10

ターゲットが foreach 関数であるいくつかのルールを定義するメイクファイルがあります。

$(foreach var,$(list), $($(var)_stuff) $($(var)_more_stuff)):
    @echo Building $@ from $^...
    $(CC) $(FLAGS) ...

リスト全体を調べずにエラーが発生したときに make を終了させる方法はありますか?

4

3 に答える 3

10

は、ルールが実行されるforeachに完全に評価され、置換されます。したがって、この動作は、. つまり、問題とは直接関係ありません。foreach

あなたが見ているものについて考えられる説明はほんの少ししかありません。主にこちらのマニュアルで説明されています:

  • -kまたはで Make を実行しています--keep-going
  • -iまたはで Make を実行しています--ignore-errors
  • あなたのターゲットは、特別な.IGNOREターゲットの前提条件として定義されています
  • あなたのレシピは-
  • あなたのレシピは実際にはゼロ以外の終了ステータスを返していません
于 2012-06-29T09:07:09.253 に答える
10

exit1 つの回避策は、失敗時に「手動で」呼び出すことです。

たとえば、実行したい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エラーで失敗するように追加することだけです)。

于 2014-03-06T03:43:43.070 に答える