自动生成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文件单独匹配规则