.PHONYターゲットに基づいてファイルを常に再生成しないようにmakeに要求するにはどうすればよいですか?

.PHONYターゲットに基づいてファイルを常に再生成しないようにmakeに要求するにはどうすればよいですか?

私はこれを持っています:

.PHONY: check
check:
    script-returning-nearly-always-zero

obj2.img: obj1.img check
    make-obj2-from-obj1

obj2.imgしたがって、論理はobj1より古い(または存在しない場合)再生成したいということです。ただし、「チェック」ターゲットが失敗した場合はエラーが発生したいと思います。

今私の問題は、発電機がobj2.img常に実行されているということです。checkためではないかと思います.PHONY

obj2.img更新時にのみobj1.img再生成するようにmakeを要求できますか?

答え1

これを行う唯一の方法は次のとおりです。いいえ持つcheck前提条件として:

偽のターゲットは、実際のターゲットファイルの前提条件にならないでください。もしそうなら、makeそのレシピはファイルを考慮するたびに実行されます。

代わりにcheckMake ターゲットとして明示的に呼び出してください。

obj2.img: obj1.img
    $(MAKE) check
    make-obj2-from-obj1

したがってobj2.img、存在し、以前でない場合はobj1.img書き換えられません。それ以外の場合は、スキャンが最初に実行され、成功すると次に実行されますmake-obj2-from-obj1

これには、検査が失敗してもこのオプションを使用して強制的に再構築できるという付随的な利点があります-k

関連情報