makefile - 为什么 makefile 惰性求值会在 "parent"配方中找到一个文件,但找不到当前文件?

标签 makefile gnu-make

此问题是 What makefile lazy evaluation rule governs this behavior? 的后续问题。我仍在尝试理解 gnu make 的惰性求值的一些规则。

我希望在配方更新目录后为该目录的内容创建一个 make 变量。

此 Makefile 演示了当 $(A_FILE) 位于实际创建文件的配方的“父级”中时,将评估 $(A_FILE) 来查找创建的文件:

A_FILE = $(wildcard subdir/*)

all: a
        @echo $(A_FILE)

a:
        @mkdir ./subdir
        @touch subdir/b
$ rm -rf ./subdir/ && make
subdir/b
$ 

但是下面的 Makefile 有一个看似微不足道的更改:在更新其包含目录的配方中引用了 $(A_FILE) - 但现在变量为空:

A_FILE = $(wildcard subdir/*)

all: a
        @echo $(A_FILE)

a:
        @mkdir ./subdir
        @touch subdir/b
        @sleep 1
        @echo $(A_FILE)
$ rm -rf ./subdir/ && make


$ 

我添加了sleep来排除目录更新后过快被拖网的计时问题。 给出了什么?如果 $(A_FILE) 在较高层配方中引用,但不在其实际所在的较低层配方中引用,为什么会根据更新的子目录内容进行评估更新了吗?

最佳答案

GNU make 在开始运行配方中的任何行之前评估配方中的所有行。因此,当它准备好运行规则 a 的配方时,它首先会展开所有行,包括其中包含 $(A_FILE) 的最后一行。此时配方的任何部分尚未运行,因此结果为空。

然后在所有扩展之后,调用 shell 来运行配方中的行。

关于makefile - 为什么 makefile 惰性求值会在 "parent"配方中找到一个文件,但找不到当前文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64084643/

相关文章:

makefile - 是否有 gnu make 的配置文件?

makefile - 为什么在使用 $$* 的二次扩展时 patsubst 停止工作?

makefile - 如何使 'make' 附加额外的标准 FLAGS

makefile - 使用 GNU-make 函数检查是否定义了变量

makefile - 为什么 make 提示循环依赖?

opencv - cmake 无法找到与 Unix Makefiles 对应的构建程序

linux - 为什么用 shell 脚本目标调用 make 会创建一个可执行文件?

c++ - Linux - 为什么我的可执行文件将 libpthread 作为共享库?

makefile - 尝试不同方法来制作目标的标准 makefile 习语是什么

makefile - GNU make 通配符不再提供排序输出。有控制开关吗?