web-dev-qa-db-ja.com

Makefileで、ビルドが完了する前にファイルの処理を開始するにはどうすればよいですか?

私はmakeを使用して、大量のデータを生成し、それを処理するプロジェクトを自動化します。レシピは次のようになります。

processed-data: data
    data-processing-program $^ > $@

data:
    output-data > $@

dataには独自のレシピがあります。これは、他のさまざまなターゲットもそれを処理するためです

output-data-プログラムはしばらくの間実行されます。完了すると、data-processing-programが始まり、最終的にprocessed-dataが生成されます。

data output, then processing

両方を並行して実行し、ファイルが完了する前にdatadata-processing-programにストリーミングすることで、明らかに高速になる可能性があります。

simultaneous output and processing

このような関係をMakefileで表現するにはどうすればよいですか?


私が検討したオプション:

  • --jobs/-jを使用して複数のレシピを並行して実行しようとしました ですが、makeは、依存関係を実行する前に、レシピが完了するのを待ちます。

  • これを手動で行う場合は、パイプラインを作成するだけであることがわかりました。

    output-data | data-processing-program > processed-data
    

    それは、データのいずれかが利用可能になるとすぐにデータを処理します。

    dataレシピでファイルの代わりに 名前付きパイプ を作成し、バックグラウンドプロセスを生成してデータを書き込むことで、それをエミュレートするレシピを試しました。ただし、パイプ内のデータは1回しか読み取ることができないため、複数のレシピで同じデータを処理することはできません。

1
Anko

teeを使用して出力の一方のコピーをディスクに保存し、もう一方をdata-processing-programにフィードすることで、ケーキを手に入れて食べることもできます。

output-data | tee data | data-processing-program > processed-data

これにより、メイクファイル内の他のターゲット用に適切にタイムスタンプが付けられたdataのコピーが残ります。

このパイプラインを依存関係に関連付ける方法はいくつもあるので、意味のあるものを選択できるようにします。 (まだ行き詰まっている場合を除き、その場合はフォローアップします。)たとえば、ルールはdataprocessed-dataの両方を生成するため、次のように記述します。

data processed-data:
    output-data | tee data | data-processing-program > processed-data
3
alexis