env.Clone () в scons не делает глубокую копию - PullRequest
7 голосов
/ 04 мая 2009

В скрипте SCons я создаю базовую среду, из которой я получил другие среды. Примерно так:

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

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

Таким образом, я могу создать больше среды (release / debug / instrumented / pgo) из базовой среды. В документации SCons сказано, что env.Clone () делает глубокую копию env. Но на самом деле это не похоже на работу. потому что в этом примере к базовой среде применяются флаги -DNDEBUG и -O3.

А я что-то не так делаю?

edit: вот реальный код. В этом коде есть два оператора печати, и я думаю, что они должны печатать одно и то же, но это не так. Вывод следующий:

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

Выход:

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

Редактировать 2 :

Это ошибка с SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390

Редактировать 3 :

Будет исправлено в 1.3.1 и 2.0.1

Ответы [ 2 ]

2 голосов
/ 22 мая 2009

Я столкнулся с этим сегодня, и это похоже на ошибку SCons. Вещи, используемые для работы.

С этим сталкиваются: Ubuntu 9.04 x64, Python 2.6.2, SCons v1.2.0.r3842

Предполагая, что это изменение API между 0.9.8 и 1.2.0, вот как это преодолеть.

Был:

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

Сейчас (1.2.0):

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

Обратите внимание, что использование методов .Append () или .AppendUnique () обрабатывает списки отдельно, не изменяя исходный источник. Тем не менее, похоже, нет такого метода для удаления определенного элемента из списка. Вот почему необходим «.remove ()», и это вызывает головную боль.

Приветствуются предложения по более простым методам или указателю на знание, является ли это ошибкой или функцией SCons 1.2.0.

1 голос
/ 04 мая 2009

Предполагая, что это проблема с Scons (несоответствие кода / документов), как насчет добавления

import copy

в заголовке скрипта и используя

opt = copy.deepcopy(Base)

Т.е. использовать тот факт, что Scons в Python ...?

...