2009-05-04 19 views
7

Bir SCONS komut dosyasında, başka ortamlardan türettiğim bir temel ortam oluşturur. Böyle bir şey:env.Clone() scons içinde derin kopyalama yapmaz

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

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

Bu şekilde, ben taban ortamından daha ortamını (salma/debug/Araçlı/pgo) oluşturabilir. SCons belgelerinde, env.Clone() öğesinin env'nin derin bir kopyasını yaptığı söylenir. Ama aslında işe yaramıyor. çünkü örnekte, temel ortam -DNDEBUG ve -O3 bayraklarına sahip olacaktır.

Bir sorun mu yapıyorum?

düzenleme: İşte gerçek kod. Bu kodda iki tane baskı ifadesi var ve bence aynı şeyleri yazdırmalılar ama yapmıyorlar. çıktısı aşağıdaki gibidir:

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

çıkışı:

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

Düzenleme 2:

:

Bu Scons http://scons.tigris.org/issues/show_bug.cgi?id=2390

Düzenleme 3 ile bir böcek1.3.1 giderilen ve 2.0.1

cevap

1

bu Scons sorun (kod/docs tutarsızlık) olduğunu varsayarsak, neyi komut dosyasının başında

import copy 

eklenmesi ve

opt = copy.deepcopy(Base) 
kullanmayla ilgili olacak

Örneğin Scons'un Python'da olduğu gerçeğini kullanmak…?

2

Bugün bu durumla karşılaştım ve bir SCons hatası gibi görünüyor. İşler işe yarardı. bu bakan

: it varsayarsak Ubuntu 9.04 x64, Python 2.6.2, Scons v1.2.0.r3842

burada bunun üstesinden gelmek için nasıl 0.9.8 ve 1.2.0 arasındaki API bir değişikliktir.

oldu: (1.2.0) Artık

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

: .Append() veya .AppendUnique() yöntemlerini kullanarak orijinali değiştirmeden değil, ayrı ayrı listeleri davrandığını

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

Not kaynak. Bununla birlikte, belirli bir öğeyi bir listeden çıkarmak için böyle bir yöntem yoktur. İşte bu yüzden '.remove()' gereklidir ve baş ağrısına neden olur.

Daha kolay yöntemler veya bir işaretçi hakkında bilgi almak için bir işaretçi olduğunu bu bir hata veya SCons 1.2.0 özelliği olacaktır.

+0

Merhaba, bu hataya bir hata buldum (http://scons.tigris.org/issues/show_bug.cgi?id=2390). Geliştiricilerin bu hatayı yeniden üretemeyeceği anlaşılıyor, bu yüzden bu dosyayı RESOLVED olarak işaretledi. –

+0

Hata yeniden açıldı ve umarım bir sonraki sürümlerde düzeltilecektir. –

+0

Bu, 1.3.1'de düzeltildi gibi görünüyor. Doğrulayabilir misin? – bdbaddog

İlgili konular