2010-03-14 17 views
19

Uso scons puedo configurar fácilmente mi incluyen rutas de acceso:¿Cómo se configura el sistema scons ruta de inclusión

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

Esto pasa la bandera

-Ifoo 

a GCC

Sin embargo estoy tratando para compilar con muchas advertencias habilitadas. En particular con

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

el que muere horriblemente en cierto impulso incluye ... puedo arreglar esto añadiendo el impulso incluye al sistema de ruta de inclusión en lugar de la ruta de inclusión como golosinas gcc sistema incluye de manera diferente.

Así que lo que necesita para obtener pasó a gcc en lugar de -Ifoo es

-isystem foo 

supongo que podría hacer esto con la variable CPPFLAGS, pero me preguntaba si había una solución mejor integrada en scons.

Respuesta

12

No hay una forma incorporada de pasar las rutas del sistema incluido en SCons, principalmente porque es muy específico del compilador/plataforma.

Ponerlo en el CXXFLAGS funcionará, pero tenga en cuenta que esto ocultará los encabezados del escáner de dependencias de SCons, que solo mira a CPPPATH.

Esto probablemente sea correcto si no espera que esos encabezados cambien alguna vez, pero podría causar problemas extraños si utiliza la memoria caché de resultados de compilación y/o la caché de dependencia implícita.

+0

Gracias por la confirmación de lo que esperaba (pero esperaba que fuera incorrecto) –

+1

Buena respuesta, pero en realidad, creo que es bueno que los incluidos estén excluidos de la cadena de dependencia ya que ralentizarían todo el proceso de compilación sin ganancia real Hay muchos encabezados de Boost que probablemente no cambien (y cuando lo hagan, lo sabrán y pueden decidir limpiarlo todo). – ereOn

+1

De hecho, excluir los encabezados de "solo lectura" es una excelente manera de acelerar su compilación. Una buena práctica es asegurarse de que la versión de la biblioteca sea parte de su ruta de directorio (es decir, /foo/bar/boost/1.38/include). De esta forma, el número de versión de refuerzo aparece en las líneas de comando de compilación. Dado que SCons incluye la línea de comando en su firma, cualquier actualización de impulso aterrizaría en un directorio diferente, invalidando así cualquier producto de compilación existente. Esto hace que un caché de compilación sea mucho más robusto, especialmente para equipos grandes. – BenG

6

Si lo hace

print env.Dump() 

verá _CPPINCFLAGS, y verá que la variable utilizada en CCCOM (o _CCCOMCOM). _CPPINCFLAGS normalmente se ve así:

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

A partir de este es probable que pueda ver cómo se podría añadir un "isystem" conjunto de incluye también, como _CPPSYSTEMINCFLAGS o algo así. Simplemente defina su propio prefijo, el nombre de la ruta var (por ejemplo, CPPSYSTEMPATH) y el sufijo y utilice la expresión anterior para concatenar el prefijo. Luego solo agregue su _CPPSYSTEMINCFLAGS a CCCOM o _CCCOMCOM y listo.

Por supuesto, esto es específico del sistema, pero puede incluir condicionalmente su nueva variable en la línea de comandos del compilador cuando lo desee.

2

Según the SCons release notes, "-isystem" es compatible desde la versión 2.3.4 para los CCFLAGS del entorno.

Así, se puede, por ejemplo, hacer lo siguiente:

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

Sin embargo, usted necesita estar seguro de que su compilador soporta esa opción.

+0

Las notas de la versión dicen que ParseFlags ahora puede analizar -isistema, que no implica los siguientes trabajos. ¿Lo has probado? – bdbaddog

+0

Lo probé y funciona para mí, al menos con scons 2.5.0. – LangerJan

+0

¿Aparece algún archivo en el árbol de dependencias (salida de --tree = podar)? ¿O se omiten si lo haces arriba? – bdbaddog

0

Ampliando la idea propuesta por @LangerJan y @BenG ...He aquí un ejemplo completo multiplataforma (sustituir env['IS_WINDOWS'] con su ventanas de cheques plataforma)

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) 

Ahora, al configurar el uso de bibliotecas externas, en lugar de

env.AppendUnique(CPPPATH=include_paths) 

llamada

enable_extlib_headers(env, include_paths) 

En mi caso esto redujo el árbol de dependencia podado (como se produce con --tree=prune) por 1000x en Linux y 3000x en Windows! Se aceleró el tiempo de compilación sin acción (es decir, todos los objetivos actualizados) por 5-7x El árbol de dependencias podadas antes de este cambio tenía 4 millones de Boost. Eso es una locura.

Cuestiones relacionadas