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
|