2010-03-14 13 views
19

Mit scons schließe ich meine leicht Pfade umfassen einstellen:Wie stelle ich scons Systempfad

env.Append(CPPPATH=['foo']) 

Das unter der Flagge geht

-Ifoo 

jedoch gcc Ich versuche, Kompilieren mit vielen Warnungen aktiviert. Insbesondere mit

env.Append(CPPFLAGS=['-Werror', '-Wall', '-Wextra']) 

, die schrecklich an bestimmten Schub enthält stirbt ... Ich kann dieses Problem beheben, indem Sie die Boost-Zugabe enthält zu dem System gehören Pfad anstelle der Include-Pfad als gcc behandelt System anders enthält.

Also, was ich brauche statt -Ifoo zu gcc zu bekommen, ist

-isystem foo 

Ich glaube, ich dies mit der variablen CPPFLAGS tun könnten, aber frage mich, ob es eine bessere Lösung in scons gebaut war.

Antwort

12

Es gibt keine eingebaute Möglichkeit, -isystem include-Pfade in SCons zu übergeben, hauptsächlich weil es sehr compiler-/plattformspezifisch ist.

Es in die CXXFLAGS Putting funktioniert, aber beachten Sie, dass dies die Header aus SCons Dependency Scanner, die nur auf CPPPATH sieht.

Dies ist wahrscheinlich in Ordnung, wenn Sie nicht erwarten, dass sich diese Header jemals ändern, aber wenn Sie den Build-Ergebnis-Cache und/oder den impliziten Abhängigkeitscache verwenden, kann dies seltsame Probleme verursachen.

+0

Danke für die Bestätigung dessen, was ich erwartete (aber gehofft hatte, war falsch) –

+1

Gute Antwort, aber ich glaube, es ist eine gute Sache, dass diese Includes aus der Abhängigkeits-Kette ausgeschlossen sind, da sie den gesamten Build-Prozess für Nein verlangsamen würden echter Gewinn. Es gibt viele Boost-Header und diese würden sich wahrscheinlich nicht ändern (und wenn sie es tun, wissen Sie es und können entscheiden, alles zu bereinigen). – ereOn

+1

In der Tat ist das Ausschließen von "Nur-Lese" -Kopfzeilen eine großartige Möglichkeit, um Ihren Build zu beschleunigen. Es empfiehlt sich, sicherzustellen, dass die Bibliotheksversion Teil des Verzeichnispfads ist (z. B. /foo/bar/boost/1.38/include). Auf diese Weise wird die Boost-Versionsnummer in den Kompilierbefehlszeilen angezeigt. Da SCons die Befehlszeile in seiner Signatur enthält, würde jedes Boost-Upgrade in einem anderen Verzeichnis landen, wodurch jedes vorhandene Build-Produkt ungültig wird. Dies macht einen Build-Cache viel robuster, besonders für große Teams. – BenG

6

Wenn Sie das tun

print env.Dump() 

Sie _CPPINCFLAGS sehen, und Sie werden diese Variable in cccom (oder _CCCOMCOM) gebraucht. _CPPINCFLAGS sieht in der Regel wie folgt aus:

'$(${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' 

Daraus kann man wohl sehen, wie Sie einen „isystem“ Set hinzufügen könnte beinhaltet auch, wie _CPPSYSTEMINCFLAGS oder so. Definieren Sie einfach Ihr eigenes Präfix, den Pfadvariablennamen (z. B. CPPSYSTEMPATH) und das Suffix und verwenden Sie das obige Idiom, um das Präfix zu verketten. Dann fügen Sie einfach Ihre _CPPSYSTEMINCFLAGS zu CCCOM oder _CCCOMCOM und los geht's.

Natürlich ist dies systemspezifisch, aber Sie können Ihre neue Variable in die Compiler-Befehlszeile beliebig und beliebig einfügen.

2

Nach the SCons release notes wird "-isystem" seit Version 2.3.4 für die CCFLAGS der Umgebung unterstützt.

So können Sie zum Beispiel wie folgt vorgehen:

env.AppendUnique(CCFLAGS=('-isystem', '/your/path/to/boost')) 

Dennoch Sie müssen sicher sein, dass Ihr Compiler diese Option unterstützt.

+0

Die Release-Notes sagen, dass ParseFlags jetzt -isystem analysieren kann, das bedeutet nicht die folgenden Arbeiten. Hast du es versucht? – bdbaddog

+0

Ich habe es versucht und es funktioniert für mich, zumindest mit scons 2.5.0. – LangerJan

+0

Werden irgendwelche Dateien im Abhängigkeitsbaum angezeigt (Ausgabe von --tree = Prune)? Oder sind sie weggelassen, wenn Sie oben tun? – bdbaddog

0

Erweiterung der Idee von @LangerJan und @BenG ...Hier ist ein vollständiges plattformübergreifende Beispiel (ersetzen env['IS_WINDOWS'] mit Ihrer Windows-Plattform Kontrolle)

from SCons.Util import is_List 
def enable_extlib_headers(env, include_paths): 
    """Enables C++ builders with current 'env' to include external headers 
    specified in the include_paths (list or string value). 
    Special treatment to avoid scanning these for changes and/or warnings. 
    This speeds up the C++-related build configuration. 
    """ 
    if not is_List(include_paths): 
     include_paths = [include_paths] 

    include_options = [] 
    if env['IS_WINDOWS']: 
     # Simply go around SCons scanners and add compiler options directly 
     include_options = ['-I' + p for p in include_paths] 
    else: 
     # Tag these includes as system, to avoid scanning them for dependencies, 
     # and make compiler ignore any warnings 
     for p in include_paths: 
      include_options.append('-isystem') 
      include_options.append(p) 
    env.Append(CXXFLAGS = include_options) 

nun bei der Konfiguration die Verwendung von externen Bibliotheken, statt

env.AppendUnique(CPPPATH=include_paths) 

Anruf

enable_extlib_headers(env, include_paths) 

In meinem Fall hat dies den überarbeiteten Baum (wie mit erzeugt) um 1000x unter Linux reduziert und 3000x auf Windows! Es beschleunigte die No-Action-Build-Zeit (d. H. Alle Ziele auf dem neuesten Stand) um 5-7x Der beschnittene Abhängigkeitsbaum vor dieser Änderung hatte 4 Millionen Einschlüsse von Boost. Das ist verrückt.