我有一个顶层生成文件,该文件由我的自定义构建工具从各种配置文件中自动生成:我希望该生成文件能够在过期时重新制作。为此,我有以下规则:
<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声称支持此用例,所以我想我在这里一定做错了吗?
答案 0 :(得分:1)
似乎make(或至少是GNU Make 4.3)无法识别出作为规则目标的绝对路径实际上是指已经自动加载的makefile:它只是在进行简单的文本比较而不是解析正确的路径。
将规则更改为:
Makefile: <list> <of> <configuration> <files>
@echo "Rebuilding top-level makefile"
@<invoke my build tool>
解决了这个问题。
我认为这应该被视为GNU Make中的错误,因为它似乎没有记录。