5 Stimmen

Quiet Make dazu bringen, bei einem Fehler die Befehlszeilen auszugeben

Ich habe ein Makefile, das viele C-Dateien mit langen, langen Befehlszeilen erstellt, und wir haben die Ausgabe mit Regeln wie diesen bereinigt:

.c${MT}.doj:

        @echo "Compiling $<";\
         $(COMPILER) $(COPTS) -c -o $@ $<

Das ist großartig, denn das @ unterdrückt die Ausgabe der Kompilierzeile. Aber wenn ein Fehler auftritt, erhalten wir nur die Fehlermeldung, aber keine Befehlszeile. Fällt jemandem eine "saubere" Möglichkeit ein, die Befehlszeile auszugeben? Das einzige, was mir einfällt, ist ein Echo in eine Datei zu schreiben und ein übergeordnetes Programm den Fehler abfangen und die Datei katalogisieren zu lassen. Hacky ich weiß.

7voto

Rajish Punkte 6635

Getestet und es hat funktioniert (GNU make in Linux):

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

2 Stimmen

Beachten Sie, dass make auf diese Weise nicht mehr bemerkt, dass der Befehl fehlgeschlagen ist, und so fortfährt, als wäre er erfolgreich gewesen. Vielleicht können Sie ein "&& false" am Ende hinzufügen, um dies zu kompensieren.

0 Stimmen

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

7voto

Seth Kingsley Punkte 432

Diese Frage ist schon ziemlich alt, aber für diejenigen, die googeln, denke ich, dass ich in dieser Situation einen Alias verwenden werde make à make -s (stiller Modus) in meiner Shell, und setze nur die @ Präfix vor Zeilen, in denen echo oder andere Diagnosebefehle aufgerufen werden. Wenn ich die vollständige Ausgabe von make werde ich meinen Alias überschreiben, indem ich ihn als \make .

Beachten Sie auch, dass Sie in dieser Situation das übliche tun müssen und die @echo in einer eigenen Zeile, wobei die eigentlichen Regelbefehle in separaten Zeilen und ohne @ 's.

0voto

mweerden Punkte 12961

Eine einfache Lösung wäre die Verwendung eines einfachen Skripts abc wie die folgenden:

#!/bin/bash

$@
code=$?
if (( code )); then
  echo error running $@
fi
exit $code

Dann können Sie schreiben abc $(COMPILER) $(COPTS) -c -o $@ $< in Ihrem Makefile . Bitte beachten Sie, dass dies nicht funktioniert, wenn Sie Pipes oder Redirects haben (da diese auf abc anstelle des Befehls, den Sie ausführen möchten).

Sie können auch einfach ähnlichen Code direkt in die Makefile wenn Sie das bevorzugen.

0voto

Ich habe kürzlich ein Dienstprogramm namens Logtext um nachzuvollziehen, welche Ausgaben im Laufe der Ausführung einer Bat-Datei erfolgt sind. Probieren Sie es aus, vielleicht finden Sie es ganz nützlich, wenn Sie wissen wollen, welcher Fehler wo aufgetreten ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X