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

6

我有一个使用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文件目标的名称完全相同。从文档“多个构建环境”中,我知道我可以像"opt.Object('xxx-opt', 'xxx.c')"一样重命名对象,但是,它是Glob而不是Object。我该如何解决这个问题?
1个回答

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)

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

1
类似那种难以理解的概念,给定名称你永远不会想要谷歌搜索,它们大大降低了Scons的功能。个人而言,我希望只需调用env.TemporaryObjectDir,所有我的.os文件就会存储在那里,而不是这种奇怪的解决方法...但无论如何,非常感谢,我搜寻了很长时间 :-) - this.myself
1
这个 Scons 的做法太蠢了,使用 Globbing 在一个不存在的地方寻找文件(特别是带上 duplicate=0 参数),完全不符合直觉。我曾向老板推荐使用 Scons 取代我们糟糕的 makefile,但现在我后悔了。 - Jonathan.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接