什么 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/*)
扩展为空。
我正在尝试为目录的内容创建一个 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/*)
扩展为空。