zoukankan      html  css  js  c++  java
  • 自动生成makefile的脚本

    如果需要测试某一个特性,写了一个test.cpp

    某天又增加了一个utils.cpp,依此类推,测试文件越来越多

    每次测试时都要手动维护一个makefile实在是不明智的

    于是萌生了用脚本自动维护的念头

    很简单的一个脚本,运行脚本生成脚本当前目录的makefile

    很适合用来测试简单的特性,生成的makefile很简单,没有多余的依赖关系

    sedcmd文件包含了生成.d文件依赖的命令,因为有一堆的$符号需要转义

    因此将命令单独放在一个文件里

    bash文件genmake.sh代码如下:

     1 #!/bin/bash
     2 
     3 # 获取脚本程序的绝对路径
     4 sh=$0
     5 
     6 # 查找所有c++文件
     7 cppsource=$(find ./ -name *.cpp -type f -exec basename {} ;)
     8 chrlen=${#cppsource}
     9 if [ $chrlen -eq 0 ]; then      # 如果没有找到可用的c++文件,直接退出程序
    10     echo "found no c++ file"
    11     exit
    12 fi
    13 
    14 mkfile="Makefile"
    15 sedtemp="${sh%/*.sh}/sedcmd"    # 构建sed命令的模板文件绝对路径,该文件与脚本程序处以同一目录
    16 OBJS=
    17 
    18 rm -f $mkfile
    19 
    20 # 根据c++文件名构建队名的obj文件列表
    21 for file in $cppsource; do
    22    obj=${file%*.cpp}.o
    23    OBJS+=$obj
    24    OBJS+=" "
    25 done
    26 
    27 # 定义编译器编译所需的参数
    28 echo "INCLUDES= -I." > $mkfile
    29 echo "CFLAGS= -O2 -Wall" >> $mkfile
    30 echo "CPPFLAGS= -D_DEBUG" >> $mkfile
    31 echo "CXX=g++ -std=c++11" >> $mkfile
    32 echo "" >> $mkfile
    33 
    34 echo "OBJS=$OBJS" >> $mkfile
    35 echo "all:test" >> $mkfile
    36 echo "" >> $mkfile
    37 
    38 echo "include $(OBJS:.o=.d)" >> $mkfile
    39 echo "" >> $mkfile
    40 
    41 echo "test:$(OBJS)" >> $mkfile
    42 echo -e "	$(CXX) $(CFLAGS) $(OBJS) -o $@" >> $mkfile
    43 echo "" >> $mkfile
    44 
    45 # Makefile的模糊匹配依赖
    46 echo "%.o:%.cpp" >> $mkfile
    47 echo -e "	$(CXX) $(CPPFLAGS) $(INCLUDES) -c $< -o $@" >> $mkfile
    48 echo "" >> $mkfile
    49 
    50 # 使用sed命令模板构建Makefile的d文件依赖规则
    51 echo "%.d:%.cpp" >> $mkfile
    52 dfilecmd=$(cat $sedtemp)
    53 echo -e "	$dfilecmd" >> $mkfile
    54 echo "" >> $mkfile
    55 
    56 echo "" >> $mkfile
    57 echo ".PHONY:clean" >> $mkfile
    58 echo "clean:" >> $mkfile
    59 echo -e "	rm -rf *.o *.d test" >> $mkfile
    60 echo "" >> $mkfile

    sedcmd文件的内容

    1 @set -e;rm -f $@;
    2     $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; 
    3     sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@; 
    4     rm -f $@.$$$$

    脚本只处理的cpp文件,

    c语言文件可以使用同样的方法操作

    如果需要同时处理cpp和c文件,

    则需要将Makefile的模糊匹配依赖

    替换为使用for循环为每个源文件和obj文件单独匹配规则

  • 相关阅读:
    对struts2的简单理解
    对xml文件封装思想的处理
    反射技术
    设计模式之观察者模式
    设计模式之单例模式
    浅谈对象的克隆
    细说 过滤篇
    flex html 用flex展示html
    git同一文件由于文件名大小写不同导致不能合并
    关于C#引用Dll后,找不到命名空间的问题
  • 原文地址:https://www.cnblogs.com/jojodru/p/4673127.html
Copyright © 2011-2022 走看看