2008-10-22 12 views
18

Yapım kuralları (bu aracın benim için yazdığı) uygulanmadan önce bir araç çalıştırarak başlatan bir Makefile sahibim. Bir python betiği olan bu araç, null olmayan bir durum koduyla çıkarsa, GNU Make'in burada durmasını ve programın oluşturulmasıyla devam etmesini istemiyorum.

Şu anda, böyle bir şey (üst seviyeye yani sütun 1) yapın:

$(info Generating build rules...) 
$(shell python collect_sources.py) 
include BuildRules.mk 

1 bir durum koduyla collect_sources.py çıkışlar Bu aynı zamanda standart çıktısı yakalar Ama eğer bu hale durmuyor collect_sources.py ama yazdırmıyor, bu yüzden yanlış yöne baktığımı hissediyorum.

Mümkünse, çözüm basit bir MS-DOS kabuğu standart sistem kabuğunda olduğunda bile çalışmalıdır.

Herhangi bir öneriniz var mı?

+1

Eğer GNU make 4.2 veya üzerindeyseniz, değerlendirilen son '$ (shell ...)' fonksiyonunun çıkış durumunu içerecek '$ (. SHELL_STATUS) değişkenini kontrol edebilirsiniz. – MadScientist

+0

Değişken adı '_' olmadan' $ (. SHELLSTATUS) 'dır. https://www.gnu.org/software/make/manual/html_node/Shell-Function.html # Shell-Function – user3159253

cevap

4

Tamam, burada ne yazık ki collect_sources.py script durum kodu dayalı değildir benim kendi çözüm, ama Me (TM) için çalışır ve komut ürettiğini bana herhangi bir çıktı görmenizi sağlar ki:

SHELL_OUTPUT := $(shell python collect_sources.py 2>&1) 
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),) 
    $(info $(SHELL_OUTPUT)) 
else 
    $(error $(SHELL_OUTPUT)) 
endif 

Komut dosyası, herhangi bir hatanın "collect_sources: error:" ile başlayan bir çıktı üretecek şekilde yazılmıştır. Ayrıca, python verilen komut dosyasını bulamıyor veya yürütemiyorsa, "[Errno 2]" veya benzeri bir iletiyi içeren bir hata iletisi çıkarır. Yani bu küçük kod parçası sadece çıktıyı yakalar (stderr'i stdout'a yönlendirir) ve hata mesajlarını arar. Hiçbiri bulunmazsa, çıktıyı yazdırmak için $(info) kullanır, aksi halde Make stop'u etkili yapan $(error) kullanır.

Not: ifeq ... endif'daki girinti boşluklarla yapılır. Sekmeler kullanılıyorsa, Make bir komutu çağırmaya çalıştığınızı ve bu konuda şikayette bulunduğunuzu düşünür.

6

daha iyi bir yolu olabilir, ama ben denedim takibi ve çalışır:

İşte
$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed)) 

Ben your_command herhangi bir çıktı vermez varsayalım, ama böyle geçici bir çözüm için zor olmamalı durum.

Düzenleme: Varsayılan Windows kabuğu (ve muhtemelen herhangi bir iyi kabuk) ile çalışmasını sağlamak için shell işlevi içinde if yerine your_command && echo ok yazabilirsiniz. Bunun (eski) DOS kabukları için mümkün olduğunu düşünmüyorum. Bunlar için muhtemelen your_command'a uyum sağlamayı veya hata (veya başarı) üzerine bir şey yazdırmak için bir sarıcı komut dosyası yazmak istersiniz.

+0

Ancak, bir unix kabuğu varsayar. – JesperE

+0

Teşekkürler, doğru yönde bir adım gibi görünüyor; sherr() gibi makrolaştırılmış olmasını dilerdim, şimdiye kadar yönetmedik. –

+0

Sadece oraya koyuyorum, eğer Unix'i (tamamen ben varım) kabul etmeye istekliyseniz, bu işe yarayan tek varyanttı. "Tanımla" şablonunda, daha sonra "$ (eval $ (çağrı şablonu, arg1, arg2)" olan ... ki bu çok garipti, ama tamamen yukarıdakilerle çalışarak, ikiye katlamaya dikkat ederek. $ '* herşey * .Bir şeyden bir şekilde yararlanırsınız (başlangıçta' @ 'başlangıçta bir hedef tanımımdayım):' @ $$ (eğer $$ (eğer kabuk ise ./generate.sh $ (2)) $ (1); sonra echo "puan"; fi),, $$ (hata [$ (2)] üretilemiyor [$ (1)])) '' – sjm324

4

Sen BuildRules.mk oluşturmak için normal bir hedef kullanmalısınız:

BuildRules.mk: collect_sources.py 
     python $< >[email protected] 

include BuildRules.mk 

Bu otomatik bağımlılıkları oluştururken kullanmak standart hiledir.

+0

Jesper, girişiniz için teşekkürler, ama ben kuralınızın benim problemimi nasıl düzeltebildiğini görüyorum.her zaman çalıştırmak için collect_sources.py dosyasına ihtiyacım var, böylece kaynak dosyaların ve kuralların listesini güncellemem gerekir. Ya da bir şey eksik miyim? –

+0

Bir ".PHONY: BuildRules ekleyin. mk "üstte, o zaman. – JesperE

+0

Belki burada bariz bir şey eksik, ama bu düzgün çalışması için görünmüyor. BuildRules.mk her zaman (.PHONY kullanarak) remade, ama önce bu olur Bu, etkili olmanız anlamına gelir. önceki BuildRules.mk'yi kullanıyor. – mweerden

-1

make/gmake'yi -k seçeneğiyle çağırmayacağınızdan emin olun.

+0

Öneriniz mantıklı görünüyor, ancak gerçek şu ki, '-k' seçeneğinin' shell' işlevindeki komutları başarısız olduğunda 'make' davranışı üzerinde hiçbir etkisi yoktur. –

İlgili konular