NASIL:PiSi Hello World
PardusWiki, özgür ansiklopedi
Konu başlıkları
|
[değiştir] PiSi ile "Hello World" Paketi Yapalım
Bu belgenin amacı hiç bir iş yapmayan bir uygulamayı PiSi paketi haline getirerek PiSi'nin işleyişi hakkında adım adım bilgi vermeye ve çeşitli ek sorularla PiSi'nin paket geliştiricisi tarafından görünen yapısı açısından fikir sahibi olunmasını sağlamaya çalışmaktır. Bu belge hazırlanırken, okuyacak kişilerin Linux konsoluna ve basit araçlarına aşina oldukları varsayılmıştır.
[değiştir] Ön Hazırlık
Şimdi hiç bir iş yapmayan, sadece komut satırından "merhaba-pisi" komutu verildiğinde "sana da merhaba" diyen bir uygulamayı nasıl sisteme kurulabilir bir pisi paketi haline getireceğimizi görelim. Bunu da herhangi bir uygulamanın PiSi paketi haline getirilebilmesi için hazırlanması gereken pspec.xml dosyası ve actions.py dosyasını hazırlayarak yapalım. Yazının devamında fonksiyonlarını daha iyi anlayacağınızı ümit ettiğim bu iki dosya, paketi build etme işlemi esnasında PiSi'nin kullandığı ve paketi hangi bilgilere göre oluşturacağına dair bilgi edindiği dosyalar. Tamam. Öncelikle bizim bir uygulamaya ihtiyacımız var.
Ben bu örnek için hemen basit bir uygulama yazıyorum:
meren@wunjo meren $ mkdir merhaba-pisi-1.0
meren@wunjo meren $ cat > merhaba-pisi-1.0/merhaba-pisi.py << EOF
> #!/usr/bin/python
> # -*- coding: utf-8 -*-
>
> import os
> print "Sana da merhaba %s" % (os.getenv("USER"))
> EOF
meren@wunjo meren $ ls merhaba-pisi-1.0/
merhaba-pisi.py
meren@wunjo meren $ chmod +x merhaba-pisi-1.0/merhaba-pisi.py
meren@wunjo meren $ ./merhaba-pisi-1.0/merhaba-pisi.py
Sana da merhaba meren
meren@wunjo meren $
Güzel. Şimdi bunu arşivleyip sıkıştırıyorum ve ortaya tar.gz uzantılı bir dosya çıkıyor, ardından da bunu Internet üzerinden erişilebilir bir kaynağa koyuyorum:
meren@wunjo meren $ tar -cf merhaba-pisi-1.0.tar merhaba-pisi-1.0/ && gzip merhaba-pisi-1.0.tar meren@wunjo meren $ ls merhaba-pisi-1.0.tar.gz merhaba-pisi-1.0.tar.gz meren@wunjo meren $ scp merhaba-pisi-1.0.tar.gz meren@uludag.org.tr:/home/meren/public_html/ meren@wunjo meren $
Bu adımla beraber [uygulamamızın web sayfası] da dahil olmak üzere başlangıç koşullarımız hazır. Bundan sonra sadece bir paket geliştiricisi gibi düşüneceğiz, buraya kadar yaptığımız her şeyi unutun. Çoğu paketçinin içinde bulunduğu durumda olduğu gibi uygulamanın orjinalini değiştirmek ya da orjinalinin istediğimiz özellikler ile dağıtılmasını sağlamak bizim tasarrufumuzda değil.
[değiştir] Pspec.xml Dosyasının Hazırlanması
Bir önceki adımda yaptıklarımızı unuttuk. Şu anda Internet'ten erişilebilir bir kaynakta paketlenmeyi bekleyen bir uygulamamız var. Böyle bir uygulamayı PiSi ile sisteme kurulabilir bir paket haline getirebilmek için bize gereken iki dosya olan pspec.xml ve actions.py dosyalarını yazmaya başlayalım. Paketleyeceğimiz uygulama ile ilgili elimizde olan verilere bir bakalım:
- Uygulamanın adı, "merhaba-pisi"
- Ev sayfası, http://cekirdek.uludag.org.tr/~meren/merhaba-pisi.php
- Bulunduğu adres http://cekirdek.uludag.org.tr/~meren/merhaba-pisi-1.0.tar.gz
- sha1sum'ı, fc917dec7b9729de935698f273f8007b2223653d (konsoldan sha1sum komutu ile hemen elde ettim)
- Sürümü 1.0
- Lisansı, As-Is
- Türü, konsol uygulaması (app:console)
- İnşa bağımlılığı, yok.
- Çalışma zamanı bağımlılığı, python (python system.base isimli bileşenimiz içinde olduğu için bu bağımlılığı yazmamıza gerek yok. Çünkü system.base çalışan her Pardus sistemde var olduğu kabul edilen bir bileşendir. System.base bileşeni içerisinde başka hangi uygulamalar olduğuna http://svn.pardus.org.tr/pardus/devel/system/base/ adresinden bakabilirsiniz. Dolayısıyla bu bağımlılığı tanımlamaya gerek yok, bu yüzden bu paketin çalışma zamanı bağımlılığının şimdilik olmadığını kabul edebiliriz).
- Kaynaktan ortaya bir tane paket çıkacak (paketin adı da, orjinal ismi olan merhaba-pisi olsun).
- Bu paket içerisinde, inşa işleminde İNŞA_DİZİNİ/usr/bin/ altına giden dosyalar olacak.
- Yama, şu an için yok (daha sonra eklenecek, fakat şu anda haberimiz yok).
- Ek dosya, yok (daha sonra eklenecek).
- ÇOMAR betiği, yok (daha sonra bu da eklenecek).
Bu bilgilerle bir pspec.xml hazırlıyorum hemen, işte pspec.xml'imiz, dikkat ederseniz eldeki bilgilerin nasıl kullanıldığını görebileceksiniz (Eğer siz de yapılanları adım adım denemek isterseniz, bunu belgenin ikinci bölümünde verilen dosyaları kopyalayarak yapabilirsiniz):
1 | <?xml version="1.0" ?>
2 | <!DOCTYPE PISI
3 | SYSTEM "http://www.uludag.org.tr/projeler/pisi/pisi-spec.dtd">
4 | <PISI>
5 | <Source>
6 | <Name>merhaba-pisi</Name>
7 | <Homepage>http://cekirdek.uludag.org.tr/~meren/merhaba-pisi.php</Homepage>
8 | <Packager>
9 | <Name>A. Murat Eren</Name>
10 | <Email>meren@uludag.org.tr</Email>
11 | </Packager>
12 | <License>As-Is</License>
13 | <PartOf>None</PartOf>
14 | <IsA>app:console</IsA>
15 | <Summary>PiSi Hello World Application..</Summary>
16 | <Summary xml:lang="tr">PiSi için merhaba dünya uygulaması, süper bir konsol uygulaması</Summary>
17 | <Description>Just a basic application. Nothing to describe.</Description>
18 | <Description xml:lang="tr">Sadece basit bir uygulama, açıklayacak bir şey yok</Description>
19 | <Archive sha1sum="fc917dec7b9729de935698f273f8007b2223653d"
| type="targz">http://cekirdek.uludag.org.tr/~meren/merhaba-pisi-1.0.tar.gz</Archive>
20 | </Source>
21 |
22 | <Package>
23 | <Name>merhaba-pisi</Name>
24 | <Files>
25 | <Path fileType="executable">/usr/bin</Path>
26 | </Files>
27 | </Package>
28 |
29 | <History>
30 | <Update release="1">
31 | <Date>2006-02-01</Date>
32 | <Version>1.0</Version>
33 | <Comment>First release.</Comment>
34 | <Name>A. Murat Eren</Name>
35 | <Email>meren@uludag.org.tr</Email>
36 | </Update>
37 | </History>
38 | </PISI>
[değiştir] Actions.py Dosyasının Hazırlanması
Sıra actions.py dosyasını hazırlamakta. Bu dosya paketin nasıl inşa edileceğine dair bilgileri PiSi'ye sağlayacak olan dosya. Bu yüzden bu uygulamanın nasıl kurulması gerektiğini öğrenmemiz gerekli. Uygulamanın ana sayfasında geliştiricisinin önerdiğine göre, kurulum merhaba-pisi.py isimli dosyanın /usr/bin altına "merhaba-pisi" adı ile kopyalanması ile gerçekleşiyormuş. Bu durumda herhangi bir ön işlem ya da inşa işlemi yapmamız gerekmiyor. Bu yüzden sadece install fonksiyonu içerisini dolduracağız. Öte yandan paket geliştiricisi olarak bu uygulamayı kullanıcı sistemine kurduktan sonra çalıştırırken "merhaba-pisi.py" yazmak zorunda kalmasın, sadece "merhaba-pisi" yazması uygulamayı çalıştırması için yeterli olsun istiyoruz diyelim. Bu durumda actions.py'miz şuna benzeyecek:
| Not: actions.py içerisinde PiSi API'si üzerinden kullanılabilecek işlevlerin tümü Actions API belgesinde anlatılmaktadır. --A. Murat Eren 01:28, 11 Şubat 2007 (EET) |
1 | #!/usr/bin/python
2 | # -*- coding: utf-8 -*-
3 | #
4 | # Copyright 2005 TUBITAK/UEKAE
5 | # Licensed under the GNU General Public License, version 2.
6 | # See the file http://www.gnu.org/copyleft/gpl.txt.
7 | #
8 | # A. Murat Eren <meren at uludag.org.tr>
9 |
10 | from pisi.actionsapi import autotools
11 | from pisi.actionsapi import pisitools
12 | from pisi.actionsapi import get
13 |
14 | def setup():
15 | pass
16 |
17 | def build():
18 | pass
19 |
20 | def install():
21 | pisitools.dobin("merhaba-pisi.py")
22 | pisitools.rename("/usr/bin/merhaba-pisi.py", "merhaba-pisi")
23 |
Bu bilgileri hazırladıktan sonra çalışma alanımızdaki görünüm şu şekilde oldu:
wunjo merhaba-pisi # ls actions.py pspec.xml
[değiştir] Paketin İnşa Edilmesi
Artık actions.py ve files.xml dosyalarımız hazır olduğuna göre PiSi ile bu uygulamayı bir PiSi paketi olarak inşa edebiliriz:
wunjo merhaba-pisi # pisi build pspec.xml Paketler çalışma dizinine yazılıyor. PiSi kaynak paketi merhaba-pisi inşa ediliyor Emniyet mandalı: taban geliştirme sistemi system.devel halihazırda kurulu Kaynak http://cekirdek.uludag.org.tr/~meren/merhaba-pisi-1.0.tar.gz adresinden indiriliyor merhaba-pisi-1.0.tar.gz (275.0 B)100% 0.00 B/s [??:??:??] [bitti] Kaynak arşivi saklandı: /var/cache/pisi/archives/merhaba-pisi-1.0.tar.gz Arşiv açılıyor... açıldı (/var/pisi/merhaba-pisi-1.0-1/work) * Yama uygulanıyor: merhaba-pisi-gui.patch Kaynak yapılandırılıyor Kaynak inşa ediliyor... Kuruluyor... Semboller çıkarılıyor.. ** Paket merhaba-pisi inşa ediliyor files.xml yaratılıyor, metadata.xml yaratılıyor, ./merhaba-pisi-1.0-1.pisi adlı PiSi paketi yaratılıyor. Bitti. İnşa dizini bırakılıyor wunjo merhaba-pisi # ls actions.py merhaba-pisi-1.0-1.pisi pspec.xml wunjo merhaba-pisi # lspisi merhaba-pisi-1.0-1.pisi files.xml metadata.xml install/usr/bin/merhaba-pisi wunjo merhaba-pisi #
Müthiş. Gördüğünüz gibi artık elimizde "merhaba-pisi-1.0-1.pisi" isimli bir paketimiz var. [lspisi] ile içine baktığımızda install dizini altında gördüklerimiz bize diyor ki, "bu uygulama kurulduğunda /usr/bin dizini altına merhaba-pisi isimli bir dosya atacak". Kuralım ve görelim o zaman:
wunjo merhaba-pisi # pisi info merhaba-pisi-1.0-1.pisi Paket dosyası: merhaba-pisi-1.0-1.pisi Ad: merhaba-pisi, versiyon 1.0, sürüm 1, inşa -- Özet: PiSi için merhaba dünya uygulaması, süper bir konsol uygulaması Açıklama: Sadece basit bir uygulama, açıklayacak bir şey yok Bileşen: None Sağladıkları: None Bağımlılıklar: None Dağıtım: Pardus, Dağıtım Sürümü: 2007 Mimari: Any, Yerleşik Boyut: 102 wunjo merhaba-pisi # pisi it merhaba-pisi-1.0-1.pisi Kurulum sırası: merhaba-pisi merhaba-pisi paketi, versiyon 1.0, sürüm 1, inşa None kuruluyor merhaba-pisi paketinin dosyaları arşivden çıkartılıyor merhaba-pisi paketi yapılandırılıyor merhaba-pisi paketi yapılandırıldı merhaba-pisi paketi kuruldu wunjo merhaba-pisi # :)
İşte kurduk. Bir de çalıştıralım bakalım:
wunjo merhaba-pisi # merhaba-pisi Sana da merhaba root wunjo merhaba-pisi #
Müthiş.
[değiştir] Pakete Yama Eklenmesi
Evet. Peki diyelim ki bu uygulamada bazı değişiklikler istiyoruz. Örneğin, eğer kullanıcı X'te çalışıyorsa kendisine grafik bir arayüz ile yanıt versin, eğer konsolda çalışıyorsa konsoldan yanıt versin. Böyle bir durumda bir paketleyici olarak yapmamız gereken şey elbette uygulamanın geliştiricisini bu ihtiyacın varlığına ya da istediğimiz özelliğin eklenmesine ikna etmek. Diyelim ki bu değişiklik önerisini geliştiriciye ilettik ve kabul edilmedi ya da özelliğin uygulamanın yeni sürümünden önce depomuzda olmasını istiyoruz ya da dağıtıma özgü bir ihtiyaç için kaynak kod içerisinde değişiklik yapmamız gerekiyor. Bu durumda değişikliğimizin sonucunda oluşan farkı yama olarak pspec.xml içerisine ekleyerek inşa işleminin hemen öncesinde PiSi'nin bu yamayı orjinal kaynağa uygulamasını sağlamak -uygulamanın lisansının buna izin verdiği durumlarda- izlenecek tek yöntemdir. Şimdi içinde uygulamamızın kaynak kodu bulunan merhaba-pisi-1.0 dizinini merhaba-pisi-1.0.orig ismi ile kopyalıyor, sonrasında değişiklikleri yapıyorum. Orjinali ile arasındaki farka bakalım:
meren@wunjo merhaba-pisi $ diff -Nuar merhaba-pisi-1.0.orig/ merhaba-pisi-1.0/
diff -Nuar merhaba-pisi-1.0.orig/merhaba-pisi.py merhaba-pisi-1.0/merhaba-pisi.py
--- merhaba-pisi-1.0.orig/merhaba-pisi.py 2006-02-18 22:29:36.000000000 +0200
+++ merhaba-pisi-1.0/merhaba-pisi.py 2006-02-18 22:34:16.000000000 +0200
@@ -2,4 +2,32 @@
# -*- coding: utf-8 -*-
import os
-print "Sana da merhaba %s" % (os.getenv("USER"))
+import sys
+
+msg = 'Sana da merhaba %s' % (os.getenv('USER'))
+
+if not os.getenv("DISPLAY"):
+ print msg
+
+else:
+ from qt import *
+
+ qapp = QApplication(sys.argv)
+ wid = QWidget()
+ wid.setCaption("Merhaba PiSi")
+ wid.setMinimumSize(QSize(320, 90))
+ wid.setMaximumSize(QSize(320, 90))
+
+ label = QLabel(msg, wid)
+ label.resize(250, 20)
+ label.move(35, 20)
+
+ button = QPushButton('Kapat', wid)
+ button.resize(50, 20)
+ button.move(240, 50)
+
+ QObject.connect(button, SIGNAL('clicked()'), qapp, SLOT('quit()'))
+
+ qapp.setMainWidget(wid)
+ wid.show()
+ qapp.exec_loop()
meren@wunjo merhaba-pisi $
Şimdi de bu farkı, orjinal kaynak her indirilip açıldığında PiSi tarafından kaynağa uygulanması için bir yama haline getirmek ve PiSi paketine eklemek için merhaba-pisi-gui.patch isimli bir dosyaya atayım:
meren@wunjo merhaba-pisi $ diff -Nuar merhaba-pisi-1.0.orig/ merhaba-pisi-1.0/ > merhaba-pisi-gui.patch
Bu oluşan yama dosyasını pspec.xml ve actions.py'nin bulundukları dizine files adında bir dizin açıp içine koymalıyım. Çünkü pspec.xml içerisinden adresi verilen yama ya da ek dosyaların tümü pspec.xml ile aynı dizinde olması gereken files isimli dizin içerisinde aranır. Bunları yaptıktan sonra çalışma dizinimin durumu şu şekilde görünüyor:
meren@wunjo merhaba-pisi $ ls actions.py files pspec.xml meren@wunjo merhaba-pisi $ ls files/ merhaba-pisi-gui.patch meren@wunjo merhaba-pisi $
Elbette PiSi'nin bu yamayı orjinal kaynağa uygulaması için durumdan haberdar edilmesi lazım. Bunun yolu da pspec.xml içerisine bu bilgiyi eklemekten geçiyor. Pspec.xml'in Source imi altına aşağıdaki satırları eklersem, her şey yolunda gidecek:
<Patches>
<Patch level="1">merhaba-pisi-gui.patch</Patch>
</Patches>
[değiştir] Orjinal Kaynağa Yama Eklenmesi İle İlgili Bir Hatırlatma
Herhangi bir uygulamaya eklediğimiz bir yama ile onun çalışma şeklini tamamen değiştiriyor olabilir, eklediğimiz yama ile daha önce sahip olmadığı bir fonksiyonu sunmasını sağlıyor ya da daha önce sahip olduğu bir fonksiyonu çıkarıyor olabiliriz. Bu durumda da doğal olarak uygulamanın beklentileri anlamında yapılan tanımlar da değişebilir. Bu örnek özelinde bu konuyu ayrıntılandıracak olursak şöyle diyebiliriz: merhaba-pisi uygulaması orjinal hali ile çalışmak için sadece python isterken, eklediğimiz son yama ile artık çalışmak için python ile beraber, Qt için hazırlanmış Python binding'lerini sunan PyQt'nin de sisteme kurulmuş olmasını istiyor. Eğer bu bilgiyi paket içerisine eklemezsek PyQt'nin kurulu olmadığı bir sisteme bu uygulama kurulurken hiç bir uyarı vermeyecek fakat aynı zamanda çalışmayacaktır. Dolayısıyla orjinal uygulamanın sahip olmadığı bir çalışma zamanı bağımlılığını artık dikkate almalı ve pspec.xml içerisine eklemeliyiz. Bu durumda pspec.xml'imizin Package imi altına şu bilgiyi ekleyerek bu uygulamanın kurulmaya çalıştığı sistemde PyQt'nin de kurulu olmasını istediğini PiSi'ye söylemesini sağlayabiliriz:
<RuntimeDependencies>
<Dependency>PyQt</Dependency>
</RuntimeDependencies>
| Not: İnşa zamanı bağımlılıkları sadece kaynağı ilgilendiren bağımlılıklar olduğundan Source imi altına eklenirken, çalışma zamanı bağımlılıkları her bir paket için ayrı ayrı olabileceğinden Package imleri altına yazılırlar. --meren |
[değiştir] Pakete Ek Dosya Eklenmesi
Uygulamamızın paketini son eklediğimiz yama ile kurulduktan sonra hem grafik hem de metin ortamda istediğimiz şekilde çalışmasını sağladık. Diyelim ki bir de istiyoruz ki kurulduktan sonra kullanıcının kolayca çalıştırabilmesi için KDE menüsünde bir yeri olsun. Paketleyici tarafından, tek olmamamkla beraber bunun en aklıbaşında çözümü pakete meşhur '.desktop' dosyalarından bir tane eklemek olduğunu biliyoruz. Böylece paketimizi, uygulamamızı masaüstü ortamının menüsünün neresinde görmek istediğimize dair bilgiyi masaüstü ortamına sağlamak için gerekli olan dosya ile beraber oluşturabileceğiz.
Biliyorum ki /usr/share/applications/ altına kopyalanacak şu içerikli bir .desktop dosyası işimi görecek (özetle pisi-kga ile aynı ikonu kullanan, ön tanımlı Pardus menüsü düzenini kullananların Uygulamalar -> Sistem altından erişebilecekleri, Merhaba PiSi isminde ve çalıştırıldığında merhaba-pisi uygulamasını çalıştıran bir desktop dosyası):
[Desktop Entry] Name=Merhaba PiSi Comment=Hello World like application for PiSi Comment[tr]=PiSi için bir merhaba dünya uygulaması.. Exec=merhaba-pisi Icon=pisi-kga Terminal=false Type=Application Categories=Application;System;
Dikkat ederseniz burada devreye inşa işlemi ile hiç bir ilgisi olmayan, inşa işleminin sonrasında pakete eklenmek istenen bir dosya girdi.
Bu gibi durumlarda kullanılması için pspec.xml içerisinde ayrılmış, her Package imi altında yararlanılabilecek AdditionalFiles isimli bir im var. Bu im içerisine eklediğiniz AdditionalFile imleri ile bahsettiğiniz dosyanın, pspec.xml ve actions.py doysları ile aynı seviyede duran files dizini altındaki yolunu, bahsi geçen Package imi altında tanımlanan paketin kurulumu ardından bahsedilen dosyanın sistemde nereye kopyalanmasını istediğinizi ve dosya sistemi erişim izinlerinin ne olacağını söyleyebiliyoruz.
| Not: Bu arada, yama dosyalarının source altında, ek dosyaların ise package imleri altında tanımlandığına dikkat ediniz. --meren |
Yukardaki .desktop dosyasını files/ dizini altına istediğim isimde bir dosya olarak oluşturuyorum ve çalışma dizinimdeki görünüm şöyle oluyor:
meren@wunjo merhaba-pisi $ ls actions.py files pspec.xml meren@wunjo merhaba-pisi $ ls files/ merhaba-pisi-gui.patch merhaba-pisi-desktop-file meren@wunjo merhaba-pisi $
Elbette yama örneğinde olduğu gibi inşa inşa işlemi sırasında ek dosyadan da haberdar edilmesi gerekli PiSi'nin. Package imi altına şöyle bir ek dosya bilgisi eklersem her şey yoluna girecek (özetle şu söyleniyor bu ek ile: files dizini altında merhaba-pisi-desktop-file ismi ile bulacağın dosyayı, /usr/share/applications dizini altına merhaba-pisi.desktop ismi ile kopyaladıktan sonra sahibini root, erişim izinlerini de 0644 olarak değiştir):
<AdditionalFiles>
<AdditionalFile owner="root" permission="0644" target="/usr/share/applications/merhaba-pisi.desktop">merhaba-pisi-desktop-file</AdditionalFile>
</AdditionalFiles>
[değiştir] Paket'e Ek Dosya Eklenmesi İle İlgili Bir Hatırlatma
Bunu yaptığımızda ek dosya ekleme işi tamam gibi görünebilir, fakat bu örnekte [lspisi] ile build işlemi sonunda ortaya çıkan pisi paketinin içerisine baktığınızda eklediğiniz dosyanın install dizini altına alınmadığını görebilirsiniz. Bu örnekte bunun nedeni paketin hangi dosyalardan oluşacağına dair bilgiyi veren pspec.xml içerisindeki Package imi altındaki Files imi altında /usr/share içindeki dosyaları da alması gerektiğine dair bir Path tanımının olmayışıdır (pspec.xml içerisindeki Files imlerinin görevi ile ilgili lütfen "Files" imleri arasında kalan "path" tanımlamaları nedir? sorusunun yanıtını okuyunuz). lspisi ile paketimizin içine bakalım:
wunjo merhaba-pisi # lspisi merhaba-pisi-1.0-1.pisi files.xml install/usr/bin/merhaba-pisi metadata.xml wunjo merhaba-pisi #
Gördüğünüz ve olması gerektiği gibi ortada .desktop dosyası yok. Çünkü ek dosyayı /usr/share altına atıyor, fakat /usr/share altında pakete ait bir dosya olduğunu pspec.xml içerisinde belirtmiyoruz. Bu durumda pspec.xml içerisinde "/usr/share altındaki dosyaları da pakete ekle" dememiz gerekiyor, bunu dediğimiz zaman da pspec.xml'in Files imi altındaki bilgiler şöyle olacak (farkı görmek için orjinal pspec.xml'deki 24-25-26. satırlara göz atınız):
<Files>
<Path fileType="executable">/usr/bin</Path>
<Path fileType="data">/usr/share/applications/</Path>
</Files>
Bu ek bilgi ile yeniden build edilen paketin içerisinde artık ek dosyamızın yer aldığını da görebilirsiniz:
wunjo merhaba-pisi # lspisi merhaba-pisi-1.0-1.pisi files.xml install/usr/bin/merhaba-pisi install/usr/share/applications/merhaba-pisi.desktop metadata.xml wunjo merhaba-pisi #
[değiştir] Pakete ÇOMAR Betiği Eklenmesi
ÇOMAR (COnfiguration MAnageR), Pardus'un merkezi yapılandırma yöneticiliği vazifesini yerine getiren bir sistem servisi olup, kullanıcı arayüzleri, ÇOMAR destekli uygulamalar ve çeşitli araçlardan gelen görev isteklerini [sistem modeli] üzerindeki uygulama nesneleri yardımı ile işletme yeteneğine sahiptir (bahsi geçen görev isteği bir uygulamanın kendi yeteneklerini sistem modeli içerisindeki nesnelere kayıt ettirmesi, bir başka uygulamanın ÇOMAR vasıtası ile sunduğu ya da ÇOMAR'ın doğal olarak sunduğu bir yetenekten faydalanması olabilir). Bu belgenin amacının dışında olduğu için ÇOMAR'ın işlevleri ve amaçlarından daha fazla bahsetmeyecek, sadece ÇOMAR destekli bir uygulama olan PiSi yardımı ile ÇOMAR'a yaptırılması istenen işlerin paketlere nasıl eklendiğine dair bir örnek vereceğim. ÇOMAR hakkında daha fazla bilgi almak için http://svn.uludag.org.tr/uludag/trunk/comar/belgeler/ adresindeki belgelere göz atabilirsiniz.
Örneğimiz üzerinden gitmeye devam edelim.
Farzedelim ki merhaba-pisi paketi sisteme kurulduktan hemen sonra ve sistemden kaldırılmadan hemen önce sistem çapında bir iş yaptırmak istiyoruz. ÇOMAR'ın modeli içerisinde bu görevler için tanımlanmış olan postInstall ve preRemove işlevleri olduğunu biliyoruz. Doğru bir kullanım olmamakla beraber örnek teşkil etmesi açısından bu işlevlerin altını şu şekilde dolduran bir betiğimiz olsun:
#!/usr/bin/python
import os
def postInstall():
os.system('wall "Merhaba PiSi paketi sisteme kuruldu!"')
def preRemove():
os.system('wall "Merhaba PiSi paketi sistemden kaldiriliyor!"')
Elbette ek dosyada olduğu gibi bundan da PiSi'yi haberdar etmemiz gerekiyor. Bunun için betiğin adresini pspec.xml içerisindeki Package imi altına aşağıdaki şekilde eklememiz gerekiyor ("comar dizini altındaki package.py'yi al, System.Package bacağına kaydet"):
<Provides>
<COMAR script="package.py">System.Package</COMAR>
</Provides>
Bu pspec.xml'i build ettiğinizde ve ortaya çıkan PiSi paketini kurduğunuzda ve sonrasında kaldırdığınızda değişimi görebileceksiniz (ÇOMAR'ın sisteminizde çalışıyor olması gerekli).
[değiştir] Örnekte Kullanılan Dosyaların Son Halleri
pspec.xml:
<?xml version="1.0" ?>
<!DOCTYPE PISI SYSTEM "http://www.uludag.org.tr/projeler/pisi/pisi-spec.dtd">
<PISI>
<Source>
<Name>merhaba-pisi</Name>
<Homepage>http://cekirdek.uludag.org.tr/~meren/merhaba-pisi.php</Homepage>
<Packager>
<Name>A. Murat Eren</Name>
<Email>meren@uludag.org.tr</Email>
</Packager>
<License>As-Is</License>
<PartOf>None</PartOf>
<IsA>app:console</IsA>
<Summary>PiSi Hello World Application..</Summary>
<Summary xml:lang="tr">PiSi için merhaba dünya uygulaması, süper bir konsol uygulaması</Summary>
<Description>Just a basic application. Nothing to describe.</Description>
<Description xml:lang="tr">Sadece basit bir uygulama, açıklayacak bir şey yok</Description>
<Archive sha1sum="fc917dec7b9729de935698f273f8007b2223653d" type="targz">http://cekirdek.uludag.org.tr/~meren/merhaba-pisi-1.0.tar.gz</Archive>
<Patches>
<Patch level="1">merhaba-pisi-gui.patch</Patch>
</Patches>
</Source>
<Package>
<Name>merhaba-pisi</Name>
<RuntimeDependencies>
<Dependency>PyQt</Dependency>
</RuntimeDependencies>
<Files>
<Path fileType="executable">/usr/bin</Path>
<Path fileType="data">/usr/share/applications/</Path>
</Files>
<AdditionalFiles>
<AdditionalFile owner="root" permission="0644" target="/usr/share/applications/merhaba-pisi.desktop">merhaba-pisi-desktop-file</AdditionalFile>
</AdditionalFiles>
<Provides>
<COMAR script="package.py">System.Package</COMAR>
</Provides>
</Package>
<History>
<Update release="1">
<Date>2006-02-01</Date>
<Version>1.0</Version>
<Comment>First release.</Comment>
<Name>A. Murat Eren</Name>
<Email>meren@uludag.org.tr</Email>
</Update>
</History>
</PISI>
actions.py:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright 2005 TUBITAK/UEKAE
# Licensed under the GNU General Public License, version 2.
# See the file http://www.gnu.org/copyleft/gpl.txt.
#
# A. Murat Eren <meren at uludag.org.tr>
from pisi.actionsapi import autotools
from pisi.actionsapi import pisitools
from pisi.actionsapi import get
def setup():
pass
def build():
pass
def install():
pisitools.dobin("merhaba-pisi.py")
pisitools.rename("/usr/bin/merhaba-pisi.py", "merhaba-pisi")
files/merhaba-pisi-gui.patch:
diff -Nuar merhaba-pisi-1.0.orig/merhaba-pisi.py merhaba-pisi-1.0/merhaba-pisi.py
--- merhaba-pisi-1.0.orig/merhaba-pisi.py 2006-02-18 22:29:36.000000000 +0200
+++ merhaba-pisi-1.0/merhaba-pisi.py 2006-02-18 22:34:16.000000000 +0200
@@ -2,4 +2,32 @@
# -*- coding: utf-8 -*-
import os
-print "Sana da merhaba %s" % (os.getenv("USER"))
+import sys
+
+msg = 'Sana da merhaba %s' % (os.getenv('USER'))
+
+if not os.getenv("DISPLAY"):
+ print msg
+
+else:
+ from qt import *
+
+ qapp = QApplication(sys.argv)
+ wid = QWidget()
+ wid.setCaption("Merhaba PiSi")
+ wid.setMinimumSize(QSize(320, 90))
+ wid.setMaximumSize(QSize(320, 90))
+
+ label = QLabel(msg, wid)
+ label.resize(250, 20)
+ label.move(35, 20)
+
+ button = QPushButton('Kapat', wid)
+ button.resize(50, 20)
+ button.move(240, 50)
+
+ QObject.connect(button, SIGNAL('clicked()'), qapp, SLOT('quit()'))
+
+ qapp.setMainWidget(wid)
+ wid.show()
+ qapp.exec_loop()
files/merhaba-pisi-desktop-file:
[Desktop Entry] Name=Merhaba PiSi Comment=Hello World like application for PiSi. Comment[tr]=PiSi için bir merhaba dünya uygulaması. Exec=merhaba-pisi Icon=pisi-kga Terminal=false Type=Application Categories=Application;System;
comar/package.py:
#!/usr/bin/python
import os
def postInstall():
os.system('wall "Merhaba PiSi paketi sisteme kuruldu!"')
def preRemove():
os.system('wall "Merhaba PiSi paketi sistemden kaldırılıyor!"')
[değiştir] Sorular
Bu kısımda PiSi ile çalışmaya yeni başlamış bir geliştiricinin aklına gelmesi muhtemel sorular ve yanıtlarına yer verilecek. Bu soruların sayılarını arttırmak için lütfen tartışma kısmına sorularınızı eklemekten çekinmeyin.
[değiştir] PiSi paketi inşa işlemi hangi adımlar ile gerçekleşir?
PiSi komut satırı istemcisine build komutu bir pspec.xml dosyası ile beraber verildiği zaman özetle ve kısaca aşağıdaki işlemler yapılır:
- pspec.xml içerisinde adresi tanımlanmış olan arşiv dosyası çekilir ("/var/cache/pisi/archives/" dizini içerisine).
- Arşiv dosyası açılır ("/var/pisi/paket_adı/work/" dizinine).
- pspec.xml dosyası içerisinde adreslenmiş olan yamalar kaynağa uygulanır. Yamalar başarı ile uygulandığı taktirde bu noktadan itibaren bir süreliğine pspec.xml dosyası ile ilgili işlemler sona erer.
- actions.py dosyası içerisindeki setup fonksiyonu PiSi tarafından çağrılır ve inşa öncesi yapılandırma işlemleri gerçekleştirilir.
- actions.py dosyası içerisindeki build fonksiyonu çağrılır ve uygulamanın kaynak kodu inşa edilir.
- actions.py dosyası içerisindeki install fonksiyonu çağrılır ve inşa edilmiş uygulama için /var/pisi/paket_adı/install dizinini kök kabul eden bir kurulum gerçekleştirilir. Bu kurulum sadece, paketin yapılandırma betiklerinin isteği doğrultusunda sisteme kurulmayı bekleyen tüm dosyalarının bir görüntüsüdür. Hangilerinin aslında pakete gerçekten gireceğini Files imi ile pspec.xml içerisinde paketçi belirler. Örnek bir kurulum dizini şöyle görünür:
meren@pardus install $ pwd /var/pisi/aalib-1.4-1/install meren@pardus $ ls usr meren@pardus install $ ls usr/ bin include lib share meren@pardus install $ ls usr/share/ aclocal doc info man meren@pardus install $ ls usr/bin aafire aainfo aalib-config aasavefont aatest meren@pardus install $ ls usr/include aalib.h meren@pardus install $
Bu aşamada PiSi'nin actions.py ile işi biter ve tekrar pspec.xml dosyası içerisindeki bilgilerden faydalanılarak işlem devam eder. Bu adımdan sonra yapılan her şey pspec.xml içerisindeki her bir Package tanımlaması için sırasıyla tekrar edilir. Her bir paket için,
- AdditionalFiles imi altında adreslenmiş dosya ya da dosyalar varsa, dosyalar kurulum dizini içerisindeki gerekli yerlere kopyalanır (AdditionalFiles imi altında yapılandırma dosyaları ya da çeşitli çalışma zamanı betikleri olabilir, bu dosyalar eğer paketin inşası esnasında inşa dizininde olması gereken dosyalar ise yama haline getirilmesi ve Source imi altında tanımlanmaları gerekir).
- pspec.xml dosyasındaki Files imi altından alınan bilgiler ile files.xml dosyası yaratılır.
- pspec.xml ve files.xml dosyasından alınan bilgiler ile metadata.xml dosyası yaratılır.
- files.xml dosyası içerisinde adreslenmiş olan dosyalar install dizininden alınır, metadata.xml dosyası, files.xml dosyası ve varsa Provides imi altında adreslenmiş olan ÇOMAR betikleri bir araya getirilerek sıkıştırılır ve ortaya .pisi uzantılı kurulabilir bir PiSi paketi çıkar.
[değiştir] Files imi içerisinde yer alan path tanımlamaları ne işe yarar?
Kısa cevap:
- Files imi içerisinde verilen bilgi PiSi'ye, kurulum yapılan install dizini içerisinde oluşacak olan hangi dizinlerin ya da hangi dosyaların, hangi sıfatla ikili paket içerisine ekleneceğini anlatır.
Uzun cevap:
Eğer http://svn.pardus.org.tr/pardus/devel/ adresindeki depoya gidip uygulamaların pspec.xml dosyaları içerisine göz atacak olursanız pspec.xml dosyasının yapısının aşağıdakine benzer bir şemaya sahip olduğunu görebilirsiniz:
<PISI>
<Source>
(...)
</Source>
<Package>
(...)
</Package>
.
.
.
<Package>
(...)
</Package>
<History>
(...)
</History>
</PISI>
Görüldüğü üzere bir pspec.xml içerisinde birden fazla Package tanımı yapılabilmektedir. Yani tek bir kaynaktan derlenen bir uygulamanın kurulumu sonunda ortaya çıkan dosyalardan birden fazla paket oluşturmak mümkündür.
Örneğin mplayer uygulamasını derlediğinizde ortaya mplayer uygulamasının çalışması için gerekli olan dosyalar ile beraber uygulamanın çalışması için elzem olmayan kullanım belgeleri de çıkar. Bu durumda mplayer'ı örneğin mplayer ve mplayer-doc gibi iki ayrı pakete bölmenin nasıl avantajları beraberinde getireceğini tahmin edebilirsiniz. Öte yandan tek bir paket ortaya çıkacağı durumlarda dahi, uygulamanın ortaya çıkan tüm dosyalarını paket içerisine almamak gibi bir tercih kimi durumlarda paketçi için anlamlı olabilir.
Bunların gerçekleştirilebilmesi için hangi paketin içerisinde hangi dosyaların olacağının bir yerde ifade edilmesi gerekliliği ortaya çıkar. Pakete özel olan bu bilginin deklare edildiği yer Package imi altındaki Path tanımlarıdır.
Path tanımlamaları içerisinde metakarakterler kullanılabilir. Buna http://svn.pardus.org.tr/pardus/devel/programming/languages/gambas/gambas/pspec.xml adresinden inceleyebileceğiniz Gambas paketi güzel bir örnektir. Lütfen bu kısmı okuduktan sonra yukarıdaki adresteki pspec.xml dosyasını inceleyin.
Aynı zamanda Path tanımlamaları içerisinde fileType isimli bir özellik bulunur. Bu özellik işaret edilen dosyanın ya da dizinin içerisindeki dosyaların executable, config, doc, man, info, library, data, localedata ve header nitelik listesinden hangisine uygun olduğu bilgisi PiSi'ye daha sonra kullanılabilecek bu bilginin paketin içerisine eklemesi için iletilir.
[değiştir] IsA imi nedir, ne işe yarar, içerisine neler yazılabilir?
IsA imi bir uygulamanın sistem genelindeki sıfatını belirlemek için kullanılır. Bir pspec.xml içerisindeki Source imi altında yer alan bir IsA tanımlaması bu kaynaktan ortaya çıkacak tüm paketler için geçerli olurken Package imi içerisinde bu bilginin üzerine paket özelinde yazılabilir ve bir paket birden fazla IsA tanımına sahip olabilir.
IsA bilgisi PiSi arayüzlerinde ve diğer muhtemel kullanım alanlarında belli bir sıfata uyan paketlerin görüntülenmesi için faydalı olur. Bu sayede paketlerin herhangi bir arayüzde gösterimi esnasında "sadece web uygulamalarını göster" ya da "kitaplıkları gösterme" gibi seçimlerin yapılması olanaklı hale gelir.
Paketçinin IsA imi içerisinde nelerden faydalanabileceği bellidir, bu seçimler aşağıdakilerden birisi olmak zorundadır:
app app:console app:gui app:web library service data data:doc data:font kernel driver locale locale:tr locale:en locale:es locale:nl locale:de
| Not: Yukarıdaki listenin en güncel hali her zaman http://svn.pardus.org.tr/uludag/trunk/pisi/pisi-spec.rng adresindeki şema dosyasından temin edilebilir. -- A. Murat Eren 02:15, 12 Şubat 2007 (EET) |

