我意识到使用递归makefile的想法。是否会根据后续makefile本身的任何更改来更新后续的makefile(如下所示)?
e.g:
#parent makefile. no changes here.
subsystem:
cd subdir && $(MAKE)
如果更改了subdir中的makefile,使得以下内容不成立(例如只更改了gcc标志),那么是否会更新目标文件?
必须在源文件或任何文件中重新编译 名为依赖项的头文件,比对象更新 文件,或者目标文件不存在。
答案 0 :(得分:3)
正如所写的那样,甚至运行该规则的唯一原因是因为subsystem
和subdir
不匹配。
如果要在该目录中创建subsystem
文件或目录,该规则将停止运行。
如果添加了.PHONY: subsystem
1 ,则问题将得到解决,并且该规则在命令行中列出时始终运行(即make subsystem
)。 (如评论中所示.PHONY
是一个GNU Make扩展。链接部分后面的部分讨论了一个便携式替代方案。虽然值得注意的是它们并不完全相同,.PHONY
有一些额外的好处和一些额外的限制。)
在这两种情况下,subsystem
目标都没有注意任何事情的修改日期(因为它没有列出任何先决条件)。
要使目标依赖于对makefile的更改,您需要将makefile列为先决条件(如subsystem: subdir/Makefile
)。将其列为.PHONY
可能更正确,更符合您的要求。
不,make中的任何内容都不会跟踪非先决条件。标志更改/等。不要触发重建。然而,有一些方法可以使make工作(它们涉及将已使用的标志存储在文件中,这些文件本身是使用这些标志的目标的先决条件等)。有关于这样做的问题和答案(我不会随便准备好)。
其他工具会自动处理标志更改。我相信Electric Cloud的工具可以做到这一点。我相信CMake也会这样做。可能还有其他人。
答案 1 :(得分:2)
您可以将makefile包含为依赖项,与任何其他文件相同:
mytarget.o: mytarget.c Makefile
答案 2 :(得分:2)
无论是否有任何改变,都会执行递归的makefile。这正是保罗米勒在近20年前的Recursive make considered harmful论文中指出的反对意见之一。
话虽如此,makefile就像任何其他依赖项一样,可以添加到生产规则中,以便在makefile被更改时触发该规则。