我想要产生这个:
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循环来追加吗?
答案 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)