制作以下基本makefile时,我看到的行为使我觉得我缺少一些基本的东西:
define foo
var := $1
$(info var_value: [$(var)] vs value: [$1])
endef
all:
$(eval $(call foo,FIRST))
$(eval $(call foo,SECOND))
该makefile的输出如下:
var_value: [] vs value: [FIRST]
var_value: [FIRST] vs value: [SECOND]
make: `all' is up to date.
我的理解是var := $1
意味着$ 1中的任何值都会立即扩展并设置为var。
因此,我(天真)希望var的内容和实际值始终相等,但事实并非如此。有人可以给我提示吗?
答案 0 :(得分:2)
eval
扩展其参数,并使make扩展结果,然后再将其传递给外壳。 $$
退出了第一个扩展名:
define foo
var := $1
$$(info var_value: [$$(var)] vs value: [$1])
endef
$(foreach n,FIRST SECOND,$(eval $(call foo,$(n))))
all:;
演示:
$ make all
var_value: [FIRST] vs value: [FIRST]
var_value: [SECOND] vs value: [SECOND]
make: 'all' is up to date.
答案 1 :(得分:1)
这是何时评估事物的问题。首先,变量var
为空,因此在第一个调用foo
扩展为:
var := FIRST
$(info var_value: [] vs value: [FIRST])
Make对此进行评估,并为var
赋予值“ FIRST”。
并且由于var
的值为“ FIRST”,因此对foo
的第二次调用扩展为:
var := SECOND
$(info var_value: [FIRST] vs value: [SECOND])