2010-06-30 10 views

risposta

21

In realtà ero alla ricerca di qualcosa d'altro, aggiungendo questa linea al Makefile:

.SILENT:clean 

mentre si esegue in modo silenzioso ogni passaggio del target "pulito".

Fino a quando qualcuno non punta qualche inconveniente a questo, io uso questa come la mia soluzione preferita!

+10

lo svantaggio è che non si ottiene mai alcun feedback dal proprio marchio e non c'è nessun opposto di "silenzioso" da parte della riga di comando per disattivarlo. È come usare un martello per aprire un barattolo. –

7

Se si mette un @ davanti al comando, non fa eco sulla shell. Prova a cambiare rm in @rm. (Reference)

63

Per iniziare con: il comando effettivo deve essere sulla riga successiva (o almeno questo è il caso di GNU Make, potrebbe essere differente con l'altro Marchio di - Non sono sicuro di questo)

clean: 
    rm -rf *.o 

(nota, è necessario un TAB prima rm -rf *.o come in ogni regola)

Rendere più silenzioso può essere fatto anteponendo un @:

così makefile diventa

clean: 
    @rm -rf *.o 

Se non ci sono file *.o da eliminare, si potrebbe ancora finire con un messaggio di errore. Per sopprimere questi, aggiungere il seguente

clean: 
    [email protected] -rf *.o 2>/dev/null || true 
  • 2>/dev/null tubi alcun messaggio di errore/dev/null - in modo da non vedere eventuali errori
  • il - davanti al comando fa in modo che ignora make un codice di ritorno diverso da zero
+1

Questo è il modo classico di gestirlo desiderare bash, ma stavo cercando il modo GNU di risolvere questo problema. E ovviamente avevo il comando sulla riga successiva, ho appena scritto la domanda in fretta. BTW, cosa ne pensi della risposta .SILENT (che un mio amico ha trovato)? – claf

+0

Non ho davvero usato .silent, il manuale di GNU Make afferma che è supportato solo per ragioni storiche, ma mi piace. È meno dettagliato di molti '@' nei tuoi comandi. – plof

+1

Vieni a pensarci, il '-' e il' || vero? insieme sono troppi - o uno di loro dovrebbe bastare. Ne hai bisogno per impedire a Gnu Make di uscire se non c'è nulla da eliminare. Sarebbe stato meglio usare 'rm -f * .o', dal momento che non restituisce un errore se non c'è nulla da eliminare. – plof

3

Dal manuale: .SILENT is essentially obsolete since @ is more flexible.

Molto peggio è che fanno stampe troppe informazioni. Avvertenza/errore/messaggi privati ​​sono sepolti nell'output. D'altra parte -s (.SILENT) sopprime qualsiasi cosa. Soprattutto i messaggi "niente da fare" e "aggiornato" possono essere un dolore. Non c'è un'opzione per sopprimerli. Devi filtrarli attivamente o usare qualcosa come colormake. Ecco una soluzione per grep:

make | egrep -hiv 'nothing to be done|up to date' 

Ma l'uscita avrà i numeri di riga.La soluzione Perl è quindi migliore, perché sopprime i numeri di riga e vampate di stdout subito:

make | perl -ne '$|=1; print unless /nothing to be done|up to date/i' 

Fare uno strumento imperfetto. "What’s Wrong With GNU make?" spiega questo meglio di me.

10

Sto rispondendo a questo argomento antico perché è in alto nella ricerca e le risposte sono confuse. Per fare solo ciò che l'utente desidera, tutto ciò che serve è:

clean: 
    @rm -f *.o 

Il simbolo @ che fa non riecheggerà quel comando. L'argomento -f a rm indica a rm di ignorare eventuali errori, ad esempio che non ci sono file *.o e di restituire sempre il successo.

Ho rimosso il -r dall'esempio OP, perché significa ricorsivo e qui siamo solo rm ing .o file, niente da recurse.

Non è necessario il 2>&1 >/dev/null perché con il -f non verranno stampati errori.

.SILENT: clean 

lavori al posto del @, ma non è nello stesso luogo nel Makefile del comando che colpisce, in modo che qualcuno mantenere il progetto in seguito potrebbe essere confuso. Ecco perché @ è preferito. È migliore località di riferimento.