2010-10-26 10 views
6

Tengo un proyecto de C++ crea con Scons. Al principio solo tengo la versión optimizada para compilar, funciona bien. Luego también necesito una versión de depuración, luego agrego otro entorno para ella. Aquí está el código Scons:¿Cómo usar Scons para compilar los mismos objetos en diferentes entornos con Glob?

env = Environment() 

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall']) 
opt_objs = opt.Glob('src/*.cpp') 
prog = opt.Program('prog', opt_objs) 

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0']) 
dbg_objs = dbg.Glob('src/*.cpp') 
dbg_prog = dbg.Program('dbg_prog', dbg_objs) 

Con este código, me encontré con error:

scons: *** Two environments with different actions were specified for the same target: 
src/CometReadService.o 

Como se puede ver, los archivos creados por objetivos .o opt.Glob ('src/. cpp ') y dbg.Glob (' src/ .cpp ') exactamente el mismo nombre. Al leer el documento Multiple Construction Environments sé que puedo cambiar el nombre del objeto como "opt.Object ('xxx-opt', 'xxx.c')", pero sin embargo, es Glob no Object. ¿Como puedó resolver esté problema?

Respuesta

7

El scons manual describe cómo usar la función VariantDir (o un argumento al agregar SConscripts) para configurar diferentes directorios de compilación. En su forma más simple, VariantDir separa la salida de compilación de los archivos de origen, pero también se puede usar para separar la salida de compilación de diferentes entornos.

env = Environment() 

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall']) 
opt.VariantDir('gen-opt', 'src', duplicate=0) 
opt_objs = opt.Glob('gen-opt/*.cpp') 
prog = opt.Program('prog', opt_objs) 

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0']) 
dbg.VariantDir('gen-dbg', 'src', duplicate=0) 
dbg_objs = dbg.Glob('gen-dbg/*.cpp') 
dbg_prog = dbg.Program('dbg_prog', dbg_objs) 

Usar VariantDir puede llevar algo de experimentación. Por ejemplo, tenga en cuenta que el argumento Glob ha cambiado: sin el parámetro duplicate=0, el comportamiento predeterminado es que VariantDir duplique los archivos fuente en el directorio de compilación.

+1

Conceptos difíciles de entender como ese, con nombres que nunca tendrá la idea de buscar en google están reduciendo mucho el poder de scons ... Personalmente, me gustaría simplemente llamar a env.TemporaryObjectDir y todo mi .os se almacenará allí ... En lugar de esta solución extraña ... Pero de todos modos, muchas gracias, he buscado por edades :-) –

+1

Esto es completamente retrasado de Scons, la idea de Globbing para los archivos en un lugar que no existe (especialmente con el duplicado = 0) es masivamente contra-intuitivo. Vendí a mi jefe usando scon en lugar del espantoso makefile que teníamos, pero ahora me arrepiento. –

Cuestiones relacionadas