动态地将值附加到makefile变量

时间:2016-12-20 15:02:15

标签: makefile

我想要产生这个:

MYFLAGS += -DMYVAR0=$(MYVAR0)
MYFLAGS += -DMYVAR1=$(MYVAR2)
MYFLAGS += -DMYVAR2=$(MYVAR3)

我知道要从我之前的变量$(NUM_VARS)追加多少个MYVAR。 这就是我试过的:

ITER := 0
while[ $(ITER) -lt $(NUM_VARS)];\
        do\
            MYFLAGS += -DMYVAR$(ITER)=$(MYVAR$(ITER));\
done

我可以使用while循环来追加吗?

3 个答案:

答案 0 :(得分:3)

如何使用shell来获取数字序列,如下所示:

NUM_RANGE := $(shell seq 0 $(NUM_VARS))

然后你可以这样做:

MYFLAGS += $(foreach N,$(NUM_RANGE),-DMYVAR$N=$(MYVAR$N) )

注意最后的额外空间。在不使用NUM_RANGE的情况下获取shell可能会有一些棘手的方法,但是......

答案 1 :(得分:2)

shell,seq和foreach的其他答案非常好,可能足以满足每个人的需求。 当shell和seq的使用有问题时(例如seq不可用),很容易用make生成序列:

NUM?=3

ENCODE=$(or $(and $(word $(1), $(2)), $(2)), $(call ENCODE, $(1), x $(2) ))
encoded=$(call ENCODE, $(NUM))
$(warning encoded: $(encoded))

GENERATE=$(or $(and $(word $(1), $(2)), $(2)), $(call GENERATE, $(1), $(2) $(words 0 $(2))))
sequence=$(call GENERATE, $(NUM))
$(warning sequence: $(sequence))

ENCODE直接受到GNU Make Standard Library使用的编码的启发(将数字编码为相同长度的x序列)。 GENERATE与seq具有相同的结果。两者都可以改进以添加一个步骤,可能是一个大于1的起点等。结果变量可以在foreach中使用,如其他答案中所述。

y@vb:~$ make NUM=13
Makefile:5: encoded:  x  x  x  x  x  x  x  x  x  x  x  x  x              
Makefile:9: sequence:               1 2 3 4 5 6 7 8 9 10 11 12 13
make: Nothing to be done for 'all'.

答案 2 :(得分:1)

试试这个:

NUM := 3
MYFLAGS += $(shell flag=""; for i in $$(seq $(NUM)); do flag=$["$${flag}-DMYVAR$${i}=\$$(MYVAR$${i}) "; done; echo $$flag)

all:
    echo '$(MYFLAGS)'

示例输出:

echo '-DMYVAR1=$(MYVAR1) -DMYVAR2=$(MYVAR2) -DMYVAR3=$(MYVAR3)'
-DMYVAR1=$(MYVAR1) -DMYVAR2=$(MYVAR2) -DMYVAR3=$(MYVAR3)

注意输出中echo之后的字符串,$(MYFLAGS)已经被显示为-DMYVAR1=$(MYVAR1) -DMYVAR2=$(MYVAR2) -DMYVAR3=$(MYVAR3)