如何使用Scons在Glob的不同环境中编译相同的对象?

时间:2010-10-26 13:20:38

标签: scons glob

我有一个用Scons构建的C ++项目。起初我只有优化版本才能编译,它运行正常。然后我还需要一个调试版本,然后我为它添加另一个环境。这是Scons代码:

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)

使用此代码,我遇到了错误:

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

正如您所看到的那样,由opt.Glob('src / .cpp')和dbg.Glob('src / .cpp')创建的那些.o文件目标完全相同。通过阅读文档Multiple Construction Environments我知道我可以将对象重命名为“opt.Object('xxx-opt','xxx.c')”,但是,它是Glob而不是Object。我怎么解决这个问题?

1 个答案:

答案 0 :(得分:7)

scons manual描述了如何使用VariantDir函数(或添加SConscripts时的参数)来设置不同的构建目录。最简单的是,VariantDir将构建输出与源文件分开,但它也可用于分离不同环境的构建输出。

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)

使用VariantDir可以进行一些实验。例如,请注意Glob参数已更改 - 没有duplicate=0参数,默认行为是VariantDir复制构建目录中的源文件。