2010-10-26 33 views
6

J'ai un projet C++ construit avec Scons. Au début je n'ai que la version optimisée à compiler, ça marche bien. Ensuite, j'ai aussi besoin d'une version de débogage, puis j'ajoute un autre environnement pour cela. Voici le code Scons:Comment utiliser Scons pour compiler les mêmes objets dans différents environnements avec 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) 

Avec ce code, je suis tombé en erreur:

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

Comme vous pouvez le voir, ces cibles fichiers .o créés par opt.Glob ('src/. cpp ') et dbg.Glob (' src/ .cpp ') exactement le même nom. En lisant le document Multiple Construction Environments je sais que je peux renommer l'objet comme "opt.Object ('xxx-opt', 'xxx.c')", mais cependant, ce n'est pas Glob Object. Comment puis-je résoudre ce problème?

Répondre

7

Le scons manual décrit comment utiliser la fonction VariantDir (ou un argument lors de l'ajout de SConscripts) pour configurer différents répertoires de construction. À son plus simple, VariantDir sépare la sortie de génération des fichiers sources, mais peut également être utilisée pour séparer la sortie de génération de différents environnements.

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) 

L'utilisation de VariantDir peut nécessiter quelques essais. Par exemple, notez que l'argument Glob a changé - sans le paramètre duplicate=0, le comportement par défaut est VariantDir pour dupliquer les fichiers source dans le répertoire de construction.

+1

Des concepts difficiles à comprendre comme celui-là, avec des prénoms que vous n'aurez jamais l'idée de google pour réduire beaucoup la puissance de scons ... Personnellement, je voudrais juste appeler env.TemporaryObjectDir et tous mes Les .os y seront stockés ... Au lieu de cette bizarre solution de contournement ... Mais de toute façon, merci beaucoup, j'ai cherché des âges :-) –

+1

Ceci est complètement retardé de Scons, l'idée de Globbing pour les fichiers dans un endroit ils n'existe pas (surtout avec le doublon = 0) est massivement contre-intuitif. J'ai vendu mon boss en utilisant des scons au lieu de l'horrible makefile que nous avions, mais maintenant je le regrette. –