2010-03-17 8 views
5

Los SCons Guía del usuario de información sobre la utilización de Multiple Construction Environments para construir crear varias versiones de un mismo programa y da el siguiente ejemplo:SCons: Cómo usar los mismos constructores de múltiples variantes (liberación/depuración) de un programa

opt = Environment(CCFLAGS = '-O2') 
dbg = Environment(CCFLAGS = '-g') 

o = opt.Object('foo-opt', 'foo.c') 
opt.Program(o) 

d = dbg.Object('foo-dbg', 'foo.c') 
dbg.Program(d) 

en lugar de asignar manualmente diferentes nombres a los objetos compilados con diferentes ambientes, VariantDir()/variant_dir suena como una solución mejor ...

Pero si coloco el constructor Program() dentro del SConscript:

Import('env') 
env.Program('foo.c') 

¿Cómo puedo exportar diferentes entornos al mismo archivo SCONScript?

opt = Environment(CCFLAGS = '-O2') 
dbg = Environment(CCFLAGS = '-g') 

SConscript('SConscript', 'opt', variant_dir='release') #'opt' --> 'env'??? 
SConscript('SConscript', 'dbg', variant_dir='debug') #'dbg' --> 'env'??? 

Por desgracia, la discusión en el SCons Wiki no trae una visión más clara a este tema.

Gracias por su ayuda!

Respuesta

4

SConscript es un método definido en el propio medio ambiente:

for dir, env in (('release', opt), ('debug', dbg)): 
    env.SConscript('SConscript', 'env', variant_dir=dir) 

y luego desde el SConscript puede:

Import('env') 
+0

Gracias BennyG: Esto se ve muy interesante y pitónico :-). Empecé a probar tu sugerencia, pero hasta ahora estoy sorprendido con otros cambios en mis scripts de construcción ... ¡Volveré con más comentarios más tarde! –

+0

Todavía estoy luchando con algunos de los aspectos que variant_dir trae a mi SConscript, pero su solución es perfecta para mi pregunta. ¡Gracias de nuevo! –

2

Alternativamente, se puede pasar de un diccionario como las exportaciones arg a SConscript. Las claves son el nombre que SConscript usará para importarlo, y los valores son los objetos en SConstruct. Por lo tanto:

SConscript('SConscript', exports={'env': dbg}, variant_dir='debug') 
SConscript('SConscript', exports={'env': opt}, variant_dir='release') 

luego en la SConscript Import('env') conseguirá dbg la primera vez y la segunda vez opt. Esto también funciona para exportar/importar cualquier otra cosa que te guste, no solo env.

Consulte Exportar() y SConscript() en la página del manual para obtener más información.

+0

Gracias a Garyo por señalar esta alternativa. La página man es escasa en ejemplos para el caso del diccionario, pero al final este enfoque se ve más limpio para personas menos pitónicas como yo :-). –

Cuestiones relacionadas