私はmake
を使用して、大量のデータを生成し、それを処理するプロジェクトを自動化します。レシピは次のようになります。
processed-data: data
data-processing-program $^ > $@
data:
output-data > $@
data
には独自のレシピがあります。これは、他のさまざまなターゲットもそれを処理するためです。
output-data
-プログラムはしばらくの間実行されます。完了すると、data-processing-program
が始まり、最終的にprocessed-data
が生成されます。
両方を並行して実行し、ファイルが完了する前にdata
をdata-processing-program
にストリーミングすることで、明らかに高速になる可能性があります。
このような関係をMakefile
で表現するにはどうすればよいですか?
私が検討したオプション:
--jobs
/-j
を使用して複数のレシピを並行して実行しようとしました ですが、make
は、依存関係を実行する前に、レシピが完了するのを待ちます。
これを手動で行う場合は、パイプラインを作成するだけであることがわかりました。
output-data | data-processing-program > processed-data
それは、データのいずれかが利用可能になるとすぐにデータを処理します。
data
レシピでファイルの代わりに 名前付きパイプ を作成し、バックグラウンドプロセスを生成してデータを書き込むことで、それをエミュレートするレシピを試しました。ただし、パイプ内のデータは1回しか読み取ることができないため、複数のレシピで同じデータを処理することはできません。
tee
を使用して出力の一方のコピーをディスクに保存し、もう一方をdata-processing-program
にフィードすることで、ケーキを手に入れて食べることもできます。
output-data | tee data | data-processing-program > processed-data
これにより、メイクファイル内の他のターゲット用に適切にタイムスタンプが付けられたdata
のコピーが残ります。
このパイプラインを依存関係に関連付ける方法はいくつもあるので、意味のあるものを選択できるようにします。 (まだ行き詰まっている場合を除き、その場合はフォローアップします。)たとえば、ルールはdata
とprocessed-data
の両方を生成するため、次のように記述します。
data processed-data:
output-data | tee data | data-processing-program > processed-data