0

次のような Makefile があります。

.PRECIOUS: do/%.build

do/%.install: do/%.build
    touch $@

do/%.build:
    touch $@

私の意図は、すべての do/ .install ターゲットが do/ .build ターゲットに依存し、ビルド ターゲットのスタンプ ファイルが欠落している場合はビルド ターゲットのルールが実行され、ビルド ターゲットが存在する場合は install ターゲットが実行されることです。スタンプの方が新しいです。これは、最初の実行時に正常に機能します。

$ make do/foo.install
touch do/foo.build
touch do/foo.install

ビルド スタンプが新しい場合にも問題なく動作します。

$ touch do/foo.build 
$ make do/foo.install
touch do/foo.install

ただし、インストール スタンプが存在し、ビルド スタンプがない場合、意図したとおりに機能しません。

$ rm do/foo.build 
$ make do/foo.install
make: `do/foo.install' is up to date.

インストール ターゲットは実行されません。私は何をすべきか?これは、ビルド スタンプの自動削除を回避するために .PRECIOUS 行を追加する必要があるという事実と関係がありますか?

よろしく、ティノ

4

1 に答える 1

0

マニュアルから:

「通常のファイル b が存在せず、make が b に依存するターゲットを考慮する場合、必ず b を作成し、b からターゲットを更新します。しかし、b が中間ファイル [つまり、パターン ルールから推測される] の場合、make はb の何らかの前提条件がそのターゲットよりも新しいか、そのターゲットを更新する他の理由がない限り、b または最終ターゲットを更新する必要はありません。

この問題を解決するにはいくつかの方法がありますが、私は本当にきれいな方法を知りません。buildまたはinstallファイルに依存する他のターゲットはありますか?

于 2013-01-23T15:50:48.130 に答える