ルールがどのように見えるかについて詳細を提供しなかったため、その質問にはお答えできません. make がプログラムを実行するとき、それがコンパイラ、リンカ、ドキュメント フォーマッタ、または make の別のインスタンスであるかどうかに関係なく、同じように機能します。終了コードが である場合0
、これは UNIX では「成功」です。次のルールに進みます。終了コードが non- の場合0
(UNIX では「失敗」)、make を停止します (-k
オプションを使用していない場合)。
make プログラム自体は0
、ビルドしようとしたすべてのターゲットが成功した場合にのみ終了します。
したがって、正しく記述されていれば、サブ make が失敗したときに make が停止します。そうでない場合は、サブ make を呼び出すルールが終了コードを失っているため、親の make は失敗しません。ルールを提供していただければ、それを修正する方法を正確にお伝えできます。
私の経験に基づいて、サブメイクを実行するために次のようなルールを使用することをお勧めします。
SUBDIRS = foo bar biz
all:
for d in $(SUBDIRS); do $(MAKE) -C $$d; done
.PHONY: all
ここでは、各サブ make の終了コードをチェックしていないため、停止しません。最後のコマンドの最終終了コードのみがシェルから make に返されます。Makefile を次のように書き換える必要があります (このように見える場合)。
SUBDIRS = foo bar biz
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
.PHONY: all $(SUBDIRS)
編集
メイクファイルに基づいて上記を読むと、何が問題なのかがわかります。スクリプトの最後のコマンドはpopd
失敗しないため、コマンドの終了コードは成功です。pushd
ここではandを使用する必要がないことに注意してくださいpopd
(少なくとも UNIX システムでは)。これは、各コマンドが個別のシェル内で実行されるため、シェルが終了すると作業ディレクトリがリセットされるためです。
次のようなものが必要です。
all:
cd "${STA_DIR}" && ${MAKE} clean && ${MAKE} ARGS="${A1},${A2}"
オペレーターは、成功の&&
ための短絡テストです。これらのコマンドのいずれかが失敗すると、コマンド全体がすぐに失敗します。
また、再帰的な make を呼び出すときは常に$(MAKE)
orを使用することを忘れないでください (それらは同一です)。 static は使用しないでください。${MAKE}
make