自动生成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 "\t\$(CXX) \$(CFLAGS) \$(OBJS) -o \$@" >> $mkfile
43 echo "" >> $mkfile
44 
45 # Makefile的模糊匹配依赖
46 echo "%.o:%.cpp" >> $mkfile
47 echo -e "\t\$(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 "\t$dfilecmd" >> $mkfile
54 echo "" >> $mkfile
55 
56 echo "" >> $mkfile
57 echo ".PHONY:clean" >> $mkfile
58 echo "clean:" >> $mkfile
59 echo -e "\trm -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文件单独匹配规则

posted @ 2015-07-24 12:29  Jojodru  阅读(2069)  评论(1编辑  收藏  举报