如何充分扩展gnu使变量值

时间:2015-02-11 10:50:53

标签: variables macros makefile expand expansion

我尝试将递归make变量的完全评估值传递给$(shell ...)。我尝试了很多方法,包括自己计算最终价值的宏,但没有成功。

我在shell中获取了中间变量语法,而不是完全展开的递归变量值。

VAR1 ?= var1_value
VAR2 ?= var2_value1 var2_value2
VAR3 ?= $(VAR1)
VARLIST := VAR1 VAR2 VAR3

quote     = $(if $(call ne,$(words $(1)),1),"$(1)",$(1))
GENVARS1  = $(foreach v,$(1),set $(v) $(call quote,$(value $(v)));)
SHELLVARLIST = $(shell echo $(call GENVARS1,$(VARLIST)))

shelltest :
    @echo "--->Executing recipe for shelltest"
    @echo "VAR3 is $(VAR3)"
    $(call GENVARS,$(VARLIST))
    @echo "SHELLVARLIST = $(SHELLVARLIST)"

在普通的解引用中(至少在配方中),变量完全展开。但是,当作为参数传递给宏时,它不会。有没有办法将完全扩展的值转换为宏参数?

运行make:

时的结果
bash-4.1$ make -f test_expand.mk shelltest
/bin/sh: VAR1: command not found
--->Executing recipe for shelltest
VAR3 is var1_value
set VAR1 var1_value; set VAR2 var2_value1 var2_value2; set VAR3 $(VAR1);
/bin/sh: VAR1: command not found
SHELLVARLIST = set VAR1 var1_value

如您所见,$(VAR3)未被传递为" var1_value"但是作为文字" $(VAR1)"。

传递

任何提示或指示都是最受欢迎的。这令人沮丧(我离开的时间很少......: - o)

谢谢, 戴夫

1 个答案:

答案 0 :(得分:1)

通过使用$(value $(V))构造,您明确告诉make不扩展变量。这就是value函数的作用:避免扩展。

如果要扩展,请删除value功能。你为什么一开始就把它添加到那里?

GENVARS1  = $(foreach v,$(1),set $(v) $(call quote,$(v));)

ETA

很抱歉,如果您希望将值扩展为变量名称,则需要添加额外级别的$(...)来扩展它:

GENVARS1  = $(foreach v,$(1),set $(v) $(call quote,$($(v)));)

内部$(v)扩展为变量的名称,例如VAR3,因此外部$(...)将为$(VAR3)并展开为{{{ 1}}变量。