0

Makefile には 2 つのターゲットがあります。

.SECONDARY: 
exp-%.ans: 
    echo $* > eval/$@

%.scores: %.ans
    cat eval/$< > eval/$@

make -n exp-40.scores出力を書くと、次のようになります。

echo 40 > eval/exp-40.ans 
cat eval/exp-40.ans > eval/exp-40.scores

1つのことを除いて、これは良いことです。依存関係が既に保持されていることを認識していません。eval/exp-40.scores を (初めて) 作成すると、同じコマンドを実行すると、make が既にそこにあると言うことが期待されます。だから私は次のように私の Makefile を変更しようとします:

.SECONDARY: 
exp-%.ans: 
    echo $* > eval/$@

%.scores: eval/%.ans
    cat eval/$< > $@

make -n exp-40.scoresもう一度書くと、出力は次のようになります。

echo eval/40 > eval/eval/exp-40.ans
cat eval/eval/exp-40.ans > exp-40.scores

私のパラメータは eval/40 ではなく 40 であるべきなので、これは完全に間違っています。

この 2 つの世界を最大限に活用するにはどうすればよいでしょうか? つまり、eval/ フォルダーに *.scores を作成します。また、ファイルが既に存在するかどうかを確認する必要があります。次に、そのファイルの存在に従って make を続行する必要があります。

ありがとう。

4

1 に答える 1

2

make のコア ルールの 1 つは、ルールが make にビルドするように指示したターゲットをビルドする必要があるということです。のようなルールfoo : barは、そのレシピを実行すると、レシピが という名前のファイルを作成または更新することを make に指示しますfoo。レシピが代わりの名前のファイルを作成または更新する場合、biz/foomakefile が間違っているため、動作しません。

Make は常に、レシピが作成することを期待するターゲットを$@自動変数に入れます。レシピは正確に作成または更新する必要が$@あります$@。他のものではありません。

したがって、あなたの場合、次のように書く必要があります。

eval/exp-%.ans: 
        echo $* > $@

eval/%.scores: eval/%.ans
        cat $< > $@

make exp-40.scores実行して実際に作成できるようにしたい場合はeval/exp-40.scores、次のようなルールを追加できます。

%.scores: eval/%.scores ; @:

(パターン ルールにはある種のレシピを提供する必要があります。空のレシピを持つことはできません。上記のものは何もしません)。

于 2013-07-24T15:57:11.910 に答える