1.编译行为带来的缺陷 预处理器将头文件中的代码直接插入源文件 编译器只通过预处理后的源文件产生目标文件 因此,规则中以源文件为依赖,命令可能无法执行
实现想法: 通过命令自动生成对文件的依赖 将生成的依赖自动包含进makefile中 当头文件改动后,自动确认需要重新编译的文件 预备工作: Linux命令sed 编译器依赖生成选项gcc -MM(gcc -M) linux中的sed命令: sed是一个流编辑器,用于流文本的修改(曾、删、改、查) sed用于流文本中的字符串替换 sed的字符串替换方式为:sed ‘s:src:des:g’ sed的正则表达式支持 在sed中可以用正则表达式匹配替换目标 并且可以使用匹配的目标生成替换结果 gcc关键编译选项: 生成依赖关系: 获取目标的完整依赖关系:gcc -M test.c 获取目标的部分依赖关系:gcc -MM test.c
小技巧:拆分目标的依赖 将目标的完整依赖拆分为多个部分的依赖 makefile中的include关键字: 类似C语言中的include 将其他文件的内容原封不动的搬入当前文件 语法:include filename 例:include foo.make *.mk $(var) make对include关键字的处理方式: 在当前目录搜索或指定目录搜索目标文件 搜索成功:将文件内容搬入当前makefile中 搜索失败:产生警告 以文件名作为目标查找并执行对应规则 当文件名对应的规则不存在时,最终产生错误 makefile中命令的执行机制 规则中的每个命令默认是在一个新的进程中执行(shell) 可以通过接续符(;)将多个命令组合成一个命令 组合的命令依次在同一个进程中被执行 set -e指定发生错误后立即退出执行
解决方案的初步思路: 通过gcc -MM 和sed得到.dep依赖文件(目标的部分依赖) 技术点:规则中命令的连续执行 通过include指令包含所有的.dep依赖文件 技术点:当.dep依赖文件不存在时,使用规则自动生成
|