如果需要测试某一个特性,写了一个test.cpp
某天又增加了一个utils.cpp,依此类推,测试文件越来越多
每次测试时都要手动维护一个makefile实在是不明智的
于是萌生了用脚本自动维护的念头
很简单的一个脚本,运行脚本生成脚本当前目录的makefile
很适合用来测试简单的特性,生成的makefile很简单,没有多余的依赖关系
sedcmd文件包含了生成.d文件依赖的命令,因为有一堆的$符号需要转义
因此将命令单独放在一个文件里
bash文件genmake.sh代码如下:
1 #!/bin/bash 2 3 mkfile=makefile 4 files=$(ls *.cpp) 5 OBJS= 6 7 for file in $files; do 8 obj=${file%*.cpp}.o 9 OBJS+=$obj 10 OBJS+=" " 11 done 12 13 echo "INCLUDES= -I." > $mkfile 14 echo "CFLAGS= -O2 -Wall" >> $mkfile 15 echo "CPPFLAGS= -D_DEBUG" >> $mkfile 16 echo "CXX=g++" >> $mkfile 17 echo "" >> $mkfile 18 19 echo "OBJS=$OBJS" >> $mkfile 20 echo "all:test" >> $mkfile 21 echo "" >> $mkfile 22 23 echo "include \$(OBJS:.o=.d)" >> $mkfile 24 echo "" >> $mkfile 25 26 echo "test:\$(OBJS)" >> $mkfile 27 echo -e "\t\$(CXX) \$(CFLAGS) \$(OBJS) -o \$@" >> $mkfile 28 echo "" >> $mkfile 29 30 echo "%.o:%.cpp" >> $mkfile 31 echo -e "\t\$(CXX) \$(CPPFLAGS) \$(INCLUDES) -c \$< -o \$@" >> $mkfile 32 echo "" >> $mkfile 33 34 echo "%.d:%.cpp" >> $mkfile 35 dfilecmd=$(cat sedcmd) 36 echo -e "\t$dfilecmd" >> $mkfile 37 echo "" >> $mkfile 38 39 echo "" >> $mkfile 40 echo ".PHONY:clean" >> $mkfile 41 echo "clean:" >> $mkfile 42 echo -e "\trm -rf *.o *.d test" >> $mkfile 43 echo "" >> $mkfile
sedcmd文件的内容
1 @set -e;rm -f $@;\ 2 $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \ 3 sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ 4 rm -f $@.$$$$
脚本只处理的cpp文件,其它语言同理。