2016-04-12 7 views
1

Ich weiß, die stille Flag (-s) für make wird das Rezept vollständig Echo, aber das macht es schwer zu sehen, Fortschritt.Reduce rezept echo in machen

Zum Beispiel zur Zeit habe ich Hunderte von Zeilen wie (ich habe die Linie gebrochen passen SO):

g++ -I.  -std=c++11 -Wall -Wno-unused-local-typedefs -Wno-literal-suffix 
-Wno-unused-but-set-variable `wx-config --cxxflags --unicode=no` 
-MT dialog_export.o -MD -MP -MF .deps/dialog_export.Tpo 
-c -o dialog_export.o dialog_export.cpp 

Es wäre toll, wenn es nur ein Teil der Linie gedruckt werden könnte, sagen ohne die Fahnen, so etwas wie:

g++ dialog_export.o dialog_export.cpp 

Oder nur ein Weg Fortschritt zu sehen, aber ohne die Konsole mit einer Tonne von Nachrichten Spam.

+0

Ich glaube nicht, dass es eine make-Funktionalität dafür gibt. Es kann jedoch trivial sein, Makefile zu ändern, wenn es Pattern-Regeln verwendet. Ein anderer Weg kann das Schreiben von Wrapper (z.B.in bash) und es als Ersatz für 'CXX' verwenden, die Befehlszeichenfolge parsen wird, interessante Optionen Echo, und führen Sie g ++ (hässlich; sehr nicht empfohlen). – keltar

Antwort

0

Eine Reihe von Build-Systemen von den Autotools zum Kernel-Build-System zu CMake, etc. machen so etwas.

Der Trick ist, dynamisch zu steuern, ob das Schweigen zu bringen @ auf den Rezeptzeilen vorhanden ist oder nicht, und wenn sie es mit einem einiger freundlichen Nachricht manuellen Echo zu ersetzen.

Um eine Nachricht wie zu bekommen, was Sie wollen Sie so etwas wie diese verwenden würde:

E_g++ := @echo 'g++ $(filter %.o,$^) [email protected]' 

%.o: %.cpp 
    $(E_g++)g++ ... -o [email protected] $^ 

Um diese Art der Sache für mich leichter zu machen in Projekte, die die Autotools oder irgendetwas nicht so verwende ich schrieb Silent Make Rules.

Welche würden Sie wie folgt verwenden:

include silent_rules.mk 

$(eval $(call vrule,G++,g++ $$(filter %.o,$$^) [email protected])) 

%.o: %.cpp: 
     $(SR_V_G++)g++ ... -o [email protected] $^ 

Dies würde auch (wie die Autotools und Kernel-Versionen machen) können Sie V=1 auf der make Befehlszeile angeben, um die normalen make Ausgabe und Verwendung zu gehen zurück V=-1, um die Ausgabe vollständig zum Schweigen zu bringen.

0

Ich mag Regeln wie folgt aus:

dialog_export.o: dialog_export.cpp 
    @echo [email protected] 
    @g++ -I. -std=c++11 -Wall -Wno-unused-local-typedefs -Wno-literal-suffix -Wno-unused-but-set-variable `wx-config --cxxflags --unicode=no` -MT dialog_export.o -MD -MP -MF .deps/dialog_export.Tpo -c -o [email protected] $< 

Die führenden ‚@‘ Symbole unterdrücken Befehl Echo, und der erste Befehl spiegelt den Namen des Ziel:

dialog_export.o... 

Wenn Sie eine Make-Datei haben Mit Hunderten von Regeln können Sie alle in wenigen Minuten mit einem guten Editor in diese Form konvertieren. Oder schneller mit einem Makro oder sed, wenn Sie fett sind.

(. Wenn Sie Hunderte von Zeilen wie die haben, können Sie Ihre Make-Datei wahrscheinlich ziemlich viel vereinfacht werden, aber das ist für einen anderen Tag)

0

ich immer $(Q) verwenden:

ifeq ("$(V)","1") 
Q := 
vecho = @echo 
else 
Q := @ 
vecho = @true 
endif 

somerule: 
    $(vecho) building [email protected] verbosely 
    $(Q)do command 

Sie können dann Ändern Sie Ihre Musterregeln so, dass nur der Text ausgegeben wird, der Ihnen wichtig ist. Wenn Sie mehr ausführlich benötigen, dann bauen Sie einfach mit make V=1. Ich denke nicht, dass es eine Abkürzung dafür gibt, dies automatisch zu speichern, indem Sie Ihre Ausgabe über sed leiten (was ich nicht empfehlen würde).