2.5. Make

2.5.1. Make nedir ?

Eğer bir program yazdığınızda derlemek için

% cc dosya1.c dosya2.c

yazmanız yeterli. Ama 4-5 dosya daha ekleyecek olsak yazacağımız kod çok uzun olacak ve her derleme sırasında bu işlemi manasız tekrar edeceğiz. Üstelik her derleyişte bütün dosyaları tekrar baştan derleyecek ve bu çok fazla zaman alacak.

Bu problemi çözmenin bir yolu kaynak kodu dosayaları yerine derlenmiş olan obje dosyalarını verip ve değişiklik yapmış olduğunuz dosyayı derlersiniz.

% cc dosya1.o dosya2.o ... dosya37.c ...

Derleme zamanını oldukça azaltacak olsada bu satırı yazmak büyük bir zaman kaybı olacaktır.

Yada bir kabuk programı yazarak herşeyi tekrar baştan derlemesini sağlayabiliriz, yine derleme zamanından kayıp olacağı için mantıklı bir çözüm değil.

Bir de bir takım halinde çalıştığınızı ve hangi kodu değiştirdiğini unutan bir takım arkadaşınız olduğunu düşününün. Böyle olunca öyle bir kabuk programı yazmalıyız ki derlenmesi gereken kodları derlesin geri kalanında obje kodu kullansın. Bu iş kabuk programı için çok karmaşık olacaktır.

Make programı bu işi sizin için otomatik olarak yapar. Mesela deneme.c nin değiştirilme süresi deneme.o dan sonra ise derlenmesi gereken bir dosyadır diyerek bunu derler. Hangi dosyaların programımız içinde olacağını Makefile dosyasında belirtiriz. Ayrıca kodların nasıl derleneceğini hangi kuralların geçerli olduğunu hepsini bu şekilde halledebiliriz.

Makefile dosyaları genellikle kaynak kodlarımızla aynı dizinde olur ve genellikle makefile , Makefile yada MAKEFILE olarak isimlendirilir. Çoğu programcı Makefile ismini tercih ediyor çünkü listelediğinizde en üstte çıkıyor.

2.5.2. Make kullanım örnekleri

Basit bir make file örneği

deneme: deneme.c cc -o deneme deneme.c

İki satır içerir bir tanesi bağlantı satırı bir tanesi oluşturma satırı.

Bağlantı satırı iki ana elementten oluşur , program ismi (hedef olarak da isimlendirilir) sonra ':' karakteri bir boşluk ve kaynak kodu dosyası.Make programı bu satırı okuduğu zaman deneme dosyasının olup olmadığına bakar eğer var ise deneme.c dosyasının zamanı ile karşılaştırır.Eğer daha eski ise oluşturma satırındaki derlemeyi gerçekleştirir.

Oluşturma satırı tab karakteri ile başlar ve komut satırında deneme programını oluşturmak için yapılması gerekenleri içerir. Eğer deneme dosyası yoksa veya eski ise bu komut çalıştırılarak yeniden derleme işlemi gerçekleştirilir.

Bu kural birden fazla make file dosyası için de geçerlidir.Mesela FreeBSD sistemini derlemek için gerekli dizinde "make world" şeklinde komut kullanılabilir.

Make programının başka bir güzelliği de hedefin illa ki program olmasının gerekmemesidir. Şöyle bir örnek verirsek :

deneme : deneme.c deneme -o deneme deneme.c install : cp deneme /home/bin

böyle bir makefile dosyası oluşturur ve çalıştırır isek deneme programımızı derler. Hedef olarak install'i belirtip kurulum sırasında gereken betikleri kolayca işletebiliriz.

Eğer make komutunu önüne dosya ismi yazmadan kullanırsak make bulduğu ilk hedefte durup diğerlerine bakmayacaktır.Bunun yerine aşağıdaki yöntemle hedef belirtilebilir

% make hedef

Burada sadece make yazarsak deneme programı oluşturulacak ama install betiği oluşturulmayacaktır.

Install programı hiç bir şeye bağlı olmadığı için sağ tarafı boş bırakıldı. Bu yüzden her seferinde alttaki komutu işletecektir. Install hedefini oluşturmak için

 make install 
yazmak yeterlidir.Bu durumda install hedefinin belirttiği işlemler gerçekleştirilecek ve deneme programı kullanıcı dizininin altına atılacak.

Burası size biraz karışık geldi ise yapabileceğiniz en iyi şey küçük bir "Merhaba dünya" programı yazmanız ve bu program üzerine makefile oluşturup bunlar üzerinde biraz çalışmanız olacaktır.Sonra birden fazla kaynak kodu üzerinde çalışmayı deneyebilirsiniz, üzerine diğer kütüphaneleri vs vs ile bunu genişletebilirsiniz. Ayrıca

        touch 
komutu ile dosya erişim zamanını dosyayı açmadan değiştirebilirsiniz. Bu komutu kullandığınız takdirde dosyanıza sanki yeni erişim yapılmış gibi erişim zamanını değiştirir . Daha detaylı bilgi için bilgi sayfasına (man page) bakabilirsiniz.

2.5.3. Make ile include kullanımı

Programınızın başına yazdığınız kullanacağınız fonksiyonların protatiplerini içeren bu kütüphane dosyaları şu şekildedir.

#include <stdio.h> #include "deneme.h" int main(....

Burada kendi yazdığımız kütüphane (header) dosyalarının da değiştiğinde derlenmesi istiyorsak şu satırı eklemeliyiz

deneme: deneme.c deneme.h

Projenizi büyüttükçe kendi yazmış olduğunuz kütüphane(header) dosyalarını daha çok kullanmanız gerekecek. Bazen bütün bu dosyaların hangisine bağlantılı olduğunu ayarlamak çok zor olabilir.Eğer siz bir header i değiştirir ve bu dosyaya bağlı olan diğer kodlarınızı tekrar derlemezseniz sonuç hiç de iç açıcı olmayacaktır.Çünkü buna bağlı olan diğer kodlar eski versiyonunu derlenmiş halini çalıştıracaktır.Gcc'nin -MM seçeneği bütün gerekli dosyaları analiz etmek için kullanılabilir .

Makefile dosyanıza şu şekilde ekleyebilirsiniz

depend: gcc -E -MM *.c >.depend

sonra

make depend
i çalıştırdığınızda bütün bağlantılı dosyaları liste halinde .depend dosyasında elde edebilirsiniz.

foo.o: foo.c foo.h

Eğer foo.h dosyasını değiştirirseniz foo.h'a bağlı olan bütün dosyalar yeniden derlenecektir.

Programınıza her bir header eklediğinizde make depend i tekrar çalıştırmayı unutmayın.

2.5.4. FreeBSD Makefile dosyaları

Makefile dosyaları bazen yazması karmaşık olabilir. Bereket versin BSD- tabanlı sistemler mesela FreeBSD çok güçlü çeşitli makefile dosyaları ile birlikte geliyor. Mesela port ağacı sistemi

MASTER_SITES=
        ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/ DISTFILES=
        scheme-microprogramlisting+dist-7.3-freebsd.tgz .include <bsd.port.mk>

Bu dizine gidip 'make' komutunu verirsek aşağıdaki olaylar gerçekleşecektir :

1. Bu portun sistemde olup olmadığı kontrol edilir.

2. Eğer yoksa FTP bağlantısı ile MASTER_SITES yolundaki sisteden kodlar alınır.

3. Dosyanın tam olarak alındığına emin olmak için sağlama yapılır.Bu şekilde aktarım sırasında oluşan hatalar denetlenir.

4. Aktarılan kaynak kodlarının çalışabilmesi için gerekli bütün ayarlar yapılır.

5. Gerekli özel ayarlar gerçekleştirilir. (Hangi UNIX versiyonunda derleme yapıldığı gibi)

6. Kaynak kodu derlenir. Kaynak kodlarının olduğu dizine gidip make çalıştırılır. Make programı yapmak için bütün gerekli bilgilere sahiptir.

7. Bundan sonra programın derlenmiş halini elde ederiz.Bu aşamada programı test edebiliriz.Eğer sonuçtan memnun iseniz programınızı gerekli yerlere kopyalamak için make install ı çağırabilirsiniz.Böylece paket veritabanına da kayıt olan program istendiğinde rahatça sistemden kaldırılabilir.

Bu dört satır kodu bu kadar etkileyici kılan nedir ?

Bu işin sırrı son satırda saklı , yani sistem makefile dosyası olan bsd.port.mk dosyasını çalıştırıyor.Bu satırı gözden kaçırmak olası ama birileri akıllıca bu kodu eklemiş ve yukarıda anlatılan işleri ve burada bahsedilmemiş bir sürü işi yapıyor. Böylece makefile yazdığınız zaman bu kodu eklemeniz erişim için yeterli olacaktır.

Eğer sistem makefile dosyalarına bakmak istiyorsanız /usr/share/mk altında bulabilirsiniz.Ama makefile sistemine alışmadan önce biraz beklemeniz daha yararlı olacaktır.Çünkü başlangıç için çok karmaşık gelebilir.

2.5.5. Daha gelişmiş make kullanımı

Make çok güçlü bir araç , yukarıda gösterilenlerden çok daha fazlasını yapabilir.Ne yazık ki make'in birden fazla versiyonu vardır.Her biri birbirinden ayrı düşünülebilir. Bunları öğrenmenin en iyi yolu kendi dökümanlarını , yardım sayfalarını okumaktır. İnşallah bu döküman size bir temel teşkil etmiştir.

FreeBSD ile birlikte gelen make Berkeley make olarak adlandırılır. Bu programın kullanımı /usr/share/doc/psd/12.make dosyasında bulunabilir.Görüntülemek için

% zmore paper.ascii.gz

komutu verilir.

Port ağacında bulunan programlar genel itibari ile GNU make kullanırlar.GNU make e ait güzel bilgi sayfaları vardır.Eğer gnu make gerektiren herhangi bir port kurduysanız Gnu make otamatik olarak kurulacaktır.Ayrıca kendisi de bir port olarak sistemde bulunur.

Gnu make in bilgi sayfalarına bakmak için /usr/local/info altındaki dir dosyasını düzenlemeniz gerekmektedir.Sonra aşağıdaki satırı ekleyin.

* Make : (make). The GNU Make utility.

Bundan sonra info yazdığınızda karşınıza çıkan menüden make seçeneğini seçerek bakabilirsiniz (Yada Emacs altında C-h tuş kombinasyonunu kullanabilirsiniz.)