1

現在、コンパイル以外の目的で使用している Makefile があります。中間ファイルを削除する代わりに、それらを保持したいのですが、それらをgzipしてから、後でMakefileに中間ファイルが存在することを検出させ、それを再計算する代わりに、単純に解凍します。

ターゲットtarget.txtが、それ自体がprereq.txtに依存する、intermediate.txt という中間ファイルに依存しているとします。次のようなものです:

target.txt: intermediate.txt
intermediate.txt: prereq.txt

デフォルトでは、Make は中間ファイルを削除しますが、これを無効にすることができます。ただし、 intermediate.txtの計算には時間がかかるため、自動削除を無効にします。しかし、ファイルmiddle.txtも非常に大きい場合はどうでしょう。ファイルを再計算する代わりに、既存の zip ファイルを Make で解凍したいので、gunzip middle.txt.gzを実行します。

私が尋ねていると思うより大きな質問は、2 つの異なる依存関係に基づいて、ターゲットを作成する 2 つの方法があるということです。前提条件が存在するルールを Make に実行させ、他のルールを無視してもらいたいのですが、圧縮されたバージョンを削除して、中間の前提条件のタイムスタンプが新しい場合にのみ再計算してください。誰か提案はありますか?

4

2 に答える 2

1

GNU Make を使用している場合は、パターン ルールを使用してこれを行うことができます (tac は、行っている処理を表すために使用されます)。

%.txt: %.i.txt
    tac $^ > $@               #make .txt file the normal way
    gzip $^                   #gzip the intermediate file

%.txt: %.i.txt.gz
    gunzip < $^ | tac > $@    #make .txt by streaming in the gzipped intermediate

%.i.txt: %.p.txt
    tac $^ > $@               #make the intermediate file from the prereq

.i.txtファイルが見つからない場合、Make は次のパターンにフォールスルーしてバージョンを探すため、これはパターンルールに対して機能します.i.txt.gz。これは明示的なルールでは機能しません。後のルールは単に以前のルールを置き換えるだけだからです。

于 2012-12-06T20:15:33.917 に答える
0

prereq.txt が gzip されたファイルよりも新しい場合、.gz バージョンを解凍したくないと思います。その場合、シェル テストを使用して gzip 圧縮されたファイルを保存および復元し、make を直接関与させない傾向があります。

target.txt: intermediate.txt
        ...same as it ever was ....

intermediate.txt: prereq.txt
        if [ $@.gz -nt $< ]; then      \
            gunzip <$@.gz >$@;         \
        else                           \
            whatever >$@ <$<;          \
            gzip <$@ >$@.gz;           \
        fi

ここで、'whatever' は、prereq.txt から中間.txt を作成するコマンドです

于 2012-12-06T21:20:35.357 に答える