2010-10-08 30 views
5

Tôi sẽ cố gắng kiểm soát các loại hạt khi được xây dựng trong scons. Tôi có một cây xây dựng ví dụ rất đơn giản (xem bên dưới), với trình xây dựng Poem chỉ cần lấy tệp .txt và chuyển đổi nó thành chữ thường trong tệp .eectxt tương ứng.điều gì gây nên scons để tạo tệp khi tôi có trình tạo tùy chỉnh?

Trong các tệp SConstruct và SConscript của tôi, tôi khai báo phụ thuộc của 3 tệp .txt.

Nhưng tôi không thể tìm ra điều gì đang đưa những thứ này vào bản dựng mặc định!

sconstest/ 
    SConstruct 
    tiger.txt 
    src/ 
     SConscript 
     hope.txt 
     jabberwocky.txt 

nơi tập tin * .txt là bài thơ và SConstruct và SConscript của tôi trông như thế này:

SConstruct:

env = Environment(); 

def eecummings(target, source, env): 
    if (len(target) == 1 and len(source) == 1): 
    with open(str(source[0]), 'r') as fin: 
     with open(str(target[0]), 'w') as fout: 
      for line in fin: 
       fout.write(line.lower()); 
    return None 

env['BUILDERS']['Poem'] = Builder(action=eecummings, suffix='.eectxt', src_suffix='.txt'); 

Export('env'); 
poems = SConscript('src/SConscript'); 
tigerPoem = env.Poem('tiger.txt'); 

src/SConscript:

Import('env'); 

input = ['jabberwocky.txt', 'hope.txt']; 
output = [env.Poem(x) for x in input]; 
Return('output'); 

Những gì tôi muốn làm là khai báo sự phụ thuộc của các tệp .eectxt từtương ứngtệp, nhưng không phải làm cho chúng được xây dựng trừ khi tôi đặt chúng một cách rõ ràng vào việc xây dựng Default() trong tệp SConstruct hoặc tôi yêu cầu chúng rõ ràng tại dòng lệnh.

Tôi làm cách nào để thực hiện việc này?

Trả lời

1

Theo mặc định, thư mục phụ thuộc vào tất cả các tệp và/hoặc mục tiêu nằm trong đó. Vì vậy, chạy:

scons 

Sau đó sẽ xây dựng tất cả các mục tiêu trong thư mục hiện tại.

0

Tôi đã tìm ra cách để làm những gì tôi muốn, nhưng tôi vẫn không hiểu tại sao tôi cần phải làm theo cách này. Chấp nhận câu trả lời tốt đầu tiên giải thích nó.

Dưới đây là những gì làm việc, nếu tôi thêm dòng sau vào file SConstruct root:

env.Ignore('.', tigerPoem); 
env.Ignore('src', poems); 
env.Alias('poems', [tigerPoem]+poems); 

này bỏ qua 3 bài thơ từ mục tiêu mặc định, và sau đó thêm chúng như mục tiêu lấy bí danh là "thơ", vì vậy nếu Tôi chạy scons nó xây dựng không có gì, nhưng nếu tôi chạy scons poems nó sẽ xây dựng các tệp.

Tại sao tính năng này hoạt động? Tại sao gọi env.Poem(...) thêm thứ gì đó vào các mục tiêu mặc định?

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