2009-05-04 9 views
7

W skrypcie SCons tworzę podstawowe środowisko, z którego wyprowadziłem inne środowiska. Coś takiego:env.Clone() w scons nie wykonuje kopii głębokiej

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

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

W ten sposób można utworzyć więcej środowisko (release/debug/oprzyrządowanie/PGO) od środowisku zasadowym. W dokumentacji SCons mówi się, że env.Clone() robi głęboką kopię env. Ale w rzeczywistości to nie działa. ponieważ w tym przykładzie środowisko podstawowe będzie miało zastosowane flagi -DNDEBUG i -O3.

A Robię coś nie tak?

edytuj: Oto prawdziwy kod. W tym kodzie są dwie instrukcje drukowania i myślę, że powinny wydrukować te same rzeczy, ale tak nie jest. Wyjście następująco:

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

wyjście:

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

Edycja 2:

Jest to błąd z SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390

Edycja 3:

zostanie ustalona w 1.3.1 i 2.0.1

Odpowiedz

1

Zakładając, że jest to kwestia SCons (kod/docs rozbieżność), co na temat dodawania

import copy 

w głowę skryptu, a przy użyciu

opt = copy.deepcopy(Base) 

czyli wykorzystanie faktu, że Scons jest w Pythonie ...?

2

Zmierzyłem się z tym dzisiaj i wygląda na to, że to błąd SCons. Rzeczy kiedyś działały.

Wobec tego na: Ubuntu 9.04 x64, Python 2.6.2, SCons v1.2.0.r3842

Zakładając, że jest to zmiana API pomiędzy 0.9.8 i 1.2.0 tutaj jest, jak go pokonać.

Czy:

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") 

Należy pamiętać, że stosując .append() lub .AppendUnique() metody traktuje list osobno, nie zmieniając oryginał źródło. Jednak nie istnieje taka metoda usuwania określonego elementu z listy. Właśnie dlatego potrzebne jest ".remove()", które powoduje ból głowy.

Sugestie dotyczące łatwiejszych metod lub wskazówki, czy jest to błąd lub funkcja programu SCons 1.2.0, byłyby mile widziane.

+0

Witam, znalazłem odnośnik do tego błędu w trackerze problemów scons (http://scons.tigris.org/issues/show_bug.cgi?id=2390). Wygląda na to, że programatory nie są w stanie odtworzyć błędu, więc oznaczono go jako ROZDZIELONY. –

+0

Błąd został ponownie otwarty i mamy nadzieję, że zostanie naprawiony w następnych wydaniach. –

+0

Wygląda na to, że zostało to naprawione w wersji 1.3.1. Czy możesz to zweryfikować? – bdbaddog

Powiązane problemy