makefile中的嵌套循环,与“-i n”兼容

时间:2013-02-27 00:50:08

标签: makefile gnu-make

在bobbogo对Stack Overflow问题How to write loop in makefile?的回答中,展示了如何在makefile中编写以下伪代码的等价物:

For i in 1, ..., n:
  Add the following rule "job_$i: ; ./a.out $i > output_$i"

如答案本身所述,关于bobbogo解决方案的好处是,如果指定“-j num_threads”,作业将并行运行。其他明显且简单的解决方案没有这个属性。

我的问题:我怎样才能做同样的事情,但对于嵌套循环,即:

For i in 1, ..., n:
  For j in 1, ..., m:
    Add the following rule "job_$i_$j: ; ./a.out $i $j > output_$i_$j"

我只期待使用GNU Make。提前谢谢!

2 个答案:

答案 0 :(得分:6)

@Michael说得对。唯一棘手的一点是在工作的食谱中导出$ i和$ j。在原始解决方案中,我使用了静态模式规则,其中shell命令中的$*扩展为规则中由%匹配的字符串。不幸的是,当您想要匹配目标名称中的两个字段时,它并不那么方便。宏帮助了很多。草图:

jobs := $(foreach i,1 2 3 4 5,$(foreach j,1 2 3,job-$i-$j))

.PHONY: all
all: ${jobs} ; echo $@ Success

i = $(firstword $(subst -, ,$*))
j = $(lastword $(subst -, ,$*))

.PHONY: ${jobs}
${jobs}: job-%:
    echo i is $i j is $j

答案 1 :(得分:2)

经过一番挖掘,我发现了这个:

NUM1 := $(shell seq 1 5)
NUM2 := $(shell seq 1 3)
A := $(addprefix job_,$(NUM1))
B := $(foreach a,$(A),$(addprefix $(a)_,$(NUM2)))

这形成了规则,然后你只需要添加你的任务。像这样:

all: $(B)
$(B):
    @echo $@