2010-06-15 14 views
10

Bu, here numaralı telefondan gelen bir sorudur. Sorun şu ki, tek bir girişten çok sayıda çıkış üreten bir kural var ve komut zaman alıcıdır, bu yüzden yeniden hesaplamayı önlemek isteriz. Artık dosyaların ara dosyaları olarak silinmesini engellemek için ek bir bükülme var ve kurallar parametrelere izin vermek için joker karakterleri içeriyor. make file-c.out arayarak, SonraGNU Makefile: tek bir kuraldan birden fazla çıktı + ara dosyaların silinmesini önleme

file-a.out: program file.in 
    ./program file.in file-a.out file-b.out file-c.out 

file-b.out: file-a.out 
    @ 

file-c.out: file-b.out 
    @ 

hem oluşturur ve biz -j anahtarı ile paralel make çalışan sorunları önlemek: Çözüm önerdi


aşağıdaki kural kurmak olmasıydı. Şimdiye kadar her şey yolunda.


sorun şudur. Yukarıdaki çözüm DAG'de bir zincir oluşturduğundan, make farklı olarak ele alır; file-a.out ve file-b.out dosyaları ara dosyalar olarak kabul edilir ve varsayılan olarak file-c.out hazır olduğunda gereksiz olarak silinir.

Burada bir yerden bahsedildi ve ve file-b.out adreslerinin bir .SECONDARY hedefinin bağımlılıkları olarak eklenmesi, bunların silinmesini engelliyor. Ne yazık ki, bu benim durumumu çözmüyor çünkü kurallarım joker karakterler kullanıyor; Özellikle, benim kurallarım daha şuna benzer:

file-a-%.out: program file.in 
    ./program $* file.in file-a-$*.out file-b-$*.out file-c-$*.out 

file-b-%.out: file-a-%.out 
    @ 

file-c-%.out: file-b-%.out 
    @ 

böylece bir örneğin, dosya adı dahil edildiğinden bir parametre iletebilirsiniz

make file-c-12.out 

make belgeleri etmektir anlaşılacağı çözüm çalıştırarak Bunları örtük kurallar olarak .PRECIOUS'un bağımlılıkları listesine ekleyin, böylece bu dosyaların silinmesini engelleyin.


.PRECIOUS eserlerle çözüm, ama aynı zamanda bir kural başarısız olur ve dosyalar eksik olduğunda silinmesini bu dosyaları engeller. Bu işi yapmak için başka bir yolu var mı?

çözmek için bir kesmek, yani herhangi bir önkoşul olan bir hedef .SECONDARY tanımlamaktır

tüm dosyaları make kesilirse sürece, çıkarılabilir ya da bu şekilde ikincil olarak kabul edilmelidir make bildirir
.SECONDARY: 

bir kural başarısız olur. Ne yazık ki, bu, bu şekilde çalışması için joker karakterlerle bir kural alt kümesinin seçilmesine izin vermez, bu yüzden bunu sadece bir kesmek (kullanışlı olsa bile) olarak düşünürüm.

+0

Hmm, orada önkoşullar hiçbir kök yoktur (yani sizi 'file.in yerine dosya kullanıyorum -%. in). Dosya-$ n.out dosya- $ n.in dosyasından oluşturursanız çok daha kolay hale gelir ve işleyiş şekli gariptir (dosya-c-17.out dosyası-c-18.out). Zaman gibi bazı gizli giriş kaynakları olmadığı sürece, farklı isimlerle aynı çıktıları üretin. Kural, dosya-a -% olarak değiştirilebildi mi? Out: program dosyası -%. In? – p00ya

+0

Eldeki soruyla alakasız. Bunlar sadece kurallar oluşturdu, konu, joker karakterleri içermesiydi. Gerçek kurallar çok daha karmaşıktır, ancak karmaşıklık karşılaştığım problemi gizleyecektir. – makesaurus

+0

Niçin uygun olduğu için cevabımı görün. – p00ya

cevap

2

Tek bir file.in yerine, çıktılarınız sapı içeren bir önkoşul dosyasından oluşturulduysa, örn.

file-a.out: program file-%.in 
    ./program file-$*.in file-a-$*.out file-b-$*.out file-c-$*.out 

sonra tüm olası hedefin bir listesini oluşturabilir eşleşir: kök sonlu setinden gelir

inputs = $(wildcard file-*.in) 
secondaries = $(patsubst file-%.in,file-a-%.out,$(inputs)) \ 
    $(patsubst file-%.in,file-b-%.out,$(inputs)) 

Benzer eğer:

batchnos = 17 18 19 20 
batchnos = $(shell seq 17 20) 
secondaries = $(patsubst %,file-a-%.out,$(batchnos)) $(patsubst %,file-b-%.out,$(batchnos)) 

Sonra sadece için bir önkoşul olarak bu ekleyin IECEKSERİ hedef

+0

Bu, her zaman çok pratik olmayan olası bir çözümdür. Benim durumumda, tüm olasılıkları listelemek yerine '.SECONDARY:' 'u bırakmak daha kolaydı. Ayrıca, giriş dosyasının adına '%' yazmayı gerektirmez. İhtiyacınız olan tek şey, tüm olası çıktı isimlerini adlandırmalar listesine eklemektir. – makesaurus

16

En Basit Şey, tam olarak ne istediğinizi yapacağınız en basit şeydir.

(birden hedeflerle Desen kuralları hakkında here soran birden hedeflerle Normal kural farklıdır. make manual yılında bizon örneğe bakın.)

İlgili konular