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

rei*_*ost 17 makefile gnu-make

当我更改Makefile时,它的规则可能已经改变,所以应该重新评估它们,但make似乎并不这么认为.

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

我正在使用GNU make.

Bet*_*eta 12

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

这是一个解决方法.如果clean规则设置正确,Make可以在makefile被更改时执行它,使用空dummy文件作为标记.

-include dummy

dummy: Makefile
    @touch $@
    @$(MAKE) -s clean
Run Code Online (Sandbox Code Playgroud)

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

  • @reinierpost:等一下.如果makefile已被更改,您是否希望重新创建所有依赖项?难道你不希望它们都依赖于makefile本身吗?那不是重点吗? (11认同)

ela*_*vie 7

由于 GNU make 4.3 版,现在可以使用这两个特殊变量

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

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

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

.EXTRA_PREREQS:= $(abspath $(lastword $(MAKEFILE_LIST)))
Run Code Online (Sandbox Code Playgroud)

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

将以下行放在文件末尾:

    .EXTRA_PREREQS+=$(foreach mk, ${MAKEFILE_LIST},$(abspath ${mk}))
Run Code Online (Sandbox Code Playgroud)