ルールが失敗した場合、ターゲットは.DELETE_ON_ERROR
make にターゲットを削除するよう指示します。ただし、終了ステータス値は$?
パイプラインの最後のプログラム値を保持するため、パイプラインでは機能しません。たとえば、次のmakefileは新しく作成されたファイルを削除しません。金持ち。
.DELETE_ON_ERROR:
foo:
false | true > foo
パイプラインのどの項目でも失敗する場合(たとえば、配列要素にゼロ以外の値がある場合など$PIPESTATUS
)、makeにルールを失敗として扱う方法はありますか?
答え1
Bashを使用している場合は、パイプライン障害オプションをグローバルに設定することもできます。パイプラインの途中でもエラーを捉えるメイクファイルの先頭に一つがありました。
# Make sure any errors in the middle of a pipe cause the build to fail
SHELL=/bin/bash -e -o pipefail
(MadScientistのコメントに従って、/bin/shから/bin/bashに変更されました。)
答え2
makefileにbash
シェルがあると確信している場合は、パイプライン失敗オプションを設定してみてください。
SHELL=bash
.DELETE_ON_ERROR:
foo:
set -o pipefail; false | true > foo
ルールの各行は別々のシェルインスタンスで実行されるため、set -o pipefail
このルールを適用する各行にそれらを追加する必要があります。
sh
POSIXだけでなく、すべてのPOSIXで動作させるためには、bash
答えはより複雑です。