2011-06-20 1 views
10

基準: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!

+1

おそらく 'set -o pipefail;を前に置くことによってその状況を改善することができます。 '$(SUBDIRS)'コマンドに渡されるので、失敗した '$(MAKE)'の非ゼロ終了コードは 'sed'の成功した終了によって隠されなくなりました。 – slowdog

+0

'orange 'に失敗した場合は、オレンジ、バナナなどで処理しますか? – Beta

+0

@slowdog - makeの終了コードは必ずしも問題ではありませんが、良い点です+1、あなたのために+1 – synthesizerpatel

答えて

0

私が見る唯一の方法は、サブメイクと自己実行です:

all : subdirs 

subdirs : 
    $(MAKE) -f $(lastword $(MAKEFILE_LIST)) subdirs-recursive || cat log 

subdirs-recursive: $(SUBDIRS) 
3

あなたはすぐに最初の失敗、最後に中断して待っているのではなく、すべての飛行中のジョブを殺すために作りたいとき彼らは、この記事で説明するように、GNUはその後、あなたは(あなたがパイプを使用する場合と同様にset -o pipefail)を呼び出しを行うすべてのシェルのためのトラップを設定する必要があり、この http://lists.gnu.org/archive/html/bug-make/2009-01/msg00035.html

のようにしてくださいパッチを適用する必要があり、終了しhttp://lists.gnu.org/archive/html/help-make/2009-02/msg00011.html

一言で言えば:「そのうちの一つが失敗した場合、もちろん全体のビルドは失敗しますが、全ての走行が完了(または失敗)に実行させないまで」

target1: 
    trap 'kill $$(jobs -p)'; command && something || something-else 
target2: 
    trap 'kill $$(jobs -p)'; set -o pipefail; command | sed '...' 
関連する問題