.make とパイプに対する DELETE_ON_ERROR アクション

.make とパイプに対する DELETE_ON_ERROR アクション

ルールが失敗した場合、ターゲットは.DELETE_ON_ERRORmake にターゲットを削除するよう指示します。ただし、終了ステータス値は$?パイプラインの最後のプログラム値を保持するため、パイプラインでは機能しません。たとえば、次の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このルールを適用する各行にそれらを追加する必要があります。

shPOSIXだけでなく、すべてのPOSIXで動作させるためには、bash答えはより複雑です。

関連情報