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

27

当我修改一个Makefile时,它的规则可能已经改变,因此它们应该被重新评估,但是make似乎并不这样认为。

有没有办法在Makefile中指定,所有目标都依赖于Makefile本身,无论其名称如何?

我正在使用GNU make。


注:Makefile是一种用来描述文件之间依赖关系的格式化文件。make是一个工具程序,通过读取Makefile来自动执行一系列命令,以达到构建软件的目的。
3个回答

17

这似乎是Make应该能够实现但却未能做到的一件简单、有用、合乎逻辑的事情。

以下是一个解决方法。如果正确设置了clean规则,Make就可以使用一个空的dummy文件作为标记,每当makefile被修改时执行该规则。

-include dummy

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

这对于大多数目标都有效,也就是那些实际上是文件并且被clean删除的目标,以及依赖它们的任何目标。副作用目标和一些PHONY目标将会通过检查。


1
不错的技巧,但如果我想重新制作所有依赖项(在我的当前项目中需要大约30分钟),我会自己调用make clean - reinierpost
15
等一下,如果 makefile 已经被修改,难道不是希望重新制作所有的依赖项吗?难道不希望它们都依赖于 makefile 本身吗?这不是整个重点吗? - Beta
@Beta:它们不是二进制文件,而是文本文件。(我意识到make不适合我想要做的事情。)如何用“一两个列表”总结115个隐式make规则? - reinierpost
1
@reinierpost:对于文本文件使用Make不太常见,但也并非完全无法接受。你的问题可能有一个不错的解决方案,但是你想要的精确解决方案并不存在。而且你误读了我关于列表的写法:可能有几十个列表,但是新目标只会在其中一或两个列表中。 - Beta
@Beta:啊,好的。我更喜欢通用规则,而不是与特定文件名绑定的规则,因此我使用隐式规则模式而不是列表。对于这个项目,我发现make在表达能力方面基本上太受限制了,我很想用一种实际的编程语言来编写自己的构建工具。 - reinierpost
显示剩余8条评论

11

自GNU make 4.3版本以来,使用这两个特殊变量,现在可以实现以下功能:

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

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

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

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

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

将以下行放在您的文件末尾:

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

2
我知道的唯一解决方法是将makefile显式地添加到依赖项中。例如,
%.o: %.c makefile
        $(CC) $(CFLAGS) -c $<

3
$(CPPFLAGS)添加到规则中是个好主意,以匹配对应的隐式规则 - juanchopanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接