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 Yazlm Gelitirme Aralar
     
 

CISN'in geen saysnda Serbest Yazlm'dan bahsetmitim. Bu sayda da Serbest Yazlm gelitirme aralarndan sz edeceim ve rnek bir yazlm projesi gerekletireceim.

Serbest yazlmlar deiik platformlar zerinde ok farkl aralar kullanlarak gelitirilebilirler. Ben, bu yaz boyunca, automake, autoconf, cvs gibi aralarn kullanmndan bahsedeceim. Klyx, Glade gibi grsel aralara ise deinmeyeceim.

Biroumuz Linux kurulu bilgisayarlarmza program kurarken basite:

$ ./configure
$ make
$ make install

komut dizileri ile program kurmuuzdur. Elbette kurulan yazlma bal olmakla birlikte program derlemeye balamadan ./configure aamasnda kurulumumuzu yaplandrabiliriz. Bir rnek zerinden gitmenin ok daha aklayc olacan dnyorum. Dnyada en ok yazlan programlardan biri, "helloworld" rneini ele alalm.

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

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

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

Bu program derlemek iin aadaki komut yeterli olacaktr. Bu komutun sonucu olarak elimizde "helloworld" isminde altrlabilir bir dosya olacaktr.

$ gcc -o helloworld helloworld.c

stersek programmz yukarda bahsettiim configure komutu ile yaplandrlabilir, make komutu ile derlenebilir hale getirebiliriz. Byle bir program gelitirme ortam iin autoconf ve automake programlarnn kurulu olmas gerekiyor. nce bu programlarn ne yaptklarndan bahsedelim:

Autoconf: Yazlmlarn kaynak kodlarn Unix-benzeri sistemlere uyarlayan betikleri (shell script) hazrlar. Autoconf programn kullanaca sistem zelliklerinin bir listesini kartr ve bunlar kontrol eden bir yaplandrma betii oluturur.

Automake: Program derlemek iin kullanlan Makefile dosyasn oluturur.

rneimize devam edelim. "helloworld" programnn versiyon bilgisini ekrana basmasn istersek, bir seeneimiz bu bilgiyi "helloworld.c" kaynak kod dosyasnn iine yazmak olabilir. Dier bir seenek ise autoconf / automake kullanarak gelitireceimiz programn bu bilgiyi yaplandrma dosyalar aracl ile almasn salamaktr. Bunun iin u aamada yapmamz gerekenler autoconf ve automake'in ihtiya duyduu dosyalar aadaki ekilde oluturmaktr:

- 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 oluturaca vb. bilgileri ieriyor. Programn derlenmesi iin gerekli her eyi, yaplandrma aamasnda verilmesini istediiniz seeneklerin denetimini burada belirtebilirsiniz.

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

"configure.in" dosyasnda belirttiimiz config.h dosyasn hazrlarken acconfig.h dosyasna ihtiyacmz olacak.

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

Program Makefile aracl ile derlerken hangi kaynak kod dosyasnn kullanlacan ve retilecek altrlabilir 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 deiiklii yapp, programmzn versyon bilgisini "config.h" dosyasndan almasn salyoruz. u anda elimizde sadece 4 dosya var. altrlmas gereken komutlar ve sonucunda oluan durumu aada 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 yazlm paketinde bulunmas gereken "NEWS", "README", "AUTHORS" ve "ChangeLog" dosyalarn oluturmak ise paketi hazrlayana braklmtr.

$ ./configure
$ make

eklinde programmz derleyip altrdmzda aadaki ekran kts grlr.

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

Gelecekte yeni versiyonlar hazrlanrken, projedeki dosyalarn eski durumlarna dnmek gerekebilir. Byle durumlar iin projenizin belirli anlardaki kopyalarn farkl dizinlerde saklayp bu dosya kalabalnda kaybolabilirsiniz ya da CVS kullanp projenizdeki dosyalarn istediiniz kopyasna eriebilirsiniz.

CVS: CVS bir versiyon kontrol sistemidir. CVS kullanarak kaynak kodlarnzn gemiteki durumlarn tutabilirsiniz. CVS dosyalarn farkl versiyonlarn tek bir dosyada diff komutunun ktsna benzer farklar halinde tutar, bu yzden ok az disk alan kullanr. CVS sunucu, yazlmn gelitirildii bilgisayar zerinde olabilecei gibi, baka 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, dosyalarmz CVS sunucuya gnderebiliriz.

-------------------------------
$ 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 gnderme ilemi tamamland. zerinde almak istediimizde dosyalarmz CVS sunucudan almak ise u ekilde gerekletirebiliriz:

-------------------------------
$ 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
-------------------------------

Programmza yaplandrma srasnda "configure" ile argman geirmek iin rneimizi gelitirmeye devam edelim. Programmzn "debug" opsyonu ile derlenip derlenmediini ekrana gndermesini istersek dosyalarmz aadaki gibi deitirmeliyiz:

- 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;
}
-------------------------------

Deiikliklerimizin kullanlabilir olmas iin yukarda anlatld ekilde aclocal, autoheader, autoconf, automake komutlarnn altrlmas gerekir. Daha sonra programmz derleyebiliriz.

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

Grdnz gibi programmz derleme ncesi yaplandrma srasnda bir opsiyon ald ve bu ekilde alabilir oldu. Bu bizim 0.2 numaral versiyonumuz olacak. Bunu da CVS depomuzda tutmak istersek yapmamz 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
-------------------------------

Artk istediimiz an dosyalarmzn 1.1 ya da 1.2 versiyonlarna ulaabiliriz.

Bu ilemleri yaparken karmza bir metin editor penceresi alr ve dosyalarda yaptmz deiikliklerle ilgili bir yorum/not yazmamza olanak salar. Bu notlar yazmak, ileride bu dosyalarda deiiklik yaplaca zaman ok yardmc olur.

Son olarak cvs2cl adl bir programdan sz etmek istiyorum. Aslnda bir Perl betii olan cvs2cl, datmlarn ierisinde yer alan ChangeLog dosyasn otomatik olarak oluturur. Bu ii yaparken yukarda sz edilen dosyalardaki deiiklikler ile ilgili girilen yorumlar / notlar kullanr.

-------------------------------
$ 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
-------------------------------

Yukarda ksa bir rnek ile serbest yazlm gelitirme ortamn tantmaya altm. Eer bir projeniz varsa ve bunu serbest yazlm ilkelerine gre gelitirip datmak istiyorsanz Sourceforge'un serbest yazlm gelitiricilerine sunduu olanaklar incelemenizi neririm.

Linkler:

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

Paylamann tadn karn! (Share and Enjoy!)

Ahmet ztrk

 
     
  - BAA DN -  
2002 METU CC
Design: CC - INFO