这个问题是后续问题什么 makefile 惰性求值规则控制此行为? https://stackoverflow.com/questions/64084461/what-makefile-lazy-evaluation-rule-governs-this-behavior#64084491。我仍在尝试理解 gnu make 的惰性求值的一些规则。
在配方更新目录后,我想要为该目录的内容创建一个 make 变量。
这个 Makefile 表明$(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 评估all配方开始运行之前的行any食谱中的一行。所以,当它准备好运行你的规则配方时a
它首先展开所有行,包括最后一行$(A_FILE)
在里面。此时配方的任何部分尚未运行,因此结果为空。
然后在所有扩展之后,调用 shell 来运行配方中的行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)