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

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

私は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これにより、makefile の他のターゲットに対して正しいタイムスタンプを持つコピーが残ります。

このパイプラインを依存関係に関連付ける方法はいくつかありますので、あなたに合った方法を選択してください。 (まだ問題が発生しない限り、フォローアップを実行してください。)たとえば、ルールは両方を生成するので、次のように書くことができdataますprocessed-data

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

おすすめ記事