此问题是 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/