在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中修复
答案 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中的事实......?