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

Fan*_*Lin 6 glob scons

我有一个用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)
Run Code Online (Sandbox Code Playgroud)

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

scons: *** Two environments with different actions were specified for the same target: 
src/CometReadService.o
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*her 7

scons的手册介绍如何使用该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)
Run Code Online (Sandbox Code Playgroud)

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