web-dev-qa-db-ja.com

GNUに明示的に失敗をテストさせるには?

Makeを何年も使用しなかった後、私は再びそれを必要としていることに気づきました。今はgnuバージョンです。自分のやりたいことができるはずですが、方法がわからなかったり、Googleで答えを見つけたりできていません。

プログラムを何度も実行するテストターゲットを作成して、結果をログファイルに保存しようとしています。一部のテストでは、プログラムが異常終了するはずです。残念ながら、私のメイクファイルは最初のテストで異常終了し、エラーが発生します。私のようなものがあります:

# Makefile
# 
test:
        myProg -h > test.log              # Display help
        myProg good_input >> test.log     # should run fine
        myProg bad_input1 >> test.log      # Error 1
        myProg bad_input2 >> test.log      # Error 2

上記の場合、bad_input1の実行後に終了し、bad_input2の実行には決して到達しません。

62
GreenMatt

ターゲットを失敗させる必要がある場合の適切な解決策は、その終了コードを無効にすることです。

# Makefile
# 
test:
    myProg -h > test.log              # Display help
    myProg good_input >> test.log     # should run fine
    ! myProg bad_input1 >> test.log      # Error 1
    ! myProg bad_input2 >> test.log      # Error 2

現在、これら2つのケースで成功するのはエラーです。

16
tripleee

-コマンドの前。例:

-myProg bad_input >> test.log

GNU makeは、プロセスの終了コードを無視します。

120

次のように実行してみてください

make -i

または

make --ignore-errors

allルールのすべてのエラーを無視します。

私はそれを次のように実行することもお勧めします

make -i 2>&1 | tee results

すべてのエラーと出力を取得して、何が起こったかを確認します。

エラーの後に盲目的に続行することは、おそらくあなたが本当にやりたいことではないでしょう。 makeユーティリティは、その性質上、通常、前のコマンドの正常な完了に依存しているため、後で実行するコマンドの前提条件としてこれらのコマンドのアーティファクトを使用できます。

ところで、私はhighlyO'Reilly book on make のコピーを取得することをお勧めします。初版では、makeの基本的な性質、特にその後方連鎖動作についての優れた概要があります。その後の版はまだ良いですが、最初の版です。実際に何が起こっているかについての最も明確な説明がまだあります。実際、私自身のコピーは、makeについて「WTF?質問」をするために私にやって来た人々に最初に渡すものです! (-:

30
Rob Wells