2011-09-12 36 views
5

Tôi đang cố gắng để có được SCons để sao chép một dự án Makefile từ thư mục nguồn để xây dựng thư mục và chạy một số lệnh để tạo libmoo.a, nhưng tôi đang chạy vào một lỗi chu kỳ phụ thuộc. Thông tin chi tiết theo:SCons: Chu kỳ phụ thuộc?

./SConstruct:

env = Environment() 
Export('env') 

dirs = ['.'] 

variant_dir = 'build' 

for dir in dirs: 
     SConscript(dir + '/' + 'SConscript', variant_dir=variant_dir + '/' + dir, duplicate=0) 

./SConscript:

import os 
Import('env') 

env.Command(env.Dir('moo2').abspath, env.Dir('#moo').abspath, ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 

env.Command(env.Dir('moo2/Makefile').abspath, env.Dir('moo2').abspath, 'echo would run moo2.configure') 

moolib = env.Command(env.Dir('moo2/libmoo.a').abspath, env.Dir('moo2/Makefile').abspath, 'echo would run make') 

Default(moolib) 

Lỗi chạy scons:

scons: *** Found dependency cycle(s): 
    build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
    build/moo2/libmoo.a -> build/moo2 -> build/moo2/Makefile -> build/moo2/libmoo.a 

Cũng đã cố gắng mà không sử dụng .abspath, nhưng shouldn rằng không quan trọng, phải không?

Tôi không thấy bất kỳ chu kỳ:

  • build/moo2/libmoo.a đòi hỏi xây dựng/moo2/Makefile
  • build/moo2/Makefile đòi hỏi xây dựng/moo2
  • build/moo2 đòi hỏi (nguồn /) moo

Làm thế nào để thấy một chu kỳ? Dường như nghĩ rằng build/moo2/Makefile phụ thuộc vào build/moo2/libmoo.a, đó không phải là những gì tôi định chỉ định.

Bất kỳ lời đề nghị có liên quan cũng được chào đón :-)

Trả lời

5

Không cần cho env.Dir ('moo'). Abspath bất cứ nơi nào trong SConscript của bạn. Vì vậy, đó sẽ thay đổi nó thành:

Import('env') 
env.Command('moo2', '#moo', ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 
env.Command('moo2/Makefile', 'moo2', 'echo would run moo2.configure') # Look Here 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

Nhưng điều đó vẫn mang lại những lỗi tương tự:

scons: *** Found dependency cycle(s): 
build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
build/moo2/libmoo.a -> build/moo2/Makefile -> build/moo2/libmoo.a 

Vậy tại sao vậy? Các SCON tự động tạo một thư mục phụ thuộc vào tất cả các tệp chứa trong đó. Xem dòng có nhận xét "# Nhìn đây". Bạn đã thêm một phụ thuộc moo2/Makefile bây giờ phụ thuộc vào moo2. moo2 phụ thuộc vào tất cả nội dung của nó theo mặc định và do đó chu kỳ của bạn.

Vậy làm cách nào để khắc phục sự cố?

Import('env') 
env.Install('moo2',Glob('#moo/*')) 
env.Command('moo2/Makefile', env.Glob('moo2/*'), 'echo would run moo2.configure') 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

Tôi đã thay đổi từ việc sử dụng Sao chép() thành env.Install(). Vì Copy không được gắn với đối tượng Environment() xây dựng nên nó sẽ không biết về dir biến thể. Cài đặt() và Copy() có chức năng tương đương, với env.Install() đang được env nhận biết. Ngoài ra tôi có nó sao chép/tùy thuộc vào tất cả các tập tin trong thư mục, chứ không phải là thư mục chính nó.

Bây giờ chúng ta hãy cho rằng một thử:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /Users/bdbaddog/devel/scons/trunk/bootstrap/src/script/scons.py --tree=prune 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
Install file: "moo/abc.c" as "build/moo2/abc.c" 
Install file: "moo/configure" as "build/moo2/configure" 
Install file: "moo/def.c" as "build/moo2/def.c" 
echo would run moo2.configure 
would run moo2.configure 
echo would run make 
would run make 
+-build/moo2/libmoo.a 
    +-build/moo2/Makefile 
    | +-build/moo2/abc.c 
    | | +-moo/abc.c 
    | +-build/moo2/configure 
    | | +-moo/configure 
    | +-build/moo2/def.c 
    | | +-moo/def.c 
    | +-/bin/echo 
    +-/bin/echo 
scons: done building targets. 

Lưu ý "--tree = prune" cờ này sẽ có SCons in ra cây phụ thuộc và prune sự trùng lặp trong cây (vì vậy nếu 2 file phụ thuộc trên cùng một tập tin, bạn sẽ chỉ nhìn thấy một lần)

+0

Cảm ơn bài đăng. Quá đơn giản là sao chép một số tệp vào thư mục biến thể của tôi, một tệp SConscript có hai lệnh làm việc cho tôi: Nhập ('env') env.Install ('', Glob ('# kernels/*. Cl')) – NoahR

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