2009-05-04 4 views
7

In uno script SCons creo un ambiente di base da cui ho derivato altri ambienti. Qualcosa di simile a questo:env.Clone() in scons non esegue una copia profonda

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

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

In questo modo, posso creare più rispettosi dell'ambiente (release/debug/strumentata/PGO) dall'ambiente base. Nella documentazione di SCons si dice che env.Clone() esegue una copia profonda di env. Ma in effetti non sembra funzionare. perché nell'esempio, l'ambiente di base avrebbe i flag -DNDEBUG e -O3 applicati.

A Ho fatto qualcosa di sbagliato?

modifica: questo è il codice reale. Ci sono due dichiarazioni di stampa in questo codice e penso che dovrebbero stampare le stesse cose, ma non lo fanno. L'uscita segue:

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

L'output:

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

Si tratta di un bug con SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390

Modifica 3:

saranno fissati in 1.3.1 e 2.0.1

risposta

1

Supponendo che questo è un problema Scons (codice/docs discrepanza), per quanto riguarda l'aggiunta di

import copy 

alla testa dello script, e l'utilizzo di

opt = copy.deepcopy(Base) 

ie sfruttando il fatto che Scons è in Python ...?

2

Ho affrontato questo oggi, e sembra un bug SCons. Le cose funzionavano.

Di fronte a questo su: Ubuntu 9.04 x64, Python 2.6.2, SCons v1.2.0.r3842

Presumendo che è un cambiamento di API tra la 0.9.8 e 1.2.0 qui è come superarla.

Was:

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

Si noti che utilizzando il .Append() o .AppendUnique() metodi tratta delle liste a parte, non cambiando l'originale fonte. Tuttavia, non sembra esserci un tale metodo per rimuovere un particolare elemento da un elenco. Questo è il motivo per cui è necessario ".remove()" e causa il mal di testa.

Suggerimenti per metodi più semplici o un puntatore per sapere che questo è un bug o una funzionalità di SCons 1.2.0 sarebbe il benvenuto.

+0

Ciao, ho trovato un riferimento a questo bug nel tracker di scons issue (http://scons.tigris.org/issues/show_bug.cgi?id=2390). Sembra che gli sviluppatori non siano in grado di riprodurre il bug, quindi lo hanno contrassegnato come RISOLTO. –

+0

Il bug viene riaperto e si spera che venga corretto nelle prossime versioni. –

+0

Sembra che sia stato corretto in 1.3.1. Puoi verificarlo? – bdbaddog