2010-03-17 11 views
5

Kullanım Kılavuzu tek bir program birden çok sürümünü kurmak inşa etmek Multiple Construction Environments kullanımı hakkında anlatır ve şu örneği veriyor Scons:Scons: Bir programın birden varyantları için aynı inşaatçılar (salma/hata ayıklama) nasıl kullanılır

/ variant_dir VariantDir() daha iyi bir çözüm gibi görünse

yerine manuel olarak farklı ortamlarda derlenmiş nesnelere farklı adlar atama

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) 
...

Ama SConscript içine Program() oluşturucu yerleştirirseniz:

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

Farklı ortamları aynı SConscript dosyasına nasıl aktarabilirim?

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

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

Maalesef SCons Wiki tartışma bu konuya daha fazla fikir getirmiyor.

Girişiniz için teşekkürler! yapabilirsiniz SConscript dan sonra

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

Ve: ihracat SConscript için arg olarak

Import('env') 

cevap

4

SConscript çevre kendisinde tanımlanan bir yöntemdir. Anahtarlar, SConscript'in içe aktarmak için kullanacağı addır ve değerler, SConstruct'taki nesnelerdir. Yani: SConscript Import('env') sonra

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

dbg ilk kez ve opt ikinci kez alacak. Bu, sadece env'yi değil, istediğiniz herhangi bir şeyi dışa aktarmak/ithal etmek için de çalışır.

Daha fazla bilgi için man sayfasında Export() ve SConscript() öğelerine bakın.

+0

Teşekkür ederim BennyG: Bu çok ilginç ve pythonic :-) görünüyor. Önerinizi denemeye başladım ama şu ana kadar yapılarımdaki diğer değişikliklerle sıkışıp kaldım ... Daha sonra geri bildirim ile geri döneceğim! –

+0

Hala varyant_dir’in SConscript’ime getirdiği bazı yönleriyle uğraşıyorum, fakat çözümünüz benim için mükemmel bir çözüm. Tekrar teşekkürler! –

2

Alternatif olarak, bir sözlük geçebilir

+0

Bu alternatifi işaret ettiğin için teşekkürler. Adam sayfası sözlük davası için örnekler üzerinde seyrek, ama sonunda bu yaklaşım benim gibi daha az pythonic insanlara daha temiz görünüyor :-). –