重新制作自己的生成文件:未正确重新加载生成文件

Makefiles which re-make themselves: makefile not reloaded correctly

我有一个顶级 makefile,它是由我的自定义构建工具根据各种配置文件自动生成的:我希望 makefile 能够在过时时自行重新制作。为此,我有以下规则:

<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。"

我遇到的问题是,虽然这个规则被正确调用(但 不是 隐含地,我实际上需要另一个 PHONY 默认目标,它有 makefile 作为先决条件),似乎make 不会重新加载 makefile,即使它已更改 。我注意到 make 确实正确地重新加载 included makefiles 当它们有一个配方并且已经过时时:只有这个顶级 makefile 有问题。

这样做的结果是文件中的其他规则已经过时,更改只会反映在后续的 make 调用中。

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

似乎 GNU Make 声称支持这个用例,所以我想我一定是在这里做错了什么?

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

将规则更改为:

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

已解决问题。

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