2009-05-04 20 views
7

In einem SCons-Skript erstelle ich eine Basisumgebung, aus der ich andere Umgebungen abgeleitet habe. Etwas wie folgt aus:env.Clone() in scons macht keine Deep-Copy

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

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

Auf diese Weise kann ich mehr Umgebung (Release/debug/instrumentiert/PGO) von der Basisumgebung. In der SCons Dokumentation heißt es, dass env.Clone() eine tiefe Kopie von env macht. Aber tatsächlich scheint es nicht zu funktionieren. Da im Beispiel die Basisumgebung die Flags -DNDEBUG und -O3 haben würde.

A Ich mache etwas falsch?

edit: Hier ist der echte Code. Es gibt zwei Druckanweisungen in diesem Code und ich denke, sie sollten die gleichen Dinge drucken, aber sie nicht. Der Ausgang folgt:

# -*- 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'] 

Der Ausgang:

|| 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. 

Edit 2:

Es ist ein Fehler mit SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390

bearbeiten 3:

Wird in 1.3.1 und 2.0.1

Antwort

1

Angenommen, dies ist eine Scons Ausgabe (Code/docs Diskrepanz), was über das Hinzufügen von

import copy 

am Skript Kopf fixiert werden, und unter Verwendung von

opt = copy.deepcopy(Base) 

dh die Tatsache ausnutzen, dass Scons in Python ist ...?

2

Ich konfrontiert dies heute, und es scheint wie ein SCons-Fehler. Die Dinge haben früher funktioniert.

Mit Blick auf diese auf: Ubuntu 9.04 x64, Python 2.6.2, SCons v1.2.0.r3842

es die Annahme, ist eine Änderung der API zwischen 0.9.8 und 1.2.0 ist hier, wie es zu überwinden.

War

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

Now (1.2.0):

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

Beachten Sie, dass die .Append() oder .AppendUnique() Methoden, um die Listen separat behandelt, nicht das Original zu verändern Quelle. Es scheint jedoch keine solche Methode zu geben, um einen bestimmten Gegenstand aus einer Liste zu entfernen. Deshalb ist das ".remove()" notwendig und verursacht Kopfschmerzen.

Vorschläge für einfachere Methoden oder ein Hinweis, ob dies ein Fehler oder eine Funktion von SCons 1.2.0 ist, wäre willkommen.

+0

Hallo, ich habe einen Verweis auf diesen Fehler im Scons Issue Tracker gefunden (http://scons.tigris.org/issues/show_bug.cgi?id=2390). Es scheint, dass die Entwickler nicht in der Lage sind, den Fehler zu reproduzieren, also markierten sie ihn als BEHOBEN. –

+0

Der Bug wurde wieder geöffnet und wird hoffentlich in den nächsten Releases behoben sein. –

+0

Sieht so aus als wäre das in 1.3.1 behoben worden. Kannst du es verifizieren? – bdbaddog