1

次のタイプのルールを含む Makefile があります。

%.html:
    ./generate-images.py > $@
    make $(patsubst %.png,%.gif,$(wildcard *.png))

このgenerate-imagesスクリプトは、HTML ファイル (標準出力) だけでなく、いくつかの .png ファイルを現在のディレクトリに書き込みます。ここでの目標は、それらを .gif に変換することです。(実際にはありませんが、これは例です)

これは、直接呼び出すと機能します。問題は、依存関係がある別のルールから呼び出すとfoo.html、ワイルドカード ステートメントがファイルを見つけられないことです。つまり、make引数なしで呼び出されただけであり、これは私がここで望んでいるものではありません。

ワイルドカードとの取引は何ですか?または、これを行うより良い方法はありますか?

4

2 に答える 2

3

あなたの問題は何か違うかもしれませんが、私にははっきりとわかります。

ルール内のすべてのコマンドのテキスト全体が同時に処理されるため、make の関数と変数が展開されます。ディレクトリにファイルがなく.png、make を呼び出してファイルを再生成するa.pngとしb.pngます。次に、make を呼び出した後、ルールのテキストは事実上次のようになります。

file.html:
    ./generate-images.py > file.html
    make 

メイクファイルを読んだ時点でファイルがなかったから.pngです! 最初の行が実行されると、ファイルが表示されますが、次の行は既に"make" だけに生成されています。

そして、makefile を 2 回目に呼び出したときにのみ、次のように展開されます。

file.html:
    ./generate-images.py > file.html
    make a.gif b.gif

これはあなたが望むものではありません。だから私は正しい方法でそれを行うことをお勧めします。

# If you have batch conversion program, this may be helpful
images.stamp: *.png
     convert_all_images $?
     touch images.stamp

# OR, if you want convert one-by-one with means of make
images.stamp: $(wildcard *.png)
    touch images.stamp

%.gif: %.png
    convert_one --from=$^ --to=$@

# HTML would look like
%.html:
     ./generate-images.py > $@
     make images.stamp

したがって、 を呼び出すmake allと、html が生成され、新しく生成された画像が変換されます。更新された画像のみが変換されることに注意してください。これはあなたが望むものです。


gif/png 拡張子の混乱を指摘してくれたBetaに感謝します。

于 2009-09-24T20:46:51.717 に答える
1

これは、各ルールを実行するのではなく、 を$()処理するときにすべての式を評価しているように聞こえます。Makefile次のようにルールをメイクファイルに追加できます。

images: $(patsubst %.png,%.gif,$(wildcard *.png))
.PHONY: images

次に、サンプルスニペットを次のように変更します

%.html:
    ./generate-images.py > $@
    make images

Make が適切なタイミングでグロブを評価するようにします。これについては、マニュアルを確認する価値があるかもしれません。

于 2009-09-24T20:33:48.653 に答える