Şimdi aşağıdaki test programımız için GNU Paket Kurgulama Sistemini nasıl kullanacağımızı öğrenelim.
#include <stdio.h>
int main()
{
printf("Çalışıyor\n");
return 0;
Programımızı test.c olarak kaydedelim. Şimdi programın derlenmesi işlemlerini autoconf ve automake ile yapmaya başlayalım. Bunun için öncelikle aşağıdaki Makefile.am dosyasını oluşturalım:
in_PROGRAMS = test
test_SOURCES = test.c
Ardından aşağıdaki gibi bir configure.in dosyası oluşturalım:
AC_INIT(test.c)
AM_INIT_AUTOMAKE(test,0.1)
AC_PROG_CC
AC_PROG_INSTALL
AC_OUTPUT(Makefile)
Dosyaları oluşturup kaydettikten sonra şimdi aşağıdaki komutları çalıştıralım:
$ aclocal
$ autoconf
$ ls -l
total 88
-rw-r--r-- 1 demirten demirten 16626 Haz 22 17:32 aclocal.m4
-rwxr-xr-x 1 demirten demirten 50233 Haz 22 17:32 configure
-rw-r--r-- 1 demirten demirten 90 Haz 22 17:31 configure.in
-rw-r--r-- 1 demirten demirten 43 Haz 22 17:29 Makefile.am
-rw-r--r-- 1 demirten demirten 71 Haz 22 17:28 test.c
Gördüğünüz gibi aclocal ve autoconf uygulamaları çalıştıktan sonra aclocal.m4 ve configure dosyaları üretildi. Şimdi ise automake programını çalıştıracağız:
$ automake -a
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'
automake: Makefile.am: installing `./INSTALL'
automake: Makefile.am: required file `./NEWS' not found
automake: Makefile.am: required file `./README' not found
automake: Makefile.am: installing `./COPYING'
automake: Makefile.am: required file `./AUTHORS' not found
automake: Makefile.am: required file `./ChangeLog' not found
automake: configure.in: installing `./depcomp'
automake ilk çalıştırıldığında öncelikle install-sh, mkinstalldirs ve missing dosyalarının daha önceden oluşturulup oluşturulmadığını kontrol eder. Eğer yoksa bu dosyaları oluşturur (Bendeki sistemde dosyaları oluşturmak yerine /usr/share/automake dizini altındaki asıllarına bağ veriyor). Bu dosyalar automake tarafından üretilen Makefile dosyaları için gereklidir. Ayrıca GNU kodlama standartlarına göre INSTALL, NEWS, COPYING, README, AUTHORS ve ChangeLog dosyalarının da bu dizinde bulunması gereklidir. Bu dosyalar olmadığı için automake uyarı vermektedir. make distcheck komutunun hata vermemesi için bu dosyaları oluşturalım, sonra içlerini nasıl olsa doldururuz. Bendeki sistemde automake ilk çalıştırıldığında INSTALL ve COPYING dosyalarını da bağ olarak oluşturduğu için önce onları siliyorum:
$ rm INSTALL COPYING
$ touch NEWS INSTALL README COPYING AUTHORS ChangeLog
automake programını bu dosyalardan varlığından haberdar edelim:
$ automake -a
$ ls
aclocal.m4 configure depcomp Makefile.am mkinstalldirs test.c
AUTHORS configure.in install-sh Makefile.in NEWS
ChangeLog COPYING INSTALL missing README
Bu dizin yapısı size tanıdık gelmiş olmalı. Kaynak paketimiz bu haliyle artık son kullanıcının karşısına çıkmaya hazır, hemen paketleyip dağıtabiliriz. Şimdi kendimizi bu programi Genel Ağ'dan indirip bilgisayarına kurmak isteyen birinin yerine koyalım. Yapmamız gerekenler aşağıdaki gibidir:
$ ./configure
creating cache ./config.cache
checking for a BSD compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for mawk... mawk
checking whether make sets ${MAKE}... yes
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc
checking for a BSD compatible install... /usr/bin/install -c
updating cache ./config.cache
creating ./config.status
creating Makefile
$ make
source='test.c' nesnect='test.o' libtool=no \
depfile='.deps/test.Po' tmpdepfile='.deps/test.TPo' \
depmode=gcc /bin/sh ./depcomp \
gcc -DPACKAGE=\"test\" -DVERSION=\"0.1\" -I. -I. -g -O2 -c `test -f test.c
¬ || echo './'`test.c
gcc -g -O2 -o test test.o
$ ./test
Çalışıyor
| Uyarı |
---|
Aşağıda programı nasıl sisteminize kuracağınız anlatılmaktadır. Öntanımlı olarak test uygulaması /usr/local/bin dizini altına kopyalanır. Ancak bu dizinde test adında bir uygulamanız zaten varsa ve bunu kaybetmek istemiyorsanız veya yanlışlıkla prefix vererek uygulamayı varolan /usr/bin/test üzerine kopyalamamak için dikkatli olunuz.
|
Bu noktada dilerseniz uygulamayı sisteme kurabilirsiniz. Bunun için root kullanıcı haklarına sahip olmalısınız.
$ make install
make[1]: Entering directory `/tmp/test'
/bin/sh ./mkinstalldirs /usr/local/bin
/usr/bin/install -c test /usr/local/bin/test
make[1]: Nothing to be done for `install-data-am'.
make[1]: Leaving directory `/tmp/test'
Uygulamayı kaldırmak içinse make uninstall komutunu kullanabilirsiniz:
$ make uninstall
rm -f /usr/local/bin/test
Uygulamanızın artık hazır olduğuna inandığınızda make distcheck komutu ile onu paket haline getirebilirsiniz (Ekran çıktısı biraz uzun olduğundan burada listelenmemiştir). Bu komut işini tamamladığında bulunduğunuz dizinde test-0.1.tar.gz adında bir dosya oluşacaktır. Artık bu dosya ile programınızın dağıtımını yapabilirsiniz.
Şimdi biraz da yaptığımız bu örneği biraz daha açıklayalım. Makefile.am içerisinde mantıksal bir dil kullandık. Yazdığımız hiç bir satır çalıştırılmadı. Diğer yandan configure.in içerisinde kullandığımız dil prosedüreldir, yazdığımız her satır çalıştırılacak bir komutu göstermektedir. Makefile.am dosyası içerisindeki ilk satır programın ismini belirtirken ikinci satır programı oluşturan kaynak kodları belirtmektedir. Şimdi daha karışık olan configure.in içerisindeki komutlara sırasıyla bakalım:
AC_INIT komutu configure betiği
için ilklendirmeleri yapar. Parametre olarak kaynak dosyaların adlarını alır.
AM_INIT_AUTOMAKE komutu, automake kullanacağımızı gösterir. Parametre olarak programın ismini ve sürümünü alır. Eğer Makefile.in dosyalarını elle hazırlayacak olsaydık bu komutu kullanmamıza da gerek olmayacaktı.
AC_PROG_CC komutu kullanılan C derleyicisinin ne olduğunu belirler.
AC_PROG_INSTALL komutu BSD uyumlu install uygulamasına sahip olup olmadığımızı denetler. Eğer yoksa bu işlem için install-sh'ı kullanır.
AC_OUTPUT komutu configure betik programının Makefile dosyalarını Makefile.in dosyalarından üretmesi gerektiğini belirtir.
Örneğimizdeki configure.in dosyası içerisinde yer almayan ama sıklıkla kullanacağımız bazı komutlar da şunlardır:
AC_PROG_RANLIB komutuyla bir kütüphane geliştiriyorsak ranlib'in sistemde nasıl kullanılacağını öğrenebiliriz.
AC_PROG_CXX komutuyla sistemdeki C++ derleyicisinin ne olduğunu öğrenebiliriz.
AC_PROG_YACC ve AC_PROG_LEX komutlarıyla kaynak kodlarımız lex veya yacc dosyaları içeriyorsa bu uygulamaların sistemde varlığını denetleyebiliriz.
Eğer alt dizinlerde başka Makefile dosyalarımız da olacaksa bunu
AC_OUTPUT(Makefile \
dizin1/Makefile \
dizin2/Makefile \
)
komutlarıyla belirtebiliriz.
Dosyaların içeriğinden bahsettikten sonra şimdi de biraz önce yaptığımız örnekte çalıştırdığımız komutlardan sonra neler olduğuna tekrar bakalım.
aclocal komutu çalıştıktan sonra aclocal.m4 dosyası üretilir. Bu dosya içerisinde autoconf tarafından kullanılacak olan makrolar yer almaktadır (kendi özel makrolarımızı nasıl hazırlayacağımıza ileride değinilecektir).
autoconf komutuyla aclocal.m4 ve configure.in dosyaları işlenerek configure betik programı oluşturulur.
automake komutu Makefile.am dosyasını temel alan bir Makefile.in oluşturur. Ayrıca GNU kodlama standartlarına göre eksik olan dosyalar için örnek birer kopya üretir.
./configure komutuyla çalıştırılan betik programı daha önceden belirtilen özellikler için sistemimizi test eder ve Makefile.in dosyasını örnek alarak Makefile dosyalarını oluşturur. AC_OUTPUT() ile belirtilen tüm dosyalardaki @FOO@ şeklindeki kayıtları FOO için elde edilen değerlerle değiştirir (örneğin C derleyicisinin ne olduğu gibi).