【问题标题】:env.Clone() in scons doesn't do a deep-copyscons 中的 env.Clone() 不做深拷贝
【发布时间】:2009-05-04 01:45:50
【问题描述】:

在 SCons 脚本中,我创建了一个基础环境,从中派生出其他环境。像这样:

base = Environment()
base['CXXFLAGS'] += ['-DBOOST_HAS_PTHREAD', '-D__STDC_CONSTANT_MACROS', '-DFILELOG_MAX_LEVEL=4', '-Wall']

opt = base.Clone()
opt['CXXFLAGS'] += ['-DNDEBUG', '-O3']

这样,我可以从基础环境创建更多环境(发布/调试/仪表化/pgo)。在 SCons 文档中,据说 env.Clone() 对 env 做了一个深拷贝。但实际上它似乎不起作用。因为在示例中,基础环境将应用 -DNDEBUG 和 -O3 标志。

我做错了什么?

edit : 这是真正的代码。此代码中有两个打印语句,我认为它们应该打印相同的内容,但事实并非如此。输出如下:

# -*- coding: utf-8 -*-

import os.path
import glob

local_env = Environment()

local_env['CXXFLAGS'] += ['-DBOOST_HAS_PTHREAD', '-D__STDC_CONSTANT_MACROS', '-DFILELOG_MAX_LEVEL=4', '-Wall']
local_env.Append(LIBS = ['pthread', 'boost_thread', 'boost_filesystem', 'boost_program_options', 'boost_iostreams'])

opt = local_env.Clone()

opt['CXXFLAGS'] += ['-DNDEBUG', '-O3']

print opt['CXXFLAGS']

instr = opt.Clone()
instr['CXXFLAGS'] += ['-fprofile-arcs']
instr['LIBS'] += ['gcov']

print opt['CXXFLAGS']

输出:

|| scons: Reading SConscript files ...
|| -DBOOST_HAS_PTHREAD -D__STDC_CONSTANT_MACROS -DFILELOG_MAX_LEVEL=4 -Wall -DNDEBUG -O3
|| -DBOOST_HAS_PTHREAD -D__STDC_CONSTANT_MACROS -DFILELOG_MAX_LEVEL=4 -Wall -DNDEBUG -O3 -fprofile-arcs
|| scons: done reading SConscript files.
|| scons: Building targets ...
|| scons: `.' is up to date.
|| scons: done building targets.

编辑 2

这是 SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390 的一个错误

编辑 3

将在 1.3.1 和 2.0.1 中修复

【问题讨论】:

    标签: scons


    【解决方案1】:

    我今天遇到了这个问题,这似乎是一个 SCons 错误。过去的工作。

    面对这个:Ubuntu 9.04 x64,Python 2.6.2,SCons v1.2.0.r3842

    假设这是 0.9.8 和 1.2.0 之间的 API 更改,这里是如何克服它。

    曾经:

      e2= env.Clone()
      e2["CXXFLAGS"].remove( "-Werror" )
      e2["CXXFLAGS"].append( "-Wno-error" )
    

    现在(1.2.0):

      import copy
      ...
      e2= env.Clone( CXXFLAGS= copy.deepcopy(env["CXXFLAGS"]) )
      e2["CXXFLAGS"].remove( "-Werror" )
      e2.AppendUnique( CXXFLAGS= "-Wno-error" )
    

    请注意,使用 .Append() 或 .AppendUnique() 方法会分别处理列表,而不是更改原始源。但是,似乎没有这样一种方法可以从列表中删除特定项目。这就是为什么需要 '.remove()' 并导致头痛的原因。

    欢迎提供更简单方法的建议或了解这是 SCons 1.2.0 的错误或功能的指针。

    【讨论】:

    • 嗨,我在 scons 问题跟踪器 (scons.tigris.org/issues/show_bug.cgi?id=2390) 中找到了对这个错误的引用。开发人员似乎无法重现该错误,因此将其标记为已解决。
    • 该错误已重新打开,希望在下一个版本中修复。
    • 看起来这在 1.3.1 中已修复。可以验证吗?
    • 抱歉,不再使用 SCons。
    【解决方案2】:

    假设这是一个 Scons 问题(代码/文档差异),那么添加呢

    import copy
    

    在脚本的头部,并使用

    opt = copy.deepcopy(Base)
    

    即利用 Scons 在 Python 中的事实...?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2015-01-13
      • 2011-09-05
      相关资源
      最近更新 更多