1

次のメイクファイルを実行しました

.PHONY: check
check:
    @[ -f `which cmake` ] ||  $(error Install cmake first)

.PHONY: check2    
check2:
    @[ -f `which cmake` ] || echo "Install cmake first"

.PHONY: exec
exec: check
    @echo "Compiling executable ..."
    @[ -d ./build ] || mkdir ./build
    @cd ./build; cmake ../src; make

ターゲット チェック 2 が機能している間( cmake が存在する場合、「最初に cmake をインストールします」というメッセージが表示されません。存在しない場合、メッセージが表示されます)、ターゲットチェックは、cmake が存在する場合でも常に終了します。

そのため、 target execに target checkを使用できません。ターゲットcheck2を使用する必要があります。もちろん、cmake が見つからないため、 make を終了します。

「Compiling executable ...」というメッセージが表示される前に、makeを終了させたいと思います。

4

1 に答える 1

1

make がターゲットを再構築する必要があると判断すると、最初に行うことは、レシピ内のすべての make マクロ (変数) と関数を展開することです。次に、展開された結果のテキストをシェルに送信します。

「チェック」ルールでは、make 関数 $(error ...) を使用しているため、make がそのターゲットをビルドすることを決定するとすぐに、$(error ...) 関数と make の展開を含むレシピを展開します。終了します。シェルがコマンドの一部を実行することはできません ([ -f ... ]たとえば、make 関数を呼び出す必要があるかどうかを make に示すなど)。

make を失敗させたい場合は、レシピを失敗させるだけです。check2レシピはメッセージを出力しますが、それでも成功するため、make の続行は停止しません。あなたはこれを行うことができます:

.PHONY: check2    
check2:
        @[ -f `which cmake` ] || { echo "Install cmake first"; exit 1; }

.PHONY: exec
exec: check2
        @echo "Compiling executable ..."
        @[ -d ./build ] || mkdir ./build
        @cd ./build; cmake ../src; make

または、テストを exec ターゲット自体に入れることもできます。

.PHONY: exec
exec:
        @[ -f `which cmake` ] || { echo "Install cmake first"; exit 1; }
        @echo "Compiling executable ..."
        @[ -d ./build ] || mkdir ./build
        @cd ./build; cmake ../src; make

他の場所で必要ない場合。

于 2012-04-05T20:49:51.937 に答える