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.