我知道使用递归Makefile的想法。诸如以下的后续生成文件是否会仅在对后续生成文件本身进行任何更改时被更新?
例如:
#parent makefile. no changes here.
subsystem:
cd subdir && $(MAKE)
如果子目录中的makefile被更改,使得以下内容不成立(例如,仅更改了gcc标志),那么将更新目标文件吗?
如果源文件或任何名为依赖项的头文件比目标文件更新,或者如果目标文件不存在,则必须重新编译。
正如所写的,使之完全运行该规则的唯一原因是因为subsystem
和subdir
不匹配。
如果subsystem
要在该目录中创建文件或目录,则该规则将停止运行。
如果添加.PHONY: subsystem
1,则该问题将得到解决,并且该规则在命令行(即)上列出时将始终运行make subsystem
。(如注释中所示,它.PHONY
是GNU Make扩展。链接的部分之后的部分讨论了可移植的替代方法。尽管值得注意的是,它们并不完全相同,因为它.PHONY
具有一些额外的好处和一些额外的限制。)
在这两种情况下,subsystem
目标都不会关注任何内容的修改日期(因为它没有列出任何先决条件)。
要使目标依赖于对Makefile的更改,您需要像其他任何东西(例如)一样,将Makefile作为先决条件列出subsystem: subdir/Makefile
。将其列出.PHONY
可能会更正确,也可能会更多。
不,make本身没有什么可追踪非先决条件。所以标记更改/等。不触发重建。但是,有一些方法可以使它正常工作(它们涉及将使用的标志存储在文件中,这些文件本身就是使用这些标志的目标的先决条件,等等)。关于这样做的问题和解答(尽管我没有立即准备好它们)。
但是其他工具会自动处理标志更改。我相信Electric Cloud的工具可以做到这一点。我相信CMake也一样。可能还会有其他人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句