Ş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:
laptop:/tmp/test$ aclocal
laptop:/tmp/test$ autoconf
laptop:/tmp/test$ 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:
laptop:/tmp/test$ 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:
laptop:/tmp/test$ rm INSTALL COPYING
laptop:/tmp/test$ touch NEWS INSTALL README COPYING AUTHORS ChangeLog
automake programını bu dosyalardan varlığından haberdar edelim:
laptop:/tmp/test$ automake -a
laptop:/tmp/test$ 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 örütbağdan indirip
bilgisayarına kurmak isteyen birinin yerine koyalım. Yapmamız gerekenler aşağıdaki gibidir:
laptop:/tmp/test$ ./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
laptop:/tmp/test$ 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
laptop:/tmp/test$ ./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.
laptop:/tmp/test$ 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:
laptop:/tmp/test$ 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).