Makefile:如何检测makefile本身的变化?

时间:2015-01-06 03:18:48

标签: makefile

我意识到使用递归makefile的想法。是否会根据后续makefile本身的任何更改来更新后续的makefile(如下所示)?

e.g:

#parent makefile. no changes here. 
subsystem:
    cd subdir && $(MAKE)

如果更改了subdir中的makefile,使得以下内容不成立(例如只更改了gcc标志),那么是否会更新目标文件?

  

必须在源文件或任何文件中重新编译   名为依赖项的头文件,比对象更新   文件,或者目标文件不存在。

3 个答案:

答案 0 :(得分:3)

正如所写的那样,甚至运行该规则的唯一原因是因为subsystemsubdir不匹配。

如果要在该目录中创建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被更改时触发该规则。