3

おおよそ次のようなMakefileがあります。

FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps
NUMBERS = 1 2 3

all : $(FIGURES)

%.eps : $(foreach num, $(NUMBERS), $(subst B, $(num), %).out)
    # my_program($+, $@);

%.out :

重要なのは、私のフィギュアのファイル名には特定の情報(A、B、C)が含まれており、各フィギュアはmy_programによっていくつかの(例3の)ファイルから作成されているということです。各図のファイル名の形式はですがAx_Bx_Cx.eps、図を作成するためのデータファイルの名前は次のようになります。

Ax_1x_Cx.out
Ax_2x_Cx.out
Ax_3x_Cx.out

したがって、図ごとに、いくつかのファイル名を持つ動的に作成された依存関係リストが必要です。言い換えると、上記の例で必要な出力は次のようになります。

#my_program(A1_11_C1.out A1_21_C1.out A1_31_C1.out、A1_B1_C1.eps);

#my_program(A2_12_C2.out A2_22_C2.out A2_32_C2.out、A2_B2_C2.eps);

#my_program(A3_13_C3.out A3_23_C3.out A3_33_C3.out、A3_B2_C3.eps);

残念ながら、subst出力は次のようになっているため、コマンドは無視されているようです。

#my_program(A1_B1_C1.out A1_B1_C1.out A1_B1_C1.out、A1_B1_C1.eps);

#my_program(A2_B2_C2.out A2_B2_C2.out A2_B2_C2.out、A2_B2_C2.eps);

#my_program(A3_B3_C3.out A3_B3_C3.out A3_B3_C3.out、A3_B3_C3.eps);

私はこの可能性のある重複%を調べましたが、私は使用しているので、使用していないので、答えは私を助けることができないと考えました$@。これは前提条件で問題ないはずです。

明らかに私はここで何か問題を抱えています。どんな助けでも大歓迎です。

4

1 に答える 1

3

凝った前提条件の操作を行うには、少なくともmake-3.82が必要です。これは2次拡張機能をサポートします。

FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps
NUMBERS = 1 2 3

all : $(FIGURES)

.SECONDEXPANSION:

$(FIGURES) : %.eps : $$(foreach num,$$(NUMBERS),$$(subst B,$$(num),$$*).out)
    @echo "my_program($+, $@)"

%.out :
    touch $@

出力:

$ make
touch A1_11_C1.out
touch A1_21_C1.out
touch A1_31_C1.out
my_program(A1_11_C1.out A1_21_C1.out A1_31_C1.out, A1_B1_C1.eps)
touch A2_12_C2.out
touch A2_22_C2.out
touch A2_32_C2.out
my_program(A2_12_C2.out A2_22_C2.out A2_32_C2.out, A2_B2_C2.eps)
touch A3_13_C3.out
touch A3_23_C3.out
touch A3_33_C3.out
my_program(A3_13_C3.out A3_23_C3.out A3_33_C3.out, A3_B3_C3.eps)
于 2013-02-06T15:22:04.553 に答える