如何获得完全扩展的gnu make变量值

How to get fully expanded gnu make variable value

我正在尝试将递归 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)

谢谢, 戴夫

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

如果要扩展,去掉value函数。你为什么首先将它添加到那里?

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

预计到达时间

抱歉,如果要将值作为变量名展开,需要额外加一层$(...)展开:

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

内部的$(v)扩展为变量名如VAR3,那么外部的$(...)将是$(VAR3)并扩展为变量的值VAR3变量。