2009-04-01 17 views
5

Gzip'in bazı günlük dosyalarını kapatmadan önce bitiren diğer hedeflere bağlı olarak bir "Temizleme" hedefi enjekte etmek istiyorum. Bazı araçların arızalanmasına neden olabileceğinden, erken gzip yapmamam önemlidir.Scons'ta, oluşturulacak bir hedefi nasıl enjekte edebilirim?

Çalıştırılacak Scons için bir temizleme hedefini nasıl enjekte edebilirim?

örn. Hedeflerim var bar ve bar.

% scons foo 
: Ben onlara yazmak istediğiniz

% scons foo cleanup 

belirtmek zorunda kalmadan, foo ve çubuğu bağlıdır ve her ikisi de bittikten sonra çalışır 'temizleme' adlı yeni bir özel hedef enjekte etmek istiyorum

ama scons kullanıcı

% scons foo cleanup 

ben temizleme hedefi oluşturma ve sys.argv eklemeden denedim yazmışsınız olarak gerçi yürütmek var, ama scons zaten tarafından sys.argv işlenmiş gibi görünüyor Koduma ulaştığı zaman, bu yüzden elle sys.argv'ye eklediğim 'temizleme' hedefini işlemez.

cevap

1

Scons sürümü 1.1.0.d20081104 olarak, özel iç Scons yöntemi kullanabilirsiniz: İstenen çıktıyı almak için Şimdi şu şekilde takma "foo" ekleyebilirsiniz kullanıcı yazmış sanki yukarıdaki kod parçası scons davranmasına neden olacaktır

% scons foo bar 

:

01 kullanıcı türleri ise
+1

Belgesiz özellikler FTW! :-) Ben genellikle bu "çözülemez" sorunları vurduğunda SCons için kaynağı grepping sonunda buluyorum ... – richq

+0

--random bayrağı kullanıldığında bu kırılma mı? Kullanıcı tarafından sağlanan hedeflerin oluşturulduğu sıra, bildiğim kadarıyla tanımlanmamıştır. – BenG

+1

Hedefi enjekte ediyorum ancak diğer hedeflere bağımlılık yapıyorum, bu yüzden grafikte rahatça uyuyor. Eğer '-random' yaparsanız bile, sadece eşzamanlı adımları rasgele hale getirecek - birbirine bağımlı olan adımları değil. Bağımlılıklar, bağlı hedef oluşturma komutunun çalıştırılmasından önce her zaman tatmin olur. –

2

Gzip aracının günlük dosyalarının çıkışına bağlı olması bir yoldur. Örneğin, bu C dosyasını 'merhaba.c' varsa:

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

Ve bu SConstruct dosyası:

#!/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) 

Daha sonra "scons temizleme" doğru sırayla gerekli adımları çalışacak çalıştıran :

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

Bu belirttiğiniz oldukça ne değildir, ancak bu örnekte ve gereksinimi arasındaki tek fark, sahip olduğunuz adımdır yüzden "temizleme" aslında zip dosyası oluşturur adım olmasıdır koşmak. Bağımlılıkları (günlüğü oluşturan programı çalıştıran, bu programı oluşturan) otomatik olarak hesaplanır.

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

:

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

Teşekkür çağıran BUILD_TARGETS değiştirmeye yöneliktir sanırım. Mesele şu ki, tamamen kontrol etmediğim parçalara sahip bir yapı akışı yapıyorum, bu yüzden, kaydedilen tüm günlük dosyalarını bilmediğim için sıkıştırılmış günlük dosyalarını önceden kaydedemiyorum. –

12

Eğer _Add_Targets veya belgesiz özellikleri kullanmak gerekir, sadece BUILD_TARGETS için temizleme hedefi ekleyebilirsiniz: yerine belgesiz fonksiyonların hedeflerin bu belgelenmiş listeyi kullanırsanız

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

, scons kanmayan defter tutma yaparken.Bu yorum, blok SCons/Script/__init__.py bulunabilir:

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

yüzden yerine dahili yardımcı fonksiyonları fikirler için

+0

Bu harika çalışıyor! Ancak bir takip sorusu olurdu - eklemek istediğim hedef tarayıcıdan geldiğinde bunu nasıl yapabilirim? Yani çalışma zamanında üretilir. BUILD_TARGETS eklemeye çalıştım, ancak bunun hiçbir etkisi yoktu. Büyük olasılıkla SCons, oluşturmaya başladıktan sonra bu listeyi kontrol etmez. –

İlgili konular