Makefile 中的随机访问数组

ali*_*ali 3 makefile

我想编写一个 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 中的数组索引

And*_*ndo 6

空格分隔的列表可以像数组一样处理,使用$(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.