2008-10-20 7 views
5

Mam Makefile budowy wielu plików C o długich kolejkach długo dowodzenia i mamy oczyścić wyjście poprzez zasady takie jak:Pierwsze Quiet Marka echo linii poleceń w przypadku błędu

.c${MT}.doj: 

     @echo "Compiling $<";\ 
     $(COMPILER) $(COPTS) -c -o [email protected] $< 

Teraz to jest wielki as @ wyłącza emitowaną linię kompilacji. Ale kiedy pojawia się błąd, dostajemy tylko komunikat o błędzie, bez linii poleceń. Czy ktoś może pomyśleć o "zgrabnym" sposobie emisji linii poleceń? Wszystko, co mogę zrobić, to wysłać je do pliku i mieć wyższy poziom, aby złapać błąd i zamknąć plik. Hacky, wiem.

Odpowiedz

7

Przetestowane i to działało (GNU zrobić w Linuksie):

.c${MT}.doj: 
    @echo "Compiling $<";\ 
      $(COMPILER) $(COPTS) -c -o [email protected] $< \ 
      || echo "Error in command: $(COMPILER) $(COPTS) -c -o [email protected] $<" \ 
      && false 
+2

Należy zauważyć, że w ten sposób nie można już zauważyć, że polecenie nie powiodło się i będzie kontynuowane tak, jakby się powiodło. Może na końcu dodać "&& false", aby to zrekompensować. – mweerden

+0

Potrzebowałem dodać nawiasy, takie jak: @echo ...; kompilować ... || (echo ... && false) –

0

Prostym rozwiązaniem byłoby użyć prostego skryptu abc jak następuje:

#!/bin/bash 

[email protected] 
code=$? 
if ((code)); then 
    echo error running [email protected] 
fi 
exit $code 

Następnie można napisać abc $(COMPILER) $(COPTS) -c -o [email protected] $< w Twój Makefile. Zauważ, że to nie działa, gdy masz potoki lub przekierowania (ponieważ będą one stosowane do zamiast polecenia, które chcesz uruchomić).

Można również po prostu wstawić podobny kod bezpośrednio w numerze Makefile, jeśli jest to zalecane.

0

Niedawno skorzystałem z narzędzia o nazwie logtext, aby śledzić, jakie dane wyjściowe wystąpiły w trakcie wykonywania pliku nietoperza. Sprawdź to, może się okazać, że jest to przydatne, jeśli chcesz wiedzieć, gdzie wystąpił błąd.

7

To pytanie jest dość stary, ale dla tych z was Googling, myślę co będę robić w tej sytuacji jest alias make do make -s (tryb cichy) w swojej skorupy, a jedynie umieścić @ prefiksu przed liniami gdzie echo lub inne wywołania diagnostyczne są wywoływane. Kiedy chcę uzyskać pełną wydajność od make, nadpisam mój alias, nazywając go jako \make.

Należy również pamiętać, że w tej sytuacji konieczne będzie wykonanie typowej czynności i umieszczenie @echo we własnym wierszu, przy użyciu rzeczywistych poleceń reguł w osobnych wierszach i bez numerów @.