2011-06-20 10 views
10

Kriterler: Makefile bir GNU Make Makefile - Makepp, qmake, cmake vb. Ile ilgilenmiyorum. cmake), ama bu iş için ve işte GNU Make kullanıyoruz. En uygun çözüm, sizin için ayrıştıran bir kabuk betiği yerine saf bir Makefile çözümüdür.GNU Makefile eşdeğeri 'TRAP' komutunun eşdeğer tanımlaması için çıkışta yetersizlik tespitinde

Ayrıca bir 'hataya devam et' çözümü yapmak istemiyorum - eğer bozuksa, bozuk ve düzeltilmesi gerekiyor.

Durum şu ki, paralel olarak birkaç dizin oluşturan bir makefile var - bunlardan biri başarısız olursa, elbette tüm yapı başarısız oluyor, ancak tüm çalışma tamamlanıncaya (veya başarısızlığa) kadar devam etmiyor. Bu, gerçekte başarısızlığa uğramanın nedeninin, çıktının çıktısından sonuna kadar keyfi bir yere gömüldüğü anlamına gelir. I ve 'turuncu' başarısız olur '-j 5 yapmak' çalıştırırsanız

all: $(SUBDIRS) 

SUBDIRS = \ 
    apple \ 
    orange \ 
    banana \ 
    pineapple \ 
    lemon \ 
    watermelon \ 
    grapefruit 

$(SUBDIRS): 
    cd [email protected] && $(MAKE) $(MFLAGS) 2>&1 | sed -e "s/^/$(notdir $(@)): /g" 

- Ben böyle bir tablo görmek istiyorum: Burada

bende ne bir örnek marka sürecin sonu

apple  - passed 
    orange - FAILED 
    banana - passed 
    pineapple - passed 
    lemon  - passed 

bir & & yankı "geçti"> .result || sahip kabul ettik echo "FAILED"> .result, ancak yine de çıkışta onlara yazdırmak için bir çeşit TRAP veya __onexit() cleanup komutuna ihtiyaç duyar.

Herhangi bir Makefile ninjaları bunun için saf makefile çözüm var mı?

un-edit - çözümüm aslında umduğum şekilde çalışmadı .. STYMIED!

+1

Bu durumu muhtemelen 'set -o pipefail' hazırlayarak artırabilirsiniz; '' $ (SUBDIRS) 'komutuna göre, başarısız bir' $ (MAKE) 'un sıfır olmayan çıkış kodu artık 'sed'ün başarılı çıkışı tarafından gizlenmez. – slowdog

+0

Eğer 'turuncu' başarısız olursa, portakal, muz vb. Ile devam etmesini ister misiniz? – Beta

+0

@slowdog - Yapmanın çıkış kodu mutlaka sorun değil, bu iyi bir nokta, sizin için +1 – synthesizerpatel

cevap

0

gördüğüm tek yolu bir alt marka ile kendini yürütme geçerli:

all : subdirs 

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

subdirs-recursive: $(SUBDIRS) 
3

hemen ilk yetmezliği, sonunda iptal ve beklemek yerine tüm uçak içi işleri öldürmek yapmak istediğinizde onları bu yazı açıklandığı gibi, GNU Sonra (bir boru kullanıyorsanız yanı sıra set -o pipefail) çağırır yapmak her kabuk için tuzak kurmaya gerek bu http://lists.gnu.org/archive/html/bug-make/2009-01/msg00035.html

gibi yap yama gerekiyor bitirmek için http://lists.gnu.org/archive/html/help-make/2009-02/msg00011.html

Özetle

: "bunlardan biri başarısız olursa, elbette bütün yapı başarısız, ancak tüm çalışan tamamlanmasından (veya başarısızlık) çalıştırmak yapar kadar olmaz"

target1: 
    trap 'kill $$(jobs -p)'; command && something || something-else 
target2: 
    trap 'kill $$(jobs -p)'; set -o pipefail; command | sed '...'