Editör'den
 Bilişim Harcamaları
 Hangi Linux?
 Sanal Yerel Ağları
 Serbest Yazılım - II
 Veritabanı Bileşenleri
 Windows Güvenliği - I
 CISN Arşiv
 Anket
 Geribildirim


Computing & Information Services Newsletter
Serbest Yazılım Geliştirme Araçları
     
 

CISN'in geçen sayısında Serbest Yazılım'dan bahsetmiştim. Bu sayıda da Serbest Yazılım geliştirme araçlarından söz edeceğim ve örnek bir yazılım projesi gerçekleştireceğim.

Serbest yazılımlar değişik platformlar üzerinde çok farklı araçlar kullanılarak geliştirilebilirler. Ben, bu yazı boyunca, automake, autoconf, cvs gibi araçların kullanımından bahsedeceğim. Klyx, Glade gibi görsel araçlara ise değinmeyeceğim.

Birçoğumuz Linux kurulu bilgisayarlarımıza program kurarken basitçe:

$ ./configure
$ make
$ make install

komut dizileri ile program kurmuşuzdur. Elbette kurulan yazılıma bağlı olmakla birlikte programı derlemeye başlamadan ./configure aşamasında kurulumumuzu yapılandırabiliriz. Bir örnek üzerinden gitmenin çok daha açıklayıcı olacağını düşünüyorum. Dünyada en çok yazılan programlardan biri, "helloworld" örneğini ele alalım.

- helloworld.c
-------------------------------
#include <stdio.h>

int main(int argc, char **argv) {

  printf("hello world\n");
  return 0;
}
-------------------------------

Bu programı derlemek için aşağıdaki komut yeterli olacaktır. Bu komutun sonucu olarak elimizde "helloworld" isminde çalıştırılabilir bir dosya olacaktır.

$ gcc -o helloworld helloworld.c

İstersek programımızı yukarıda bahsettiğim configure komutu ile yapılandırılabilir, make komutu ile derlenebilir hale getirebiliriz. Böyle bir program geliştirme ortamı için autoconf ve automake programlarının kurulu olması gerekiyor. Önce bu programların ne yaptıklarından bahsedelim:

Autoconf: Yazılımların kaynak kodlarını Unix-benzeri sistemlere uyarlayan betikleri (shell script) hazırlar. Autoconf programın kullanacağı sistem özelliklerinin bir listesini çıkartır ve bunları kontrol eden bir yapılandırma betiği oluşturur.

Automake: Programı derlemek için kullanılan Makefile dosyasını oluşturur.

Örneğimize devam edelim. "helloworld" programının versiyon bilgisini ekrana basmasını istersek, bir seçeneğimiz bu bilgiyi "helloworld.c" kaynak kod dosyasının içine yazmak olabilir. Diğer bir seçenek ise autoconf / automake kullanarak geliştireceğimiz programın bu bilgiyi yapılandırma dosyaları aracılığı ile almasını sağlamaktır. Bunun için şu aşamada yapmamız gerekenler autoconf ve automake'in ihtiyaç duyduğu dosyaları aşağıdaki şekilde oluşturmaktır:

- configure.in
-------------------------------
AC_INIT(Makefile.am)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE(helloworld,0.1)
AM_CONFIG_HEADER(config.h)
AC_PROG_INSTALL
AC_SUBST(INCLUDES)
AC_SUBST(VERSION)
AC_OUTPUT(Makefile)
-------------------------------

Bu dosya, Makefile.am isimli bir dosya kullanacağı, config.h header dosyası oluşturacağı vb. bilgileri içeriyor. Programın derlenmesi için gerekli her şeyi, yapılandırma aşamasında verilmesini istediğiniz seçeneklerin denetimini burada belirtebilirsiniz.

- acconfig.h
-------------------------------
#ifndef VERSION
#undef VERSION
#endif
-------------------------------

"configure.in" dosyasında belirttiğimiz config.h dosyasını hazırlarken acconfig.h dosyasına ihtiyacımız olacak.

- Makefile.am
-------------------------------
bin_PROGRAMS: helloworld
helloworld_SOURCES: helloworld.c
-------------------------------

Programı Makefile aracılığı ile derlerken hangi kaynak kod dosyasının kullanılacağını ve üretilecek çalıştırılabilir dosyayı burada belirtiyoruz.

- helloworld.c
-------------------------------
#include <stdio.h>
#include <config.h>

int main(int argc, char **argv) {

  char *version = VERSION;
  printf("hello world!! my version: %s\n", version);
  return 0;
}
-------------------------------

Son olarak kaynak kodumuzda da gerekli değişikliği yapıp, programımızın versıyon bilgisini "config.h" dosyasından almasını sağlıyoruz. Şu anda elimizde sadece 4 dosya var. çalıştırılması gereken komutlar ve sonucunda oluşan durumu aşağıda bulabilirsiniz.

-------------------------------
$ ls
acconfig.h   configure.in   helloworld.c   Makefile.am

$ aclocal
$ ls
acconfig.h   aclocal.m4   configure.in   helloworld.c   Makefile.am

$ autoheader
$ ls
acconfig.h   aclocal.m4   config.h.in   configure.in   helloworld.c   Makefile.am

$ autoconf
$ ls
acconfig.h   config.h.in   configure.in   Makefile.am
aclocal.m4   configure     helloworld.c

$ automake
automake: configure.in: required file `./install-sh' not found
automake: configure.in: required file `./mkinstalldirs' not found
automake: configure.in: required file `./missing' not found
automake: configure.in: required file `./config.guess' not found
automake: configure.in: required file `./config.sub' not found
automake: Makefile.am: required file `./INSTALL' not found
automake: Makefile.am: required file `./NEWS' not found
automake: Makefile.am: required file `./README' not found
automake: Makefile.am: required file `./COPYING' not found
automake: Makefile.am: required file `./AUTHORS' not found
automake: Makefile.am: required file `./ChangeLog' not found
$ ls
acconfig.h   config.h.in   configure.in   Makefile.am   stamp-h.in
aclocal.m4   configure     helloworld.c   Makefile.in

$ automake --add-missing
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'
automake: configure.in: installing `./config.guess'
automake: configure.in: installing `./config.sub'
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
$ ls
acconfig.h     config.h.in   configure.in   INSTALL       Makefile.in    stamp-h.in
aclocal.m4     config.sub    COPYING        install-sh    missing
config.guess   configure     helloworld.c   Makefile.am   mkinstalldirs
-------------------------------

Her yazılım paketinde bulunması gereken "NEWS", "README", "AUTHORS" ve "ChangeLog" dosyalarını oluşturmak ise paketi hazırlayana bırakılmıştır.

$ ./configure
$ make

şeklinde programımızı derleyip çalıştırdığımızda aşağıdaki ekran çıktısı görülür.

$ ./helloworld
hello world!! my version: 0.1

Gelecekte yeni versiyonlar hazırlanırken, projedeki dosyaların eski durumlarına dönmek gerekebilir. Böyle durumlar için projenizin belirli anlardaki kopyalarını farklı dizinlerde saklayıp bu dosya kalabalığında kaybolabilirsiniz ya da CVS kullanıp projenizdeki dosyaların istediğiniz kopyasına erişebilirsiniz.

CVS: CVS bir versiyon kontrol sistemidir. CVS kullanarak kaynak kodlarınızın geçmişteki durumlarını tutabilirsiniz. CVS dosyaların farklı versiyonlarını tek bir dosyada diff komutunun çıktısına benzer farklar halinde tutar, bu yüzden çok az disk alanı kullanır. CVS sunucu, yazılımın geliştirildiği bilgisayar üzerinde olabileceği gibi, başka bir bilgisayarda da olabilir.

-------------------------------
$ cvs -d:pserve
r:user@cvs_server:/cvs/cvsroot login
Logging in to :pserver:user@cvs_server:2401/cvs/cvsroot
CVS password:
$
-------------------------------

CVS sunucuya login olduktan sonra, dosyalarımızı CVS sunucuya gönderebiliriz.

-------------------------------
$ cvs import -m "helloworld project" helloworld yoyo start
L helloworld/install-sh
L helloworld/mkinstalldirs
L helloworld/missing
L helloworld/config.guess
L helloworld/config.sub
L helloworld/INSTALL
L helloworld/COPYING
N helloworld/aclocal.m4
N helloworld/helloworld.c
N helloworld/configure.in
N helloworld/acconfig.h
N helloworld/Makefile.am
N helloworld/configure
N helloworld/config.h.in
N helloworld/stamp-h.in
N helloworld/Makefile.in

No conflicts created by this import
$
-------------------------------

Projemizdeki dosyaları CVS sunucuya gönderme işlemi tamamlandı. Üzerinde çalışmak istediğimizde dosyalarımızı CVS sunucudan almak ise şu şekilde gerçekleştirebiliriz:

-------------------------------
$ cvs checkout helloworld
cvs server: Updating hel
loworld
U helloworld/Makefile.am
U helloworld/Makefile.in
U helloworld/acconfig.h
U helloworld/aclocal.m4
U helloworld/config.h.in
U helloworld/configure
U helloworld/configure.in
U helloworld/helloworld.c
U helloworld/stamp-h.in
-------------------------------

Programımıza yapılandırma sırasında "configure" ile argüman geçirmek için örneğimizi geliştirmeye devam edelim. Programımızın "debug" opsıyonu ile derlenip derlenmediğini ekrana göndermesini istersek dosyalarımızı aşağıdaki gibi değiştirmeliyiz:

- configure.in
-------------------------------
AC_INIT(Makefile.am)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE(helloworld,0.2)
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_INSTALL

debuger=no
AC_ARG_ENABLE(debug,
  [--enable-debug, enable debug data generation],
  debuger="$enableval")
if test x"$debuger" = x"yes"; then
  AC_DEFINE(DEBUG)
if

AC_SUBST(INCLUDES)
AC_SUBST(VERSION)
AC_OUTPUT(Makefile)
-------------------------------

- acconfig.h
-------------------------------
#ifndef VERSION
#un
def VERSION
#endif
#ifndef DEBUG
#undef DEBUG
#endif
-------------------------------

- helloworld.c
-------------------------------
#include
#include

int main(int argc, char **argv) {

  char *version = VERSION;
  #ifdef DEBUG
  printf("hello world - debug enabled!! my version: %s\n", version);
  #else
  printf("hello world!! my version: %s\n", version);
  #endif

  return 0;
}
-------------------------------

Değişikliklerimizin kullanılabilir olması için yukarıda anlatıldığı şekilde aclocal, autoheader, autoconf, automake komutlarının çalıştırılması gerekir. Daha sonra programımızı derleyebiliriz.

-------------------------------
$ ./configure --enable-debug
$ make
$ ./helloworld
hello world - debug enabled!! my version: 0.2
$ ./configure
$ make
$ ./helloworld
hello world!! my version: 0.2
-------------------------------

Gördüğünüz gibi programımız derleme öncesi yapılandırma sırasında bir opsiyon aldı ve bu şekilde çalışabilir oldu. Bu bizim 0.2 numaralı versiyonumuz olacak. Bunu da CVS depomuzda tutmak istersek yapmamız gereken şu:

-------------------------------
$ cvs commit helloworld.c
Checking in helloworld.c;
/cvs/cvsroot/helloworld/helloworld.c,v <-- helloworld.c
new revision: 1.2; previous revision: 1.1
done
$ cvs commit configure.in acconfig.h
Checking in configure.in;
/cvs/cvsroot/helloworld/configure.in,v <-- configure.in
new revision: 1.2; previous revision: 1.1
done
Checking in acconfig.h;
/cvs/cvsroot/helloworld/acconfig.h,v <-- acconfig.h
new revision: 1.2; previous revision: 1.1
done
-------------------------------

Artık istediğimiz an dosyalarımızın 1.1 ya da 1.2 versiyonlarına ulaşabiliriz.

Bu işlemleri yaparken karşımıza bir metin editorü penceresi açılır ve dosyalarda yaptığımız değişikliklerle ilgili bir yorum/not yazmamıza olanak sağlar. Bu notları yazmak, ileride bu dosyalarda değişiklik yapılacağı zaman çok yardımcı olur.

Son olarak cvs2cl adlı bir programdan söz etmek istiyorum. Aslında bir Perl betiği olan cvs2cl, dağıtımların içerisinde yer alan ChangeLog dosyasını otomatik olarak oluşturur. Bu işi yaparken yukarıda sözü edilen dosyalardaki değişiklikler ile ilgili girilen yorumları / notları kullanır.

-------------------------------
$ cvs2cl.pl -P
cvs server: Logging .
$ cat ChangeLog
2002-11-17 18:06 user

* acconfig.h, configure.in: necessary changes for debug option

2002-11-17 18:05 user

* helloworld.c: debug option enabled

2002-11-17 16:51 user

* Makefile.am, Makefile.in, acconfig.h, aclocal.m4, config.h.in,
configure, configure.in, helloworld.c, stamp-h.in: Initial revision

2002-11-17 16:51 user

* Makefile.am, Makefile.in, acconfig.h, aclocal.m4, config.h.in,
configure, configure.in, helloworld.c, stamp-h.in: helloworld
project
-------------------------------

Yukarıda kısa bir örnek ile serbest yazılım geliştirme ortamını tanıtmaya çalıştım. Eğer bir projeniz varsa ve bunu serbest yazılım ilkelerine göre geliştirip dağıtmak istiyorsanız Sourceforge'un serbest yazılım geliştiricilerine sunduğu olanakları incelemenizi öneririm.

Linkler:

http://www.sourceforge.net
http://www.gnu.org
http://www.freshmeat.net

Paylaşmanın tadını çıkarın! (Share and Enjoy!)

Ahmet Öztürk

 
     
  - BAŞA DÖN -  
© 2002 METU CC
Design: CC - INFO