我想编写一个 Makefile,它使用来自两个不同数组的两个输入执行命令
a = A B C
b = 1 2 3
./run A 1
./run B 2
./run C 3
Run Code Online (Sandbox Code Playgroud)
我不知道如何编写它,因为无法访问 Makefile 中的数组索引
空格分隔的列表可以像数组一样处理,使用$(word n,text):
./run $(word 1,$(a)) $(word 1,$(b))
./run $(word 2,$(a)) $(word 2,$(b))
./run $(word 3,$(a)) $(word 3,$(b))
Run Code Online (Sandbox Code Playgroud)
为了避免重复,你可以定义一个像这样的助手:
run-cmd = ./run $(word $1,$(a)) $(word $1,$(b))
Run Code Online (Sandbox Code Playgroud)
然后像这样生成命令:
$(call run-cmd,1)
$(call run-cmd,2)
$(call run-cmd,3)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用我不久前编写的代码:
list-rem = $(wordlist 2,$(words $1),$1)
pairmap = $(and $(strip $2),$(strip $3),$(call \
$1,$(firstword $2),$(firstword $3))$(call \
pairmap,$1,$(call list-rem,$2),$(call list-rem,$3)))
Run Code Online (Sandbox Code Playgroud)
这pairmap将函数名称作为第一个参数,将两个空格分隔的列表作为第二个和第三个参数。它为两个列表中的每个压缩对调用该函数。
然后你可以像这样定义一个助手:
run-cmd = ./run $1 $2;
Run Code Online (Sandbox Code Playgroud)
并$(call pairmap,run-cmd,$(a),$(b))会生成./run A 1;./run B 2;./run C 3.