2009-05-04 24 views
7

Trong một kịch bản SCons, tôi tạo một môi trường cơ sở mà từ đó tôi bắt nguồn từ các môi trường khác. Một cái gì đó như thế này:env.Clone() trong scons không làm một bản sao sâu

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

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

Bằng cách này, tôi có thể tạo thêm môi trường (phát hành/gỡ lỗi/thiết bị/pgo) từ môi trường cơ sở. Trong tài liệu của SCons, env.Clone() thực hiện một bản sao sâu của env. Nhưng trên thực tế nó dường như không hoạt động. bởi vì trong ví dụ này, môi trường cơ sở sẽ có các cờ -DNDEBUG và -O3 được áp dụng.

Tôi có làm gì sai không?

chỉnh sửa: Đây là mã thực. Có hai câu lệnh in trong mã này và tôi nghĩ họ nên in những thứ giống nhau, nhưng họ không in. Kết quả sau:

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

đầu ra:

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

Sửa 2:

Đó là một lỗi với SCons http://scons.tigris.org/issues/show_bug.cgi?id=2390

Sửa 3:

sẽ được cố định trong 1.3.1 và 2.0.1

Trả lời

1

Giả sử đây là một vấn đề SCons (mã/docs khác biệt), những gì về việc thêm

import copy 

vào đầu của kịch bản, và sử dụng

opt = copy.deepcopy(Base) 

tức là khai thác thực tế là Scons có trong Python ...?

2

Tôi phải đối mặt với điều này ngày hôm nay và có vẻ như là lỗi của SCons. Những thứ được sử dụng để làm việc.

Đối mặt này trên: Ubuntu 9,04 x64, Python 2.6.2, SCons v1.2.0.r3842

Giả sử nó là một sự thay đổi của API giữa 0.9.8 và 1.2.0 ở đây là làm thế nào để vượt qua nó.

Là:

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

Bây giờ (1.2.0):

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

Lưu ý rằng việc sử dụng các .Append() hoặc .AppendUnique() phương pháp xử lý các danh sách riêng biệt, không thay đổi bản gốc nguồn. Tuy nhiên, có vẻ như không phải là một phương pháp để loại bỏ một mục cụ thể khỏi danh sách. Đây là lý do tại sao '.remove()' là cần thiết và gây đau đầu.

Gợi ý cho các phương pháp dễ dàng hơn hoặc một con trỏ để biết rõ đây là lỗi hoặc tính năng của SCons 1.2.0 sẽ được hoan nghênh.

+0

Xin chào, tôi đã tìm thấy một tham chiếu đến lỗi này trong trình theo dõi vấn đề về scons (http://scons.tigris.org/issues/show_bug.cgi?id=2390). Dường như những người phát triển không thể tái tạo lỗi, vì vậy họ đánh dấu nó là RESOLVED. –

+0

Lỗi này được mở lại và hy vọng sẽ được sửa trong bản phát hành tiếp theo. –

+0

Có vẻ như điều này đã được sửa trong 1.3.1. Bạn có thể xác minh nó? – bdbaddog

Các vấn đề liên quan