scons中的env.Clone()不执行深层复制

时间:2009-05-04 01:45:50

标签: scons

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

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

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

这样,我可以从基础环境创建更多环境(release / debug / instrumented / pgo)。在SCons文档中,据说env.Clone()执行env的深层复制。但事实上它似乎没有用。因为在该示例中,基础环境将应用-DNDEBUG和-O3标志。

我做错了什么?

编辑:这是真正的代码。这段代码中有两个打印语句,我认为它们应该打印相同的东西,但它们不会。输出如下:

# -*- 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中修复

2 个答案:

答案 0 :(得分:2)

我今天遇到了这个问题,看起来像是一个SCons错误。过去常常工作的事情。

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

假设这是API在0.9.8和1.2.0之间的变化,这里是如何克服它。

当时:

  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的错误或功能。

答案 1 :(得分:1)

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

import copy

在剧本的头部,并使用

opt = copy.deepcopy(Base)

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