2011-06-20 10 views
10

Kryteria: Makefile to GNU Make Makefile - nie interesuje mnie makepp, qmake, cmake, itp. Wszystkie są ładne (szczególnie cmake), ale to jest do pracy i do pracy używamy GNU Make. Optymalnym rozwiązaniem jest czyste rozwiązanie Makefile zamiast skryptu powłoki, który parsuje dla ciebie.GNU Makefile odpowiednik polecenia shell 'TRAP' dla zwięzłej identyfikacji niepowodzenia kompilacji przy wyjściu

Ja także nie chcę robić rozwiązania "kontynuuj na porażce" - jeśli jest uszkodzone, jest zepsute i musi zostać naprawione.

Sytuacja jest następująca: Mam plik makefile, który równolegle buduje kilka katalogów - jeśli jeden z nich zawiedzie, oczywiście cała kompilacja się nie powiedzie, ale nie, dopóki wszystkie uruchomienia nie zakończą się (lub nie powiodą się). Oznacza to, że powód, dla którego faktycznie się nie udało, jest pochowany gdzieś arbitralnie daleko od końca produkcji kreacji.

Oto przykład tego, co mam:

all: $(SUBDIRS) 

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

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

jeśli uruchomię „make -j 5” i „pomarańczowe” dzieje się niepowodzeniem - Chciałbym zobaczyć tabelę tak u koniec procesu make

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

ja uważane mającą & & echo "przeszedł"> .result || echo "FAILED"> .result, ale nadal potrzebuje jakiegoś polecenia czyszczenia TRAP lub __onexit(), aby wydrukować je przy wyjściu.

Każdy ninja z gry Makefile ma do tego rozwiązanie z czystym makefile?

un-edit - moje rozwiązanie nie działało tak jak miałem nadzieję ... STYMIED!

+1

Prawdopodobnie możesz poprawić tę sytuację, poprzedzając 'set -o pipefail; 'do polecenia' $ (SUBDIRS) ', więc niezerowy kod wyjścia nieudanego' $ (MAKE) 'nie jest już ukryty przez pomyślne zakończenie' sed'. – slowdog

+0

Jeśli 'pomarańczowy' nie powiedzie się, chcesz kontynuować z pomarańczą, bananem itp.? – Beta

+0

@slowdog - Kod zakończenia make niekoniecznie jest problemem, ale to dobra rzecz, +1 dla ciebie – synthesizerpatel

Odpowiedz

0

Jedynym sposobem, widzę to samo wykonanie z sub-marki:

all : subdirs 

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

subdirs-recursive: $(SUBDIRS) 
3

Gdy chcesz zrobić, aby natychmiast przerwać przy pierwszej awarii, koniec i zabić wszystkich miejsc pracy w locie, zamiast czekać na im do końca, trzeba załatać GNU make jak ten http://lists.gnu.org/archive/html/bug-make/2009-01/msg00035.html

Następnie trzeba ustawić pułapkę na każdej muszli, które sprawiają, wywołuje (jak również set -o pipefail jeśli używasz rury), jak opisano w tym poście http://lists.gnu.org/archive/html/help-make/2009-02/msg00011.html

W skrócie: „jeśli jeden z nich zawiedzie, oczywiście cała budowa zakończy się niepowodzeniem, ale nie aż cały bieg sprawia prowadzony do końca (lub porażki)”

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