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 フラグが適用されるためです。

AIが何か悪いことをしている?

編集:これが実際のコードです。このコードには 2 つの print ステートメントがあり、同じものを出力する必要があると思いますが、そうではありません。出力は次のとおりです。

# -*- 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 に答える