Makefile中的变量分配

时间:2018-12-01 01:54:20

标签: variables makefile variable-assignment expansion

制作以下基本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的内容和实际值始终相等,但事实并非如此。有人可以给我提示吗?

2 个答案:

答案 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])