2009-05-04 6 views
7

Dans un script SCons, je crée un environnement de base à partir duquel j'ai dérivé d'autres environnements. Quelque chose comme ceci:env.Clone() dans scons ne fait pas de copie profonde

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

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

De cette façon, je peux créer un environnement plus (release/debug/instrumenté/PGO) de l'environnement de base. Dans la documentation de SCons, il est dit que env.Clone() fait une copie profonde de env. Mais en fait, cela ne semble pas fonctionner. Dans l'exemple, l'environnement de base aurait les indicateurs -DNDEBUG et -O3 appliqués.

A Je fais quelque chose de mal?

edit: Voici le vrai code. Il y a deux instructions d'impression dans ce code et je pense qu'elles devraient imprimer les mêmes choses, mais elles ne le font pas. La sortie suivante:

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

La sortie:

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

Il est un bug avec SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390

Modifier 3:

sera fixé en 1.3.1 et 2.0.1

Répondre

1

En supposant qu'il est une question Scons (de divergence de code/docs), qu'en ajoutant

import copy 

à la tête du script, et en utilisant

opt = copy.deepcopy(Base) 

c'est-à-dire d'exploiter le fait que Scons est en Python ...?

2

J'ai fait face à cela aujourd'hui, et cela ressemble à un bug de SCons. Les choses avaient l'habitude de travailler.

Face à cette sur: Ubuntu 9.04 x64, Python 2.6.2, SCons v1.2.0.r3842

présumant il est un changement d'API entre 0.9.8 et 1.2.0 ici est de savoir comment surmonter.

était la suivante:

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

maintenant (1.2.0):

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

Notez que l'utilisation des méthodes .Append() ou .AppendUnique() traite les listes séparément, ne change pas l'original la source. Cependant, il ne semble pas y avoir une telle méthode pour supprimer un élément particulier d'une liste. C'est pourquoi le '.remove()' est nécessaire et cela provoque le mal de tête.

Suggestions pour des méthodes plus faciles ou un pointeur pour savoir où c'est un bug ou une caractéristique de SCons 1.2.0 serait la bienvenue.

+0

Salut, j'ai trouvé une référence à ce bogue dans le suiveur de problèmes de scons (http://scons.tigris.org/issues/show_bug.cgi?id=2390). Il semble que les développeurs ne sont pas en mesure de reproduire le bug, donc ils l'ont marqué comme RÉSOLU. –

+0

Le bug est rouvert et nous espérons qu'il sera corrigé dans les prochaines versions. –

+0

On dirait que cela a été corrigé dans 1.3.1. Pouvez-vous le vérifier? – bdbaddog

Questions connexes