ターゲットが foreach 関数であるいくつかのルールを定義するメイクファイルがあります。
$(foreach var,$(list), $($(var)_stuff) $($(var)_more_stuff)):
@echo Building $@ from $^...
$(CC) $(FLAGS) ...
リスト全体を調べずにエラーが発生したときに make を終了させる方法はありますか?
は、ルールが実行される前foreach
に完全に評価され、置換されます。したがって、この動作は、. つまり、問題とは直接関係ありません。foreach
あなたが見ているものについて考えられる説明はほんの少ししかありません。主にこちらのマニュアルで説明されています:
-k
またはで Make を実行しています--keep-going
-i
またはで Make を実行しています--ignore-errors
.IGNORE
ターゲットの前提条件として定義されています-
exit
1 つの回避策は、失敗時に「手動で」呼び出すことです。
たとえば、実行したいscripts
多数のシェル スクリプト (ファイル名の末尾が) で呼び出されるディレクトリがあるとします。.sh
次に、次のような変数宣言:
LIST_OF_SCRIPTS ?= $(wildcard scripts/*.sh)
これらのスクリプトのリストと、次のようなターゲットが表示されます。
run-all-scripts
@$(foreach scriptfile,$(LIST_OF_SCRIPTS),$(scriptfile);)
これらのスクリプトはすべて実行されますが、お気づきのように、いずれかのスクリプトがエラー コードを返すかどうかにかかわらず、foreach ループは続行されます。コマンドに a を追加する|| exit
と、エラー時にサブコマンドが強制的に終了され、Make はエラーとして処理します。
例えば、
run-all-scripts
@$(foreach scriptfile,$(LIST_OF_SCRIPTS),$(scriptfile) || exit;)
あなたが望むことをします(私は信じています)。
具体的には、擬似コードの例を使用して、次のようなものが必要だと思います:
$(foreach var,$(list), $($(var)_stuff) $($(var)_more_stuff)):
@echo Building $@ from $^...
($(CC) $(FLAGS) ...) || exit
(私が変更したのは、(CC) $(FLAGS) ...
ビットを括弧で囲み、|| exit
エラーで失敗するように追加することだけです)。