3

Makefile(GNU)でサブメイクを使用しています。ただし、サブ make が失敗するたびに、メインの make はその後も引き続き正常に実行されます。サブ make が失敗するたびに、メインの Makefile が失敗するようにします。それ、どうやったら出来るの?

all:   
    pushd ${STA_DIR};make clean;make ARGS=${A1},${A2};popd

STA_DIR の make が失敗するたびに、メインの make は停止しません。メインメイクを止めてもらいたいです。

4

1 に答える 1

9

ルールがどのように見えるかについて詳細を提供しなかったため、その質問にはお答えできません. 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

于 2013-05-11T00:25:36.420 に答える