首页 > 解决方案 > 重新制作自己的 Makefile:makefile 未正确重新加载

问题描述

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

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

我正在使用 GNU Make 4.3,它声称支持这一点,如此处详述它声称“在检查了所有 makefile 之后,如果有任何实际更改,make 从一个干净的状态开始并重新读取所有 makefile。 "

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

这样做的效果是文件中的其他规则已经过时了,变化只会在后续的make调用中体现出来。

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

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

标签: makefilegnu-make

解决方案


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

将规则更改为:

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

解决了这个问题。

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


推荐阅读