コマンドが失敗した場合は、作成を中断せずに終了ステータスを確認してください。

コマンドが失敗した場合は、作成を中断せずに終了ステータスを確認してください。

私はコマンドが失敗してもGNU Make 3.81が停止しないように指示しようとしています(それでコマンドの前にそれを付けました-)。ただし、次のコマンドの終了ステータスを確認してより多くの情報を印刷したいと思います。しかし、以下のMakefileは失敗します。

$ cat Makefile 
all:
    -/bin/false
    ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!

上記のMakefileが「失敗!」代わりに「成功!」をエコーするのはなぜですか?

修正する:

許可された回答に従い、拡張すると、次のように書かれます。

failure:                                                                                                                                                                                                                                      
    @-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"                                                                                                                                                                 
success:                                                                                                                                                                                                                                      
    @-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"     

答え1

ルールの各更新コマンドは、Makefile別々のシェルで実行されます。したがって、以前に失敗したコマンドの終了ステータスは含まれず、$?新しいシェルのデフォルト値です。$?これが[ $? -eq 0 ]テストが常に成功する理由です。

答え2

0の場合は動作し、戻り値が0以外の場合は続行するため、$?テストする必要はありません。&&$?||

そして、makeの戻り値はその行の最後の進行呼び出しから取得されるため、マイナス記号は必要ありません。だからこれは素晴らしい作品です

失敗する:

      @/bin/false && echo "success!" || echo "failure!" 

成功:

      @/bin/true && echo "success!" || echo "failure!"

逆の場合が発生します。独自のメッセージを実行し、ゼロ以外の値で make プロセスを中断するには、次のように書く必要があります。

失敗する:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }

答え3

~からGNU make ドキュメント:

「-」または「-i」フラグが原因でエラーを無視する必要がある場合は、make はエラーの返却を成功として扱います。ただし、シェルが終了したときにステータスコードを知らせ、エラーが無視されたことを示すメッセージを印刷するだけです。

makeこの場合、終了状態を利用するにはmakeスクリプトで実行してください。

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

そしてMakefileに以下を含めなさい:

all:
    /bin/false

答え4

これが私がしたことです。

.PHONY: test-cleanup
test-cleanup:
    $(eval CLEANUP = echo "Some cleanup procedure")
    @/bin/true && touch _testok || $(CLEANUP) ;\
    if [ -f "_testok" ]; then \
        rm -f _testok ;\
        echo "What a success!" ;\
    else \
        echo "Failure :-(" ;\
        exit 1 ;\
    fi

以下を印刷します。

What a success!

/bin/trueに変更すると、/bin/false次のような結果が出力されます。

Some cleanup procedure
Failure :-(
make: *** [Makefile:4: test-cleanup] Error 1

関連情報