2013-02-27 55 views
1

在bobbogo的答案堆栈溢出问题How to write loop in makefile?,它展示了如何写下面的伪码相当于在makefile兼容:嵌套循环,以“-jn”

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制作。提前致谢!

+0

我想你也可以这样做。 @ bobbogo的回答是滥用Make和它的规则生成。诀窍是如何生成所有规则...... – Michael 2013-02-27 02:32:21

回答

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 [email protected] Success 

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

.PHONY: ${jobs} 
${jobs}: job-%: 
    echo i is $i j is $j 
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 [email protected]