3.2. Basit Bir Autoconf, Automake Örneği

Şimdi aşağıdaki test programımız için GNU build 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 link 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 link 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 internetten 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' object='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'
  
Uygılamayı 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ı 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:

Örneğimizdeki configure.in dosyası içerisinde yer almayan ama sıklıkla kullanacağımız bazı komutlar da şunlardır:

Dosyaların içeriğinden bahsettikten sonra şimdi de biraz önc yaptığımız örnekte çalıştırdığımız komutlardan sonra neler olduğuna tekrar bakalım.