2009-07-02 30 views
8

Tôi đang suy nghĩ về việc sử dụng SCons cho một dự án mới. Nó trông rất tốt, mặc dù tôi đang tìm kiếm VariantDir khá khó hiểu.Tại sao SCons VariantDir() không đưa đầu ra vào thư mục đã cho?

Tôi có một dự án đơn giản với một số tệp nguồn C trong một thư mục và tôi muốn xây dựng ở chế độ "bình thường" và "hồ sơ" - với hai bộ tùy chọn khác nhau để gcc. Tôi muốn các kết quả đầu ra đi vào thư mục bình thường/và profile/tương ứng.

Để thử nghiệm, tôi đã cắt giảm chỉ thành một tệp nguồn duy nhất, t.c, trong đó có main() trong đó. tập tin SConstruct của tôi là trong cùng thư mục, và trông như thế này:

normal = DefaultEnvironment(tools=['mingw'], CCFLAGS = '-O2') 
normal.VariantDir('release', '.', duplicate=0) 
normal.Program('t', ['t.c']) 

#profile = normal.Clone(CCFLAGS='-O2 -pg', LINKFLAGS = '-pg') 
#profile.VariantDir('profile', '.', duplicate=0) 
#profile.Program('t', ['t.c']) 

Khi tôi chạy scons, tôi mong nó để đưa vào và t.exe vào phát hành /, nhưng nó đặt chúng trong thư mục hiện hành . Và tôi không thể chạy nó ở tất cả với 3 dòng hồ sơ không được chú ý - nếu có, tôi gặp lỗi này:

scons: *** Hai môi trường có hành động khác nhau được chỉ định cho cùng một mục tiêu:

Về cơ bản, tôi không chắc chắn lý do tại sao các cuộc gọi VariantDir() của tôi không yêu cầu scons đưa đầu ra vào thư mục đầu ra được chỉ định, release.

(Tôi đã đọc một chút công bằng trong tài liệu và nhóm tin tức, nhưng không có gì trả lời câu hỏi này. Gần nhất tôi là this page, mô tả một điều tương tự, nhưng nó liên quan đến một thư mục/src riêng biệt và hai các tệp scons riêng biệt và nhập/xuất các biến giữa chúng. Điều đó dường như không dễ chịu.)

Trả lời

8

Có, Biến thểDir gây nhầm lẫn trong scons. Mặc dù không được quảng cáo, bạn có thể đặt cả SConstruct và SConscript trong cùng thư mục, sử dụng thư mục hiện hành là thư mục nguồn

# SConstruct 
SConscript('SConscript', build_dir='build', src='.') 

# SConscript 
Program('main.c') 

Tôi chưa bao giờ tìm thấy một cách để tránh sử dụng hai file trong khi vẫn giữ sự tỉnh táo của tôi cố gắng tìm hiểu dir biến :)

8

tôi đã có thể tách nhị phân trong một thư mục xây dựng sử dụng cuộc gọi này:

# SConstruct 
SConscript('SConscript', variant_dir='build', src_dir='..', duplicate=0) 

Nếu bạn muốn đặt mã nhị phân vào một thư mục hai cấp độ thấp hơn, làm được điều này:

# SConstruct 
SConscript('SConscript', variant_dir='build/release', src_dir='../..', duplicate=0) 

Về cơ bản, cung cấp các thông số src_dir như một đường đi từ xây dựng thư mục của bạn trở lại thư mục nguồn của bạn.

3

Như http://www.scons.org/wiki/VariantDir%28%29 nói,

Note that when you're not using an SConscript file in the src subdirectory, you must actually specify that the program must be built from the build/hello.c file that SCons will duplicate in the build subdirectory.

VariantDir('release','.',duplicate=0) 
env=Environment() 
env.Program('release/t',['release/t.c']) 

khi tôi chạy nó với scons trên Linux.

scons -u . 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
scons: building associated VariantDir targets: release 
gcc -o release/t.o -c t.c 
gcc -o release/t release/t.o 
scons: done building targets. 

Tôi đoán nó cũng sẽ làm việc trên Win32

+0

Vâng, đó là điểm duy nhất có liên quan khi không SConscript được sử dụng. –

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