scones hacer como clasicos c++ scons

c++ - hacer - ¿Cómo configuro el sistema scons include path?



como hacer scones clasicos (4)

Ampliando la idea propuesta por @LangerJan y @BenG ... Aquí hay un ejemplo completo de multiplataforma (reemplaza env[''IS_WINDOWS''] con la comprobación de la plataforma de Windows)

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 (producido con --tree=prune ) en 1000x en Linux y 3000x en Windows. Aceleró el tiempo de compilación sin acción (es decir, todos los objetivos actualizados) en 5-7x. El árbol de dependencias podado antes de este cambio tenía 4 millones de inclusiones desde Boost. Eso es una locura.

Usando scons puedo configurar fácilmente mis rutas de inclusión:

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

Esto pasa la bandera

-Ifoo

a gcc

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

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

que muere horriblemente en cierto impulso incluye ... Puedo solucionar esto agregando el refuerzo de inclusiones al sistema incluir ruta en lugar de incluir la ruta como gcc trata el sistema incluye de manera diferente.

Entonces, lo que necesito para pasar a gcc en lugar de a Ifoo es

-isystem foo

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


De acuerdo con las notas de la versión de SCons , "-isistema" es compatible desde la versión 2.3.4 para CCFLAGS del entorno.

Entonces, puedes, por ejemplo, hacer lo siguiente:

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

Sin embargo, debe asegurarse de que su compilador admita esa opción.


No hay una forma integrada de pasar las rutas de inclusión del sistema 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 dependencia de SCons, que solo se ve en CPPPATH.

Probablemente esto esté bien si no espera que esos encabezados cambien alguna vez, pero podría causar problemas extraños si usa el caché de resultados de compilación y / o el caché de dependencia implícita.


Si lo haces

print env.Dump()

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

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

A partir de esto, es probable que también pueda ver cómo podría agregar un conjunto de "isistemas" de inclusión, como _CPPSYSTEMINCFLAGS o alguno de ellos. Simplemente defina su propio prefijo, ruta var nombre (por ejemplo, CPPSYSTEMPATH) y sufijo y use el idioma anterior para concatenar el prefijo. Luego simplemente agregue sus _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.