什么 makefile 惰性求值规则控制这种行为?

What makefile lazy evaluation rule governs this behavior?

我正在尝试为目录的内容创建一个 makefile 变量该目录已被配方更新。

为什么这不起作用:

A_FILE = $(wildcard subdir/*)

all: a
        @echo $(A_FILE)

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

$

...而这样做:

A_FILE = $(wildcard subdir/*)

all: a
        @echo $(A_FILE)

a: subdir/b
        @touch a

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

?

我认为惰性求值意味着变量在实际使用之前不会被求值。在这两个版本中,$(A_FILE) 用于相同的配方,并且在先决条件被评估之后。事实上,我很难阐明这两个规则之间有意义的区别,而不是表面上的区别:第一个是两个链 rules/prereqs,第二个是三个链。

您还需要删除 a:

$ rm -rf ./subdir a && make

由于您删除了 subdir 而不是 a,因此不会触发 a: 规则。只有这条规则运行:

all: a
        @echo $(A_FILE)

并且由于未创建 subdir,因此 $(wildcard subdir/*) 扩展为空。