Makefile 中的变量赋值
Variable Assignment in Makefile
在制作以下基本 makefile 时,我看到的行为让我觉得我缺少一些基本的东西:
define foo
var :=
$(info var_value: [$(var)] vs value: [])
endef
all:
$(eval $(call foo,FIRST))
$(eval $(call foo,SECOND))
该生成文件的输出如下:
var_value: [] vs value: [FIRST]
var_value: [FIRST] vs value: [SECOND]
make: `all' is up to date.
我的理解是 var :=
意味着 $1 中的任何值都会立即扩展并设置到 var 中。
因此,我会(天真地)期望 var 的内容和实际值始终相等,但事实并非如此。有人可以给我提示吗?
这是一个什么时候评估的问题。起初变量 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])
eval
扩展其参数并在将结果传递给 shell 之前扩展结果。 $$
避开第一个扩展:
define foo
var :=
$$(info var_value: [$$(var)] vs value: [])
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.
在制作以下基本 makefile 时,我看到的行为让我觉得我缺少一些基本的东西:
define foo
var :=
$(info var_value: [$(var)] vs value: [])
endef
all:
$(eval $(call foo,FIRST))
$(eval $(call foo,SECOND))
该生成文件的输出如下:
var_value: [] vs value: [FIRST]
var_value: [FIRST] vs value: [SECOND]
make: `all' is up to date.
我的理解是 var :=
意味着 $1 中的任何值都会立即扩展并设置到 var 中。
因此,我会(天真地)期望 var 的内容和实际值始终相等,但事实并非如此。有人可以给我提示吗?
这是一个什么时候评估的问题。起初变量 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])
eval
扩展其参数并在将结果传递给 shell 之前扩展结果。 $$
避开第一个扩展:
define foo
var :=
$$(info var_value: [$$(var)] vs value: [])
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.