3

Stack Overflowの質問に対するbobbogoの回答では、makefileにループを書き込む方法は?、makefileに次の擬似コードに相当するものを書き込む方法が示されています。

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

回答自体に記載されているように、bobbogoのソリューションの優れている点は、「-jnum_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"

GNUMakeの使用のみを期待しています。前もって感謝します!

4

2 に答える 2

8

@Michaelはそれを正しく理解しています。唯一注意が必要なのは、ジョブのレシピで$iと$jを導出することです。元のソリューションでは、静的パターンルールを使用$*しました。シェルコマンド%では、ルール内で一致する文字列に展開されます。残念ながら、ターゲット名の2つのフィールドを照合する場合は、それほど便利ではありません。マクロはかなり役に立ちます。スケッチ:

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 に答える