2010-03-17 8 views
5

I SCons Guida per l'utente racconta l'utilizzo di Multiple Construction Environments per costruire costruire più versioni di un unico programma e fornisce il seguente esempio:SCons: come utilizzare gli stessi costruttori per più varianti (stampa/debug) di un programma

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) 

Invece di assegnare manualmente nomi diversi agli oggetti compilati con ambienti diversi, VariantDir()/variant_dir suona come una soluzione migliore ...

Ma se metto il Program() costruttore all'interno della SConscript:

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

Come è possibile esportare ambienti diversi nello stesso file 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'??? 

Purtroppo la discussione nel SCons Wiki non porta più comprensione di questo argomento.

Grazie per il vostro contributo!

risposta

4

SConscript è un metodo definito per l'ambiente stesso:

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

E poi dal SConscript è possibile:

Import('env') 
+0

Grazie BennyG: Questo sembra molto interessante e pitonioso :-). Ho iniziato a provare il tuo suggerimento ma fino ad ora mi sono bloccato con altri cambiamenti nei miei script di build ... tornerò con più feedback in seguito! –

+0

Sto ancora lottando con alcuni degli aspetti che variant_dir introduce nel mio SConscript, ma la tua soluzione è perfettamente giusta per la mia domanda. Grazie ancora! –

2

In alternativa, è possibile passare un dizionario come le esportazioni arg a SConscript. Le chiavi sono il nome che SConscript utilizzerà per importarlo ei valori sono gli oggetti in SConstruct. Quindi:

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

poi nel SConscript Import('env') otterrà dbg la prima volta e opt la seconda volta. Questo funziona anche per esportare/importare qualsiasi cosa che ti piace, non solo env.

Vedere Export() e SConscript() nella pagina man per ulteriori informazioni.

+0

Grazie garyo per indicare questa alternativa. La pagina man è scarna sugli esempi per il caso del dizionario, ma alla fine questo approccio sembra più pulito per le persone meno pitone come me :-). –