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
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.
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
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
Niçin uygun olduğu için cevabımı görün. – p00ya