5

SCons 用户指南讲述了使用多个构建环境来构建单个程序的多个版本,并给出了以下示例:

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)

而不是手动为使用不同环境编译的对象分配不同的名称,VariantDir()/variant_dir听起来是一个更好的解决方案......

但是,如果我将Program()构建器放在 SConscript 中:

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

如何将不同的环境导出到同一个 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'???

不幸的是,SCons Wiki中的讨论并没有为这个主题带来更多的洞察力。

感谢您的输入!

4

2 回答 2

4

SConscript 是在环境本身上定义的方法:

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

然后从 SConscript 你可以:

Import('env')
于 2010-03-18T00:50:49.913 回答
2

或者,您可以将字典作为导出参数传递给 SConscript。键是 SConscript 用于导入它的名称,值是 SConstruct 中的对象。所以:

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

然后在 SConscript 中Import('env')会得到dbg第一次和opt第二次。这也适用于导出/导入您喜欢的任何其他内容,而不仅仅是 env。

有关详细信息,请参阅手册页中的 Export() 和 SConscript()。

于 2010-03-30T17:10:51.510 回答