3

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

4

2 回答 2

8

@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
于 2013-02-27T10:54:47.993 回答
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 $@
于 2013-02-27T03:02:31.917 回答