重新制作自己的Makefile:makefile无法正确重新加载

时间:2020-10-17 16:06:25

标签: makefile gnu-make

我有一个顶层生成文件,该文件由我的自定义构建工具从各种配置文件中自动生成:我希望该生成文件能够在过期时重新制作。为此,我有以下规则:

<absolute path to makefile>: <list> <of> <configuration> <files>
    @echo "Rebuilding top-level makefile"
    @<invoke my build tool>

我正在使用GNU Make 4.3,它声称支持这一点,详细here表示:“在检查完所有makefile之后,如果实际上进行了任何更改,make的开始都是干净的,再次读取所有makefile。”

我遇到的问题是,尽管此规则被正确调用(但不是隐式地 ,但我实际上需要另一个将makefile作为先决条件的PHONY默认目标),但是make 即使更改后也不会重新加载makefile 。我注意到,当make包含食谱且已过期时,make可以正确地重新加载 included makefile:只有这个顶级makefile才出现问题。

这样做的结果是文件中的其他规则已过期,并且更改仅反映在后续的make调用中。

我当前的解决方案是让makefile配方返回一个非零的退出代码并回显警告,要求用户重新运行make:我尝试使用($error _),但这没有达到预期的效果

GNU Make声称支持此用例,所以我想我在这里一定做错了吗?

1 个答案:

答案 0 :(得分:1)

似乎make(或至少是GNU Make 4.3)无法识别出作为规则目标的绝对路径实际上是指已经自动加载的makefile:它只是在进行简单的文本比较而不是解析正确的路径。

将规则更改为:

Makefile: <list> <of> <configuration> <files>
    @echo "Rebuilding top-level makefile"
    @<invoke my build tool>

解决了这个问题。

我认为这应该被视为GNU Make中的错误,因为它似乎没有记录。