如何在Makefile的Shell循环中通过索引访问数组?
解决Makefile循环遍历变量元素的问题
你的Makefile存在几个问题:
- Make本身没有数组类型,
${MONTH[$${m}]}这种数组引用语法不生效 - 第二个
run目标里,$(word $$m, ${MONTH})在Make解析阶段会把$$转成$,变成$(word $m, ...),但此时$m是shell变量,Make无法提前解析出对应位置的元素 - 两个同名的
run目标,Make只会执行最后定义的那个,前面的规则会被覆盖
以下两种方案可以实现你想要的输出:
方案一:用Make的foreach预生成命令
利用Make的foreach循环遍历索引,提前生成每一条echo命令,再交给shell执行:
MONTH := jan feb mar DATE := 01 03 05 run: $(foreach idx, 1 2 3, \ echo "Info : MONTH = $(word $(idx), $(MONTH))"; \ echo "Info : DATE = $(word $(idx), $(DATE))"; \ )
方案二:交给Shell数组处理
将Make变量转为Shell数组,在Shell循环中遍历索引取值:
MONTH := jan feb mar DATE := 01 03 05 run: @months=($(MONTH)); dates=($(DATE)); \ for m in 0 1 2; do \ echo "Info : MONTH = $${months[$m]}"; \ echo "Info : DATE = $${dates[$m]}"; \ done
执行make run后,两种方案都会输出:
Info : MONTH = jan Info : DATE = 01 Info : MONTH = feb Info : DATE = 03 Info : MONTH = mar Info : DATE = 05
内容的提问来源于stack exchange,提问作者sshc
相关产品推荐
相关产品推荐

