使所有规则都依赖于Makefile本身

时间:2010-10-06 10:12:51

标签: makefile gnu-make

当我更改Makefile时,其规则可能已更改,因此应重新评估它们,但make似乎并不这么认为。

在Makefile中,有没有办法说它的所有目标,无论哪个目标都取决于Makefile本身? (无论其名称如何。)

我正在使用GNU make。

3 个答案:

答案 0 :(得分:12)

这看起来像Make应该能做的一个更简单,有用,合乎逻辑的事情,但事实并非如此。

这是一种解决方法。如果clean规则设置正确,则只要makefile被更改,Make就可以使用空的dummy文件作为标记执行它。

-include dummy

dummy: Makefile
    @touch $@
    @$(MAKE) -s clean

这适用于大多数目标,即作为实际文件的目标,以及由clean删除的目标,以及依赖于它们的任何目标。副作用目标和一些PHONY目标将通过网络传播。

答案 1 :(得分:5)

从 GNU make 4.3 版开始,现在可以使用这两个 special variable

  1. .EXTRA_PREREQS
    • 为每个目标添加新的先决条件
  2. MAKEFILE_LIST
    • 获取make文件的路径

让每个目标都依赖于当前的 make 文件:

在文件顶部附近(在任何包含之前,因为它会影响 MAKEFILE_LIST)放置以下行:

.EXTRA_PREREQS:= $(abspath $(lastword $(MAKEFILE_LIST)))

让每个目标都依赖于当前的 make 文件以及包含的 make 文件

在文件末尾添加以下行:

    .EXTRA_PREREQS+=$(foreach mk, ${MAKEFILE_LIST},$(abspath ${mk}))

答案 2 :(得分:1)

我知道的唯一答案是将makefile显式添加到依赖项中。例如,

%.o: %.c makefile
        $(CC) $(CFLAGS) -c $<