Makefile'da Kural Tanımlama
Şimdi Makefile için kuralları öğreneceğiz.
Makefile hedef kuralının genel sözdizimi -
target [target...] : [dependent ....]
[ command ...]
Yukarıdaki kodda, parantez içindeki argümanlar isteğe bağlıdır ve üç nokta bir veya daha fazla anlamına gelir. Burada, her komutun önsözü için sekmenin gerekli olduğuna dikkat edin.
Aşağıda, hedefinizi diğer üç dosyadan merhaba yapmak için bir kural tanımladığınız basit bir örnek verilmiştir.
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
NOTE - Bu örnekte, tüm nesne dosyalarını kaynak dosyalardan yapmak için kurallar vermeniz gerekir.
Anlambilim çok basit. "Hedef yap" dediğinizde,makegeçerli olan hedef kuralı bulur; ve bakmakla yükümlü olduğunuz kişilerden herhangi biri hedeften daha yeniyse,makekomutları birer birer yürütür (makro değişikliğinden sonra). Herhangi bir bağımlı olması gerekiyorsa, bu önce gerçekleşir (böylece bir özyinelemeniz olur).
Makeherhangi bir komut bir arıza durumu döndürürse sona erer. Bu durumda aşağıdaki kural gösterilecektir -
clean:
-rm *.o *~ core paper
Maketire ile başlayan komut satırlarında döndürülen durumu yoksayar. Örneğin, çekirdek dosya olmaması kimin umurunda?
Makesize neler olduğunu göstermek için makro değişiminden sonra komutları yansıtır. Bazen bunu kapatmak isteyebilirsiniz. Örneğin -
install:
@echo You must be root to install
İnsanlar Makefiles'da belirli hedefler beklemeye başladılar. Her zaman önce göz atmalısınız. Ancak, hedeflerin hepsinin (veya sadece yaptığı), kurulumunun ve temizliğinin bulunmasını beklemek mantıklıdır.
make all - Uygulamaları kurmadan önce yerel testler yapabilmeniz için her şeyi derler.
make install - Uygulamaları doğru yerlere yükler.
make clean - Uygulamaları temizler, yürütülebilir dosyalardan, geçici dosyalardan, nesne dosyalarından vb. Kurtulur.
Makefile Örtülü Kuralları
Komut, x.cpp kaynak kodundan çalıştırılabilir bir x oluşturduğumuz tüm durumlarda çalışması gereken bir komuttur. Bu örtük bir kural olarak ifade edilebilir -
.cpp:
$(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o $@
Bu örtük kural, xc'den nasıl x çıkarılacağını söyler - xc üzerinde cc çalıştır ve x çıktısını çağır. Kural örtüktür çünkü belirli bir hedef belirtilmemiştir. Her durumda kullanılabilir.
Diğer bir yaygın örtük kural, .cpp (kaynak dosyalar) dışında .o (nesne) dosyalarının oluşturulması içindir.
.cpp.o:
$(CC) $(CFLAGS) -c $<
alternatively
.cpp.o:
$(CC) $(CFLAGS) -c $*.cpp