gmake - 循环并处理运行时变量

时间:2017-04-14 18:25:12

标签: loops makefile gnu-make

我有一个包含以下内容的makefile:

M_ONE = 1
M_TWO = 2
M_THREE = 3

NUMBERS = $(foreach v, $(shell echo "$(.VARIABLES)" | sed 's/ /'$$"\n"'/g' | grep "^M_" | xargs), $(info $(v)=$($(v))))
get-numbers:
        numbers=$(NUMBERS) ;\
        echo -e "numbers: \n$$numbers" ;\
        echo -e "NUMBERS: \n$(NUMBERS)"

我的变量以相同的模式开头,这里" M _"。我希望在运行时检索这些变量的所有值,并为每个变量执行一些shell任务。

当我执行命令时,我得到的是:

$ gmake --silent get-numbers
M_TWO=2
M_ONE=1
M_THREE=3
M_TWO=2
M_ONE=1
M_THREE=3
numbers: 

NUMBERS: 

好像变量'数字'空了我不明白为什么我逃脱了它的宣言。实际上,就好像即使是gmake变量' NUMBERS'也是空的。

我想要做的是循环使用" key = values"并做一些文件处理(sedding)。我怎样才能解决这个问题,或者考虑不这样做的另一种方法呢?

1 个答案:

答案 0 :(得分:1)

对于你想做的事情来说,这似乎是很多工作。 您的NUMBERS = ...表达式未将'$(info...)'命令输出分配给NUMBERS;它立即写入stdout;然后执行echo命令(因此不按顺序输出)。

使用GMAKE为您提供的所需内容的简单方法可能是:

M_ONE = 1
M_TWO = 2
M_THREE = 3
get-numbers : $(filter M_%, ${.VARIABLES:=.print})
%.print     :;@ echo $*=${$*}

是的,这也不提供数字:NUMBERS:标签。假设您想要的信息不仅仅是格式化,这是公平的吗?

HTH