Biraz daha PİSİ.. 2006/02/01

Aşağıdaki bilgiler güncelliğini yitirdi. Bu belgeyi artık bu adreste geliştiriyorum. Blog girdisini ise tarihi nedenlerle silmeyeceğim.


Sizlerden gelen muazzam feedback'ler neticesinde PİSİ Paketi Nasıl isimli minik tutorial'ımızı biraz daha genişletmeye karar verdim. Ayrıca kendisini şu adrese de koydum ki orda kendi kendine gelişsin dursun.

Build ile ilgili bir miktar daha bilgi vermek hem PİSİ'nin işleyişi hem de pspec içerisinde var olan ve yanıtsız kalmış olan bazı kısımlar ile ilgili bilgi sahibi olmanız açısından iyi bir fikir gibi görünüyor. Bir soru ile başlamak ve onun yanıtını vermeye çalışmak bence her zaman iyi bir yöntem olmuştur bir konunun anlatılmasında ve anlaşılmasında. Çünkü bir sorunun yanıtını verebilmek ve verilen yanıtı anlayabilmek için bu yanıt çevresindeki bileşenleri de az çok anlatmak / anlamak gerekir. Tamam, ucuz felsefeyi kesiyor ve konuya giriş yapabilmek amacı ile hazırladığım 5 puanlık uzman sorumuzu Barış Özyurt'a gönderdiğim selamlar eşliğinde soruyorum: "Files tag'ı arasında kalan path tanımlamaları nedir?"

Soru için teşekkürler. Efendim, bunu iyi bir şekilde anlatabilmek için önce PİSİ'nin bir kaynaktan paket oluşturma sürecinden bahsetmek gerek. PİSİ istemcisi, kendisine build komutu bir pspec.xml dosyası ile beraber verildiği zaman özetle ve kısaca aşağıdaki işlemleri yapıyor:

    * Arşiv dosyasını çekiyor ("/var/cache/pisi/archives/" dizinine).

    * Arşiv dosyasını açıyor ("/var/tmp/pisi/paket_adı/work/" dizinine).

    * pspec.xml içerisinde adreslenmiş yamaları kaynağa uyguluyor. Ve burdan itibaren bir süreliğine pspec.xml ile işimiz kalmıyor.

    * actions.py içerisindeki setup fonksiyonu çalıştırılıyor ve inşa öncesi yapılandırma işlemleri gerçekleştiriliyor.

    * actions.py içerisindeki build fonksiyonunu çağırıyor ve uygulamanın kaynak kodu inşa ediliyor..

    * actions.py içerisindeki install fonksiyonunu çağırıyor, -ve film bundan sonra kopuyor-. ;nşa edilmiş olan uygulama için bir kurulum gerçekleşiyor. Fakat bu kurulum gerçek sistem yerine "/var/tmp/pisi/paket_adı/install/" dizininin altına, paketin gerçek sistemdeki görüntüsünü görebileceğiniz şekilde gerçekleşiyor. Hatta bizim aalib örneğimizden gidecek olursak aynen şöyle görünüyor:

meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $ pwd
/var/tmp/pisi/aalib-1.4_rc4-1/install
meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $ ls
usr
meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $ ls usr/
bin include lib share
meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $ ls usr/share/
aclocal doc info man
meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $ ls usr/bin
aafire aainfo aalib-config aasavefont aatest
meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $ ls usr/include
aalib.h
meren@pardus /var/tmp/pisi/aalib-1.4_rc4-1/install $

    * Bu noktadan sonra PİSİ, actions.py ile işini bitirip yine pspec.xml dosyasından alınan bilgilerle bir takım işle yapmaya kaldığı yerden devam ediyor. Burdan sonraki adımlar, pspec.xml dosyası içerisindeki her bir Package tagı için birer birer işletilirken sizin de aklınıza muhtemelen "Biz bir tane Source bir tane de Package tagı gördük, birden fazla Package nerden çıktı?" sorusu takılıyor. Peki, o zaman sonraki adımdan bahsetmeden önce bunu aydınlatalım. PİSİ, Source tagı içerisinde tanımlanan özelliklerdeki bir kaynaktan birden fazla ikili paket üretebiliyor. Kaba hatları ile bir pspec.xml dosyası aşağıdaki gibi görünüyor. İşte Package taglarının altındaki Files tagı altında verilen bilgilerin değeri de bu ayrı ayrı paketlerin oluşturulması sırasında ortaya çıkıyor. Çünkü Files tagı içerisinde verilen bilgi PİSİ'ye, oluşturulacak ikili .pisi paketlerinin içerisine bizim kurulum yaptığımız dizin içerisinde oluşmuş olan hangi dizinlerin ya da hangi dosyaların, hangi sıfatla ekleneceğini anlatıyor. Bu bilgilerin ardından daha önce verdiğim aalib örneğindeki pspec.xml dosyasına baktığınız zaman sıfat konusu da aydınacaktır diye tahmin ediyorum. Şimdi iyice basit şekilde söylemek gerekirse Files tagı şu işe yarıyor: Örneğin bizim uygulamamız inşa edilip install dizinine kurulduğunda ortaya A, B, C ve D klasörleri çıkıyor. Biz A ve C klasörlerinden oluşan bir paket, B ve D klasörlerinden oluşan başka bir paketimiz olsun istiyoruz (diyelimki aalib.pisi ve aalib-doc.pisi gibi iki ayrı paket), işte bu isteğimizi ilgili Package altındaki Files tanımlamaları ile elde ediyoruz. Örneğimizi de verdiğimize göre aslında bu yazı amacına ulaşmış oluyor fakat sonrasında neler olduğundan da bahsetmekten zarar gelmez. Peki. Bu maddeden sonraki maddeleri okurken söyleyeceğim şeylerin her birinin Package tagı altındaki her tanımlı paket için bir kez yapıldıklarını anımsayın lütfen.

 <PISI>
<Source>
(...)
</Source>

<Package>
(...)
</Package>

.
.
.

<Package>
(...)
</Package>
</PISI>

    * PİSİ burdan sonra pspec.xml içerisindeki Package tagı altında bulunan AdditionalFiles tagında adreslenen dosya varsa kurulum dizini içerisindeki gerekli yerlere kopyalıyor.

    * Paket için files.xml dosyası yaratılıyor. "Bir de files.xml dosyası çıktı başımıza" dediğinizi duyaar gibi oluyorum. Bu dosya, bu hazırlanan paket ile beraber sisteme gelecek olan tüm dosyaların bilgilerinin tutulduğu dosya. Harika bir dosyadır ve size başka paket yöneticilerinin sağlayamadığı bir kolaylığı sağlar. Bu dosya içerisinde var olduğunu söylediğim bilgiler şunlardır: Path (dosyanın nerede duracağı), Type (bu dosyanın ne tür bir dosya olduğu), Size (dosyanın byte cinsinden boyutu), SHA1Sum (dosyanın SHA1 özeti). Böylece siz sisteminizdeki bir paket için "şu paketle gelen tüm config dosyalarını göster" sorgusunu kolayca yapabilirsiniz. Güzide files.xml dosyasından bir girdi örneği verelim de tam olsun bari (buraya kadar okuduğuna dair bana mail atan herkese Coco-Star alacağım):

  (...)
<File>
<Path>
usr/lib/libaa.so.1
</Path>
<Type>
library
</Type>
<Size>
113924
</Size>
<SHA1Sum>
9a32f0a02c49e643a4ece41679bda26a5b3cc066
</SHA1Sum>
</File>
(...)

    * files.xml dosyası da oluşturulduktan sonra sıra metadata.xml dosyasına geliyor. Bu dosya da pspec.xml'in hem Source hem de Package tagları içerisinde kalan bilgilerden derlenmiş olan bir dosyadır ve -adından da tahmin ettiğiniz üzere- oluşturulacak paketin kurulacağı sisteme geldiği zaman iş görecek meta bilgilerini tutar: paketin adı, versiyonu, bağımlılıkları, açıklaması, kurulduğundaki boyutu filan gibi.

    * Son olarak da paket için Files altında tanımlanmış dizinler, metadata.xml dosyası, files.xml dosyası ve varsa yine AdditionalFiles altında adreslenmiş olan ÇOMAR betikleri bir araya getirilip zipleniyor ve ortaya .pisi uzantılı bir kurulabilir paket çıkıyor..

Torunlarınıza anlatacağınız türden bir hikaye değil mi..