【问题标题】:How to use Scons to compile same objects in different environments with Glob?如何使用 Scons 在 Glob 的不同环境中编译相同的对象?
【发布时间】:2010-11-01 21:59:48
【问题描述】:

我有一个使用 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。我怎么解决这个问题?

【问题讨论】:

    标签: scons glob


    【解决方案1】:

    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 复制构建目录中的源文件。

    【讨论】:

    • 像这样难以理解的概念,用给定的名字你永远不会想到谷歌因为正在减少很多 scons 的力量......我个人希望只打电话 env .TemporaryObjectDir 和我所有的 .os 都将存储在那里......而不是这种奇怪的解决方法......但无论如何,非常感谢你,我搜索了很多年 :-)
    • 这完全是 Scons 的迟钝,在不存在的地方(尤其是重复项 = 0)中对文件进行 Globbing 的想法非常违反直觉。向我的老板推销使用 scons 而不是我们拥有的可怕的 makefile,但现在我后悔了。
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2011-11-11
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2019-12-13
    相关资源
    最近更新 更多