Mi chiedo come posso evitare qualche eco in un Makefile:messaggi Sopprimere a make clean (Makefile rimuovere silenziosa)
clean:
rm -fr *.o
questa regola stamperà:
$>make clean
rm -fr *.o
$>
Come posso evitare quella?
Mi chiedo come posso evitare qualche eco in un Makefile:messaggi Sopprimere a make clean (Makefile rimuovere silenziosa)
clean:
rm -fr *.o
questa regola stamperà:
$>make clean
rm -fr *.o
$>
Come posso evitare quella?
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!
Se si mette un @ davanti al comando, non fa eco sulla shell. Prova a cambiare rm in @rm. (Reference)
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-
davanti al comando fa in modo che ignora make
un codice di ritorno diverso da zeroQuesto è 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
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
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
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.
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.
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. –