Makeは変更時にパターンルールの遷移依存関係を再構築しません。なぜですか?

Makeは変更時にパターンルールの遷移依存関係を再構築しません。なぜですか?

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

.PRECIOUS: %.a %.b %.c

%.a:
        touch $@

%.b: %.a
        touch $@

%.c: %.b
        touch $@

を使用して "test.c"を生成すると、3make test.cつのファイル(test.a、、、)がすべて正しく生成されます。しかし、今削除した後に再生成しようとすると何も起こりません。test.btest.ctest.atest.c

その理由は明らかです。test.cにのみ依存しtest.btest.b変更されていないので、再構築する必要はありません。ただし、なくなった分test.b再構築しなければならず、test.aで拡散させなければならないtest.c。私はこの行動が非常に直感的ではない副作用だと思います。

直感的な方法で「遷移的」依存関係を処理するためにmakeを取得できますか? (つまり、削除後にtest.aすべてのターゲットを再構築する必要があります。)

問題はパターンルールでのみ発生します。

(Ps私はすべての中間ファイルが必要なので、PRECIOUS.GNU Makeのデフォルトの動作は中間ファイルを削除することです。)

答え1

通常、伝統的に名前が付けられた無効なターゲットを使用します。前提条件%.aなので、存在しない場合は常にビルドされます。さらに、gnu make .NOTINTERMEDIATE 特別な目標中間ファイルは削除しません(ただし、エラーと中断時には削除します.PRECIOUS)。

.NOTINTERMEDIATE: %.a %.b %.c
.PHONY: FORCE
%.a: FORCE
    touch $@
%.b: %.a
    touch $@
%.c: %.b
    touch $@

関連情報