ここからの質問の続きです。問題は、1 つの入力から複数の出力を生成するルールがあり、コマンドに時間がかかるため、再計算を避けたいということです。ここで、ファイルが中間ファイルとして削除されないようにしたいという追加のひねりがあり、ルールにはパラメーターを許可するワイルドカードが含まれます。
提案された解決策は、次のルールを設定することでした。
file-a.out: program file.in
./program file.in file-a.out file-b.out file-c.out
file-b.out: file-a.out
@
file-c.out: file-b.out
@
次に、呼び出すと両方が作成され、 switchと並行しmake file-c.out
て実行する際の問題が回避されます。これまでのところすべて順調です。make
-j
問題は次のとおりです。上記のソリューションは DAG でチェーンをセットアップするため、別の方法でmake
考慮します。これらのファイルは中間ファイルとして扱われ、デフォルトでは、準備が整うと不要になるとすぐに削除されfile-a.out
ます。file-b.out
file-c.out
これを回避する方法は、ここのどこかで言及されており、ターゲットの依存関係としてfile-a.out
andを追加することで構成され、それらが削除されないようにします。残念ながら、私のルールではワイルドカード パターンが使用されているため、これで問題は解決しません。具体的には、私のルールは次のようになります。file-b.out
.SECONDARY
file-a-%.out: program file.in
./program $* file.in file-a-$*.out file-b-$*.out file-c-$*.out
file-b-%.out: file-a-%.out
@
file-c-%.out: file-b-%.out
@
たとえば、実行することにより、ファイル名に含まれるパラメーターを渡すことができます
make file-c-12.out
ドキュメントが提案する解決策make
は、これらを暗黙のルールとして の依存関係のリストに追加し、.PRECIOUS
これらのファイルが削除されないようにすることです。
このソリューションは.PRECIOUS
機能しますが、ルールが失敗してファイルが不完全な場合にこれらのファイルが削除されるのを防ぎます。これを機能させる他の方法はありますか?
これを解決するためのハックは、.SECONDARY
前提条件なしでターゲットを定義することです。つまり、
.SECONDARY:
これは、中断されるかルールが失敗しmake
ない限り、すべてのファイルをセカンダリとして扱う必要があるため、削除しないことを通知します。make
残念ながら、ワイルドカードを使用してルールのサブセットを選択してこのように動作させることはできません。そのため、これはハックにすぎないと考えています (便利ではありますが)。