2008-10-20 6 views
5

Ich habe eine Makefile viele C-Dateien mit langen langen Befehlszeilen zu bauen und wir haben die Ausgabe von Regeln, die wie gereinigt:Erst Quiet Make zu Befehlszeilen auf Fehler echo

.c${MT}.doj: 

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

Nun ist dies groß da das @ die Kompilierungszeile unterdrückt, die ausgegeben wird. Aber wenn wir einen Fehler bekommen, erhalten wir nur die Fehlermeldung, keine Befehlszeile. Kann jemand an eine "ordentliche" Möglichkeit denken, die Befehlszeile auszugeben? Alles, was ich mir vorstellen kann, ist, es in einer Datei widerzuspiegeln und eine höhere Ebene zu haben, um den Fehler zu finden und die Datei zu catchen. Hacky, ich weiß.

Antwort

7

getestet und es funktionierte (GNU in Linux machen):

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

Beachten Sie, dass auf diese Weise nicht mehr bemerkt wird, dass der Befehl fehlgeschlagen ist, und weiter so, als ob es erfolgreich war. Vielleicht können Sie am Ende ein "&& false" hinzufügen, um dies auszugleichen. – mweerden

+0

Ich musste Klammern wie hinzufügen: @echo ...; kompilieren ... || (echo ... && false) –

0

Eine einfache Lösung ein einfaches Skript abc wie das zu verwenden, wäre folgende:

#!/bin/bash 

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

Dann können Sie schreiben abc $(COMPILER) $(COPTS) -c -o [email protected] $< in Ihre Makefile. Beachten Sie, dass dies nicht funktioniert, wenn Sie Pipes oder Redirects haben (da sie auf abc anstelle des Befehls angewendet werden, den Sie ausführen möchten).

Sie können auch ähnlichen Code direkt in die Makefile setzen, wenn das vorzuziehen ist.

0

Ich habe vor kurzem ein Dienstprogramm namens logtext für die Art der Verfolgung verwendet, was während der Ausführung einer Fledermausdatei ausgegeben wurde. Schauen Sie es sich an, Sie finden es vielleicht nützlich, wenn Sie wissen wollen, welcher Fehler wo aufgetreten ist.

7

Diese Frage ist ziemlich alt, aber für die von Ihnen googeln, ich denke, was ich in dieser Situation make-make -s (Silent-Modus) ist alias tun werde in meiner Schale, und nur setzen die @ Präfix vor Zeilen, in denen echo oder andere Diagnosebefehle werden aufgerufen. Wenn ich die volle Ausgabe von make möchte, überschreibe ich meinen Alias, indem er es als \make nennt.

Beachten Sie auch, dass Sie in dieser Situation die typische Sache tun müssen und setzen Sie die @echo auf eine eigene Zeile, mit den eigentlichen Regelbefehlen in separaten Zeilen und ohne @.