を構築し、マルチディレクトリ内の最初のエラーで停止するように作るにあたってリーフが作成され、ビルドはそのディレクトリで停止しますが、残りのmakeは続行します。これらのMakefileをどのようにセットアップすれば、どのレベルの最初のエラーでもmake全体が停止するのですか?は、私たちのプロジェクトは、各マルチディレクトリのサブメイクのためのルールの次のタイプでのMakefileを使用しています
おかげ
を構築し、マルチディレクトリ内の最初のエラーで停止するように作るにあたってリーフが作成され、ビルドはそのディレクトリで停止しますが、残りのmakeは続行します。これらのMakefileをどのようにセットアップすれば、どのレベルの最初のエラーでもmake全体が停止するのですか?は、私たちのプロジェクトは、各マルチディレクトリのサブメイクのためのルールの次のタイプでのMakefileを使用しています
おかげ
私はthis question's answerで答えを見つけました:私は、各submakeのリターン・ステータスをキャプチャするために書き換える必要があります。
bashのマニュアルのループセクションのから:
リターン・ステータスは が実行する最後のコマンドの終了ステータスです。
したがって、返品ステータスを取得する必要はありません。 、
DIRS = lib audio conf parser control
all: $(DIRS)
.PHONY: all $(DIRS)
$(DIRS):
$(MAKE) -C [email protected] $(MFLAGS) all
この方法:
DIRS = lib audio conf parser control
all: $(DIRS)
@for DIR in $(DIRS); do \
$(MAKE) -C $$DIR $(MFLAGS) all || exit 1; \
done
しかし、代わりに、ループのための単一の、ディレクトリごとに個別のレシピを持っている多くの方が良いでしょう:あなたは、任意のサブmakeが失敗した場合に失敗するためにあなたのレシピを必要としますサブメイクが失敗した場合、それは失敗して停止する完全なルールのレシピです。
.PHONY
特別なターゲットに注意してください。この場合は、ディレクトリがすでに存在していてもレシピを実行する必要があるため必要です。
この構造には別の利点があります。並列モードでメイク(make -j N
)を実行すると、forループで1つではなく、複数のサブメイクを同時に起動します。各サブメイクは、並行して複数のレシピを開始し、最大でN
のジョブを実行します。マルチプロセッサアーキテクチャまたはマルチコアアーキテクチャでは、スピードアップ要因が重要になります。
しかし、この利点は、プロジェクトが並行安全でない場合、つまりディレクトリの処理順序が重要であり、メイクファイルで正しく定義されていない場合には、欠点になる可能性があります。あなたはこのような状況にある場合は、追加することができます。
.NOTPARALLEL:
特別なターゲットを作る伝えるためにあなたのメインのmakefileの先頭に。しかし、ディレクトリ間の依存関係を明示的に定義する方が良いでしょう。これを行う方法がわからない場合は、別の質問をしてください。