メイクファイル内-:
mycommand || (echo "mycommand failed $$?"; exit 1)
makefile アクションの各行は、新しいシェルを呼び出します。エラーは、コマンドが失敗したアクション行でチェックする必要があります。
mycommand が失敗した場合、ロジックは echo ステートメントに分岐してから終了します。
make
が欲しいだけなら ツールがゼロ以外のステータスで終了した場合は中止されます make
デフォルトですでにそれを行っています。
例 Makefile
:
a: b
@echo making [email protected]
b:
@echo making [email protected]
@false
@echo already failed
.これが私の make
で起こることです :
$ make
making b
make: *** [Makefile:6: b] Error 1
失敗した場合に備えて、部分的または完全に作成されたターゲットが削除されていることを確認してください。たとえば、これ
a: b
@gena $+ > [email protected]
b:
@genb > [email protected]
は正しくありません:最初の試行の場合、genb
失敗すると、おそらく間違った b
が残ります 、これは 2 回目の試行で make
が正しいと仮定します。したがって、次のようなことをする必要があります
a: b
@gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
他のいくつかのアプローチを次に示します。
shell
&.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
出力:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
shell
という警告があります コマンド出力はストリーミングされないため、終了時に stdout にダンプされるだけです。
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
または、もう少し読みやすく:
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
出力:
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
これは基本的に、同じシェルで実行されるコマンドの 1 つの文字列です。