2009-04-20 6 views
0

Bei einigen Compilern können Sie Warnungen als Fehler festlegen, so dass Sie keine Compiler-Warnungen zurücklassen, da der Code andernfalls nicht erstellt wird. Das ist eine gute Sache.Shell-Skript, um Warnungen als Fehler zu emulieren?

Leider haben einige Compiler nicht ein Flag für Warnungen-als-Fehler.

Ich muss ein Shell-Skript oder Wrapper schreiben, die die Funktion bereitstellt.

Vermutlich analysiert es die Ausgabe der Kompilierungskonsole und gibt Fehler zurück, wenn Compilerwarnungen vorhanden waren (oder Fehler), und andernfalls erfolgreich. "Misserfolg" bedeutet auch (ich denke), dass Objektcode nicht erzeugt werden sollte.

Was ist der kürzeste, einfachste Sie UNIX/Linux-Shell-Skript darüber trifft die expliziten Anforderungen schreiben kann, sowie die folgenden impliziten Anforderungen der ansonsten genauso wie der Compiler verhält: - akzeptiert alle Flaggen, Optionen, Argumente - unterstützt Umleitung von Stdout und Stderr - produziert Objektcode und Links wie angegeben

Schlüsselwörter: elegant, erfüllt alle Anforderungen.

Extra-Kredit: einfach in eine GNU-Datei zu integrieren.

Danke für Ihre Hilfe.

=== === Clues Diese Lösung auf ein anderes Problem, Shell-Funktionen (?), Append text to stderr redirects in bash könnte Figur in. Frage mich, wie litb ‚s Freund einladen meine Adresse " die bash recht gut kennt" Frage?

=== Antwort Status ===

Dank Charlie Martin für die kurze Antwort, aber das ist leider, was ich begann mit. Vor einer Weile benutzte ich das, entließ es für den Bürogebrauch und innerhalb weniger Stunden wurde mir der schwerwiegendste Nachteil aufgezeigt: Es wird eine Kompilation ohne Warnungen, aber nur Fehler übergeben. Das ist wirklich schlecht, denn dann liefern wir Objektcode, der der Compiler wird nicht funktionieren. Die einfache Lösung erfüllt auch nicht die anderen aufgeführten Anforderungen.

Dank Adam Rosenfield für die Kurzschrift und Chris Dodd für die Einführung von Pipefail zur Lösung. Chris ' Antwort am nächsten, weil ich denke, die Pipefail sollte sicherstellen, dass, wenn die Kompilierung tatsächlich bei Fehler fehlschlägt, dass wir Fehler erhalten, wie wir sollten. Chris, funktioniert Pipefail in allen Shells? Und haben Sie irgendwelche Ideen zu den übrigen oben genannten impliziten Anforderungen?

Antwort

0

Hmmm.

$ (kompilieren-Befehl 2> & 1 | grep 'Warning') & & Ausfahrt 1

Dies ist keine sehr hilfreich ein, aber sie specififed "kürzeste". Natürlich müsste die 'Warning'-Zeichenfolge modifiziert werden, um mit dem Compiler übereinzustimmen.

Eine bessere Version wäre, die Ausgabe über grep zu pipen, nach Warnungen zu suchen und ein Flag zu setzen, danach, wenn das Flag gesetzt ist, eine Nachricht über gefundene Warnungen auszudrucken und mit einem anderen Returncode als 0 zu beenden.

0

Dies sollte es tun:

$ if compile-command |& tee /dev/tty | grep -q 'Warning'; then false; else true; fi 

|& Das Konstrukt ist eine Abkürzung für 2>&1 | (das heißt, sie leitet sowohl stdoutstderr und in die Rohrleitung). Wenn Sie tee /dev/tty in die Pipeline setzen, wird sichergestellt, dass Sie weiterhin die Ausgabe des Compilers auf der Konsole sehen. Wenn Sie es an grep -q 'Warning' weiterleiten, wird der Exit-Status 1 angezeigt, wenn keine Warnungen gefunden wurden, oder 0, wenn Warnungen gefunden wurden. Schließlich wird durch das Umbrechen in einem if ...; then false; else true; fi der Beendigungsstatus invertiert, sodass der Beendigungsstatus 0 ist, wenn keine Warnungen gefunden wurden (Erfolg), oder 1, wenn Warnungen gefunden wurden (Fehler).

0

Solange Sie bash verwenden, so etwas wie:

set -o pipefail; compile-command 2>&1 | if grep -q -i warning; then exit 1; fi 

sollte den Trick

1

tun Wie über den Make-Befehl mit einer "make" Funktion zu ersetzen, die die stdout und stderr Streams Swaps :

# cf. http://codesnippets.joyent.com/posts/show/8769 
unset -f make 
function make() { 
    command make "${@}" 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr | \ 
     grep -E -i --line-buffered 'error|warning' | \ 
     head -n 1 > stderr_make.log && { echo; return 1; } 
    return 0 
} 
0

Hier ist noch eine weitere Version einer "make" Funktion (für Bash), die stdout als auch anmelden können:

# cf. http://wiki.bash-hackers.org/howto/redirection_tutorial 
unset -f make 
function make() { # logs stdout & stderr 
    { 
    { 
     command make "${@}" 3>&- | 
      tee stdout_make.log 2>&3 3>&- 
    } 2>&1 >&4 4>&- | 
     grep -E -i --line-buffered 'error|warning' 2>&3 3>&- | 
      head -n 1 > stderr_make.log && 
       { echo; cat stderr_make.log; echo; return 1; } 
    } 3>&2 4>&1 

    return 0 
} 
Verwandte Themen