我正在使用gmake和 gcc -MM
跟踪the manual之后的标头依赖关系 . 该机制依赖于makefile include
指令来导入计算的依赖项 .
因为 .d
文件包含在makefile中,所以它们必须存在才能生成任何目标,包括 clean
. 所以在 clean
之前可以做正确的事情,必须生成依赖关系,如果一个人无法构建,那么 clean
就会变得更加混乱 .
除了 clean
之外,它还希望在构建任何目标之前创建所有依赖项 .
此外,如果任何文件被更改为包含不存在的文件,则依赖关系解析会中断,并且根本不会构建任何文件 .
如果 Headers 被删除,那么现有的依赖项文件仍然包含它作为目标的名称,并且在删除有问题的依赖项文件之前不会构建任何内容...这不能用 clean
完成 .
用通配符替换 include
的替换模式以包含所有预先存在的依赖文件解决了一些问题,但它仍然可以真正用于实际用途吗?
3 回答
只是不提供生成
.d
文件的规则 . 很好地解释为什么它不那么好(包括你的情况)也可以在Paul Smith的_1190992中找到 - 他是GNU Make的维护者 .简而言之,以下模式适用于所有情况:
另见我以前的相关答案:
GNU Make. Why this complex syntax to generate dependencies?
Makefile improvements, dependency generation not functioning
解决方案是使用Conditional Syntax:
这使得clean目标不会调用
*.d
目标,因为当您运行make clean
时,*.d
文件将不会包含在Makefile中 .参考:https://www.gnu.org/software/make/manual/html_node/Goals.html
我通常的模式看起来像
注意
-include
而不是include
. 基本上,它有条件地包括:即iff文件存在参见文档:http://www.gnu.org/software/make/manual/make.html#Include