如何获得完全扩展的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
变量。
我正在尝试将递归 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
变量。