2009-04-01 31 views
5

Tôi muốn tiêm mục tiêu "Dọn dẹp" phụ thuộc vào một số mục tiêu khác hoàn thành trước khi nó tắt và một số tệp nhật ký của gzip. Điều quan trọng là tôi không gzip sớm vì điều này có thể khiến một số công cụ thất bại.Trong scons, làm thế nào tôi có thể tiêm một mục tiêu được xây dựng?

Làm cách nào để có thể tiêm mục tiêu dọn dẹp cho Scons để thực thi?

ví dụ: Tôi có mục tiêu foo và bar. Tôi muốn tiêm một mục tiêu tùy chỉnh mới gọi là 'dọn dẹp' mà phụ thuộc vào foo và bar và chạy sau khi chúng vừa thực hiện, mà không cần người dùng phải chỉ định

% scons foo cleanup 

Tôi muốn họ gõ:

% scons foo 

nhưng có scons thực hiện như khi người dùng đã gõ

% scons foo cleanup 

tôi đã cố gắng tạo ra các mục tiêu dọn dẹp và phụ thêm để sys.argv, nhưng có vẻ như scons đã xử lý sys.argv bởi thời gian nó được mã của tôi vì vậy nó không xử lý mục tiêu 'dọn dẹp' mà tôi tự thêm vào sys.argv.

Trả lời

1

Trong phiên bản 1.1.0.d20081104 của SCons, bạn có thể sử dụng phương pháp riêng SCons nội bộ:

SCons.Script._Add_Targets([ 'MY_INJECTED_TARGET' ]) 

Nếu sử dụng các loại:

% scons foo bar 

đoạn mã trên sẽ gây SCons cư xử như thể người dùng đã gõ:

% scons foo bar MY_INJECTED_TARGET 
+1

Tính năng không có giấy tờ FTW! :-) Tôi tìm thấy tôi thường chỉ kết thúc grepping nguồn cho SCons khi tôi nhấn những vấn đề "unsolvable" ... – richq

+0

Điều này phá vỡ khi cờ --random được sử dụng? Thứ tự mà các mục tiêu do người dùng cung cấp được xây dựng là không xác định, theo như tôi biết. – BenG

+1

Tôi tiêm mục tiêu nhưng có phụ thuộc vào các mục tiêu khác, vì vậy nó phù hợp với snuggly trong biểu đồ. Ngay cả khi bạn làm '' -random'', nó sẽ chỉ ngẫu nhiên các bước đồng thời - không phải các bước có sự phụ thuộc lẫn nhau. Các phụ thuộc luôn được thỏa mãn trước khi lệnh xây dựng đích tùy thuộc bắt đầu thực hiện. –

2

Một cách là để công cụ gzip phụ thuộc vào đầu ra của tệp nhật ký. Ví dụ, nếu chúng ta có C tập tin này, 'hello.c':

#include <stdio.h> 
int main() 
{ 
    printf("hello world\n"); 
    return 0; 
} 

Và tập tin SConstruct này:

#!/usr/bin/python 
env = Environment() 
hello = env.Program('hello', 'hello.c') 
env.Default(hello) 
env.Append(BUILDERS={'CreateLog': 
    Builder(action='$SOURCE.abspath > $TARGET', suffix='.log')}) 
log = env.CreateLog('hello', hello) 
zipped_log = env.Zip('logs.zip', log) 
env.Alias('cleanup', zipped_log) 

Sau đó chạy "scons dọn dẹp" sẽ chạy các bước cần thiết theo đúng thứ tự :

gcc -o hello.o -c hello.c 
gcc -o hello hello.o 
./hello > hello.log 
zip(["logs.zip"], ["hello.log"]) 

Đây không phải là những gì bạn đã chỉ định, nhưng khác biệt duy nhất giữa ví dụ này và yêu cầu của bạn là "dọn dẹp" là bước thực sự tạo tệp zip, vì vậy đó là bước mà bạn có chạy. Các phụ thuộc của nó (chạy chương trình tạo nhật ký, tạo chương trình đó) được tính tự động. Bây giờ bạn có thể thêm các bí danh "foo" như sau để có được những kết quả mong muốn:

env.Alias('foo', zipped_log) 
+0

Cảm ơn các ý tưởng. Vấn đề là, tôi đang làm một luồng xây dựng có các phần mà tôi không hoàn toàn kiểm soát, vì vậy tôi không thể đăng ký trước các tệp nhật ký được nén bởi vì tôi không biết tất cả các tệp nhật ký được tạo. –

12

bạn không nên sử dụng _Add_Targets hoặc không có giấy tờ tính năng, bạn chỉ có thể thêm mục tiêu dọn dẹp của bạn để BUILD_TARGETS:

from SCons.Script import BUILD_TARGETS 
BUILD_TARGETS.append('cleanup') 

nếu bạn sử dụng danh sách này ghi lại các mục tiêu thay vì chức năng không có giấy tờ, scons sẽ không bị nhầm lẫn khi thực hiện kế toán.khối Nhận xét này có thể được tìm thấy trong SCons/Script/__init__.py:

# BUILD_TARGETS can be modified in the SConscript files. If so, we 
# want to treat the modified BUILD_TARGETS list as if they specified 
# targets on the command line. To do that, though, we need to know if 
# BUILD_TARGETS was modified through "official" APIs or by hand. We do 
# this by updating two lists in parallel, the documented BUILD_TARGETS 
# list, above, and this internal _build_plus_default targets list which 
# should only have "official" API changes. Then Script/Main.py can 
# compare these two afterwards to figure out if the user added their 
# own targets to BUILD_TARGETS. 

vì vậy tôi đoán nó được thiết kế để thay đổi BUILD_TARGETS thay vì gọi chức năng helper nội

+0

Công trình này tuyệt vời! Nhưng một câu hỏi tiếp theo sẽ là - làm thế nào tôi có thể làm điều này, khi mục tiêu tôi muốn thêm đến từ máy quét? I E. nó được sản xuất tại thời gian chạy. Tôi đã thử thêm vào BUILD_TARGETS, nhưng điều đó không có hiệu lực. Nhiều khả năng SCons không kiểm tra danh sách đó sau khi nó bắt đầu xây dựng. –

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