我尝试将递归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)
谢谢, 戴夫
答案 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}}变量。