基準:MakefileはGNU make Makefileです - 私はmakepp、qmake、cmakeなどに興味がありません。 cmake)ですが、これは仕事用であり、仕事ではGNU Makeを使用します。最適な解決策はmakeをパースするシェルスクリプトではなく、純粋なMakefileソリューションです。GNU Makefileはシェルの 'TRAP'コマンドと同等の意味を持ち、終了時にビルドに失敗することを明確にしています。
私はまた、「失敗した場合は続行」の解決策を望んでいません。壊れている場合は、壊れていて修正する必要があります。
これは、複数のディレクトリを並行してビルドするmakefileを持っています。そのうちの1つが失敗すると、ビルド全体が失敗しますが、実行中のすべてのmakeが完了(または失敗)するまで実行されません。これは、makeが実際に失敗した理由が、makeの出力の終わりから任意に離れた場所に埋められていることを意味します。ここで
は、私が持っているものの例です:
all: $(SUBDIRS)
SUBDIRS = \
apple \
orange \
banana \
pineapple \
lemon \
watermelon \
grapefruit
$(SUBDIRS):
cd [email protected] && $(MAKE) $(MFLAGS) 2>&1 | sed -e "s/^/$(notdir $(@)): /g"
私が実行している場合は「-j 5作る」と「オレンジ」は失敗を起こる - 私はでこのようなテーブルを見てみたいと思いますmakeプロセスの終了 は
apple - passed
orange - FAILED
banana - passed
pineapple - passed
lemon - passed
私は& &エコー "合格"> .result ||持つと考えられてきましたecho "FAILED"> .resultですが、makeは終了時に何らかの種類のTRAPまたは__onexit()cleanupコマンドを使用して印刷する必要があります。
メイクファイルのninjasには、純粋なmakefileソリューションがありますか?
un-edit - 私のソリューションは実際に私が望んでいた方法では動作しませんでした.. STYMIED!
おそらく 'set -o pipefail;を前に置くことによってその状況を改善することができます。 '$(SUBDIRS)'コマンドに渡されるので、失敗した '$(MAKE)'の非ゼロ終了コードは 'sed'の成功した終了によって隠されなくなりました。 – slowdog
'orange 'に失敗した場合は、オレンジ、バナナなどで処理しますか? – Beta
@slowdog - makeの終了コードは必ずしも問題ではありませんが、良い点です+1、あなたのために+1 – synthesizerpatel