2010-03-14 4 views
19

Utilisation scons je peux facilement mettre mes comprennent des chemins:Comment puis-je configurer le système de scons include_path

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

Ce passe le drapeau

-Ifoo 

à gcc

Cependant, je suis en train compiler avec beaucoup d'avertissements activés. En particulier avec

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

qui meurt horriblement sur certains boost comprend ... Je peux résoudre ce problème en ajoutant le coup de pouce au système inclut include_path plutôt que le chemin d'inclusion traite comme gcc système comprend différemment.

Alors ce que je dois faire passer à gcc au lieu de -Ifoo est

-isystem foo 

Je suppose que je pourrais le faire avec la variable CPPFLAGS, mais me demandais s'il y avait une meilleure solution intégrée à scons.

Répondre

12

Il n'y a pas de manière intégrée de passer les chemins d'inclusion -isystem dans SCons, principalement parce qu'il est très spécifique au compilateur/à la plate-forme.

Le mettre dans le CXXFLAGS fonctionnera, mais notez que cela cachera les en-têtes du scanner de dépendance de SCons, qui ne regarde que CPPPATH.

C'est probablement OK si vous ne vous attendez pas à ce que ces en-têtes changent, mais cela pourrait causer des problèmes étranges si vous utilisez le cache des résultats de construction et/ou le cache de dépendance implicite.

+0

Merci pour la confirmation de ce que j'attendais (mais j'espérais me tromper) –

+1

Bonne réponse mais en fait, je crois que c'est une bonne chose que ces inclusions soient exclues de la chaîne de dépendance car elles ralentiraient le processus de construction gain réel. Il y a beaucoup d'en-têtes Boost et ceux-ci ne changeraient probablement pas (et quand ils le font, vous le savez et pouvez décider de tout nettoyer). – ereOn

+1

En effet, exclure les en-têtes "en lecture seule" est un excellent moyen d'accélérer votre build. Une bonne pratique consiste à s'assurer que la version de la bibliothèque fait partie de son chemin d'accès au répertoire (par exemple, /foo/bar/boost/1.38/include). De cette façon, le numéro de version boost apparaît sur les lignes de commande de compilation. Étant donné que SCons inclut la ligne de commande dans sa signature, toute mise à niveau de boost se retrouvera dans un répertoire différent, invalidant ainsi tout produit de construction existant. Cela rend un cache de build beaucoup plus robuste, en particulier pour les grandes équipes. – BenG

6

Si vous

print env.Dump() 

vous verrez _CPPINCFLAGS, et vous verrez que la variable utilisée dans CCCOM (ou _CCCOMCOM). _CPPINCFLAGS ressemble généralement à ceci:

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

De cela, vous pouvez probablement voir comment vous pouvez ajouter un « isystem » comprend un ensemble de plus, comme _CPPSYSTEMINCFLAGS ou une telle. Définissez simplement votre propre préfixe, le nom de chemin var (par exemple CPPSYSTEMPATH) et le suffixe et utilisez l'idiome ci-dessus pour concaténer le préfixe. Ensuite, ajoutez simplement votre _CPPSYSTEMINCFLAGS à CCCOM ou _CCCOMCOM et vous voilà parti.

Bien sûr, cela est spécifique au système, mais vous pouvez conditionnellement inclure votre nouvelle variable dans la ligne de commande du compilateur comme et quand vous le souhaitez.

2

Selon "the SCons release notes", "-isystem" est pris en charge depuis la version 2.3.4 pour CCFLAGS de l'environnement.

Ainsi, vous pouvez, par exemple, procédez comme suit:

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

encore, vous devez être sûr que votre compilateur prend en charge cette option. Expansion de l'idée proposée par @LangerJan et @BenG ...

+0

Les notes de publication indiquent que ParseFlags peut maintenant analyser -isystem, ce qui n'implique pas les travaux suivants. L'as tu essayé? – bdbaddog

+0

Je l'ai essayé et cela fonctionne pour moi, au moins avec Scons 2.5.0. – LangerJan

+0

Des fichiers apparaissent-ils dans l'arbre des dépendances (sortie de --tree = prune)? Ou sont-ils omis si vous faites ci-dessus? – bdbaddog

0

Voici un exemple complet multi-plateforme (remplacez env['IS_WINDOWS'] avec Windows vérification de la plate-forme)

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) 

Maintenant, lors de la configuration de l'utilisation des bibliothèques externes, au lieu de

env.AppendUnique(CPPPATH=include_paths) 

appel

enable_extlib_headers(env, include_paths) 

Dans mon cas cela a réduit l'arbre de dépendance élagué (comme produit avec --tree=prune) par 1000x sur Linux et 3000x sur Windows! Il a accéléré le temps de construction sans action (c'est-à-dire toutes les cibles à jour) par 5-7x L'arborescence de dépendance élaguée avant que ce changement ne comprenne 4 millions de Boost. C'est dingue.

Questions connexes