25 Haziran 2012 Pazartesi

Fuzuli Programlama Dilinin Kaynaktan Derlenmesi


Fuzuli Programla Dilini kaynaktan kodlardan derlemek,

http://stdioe.blogspot.com/2012/06/compiling-and-installing-fuzuli-from.html adresinde Fuzuli programlama dilinin kaynaktan nasıl derleneceğini anlatmış idim ancak bu tarif güncelliğini yitirdi. Zira Fuzuli Programlama Dili, her gün büyük gelişimler gösteren dinamik ve genç bir proje. Kaynaktan derleme işlemlerini de etkileyecek değişiklikler yapıldığından bu konuyu tekrar anlatmak gerekti.

Bir önceki makalede olduğu gibi, sürekli güncel sürümlere erişmek için kaynak koda Mercurial ile erişimi tarif edeceğim ve örnek tarif için 64 bit Ubuntu Linux işletim sistemini kullanacağım. Bunu baz alarak farklı linux dağıtımları için de benzer işlemleri yapabilirsiniz.

1-) Mercurial kurulumu ve kaynak kodlara erişim. (Install Mercurial & access source)

Not: Bu program kabaca, geliştirici / geliştiricilerin koda her yeni müdehalede bulunduklarında, her bir işleme bir açıklama bilgisi girerek ortak bir sunucuya senkronize etmelerini sağlar. Bu sayede birden fazla kişinin aynı proje üzerinde çalışmasına olanak sağladığı gibi, işler yolunda gitmediğinde ya da bir hata tespitinde zaman çizgisi üzerinde belirli bir ana dönmeyi de sağlar. 

İşte biz de bu programı kullanarak kaynak kodların bir kopyasını kendi sistemimize çekeceğiz. Aynı zamanda ilerleyen zamanlarda, yine mercurial programını kullanarak elimizdeki kaynak kodu güncelleyip tekrar derleyebileceğiz.

Mercurial programını kurmak için,

ismail@ismail-M61PME-S2P:~$ sudo apt-get install mercurial

Yukarıdaki komut marifeti ile, sistemimize mercurial kurulacaktır. Artık "hg" komutu ile mercurial'i kullanabilir durumdayız. Bizler sözbirliği yapmışcasına kaynak kodumuzu hep /usr/share/fuzuli dizini altına indiriyoruz. Bu sebeple öncelikle "/usr/share" dizinine gideceğim ve burada "hg" komutu ile kaynak kodları code.google 'dan isteyeceğim. Kodların bir kopyası bilgisayarıma gelirken fuzuli dizini de kendiliğinden oluşturulacak,

ismail@ismail-M61PME-S2P:~$ 
ismail@ismail-M61PME-S2P:~$ cd /usr/share/
ismail@ismail-M61PME-S2P:/usr/share$ sudo hg clone https://code.google.com/p/fuzuli/
destination directory: fuzuli
requesting all changes
adding changesets
adding manifests
adding file changes
added 109 changesets with 833 changes to 353 files (+1 heads)
updating to branch default
297 files updated, 0 files merged, 0 files removed, 0 files unresolved
ismail@ismail-M61PME-S2P:/usr/share$ 

2-)  Bağımlılıkları kurmak, (Install dependencies)

ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo apt-get install libmysqlclient-dev libgd2-xpm-dev libreadline-dev libssl-dev libncurses5-dev libfltk1.1-dev

Ve ayrıca elbette gcc, g++ derleyicilerini de kurmamız gerekecek. Derleyicimiz olmadan Fuzuli'yi derlememiz mümkün olmayacaktır.

Yukarıdaki paketler, Fuzuli Programlama dilini derlemek için gerekli bağımlılıkların development paketleridir. Fuzuli derlendikten sonra bu sistemde kullanılabilmesi için ilgili paketlerin developmen olmayan yani sonlarında "-dev" ismi olmayan paketlerinin de yüklenmesi gerekecektir.


Not: Bağımlılık paketlerinin bir kısmı dinamik, bir kısmı ise statik derlenmektedir. Bunun anlamı, statik derlenen paketlerin "dev" versiyonları dışında ayrıca kendilerine ihtiyaç duyulmayacağıdır. Zira statik olmaları Fuzuli'nin içine gömülü çalışacakları anlamına gelmektedir. Ancak dinamik derlenenler, Fuzuli'nin içine gömülü olmayacakları için ilgili paketlerin kurulmuş versiyonlarına ihtiyaç olacaktır. Bu bir detay bilgidir, ayrıca paketlerin statik, dinamik durumlarını gösterir bir liste bu makale içinde verilmemiştir.


Ayrıca çok fazla müdehale gerektirdiği ve Fuzuli kullanıcıları pek uğraştırdığı için Fuzuli'nin kaynak koduna eklediğimiz soket kütüphanesi olan happycoders'ın kaynak kodları da Fuzuli Kaynak kodları içine eklenmiştir. Şimdi bu dizine gidip, happycoders'ı derleyelim;


ismail@ismail-M61PME-S2P:/usr/share$ cd fuzuli/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ cd lib/libsocket-1.8/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ sudo ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for g++... g++
checking for C++ compiler default output file name... a.out
...
...
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ sudo make
cd . && /bin/bash /usr/share/fuzuli/lib/libsocket-1.8/config/missing --run aclocal-1.7 
/usr/share/fuzuli/lib/libsocket-1.8/config/missing: line 46: aclocal-1.7: command not found
WARNING: `aclocal-1.7' is missing on your system.  You should only need it if
         you modified `acinclude.m4' or `configure.ac'.  You might want
         to install the `Automake' and `Perl' packages.  Grab them from
         any GNU archive site.
cd . && \
...
...
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ 
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ sudo make install
Making install in src
...
...
PATH="$PATH:/sbin" ldconfig -n /usr/local/lib/happycoders/
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib/happycoders/

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
...
...
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ 

Not: Yukarıdaki kurulum çıktısında satırların uzayıp gitmelerine mani olmak için bazır önemsiz olabilecek bölümleri "..." ifadesi ile özetleyip, gizledim.

Kurulumun sonunda bir rapor bilgisi veriliyor. Buna göre happycoders kütüphanesi dosyaları "/usr/local/lib/happycoders" dizinine yüklenmişler. Ancak Fuzuli programı onları "/usr/lib/happycoders" dizini içinde arayacak. Bu sebeple mevcut dizinini "ldconfig" ile register edip, bu dizinin bir de "/usr/lib" altına link'ini oluşturacağım:

ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ sudo ldconfig /usr/local/lib/happycoders/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ sodu ln -s /usr/local/lib/happycoders /usr/lib/happycoders
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ 

Artık Fuzuli'yi derlemek için ön hazırlıklarımız tamamlanmış durumda.

3-) Fuzuli'nin derlenmesi; (compiling Fuzuli)

Bu makalede sıfırdan kulum anlatıyor olsakda bir alışkanlığın sonucu olarak tedbiren önce "clean" yapıp sonra "build" yapıyorum,

ismail@ismail-M61PME-S2P:/usr/share/fuzuli/lib/libsocket-1.8$ cd /usr/share/fuzuli/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo ./release-clean-all.sh 
ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo ./release-build-all.sh

Not: Yine kalabalık yaratmamak için komutların çıktılarına yer vermedim.

Bu noktada "/usr/lib/fuzuli" dizini altında fuzuli binary'si ve kütüphaneleri bulunmaktadır. fuzuli binary'sinin alışageldik yeri olan "/usr/bin" dizininde de olması gerekir. Bunun için,

a) fuzuli binary'sinin link'ini "/usr/bin" altına oluşturacağım.

ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo ln -s /usr/lib/fuzuli/fuzuli /usr/bin/fuzuli

Ayrıca kütüphanelerin kullanılabilir olması için

b) ya "/usr/lib" altına kopyalanmaları gerekir,


ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo cp /usr/lib/fuzuli/*.so /usr/lib/

b) ya da mevcut dizinleri "ldconfig" ile register edilmeli, 


ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo ldconfig /usr/lib/fuzuli/

Kurulan Fuzuli'nin test edilmesi; (testing Fuzuli)

Artık Fuzuli Programlama Dilimiz tam olarak kullanıma hazır. Her şeyin yolunda gittiğinden emin olmak için kaynak kodları indirdiğimiz dizin içindeki "tests" dizinine gidip, tüm testleri çalıştırabiliriz.

ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ cd /usr/share/fuzuli/tests/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/tests$ ./tester.sh 
--------------------------------------------
|      testing all FUZULI script files.     |
--------------------------------------------

argc_argv.fzl:
1: PASS
arithmetic.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
5: PASS
6: PASS
7: PASS
8: PASS
9: PASS
10: PASS
11: PASS
12: PASS
block.fzl:
1: PASS
Break.fzl:
1: PASS
clientsocket.fzl:
1: PASS
clone.fzl:
1: PASS
2: PASS
dotimes.fzl:
1: PASS
eval.fzl:
1: PASS
explode.fzl:
1: PASS
fibonacci.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
5: PASS
for.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
funcoverload.fzl:
1: PASS
2: PASS
3: PASS
hex.fzl:
1: PASS
inc.fzl:
1: PASS
2: PASS
io.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
letTest1.fzl:
1: PASS
list.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
5: PASS
6: PASS
7: PASS
8: PASS
math.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
5: PASS
6: PASS
7: PASS
8: PASS
9: PASS
maxmin.fzl:
1: PASS
ols.fzl:
1: PASS
2: PASS
oop.fzl:
1: PASS
2: PASS
sort.fzl:
1: PASS
2: PASS
strings.fzl:
1: PASS
2: PASS
3: PASS
4: PASS
5: PASS
6: PASS
7: PASS
8: PASS
9: PASS
10: PASS
11: PASS
12: PASS
13: PASS
14: PASS
15: PASS
16: PASS
17: PASS
18: PASS
19: PASS
20: PASS
21: PASS
22: PASS
23: PASS
24: PASS
25: PASS
26: PASS
27: PASS
28: PASS
29: PASS
switchcase.fzl:
1: PASS
types.fzl:
1: PASS
2: PASS
while.fzl:
1: PASS

--------------------------------------------
|             Report of test               |
--------------------------------------------
|  26 files has been tested.
|  98 statements has been passed.
|  0 statements has been failed.
|  0 statements has been undefined.
--------------------------------------------
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/tests$ 

Tüm testlerin geçtiğini gördüğümüzde herşeyin yolunda gittiğinden emin olabiliriz. Ayrıca samples/gui dizini altında Grafik Kullanıcı Arabirimi örneklerine de erişebiliriz. Örneğin,

ismail@ismail-M61PME-S2P:/usr/share/fuzuli/tests$ cd ../samples/gui/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli/samples/gui$ fuzuli gui4.fzl 
[close, Hello Fuzuli GUI, 297, 296, 230, 230, @FuzuliNativeObject[@FuzuliWidget]]
Exiting...ismail@ismail-M61PME-S2P:/usr/share/fuzuli/samples/gui$ 


----
Kurulumdan daha sonraki bir tarihte Fuzuli'nin güncel kaynak kodları ile tekrar derlenmesi (update Fuzuli)


Fuzuli Programlama Dili'nin genç ve bir o kadar da dinamik bir proje olduğunu söylemiştim. Dolayısıyla her yeni bir gün, Fuzuli için yepyeni fonksiyonlar yazılmaya devam edecektir. Bu sebeple kodunuzu zaman zaman güncelleyip, Fuzuli'yi tekrar derlemeniz de gerekecektir.

Bu işlem, buraya kadar anlatılanlardan çok daha kolay olacaktır, zira tüm bağımlılıklar yüklenmiş, ilgili dizinler register edilmiş, link'ler tanımlanmış durumda. Sırasıyla,

a) Kaynak kodun güncellenmesi, (update source)

fuzuli'nin kaynak kodlarının olduğu "/usr/share/fuzuli" dizinine gidip hg ile yeni kodları istiyoruz.

ismail@ismail-M61PME-S2P:~$ cd /usr/share/fuzuli/
ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo hg pull
pulling from https://code.google.com/p/fuzuli/
searching for changes
no changes found
ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ 

Bu makale hazırlanırken, zaten en güncel kodu indirdiğimiz için değişiklik tespit edilmedi ancak "No changes found"  yerine bir takım değişikliklerin tespit edildiğini düşünelim. Bu durumda "sudo hg update" ile değişiklikleri uygulamamız gerekecekti.

b) Ve daha sonra Fuzuli'yi önce "clean" edip sonra tekrar "build" etmeliyiz, (re-compile source)

ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo ./release-clean-all.sh
ismail@ismail-M61PME-S2P:/usr/share/fuzuli$ sudo ./release-build-all.sh 

Artık son güncel versiyon Fuzuli diline sahibiz.
Lütfen varsa karşılaşılan sorunlar için bilgi veriniz.