, nasıl göründüğünü (Make GNU içinde kalıp kurallarını nasıl kullanılacağına dair bir örnek vereyim .PHONY
hedefinden bahsetmişken kullandığınız gibi. Yaptığınız en Bağımlılık denetimi herhangi kullanmıyorsanız Ancak, bir kabuk ile bunu daha basit olabilecek - gibi bir şey:
#!/bin/sh
TASKS="task01 task02 task03"
for i in $TASKS; do
rm $i $i.ext $i.o -f;
compiler $i.ext -O2 --make;
./$i;
done
Ama Yapmak ilkesini genişletmek için, başka bir sorun var mücadele etmek. Formun Hatları:
task01-all: task01-clean task01 task01-run
ön koşulları oluşturmak ne sırayla yapın söyleme - hepsi task01-all
inşa girmeden önce yapılması gereken sadece bu. Bunun yerine, çalıştırılacak her adım ondan önceki adımlara bağlı olmalıdır. Böyle bir şey: %
ile
TASKS=task01-run task02-run task03-run
.PHONY: all $(TASKS) $(TASKS:run=clean)
all: $(TASKS)
$(TASKS:run=clean): %-clean:
rm $* $*.ext $*.o -f
%: %.ext | %-clean
compiler $< -O2 --make
$(TASKS): %-run: %
./$<
kurallar "desen kuralları" denilen ve farklı hedefler için yeniden yazma aynı kural birden çok kez önlemek için harika bir araç olduğunu edilir. Bir uyarı, Make'in normalde .PHONY
hedefine ilişkin kurallarını kontrol etmemesidir; Bunu, bu kuralların hedefler listesi ve ikinci bir kolon (örneğin, $(TASKS):
) ile önekleyerek bunu açıkça yapmasını söyleriz.
task01-run
numaralı telefondan task01
numaralı telefon hattına ihtiyaç duyduğumuzdan, hedeflerini %
numaralı telefondan edinebilirsiniz. Ayrıca, Makefile'niz her seferinde temiz çalıştırmak istediğinizi gösterir, bu yüzden %
'u %-clean
'a bağımlı hale getiririz. %-clean
aslında herhangi bir çıktı üretmediğinden, bunu "yalnızca sipariş" bağımlılığı yapıyoruz - Make bir zaman damgası veya herhangi bir şey aramayacak, sadece kuralını ilk kez çalıştırdıktan sonra %
kural. "Sipariş sadece" bağımlılıkları sonra yerleştirilir bir |
:
%: %.ext | %-clean
bunu yapmak en önemli güçlerinden biri o tekrarlanması gerekmez işi tekrarlayarak kalmayarak zamandan tasarruf olmasıdır belirtmekte yarar var - yani onu Bağımlılıklar hedeften daha yeni ise, yalnızca bir kural çalıştırır.Daha sonra bir kural ekleyebilir
%: %.ext
compiler $< -O2 --make
sadece
%-clean
hedeflerin tümünü çalıştırmak için: Yani, sadece yeni
%
daha
compiler $< -O2 --make
%.ext
eğer çalıştırmak yapmak neden olur
%-clean
olan bağımlılığı, kapalı bırakabilir
.PHONY: all $(TASKS) $(TASKS:run=clean) clean
clean: $(TASKS:run=clean)
Son şey: Tariflerde bazı özel değişkenler kullanıyorum. [email protected]
, oluşturulmakta olan hedefi gösterir. $<
ilk bağımlılık anlamına gelir. $*
, bir desen kuralının "gövdesini" (yani, %
ile eşleşen parça) kısaltmasıdır.
Güzel açıklamalar. Teşekkürler! –
"|" için bir örnek sağlama iyiydi teşekkürler. –