7

在 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 标志。

人工智能做错了什么?

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

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

4

2 回答 2

2

我今天遇到了这个问题,这似乎是一个 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 的错误或功能的指针。

于 2009-05-22T11:10:01.727 回答
1

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

import copy

在脚本的头部,并使用

opt = copy.deepcopy(Base)

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

于 2009-05-04T02:41:57.203 回答