2012-06-21 12 views
6

Ich verwende SCons, um ein Projekt bei der Arbeit zu erstellen, und ich versuche, durch die Textausgabe von GCC zu analysieren, um einen zusammenfassenden Bericht aller Compilerwarnungen zu erstellen jedes Ziel, weil unsere Build-Skripte ziemlich lang sind und es eine Menge Textausgabe an die Konsole gibt.SCONS: Speichern/Redirect gcc Textausgabe (Warnungen)

Ich habe Google und diese Website für eine ganze Weile durchsucht, und ich kann eine Methode nicht finden, die in SCons integriert ist, um dies zu erreichen. Ich habe versucht, den gesamten stdout und stderr-Strom in eine Datei per this example umzuleiten, aber nur die Ausgabe von SCons selbst wird erfasst und nicht die von irgendwelchen Werkzeugen, die es anruft.

Mein nächster Gedanke war zu finden, wo SCons die Argumente kompiliert, um an GCC zu senden und Umleitung an dem Ende der Argument-Zeichenfolge hinzuzufügen. Nach dem Lesen der Dokumentation scheint es, dass die Konstruktionsvariablen CCCOM und CXXCOM die Befehlszeile zum Kompilieren enthalten. Als ich jedoch die Zeilen unten zu meinem SConstruct hinzugefügt habe, hat sich in den Befehlszeilen, die SCons ausführt, nichts geändert.

baseEnv['CCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt" 

Eine Sache, die Arbeit getan wurde auf dem gesamten SCons Befehl Stderr Strom umleiten:

scons 2> stderr.txt 

Ich mag würde dies zu vermeiden, aber, und enthalten alles, was innerhalb SCons, wenn möglich. Die Ausgabe muss auch nicht unbedingt in eine Datei gehen. Es kann überall gespeichert werden, solange ich darauf zugreifen kann, um es am Ende des Builds zu parsen und in einer Datei zu speichern.

Ich habe so lange gesucht und nichts gefunden, also weiß ich nicht, was ich sonst noch versuchen sollte. Ich muss glauben, dass ich nicht der Erste bin, der so etwas machen wollte.

Antwort

5

Ich werde meine eigene Frage hier beantworten, als ich herausgefunden habe, was ich falsch gemacht habe. Die CCCOM und CXXCOM Variablen waren die richtigen, die geändert werden mussten, aber das Problem war, dass ich Shared-Library-Objekte erstellte, so dass diese Variablen nicht verwendet wurden. Die, die ich hätte ändern sollen, sind SHCCCOM und SHCXXCOM.

Der folgende Code bekam den Job zum Umleiten der GCC Warnung ausgegeben getan (Warnungen und Fehler nur in stderr geschrieben):

baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt" 

Hoffentlich diese Antwort hilft andere, da ich nicht viele Informationen hierzu finden konnte, Thema beim Suchen.

0

Anstatt der CCCOM und CXXCOM Konstruktionsvariablen, haben Sie versucht mit den CC und CXX Variablen? Here's eine vollständige Liste der SCons-Konstruktionsvariablen, nur für den Fall.

Sie können sogar die Einstellungen CC und CXX für Skripts auf Ihrem System in Betracht ziehen, die intern umgeleitet werden.

EDIT: Ich vergaß zu erwähnen, dass die CCCOM und CXXCOM Variablen werden die Befehle zum Kompilieren tatsächlich Quelldateien mit allen cFlags usw. Im überrascht Sie in der Lage, sie zu setzen waren, wie ich dachte, sie schreibgeschützt wurden Variablen.

+0

ich diese Variablen kennen, sind tatsächlich die Befehle verwendet, die kompilieren ist, warum ich Ich dachte, sie wären gute Kandidaten, um sie zu modifizieren, aber SCons scheint meine Modifikationen zu ignorieren. Ich habe sogar versucht, ihre Werte auf eine leere Zeichenfolge zu setzen, und es wurde trotzdem gut zusammengestellt. Ich habe das Gefühl, dass etwas nicht stimmt, weil ich es erwähnt habe, diese Variablen zu ändern, während ich nach einer Lösung suche. Ich dachte jedoch nicht daran, die ausführbaren GCC-Dateien zu verpacken. Ich werde diese Option untersuchen, während ich auf eine möglicherweise mehr SConsy Antwort warte. – EarlCrapstone

+0

@EarlCrapstone, Ich bin mir ziemlich sicher, dass sich der Wert dieser 2 Variablen für jede kompilierte cc-Datei ändert (überschrieben wird), also bin ich nicht überrascht, dass deine Mods nichts getan haben. Versuchen Sie es stattdessen mit CC und CXX und diese werden tatsächlich einen Unterschied machen. Ich habe sie geändert, um einen anderen Compiler zu spezifizieren, und das funktioniert. – Brady

+0

Ich habe herausgefunden, was ich falsch mache, aber da ich neu bin, kann ich meine Frage nicht für weitere vier Stunden beantworten. @Brady Diese Variablen werden während des Builds nicht geändert. Mein Problem war, dass ich shared-library-Objekte erstellte, also stattdessen 'SHCCCOM' und' SHCXXCOM' verwendete. – EarlCrapstone

3

Zur vollständigen Kontrolle können Sie die env['SPAWN'] Konstruktionsvariable überschreiben. Sie liefern dann eine Python-Methode, die für die Ausführung der Befehlszeile verantwortlich ist, die ihr durch das Argument übergeben wird.Normalerweise würden Sie dieses Argument verwenden und einen Subprozess erzeugen (mit einer Form von subprocess.Popen). Dies würde einen Pass-Through-Ersatz für den Standard env['SPAWN'] ergeben.

Aber jetzt haben Sie die volle Kontrolle über die subprocess.Popen Aufruf. Sie können die Adressen STDOUT, STDERR oder beide in einen beliebigen Puffer/Datei umleiten. Sie können diese Ausgabe auch nachbearbeiten, bevor Sie sie auf die Konsole drucken und/oder in einer Datei speichern. Ich habe dies verwendet, um Warnungen in gelb und Fehler in rot zum Beispiel zu färben.

Für Beispiel Code auf, wie man env['SPAWN'] überschreibt, überprüfen Sie this page auf dem SCons Wiki.

+0

Die Verwendung der SPAWN-Methode bricht unter Windows ab, wenn die Befehlszeile zu lang wird, und scons verwendet eine temporäre Datei, um den Verbindungsschritt auszuführen. :( – Nick

0

Verwenden Sie wie folgt;

baseEnv['CCCOM'][0] += " 2> gcc-c-output.txt"

0

Wie wäre:

baseEnv['SHCCCOM'] += " 2> ${SOURCE}gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> ${SOURCE}gcc-cxx-output.txt" 

Dies sollte Ihnen eine separate Datei für jede Quelldatei ..