PİSİ (Packages Installed Successfully as Intended) 2011 öncesi Pardus projesi kapsamında geliştirilen bir ikili(binary) paket yönetim sistemidir. PiSi paket sistemi paketlerin sadece kurulup kaldırılmasından daha fazla işleve sahiptir, örneğin tüm kurulu paketlerin eski bir tarihteki haline geri döndürülebilmesi mümkündür.
Paket: Sisteme kurulacak bir yazılım, doküman veya her tür veri.
Kaynak dosya: Pakete ait derlenmemiş dosyaları, veri ve dökümanları bulunduran ve internetten indirilebilir haldeki sıkıştırılmış dosyalardır.
Pisilemek: Bir paketi Pisi paketi haline getirmek.
Derleme: Derlenebilir bir programlama dili ile yazılan programların (C, C++ gibi) kaynak kodlarını çalıştırılabilir ikili dosyaya (executable binary) dönüştürmek için yapılması gereken işlem.
Bağımlılık: yazılımın çalışması ve derlenmesi sırasında kullandığı ve sisteme kurulması gereken başka paketler.
Doğrulama kodu: İnternetten indirilen dosyaların doğruluğunu test etmek için kullanılır. Pisi paketi oluşturulurken yazılımın sıkıştırılmış kaynak dosyalarından sha1sum algoritmasıyla elde edilen anahtar yazılımın kendi sitesinde yayınlanan anahtar ile karşılaştırılarak doğrulama yapılır.
Bir yazılımı pisi paket sistemine dahil edilmesi pisilemek istediğiniz paketin ne olduğu ve nasıl çalıştığı hakkında bilgi toplamaktan başlayıp pisi dosyası oluşturulduktan sonra test edilip hata düzeltme ve yeni sürümlerin takip edilmesiyle devam eden bir süreçtir. Bir paketçi eğer bu süreci takip edebileceğini düşünüyorsa pisileme işlemine başlamalıdır. Bu açıdan bakınca yapılan pisi dosyaları onu yapanların çocukları gibi olurlar ve paketin her yeni sürümünde ve hata düzeltmesinde yenilenirler.
Ancak sürece sadık kalınmadan başıboş bırakılan ve takip edilmeyen pisi paketlerinin ömrü her gün yeni geliştirmelerin yapıldığı Linux dünyasında çok kısa olacaktır. Bu nedenle "yapabildiğin kadar değil bakabileceğin kadar pisile" sözünü unutmamalısınız. Ayrıca Linux dünyası kollektif çalışmanın ve imece yönteminin en güzel örneklerini sergileyip geliştiğinden mutlaka pisilediğiniz inşa dosyalarını internette paylaşın. Bu sayede pisi paketlerinizi takip edecek pek çok ebeveyni olabilir.
Bu işlev sonraki bölümde anlatılan dosyalar (Pisi inşa dosyaları) kullanılarak paketin inşa dosyasından Pisi tarafından kullanılabilecek bir paket ortaya çıkarma mekanizmasıdır. Bu mekanizma ile Pisi tarafından paket oluşturma süreci şöyledir;
Görüldüğü gibi pisi dosyası oluştururken aynı zamanda paketi /var/pisi/paket_adi/install dizinine de kurmuş oluyoruz. Pisi bu kurulumun sanki kök dizine kuruluyormuş gibi olmasını sağlıyor. Bu sayede bu dizine bakarak paket kurulduğunda sistemdeki hangi dosyaları oluşturduğunu görmüş oluyoruz.
GIT reposu Pisi Linux geliştiricilerinin paketler için oluşturduğu pisi inşa dosyalarını ve Pisi Linux projelerini barındıran bir servistir. Depoya Github adresinden ulaşabilirsiniz, burada Pisi Linux için pisilenmiş paketlerin inşa dosyaları ve projelerin kaynak kodları bulunur. Pisilemeye yeni başlayanların "Nasıl?" sorularının yanıtlarının hepsi aslında bu Pisi Paketleri reposundaki inşa dosyalarında mevcuttur.
Pisi paketi inşa dosyaları pspec.xml ve actions.py'dir ve her ikisi de aynı dizinde olmalıdır. Ayrıca ihtiyaç halinde kullanılan diğer dosyalar için comar ve files dizinleri kullanılır, bunlar da yine pspec.xml ile aynı klasörde bulunmalıdır. Kaynak dosyalar şöyle görünür;
paket_adı
|__pspec.xml
|__actions.py
|__translations.xml
|__files
|__comar
|__package.py
|__service.py
Bu belgede Actions API tanıtılmış ve içerisindeki fonksiyonların işlevleri açıklanmış ve örneklendirilmiştir.
Actions
Bir uygulamanın PiSi paketi haline getirilmesi için paket inşa sistemi tarafından kullanılan minimum bileşenler, paketlenecek uygulamanın kaynak kodu, pspec.xml dosyası ve actions.py dosyasıdır. Ayrıca varsa yamalar ve ek dosyalar da uygulamanın kaynak kodunun parçası olarak düşünülebilir.
pspec.xml dosyası uygulamanın kaynak kodunu taşıyan arşiv dosyasının nereden çekileceği, bu arşiv dosyası açılırken hangi yamaların uygulanacağı, bu uygulamayı kimin paketlemiş olduğu, uygulamanın adı, sürüm numarası gibi meta sayılabilecek bilgilerin saklandığı dosya iken, bu uygulamanın derlenmesi ve inşa edilmesi aşamasında yapılması gereken işlerin tarifi de, bu belgede bahsedilecek olan Actions API'dan faydalanan actions.py dosyası içerisinde yer alır. Örnek bir actions.py dosyası aşağıdaki gibidir:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Licensed under the GNU General Public License, version 3.
# See the file http://www.gnu.org/licenses/gpl.txt
from pisi.actionsapi import autotools
from pisi.actionsapi import pisitools
from pisi.actionsapi import get
def setup():
autotools.configure("--enable-nls
--bindir=/bin
--with-rmt=/usr/sbin/rmt")
def build():
autotools.make()
def install():
autotools.rawInstall("DESTDIR=%s" % get.installDIR())
pisitools.dodoc("AUTHORS", "NEWS", "README")
pisitools.remove("/usr/share/man/man1/mt.1")
pisitools.removeDir("/usr/libexec")
Bu belgede actions.py python betiği içerisinde paketlerin inşa edilmesi yapılandırılması ve kurulumu işlevlerinin gerçekleştirilebilmesi için Actions API tarafından sağlanan fonksiyonlar üzerinde durulacaktır.
Belge içerisinde sık sık bahsedilen kurulum (install) işlemi, uygulamanın gerçek sisteme kurulumu ile karıştırılmamalıdır. Bu belgede bahsedilen kurulum işlemi aksi belirtilmediği sürece, uygulamanın paketlenmesinden bir önceki aşama olan ve bu paket gerçek sistemde kurulurken hangi dosyanın nereye gitmesi gerektiğinin anlaşılması için yapılan sanal bir kurulum işlemidir.
Actions API
Actions API, pisi paketlerinin oluşturulması esnasında paketi oluşturacak yazılımın hangi işlemlere tabi tutulacağına dair bilgilerin Python programlama dili ile yazıldığı actions.py isimli dosya içerisinde kullanabilecek fonksiyonları barındıran kütüphanedir. Paket yapılırken bu kütüphane dışında herhangi bir Python modülü kullanılmaması tavsiye edilir, fakat paketleyici bu konuda özgürdür.
actions.py isimli dosya, kaynak koddan bir ikili ve kurulmaya hazır PİSİ paketi oluşturma sürecini tarif eden bir dosyadır. Bu dosya içerisinde tarifin doğru şekilde yapılabilmesi için paket yapıcının paketleyecekleri yazılımı yeterince tanıması gereklidir. Öte yandan paket yapıcı için bu kaynağın daha önce paketlendiği dağıtımların paket sistemlerinin spec dosyalarına göz atarak hızlı bir şekilde paketin nasıl oluşturulması gerektiğine dair fikir sahibi olması da mümkündür, fakat bunun PİSİ'nin diğer paket yöneticileri ile arasında organik bir bağ olduğu şeklinde yorumlanması yanlış olur; çünkü PİSİ diğer paket yöneticilerinin hiçbirisi ile arasında bir ilişki olmayan yeni bir paket yöneticisidir.
Actions API içerisinde paket yapıcılara sunulan fonksiyonlar amaçlarına göre birbirinden ayrılmış ve ayrı modüller içerisinde toplanmışlardır. Her bir modülün actions.py içerisinden dahil edildiğinde hangi fonksiyonları sunduğu ve bu fonksiyonların özellikleri sonraki başlıklarda incelenmiştir. Bununla beraber modüllerin basitçe amaçları şu şekilde tanımlanabilir:
Autotools: Uygulama derlemek ve kurmak için gerekli olan standart işlevleri sunar.
Cmaketools: cmake ile yapılandırılan uygulamaları derlemek ve kurmak için gerekli olan standart işlevleri sunar.
Pisitools: Pisitools, içerisinde paket yapıcıların en sık kullanacağı fonksiyonları sunan modüldür. Özel durumlar dışında tüm işlemler bu modüldeki fonksiyonlar yardımı ile gerçekleştirilmelidir. Bu modül ile beraber gelen fonksiyonların tümü relative path'ler ile çalışır ve çok büyük bir kısmı da work dizininden install dizinine dosya taşıma işlerinde kullanılırlar. Bununla beraber symlink oluşturma, dosyalar üzerinde değişiklik yapma (sed ile), dosya ya da dizin silme gibi ihtiyaçlara da yanıt verir.
Shelltools: Bu modül ile beraber özel durumlarda kullanılabilecek fonksiyonlar sunulur. Kimi işlevler pisitools içindeki işlevlerle benzerlik gösterir, fakat shelltools içerisindekilere absolut path verebilir, böylece sıkça karşılaşılmayacak work dizininden work dizinine, install dizininden install dizinine doysa taşıma işlemleri, dosya izinlerini değiştirme, kabuk'ta komut çalıştırma, çalışma dizini değiştirme gibi ihtiyaçlar karşılanabilir. Fakat mümkün olan her durumda Pisitools içerisindeki fonksiyonların tercih edilmesi şarttır. Shelltools içerisindeki fonksiyonlar paketleyiciyi tamamen özgür bıraktığı için dikkatli bir şekilde kullanılmalılardır.
Libtools: Kütüphanelerin doğru şekilde yapılandırılması, uygulamanın doğru şekilde derlenebilmesi için ihtiyaç duyulan derleme öncesi ve sonrası işlevlerini sunar.
Get: Derleme öncesi yapılandırma, derleme ve kurulum esnasında ihtiyaç duyulabilecek çeşitli ortam değişkenlerinin ve paket ile ilgili bilgilerin elde edilmesi için işlevler sunar.
Kde: KDE uygulamaları için derleme öncesi yapılandırma, derleme ve kurulum işlevlerini sunar.
Perlmodules: Perl modüllerinin kurulumu için gerekli işlevleri sunar.
Pythonmodules: Python modüllerinin derlenmesi, kurulması, çalıştırılması gibi işlevleri sunar.
Scons: Scons yeni nesil bir yazılım inşa aracıdır, geliştiricilere geleneksel autoconf/automake araçlarının yerini alabilecek bir yapı sunar. Autotools modülünün autoconf/automake için sunduklarını, Scons modülü de scons ile inşa edilmek üzere hazırlanmış uygulamalar için sunar.
Takip eden bölümlerde modüllerle ilgili açıklamalar yer almaktadır. Fonksiyonlar modüllerin altbaşlıkları olarak gösterilmiştir, fonksiyon ismini takip eden satırda fonksiyonun aldığı parametreler belirtilmiş (bir fonksiyon hiç parametre almadığı None belirtimi ile ifade edilmiştir), takip eden paragrafta nasıl bir işlev sunduğu açıklanmış, bu açıklamanın ardından da örnek bir kullanımı verilmiştir.
Pisitools
Pisitools modülü bir paket geliştiricisinin en çok ihtiyaç duyabileceği işlevleri barındıran modüldür. Ayrıca, paket yapıcının çağırdığı fonksiyonlardaki parametrelerin başına otomatik olarak çalışma dizinlerini ekleyerek onun sistemin gerçek dosyalarına erişmeden sanal bir dizin içerisinde çalışabilmesine olanak sağlar. Pisitools modülünün sunduğu bu rahatlık kimi durumlarda engelleyici olabilmektedir, bu gibi durumda da tüm kontrolü paket yapıcıya bırakan Shelltools modülü içerisindeki işlevlerden yararlanılabilir.
dobin (sourceFile, destinationDirectory = '/usr/bin')
work dizini içerisindeki yolu sourceFile ile verilen bir çalıştırılabilir destinationDirectory parametresi ile tam yolu verilmiş dizin içerisine koyar. Bu parametrenin öntanımlı değeri ``/usr/bin ''dizinidir.''
pisitools.dobin("sed/sed", "/bin")
pisitools.dobin("zipsplit")
dosbin (sourceFile, destinationDirectory = '/usr/sbin')
Install dizini içerisine destinationDirectory ile belirtilmiş isimde bir dizini oluşturur.
work dizininde içerisindeki yolu sourceFile ile verilen bir çalıştırılabilir dosyayı öntanımlı olarak /sbin verilmiş ise destinationDirectory ile tam yolu verilmiş dizin içerisine kopyalar.+
pisitools.dosbin("traceroute6")
pisitools.dosbin("extras/scsi_id/scsi_id", "/sbin")
dodir (destinationDirectory)
Install dizini içerisine destinationDirectory ile belirtilmiş isimde bir dizini oluşturur.
pisitools.dodir("/usr/include/awk")
pisitools.dodir("/usr/" + get.HOST() + "/include")
pisitools.dodir("/usr/share/doc/%s/examples" % get.srcTAG())
dodoc (sourceFiles)
work dizini içerisinden yolu verilen dosya ya da dosya listesini install dizni altındaki /usr/share/doc/PACKAGE altına kopyalar. Metakarakter kullanılabilir.
pisitools.dodoc("README")
pisitools.dodoc("*.html")
pisitools.dodoc("FAQ", "README", "ChangeLog.*", "algorithm.txt")
doexe (sourceFile, destinationDirectory)
work dizinindeki yolu verilen bir dosyayı destinationDirectory ile belirlenen install dizini içerisindeki hedefe çalıştırılabilir dosya olarak kopyalar. sourceFile için Metakarakter kullanılabilir.
pisitools.doexe("extras/scsi-devfs.sh", "/etc/udev/scripts/")
pisitools.doexe("etc/hotplug/*.rc", "/etc/hotplug/")
dohtml (sourceFiles)
work dizini içerisinden yolu verilen dosya ya da dosya listesini install dizni altındaki /usr/share/doc/PACKAGE/html altına kopyalar. Metakarakter kullanılabilir.
pisitools.dohtml("index.html")
pisitools.dohtml("doc/*")
doinfo (*sourceFiles)
work dizini içerisinden yolu verilen dosya ya da dosya listesini install dizni altındaki /usr/share/info altına kopyalar. Metakarakter kullanılabilir.
pisitools.doinfo("*.info")
dolib (sourceFile, destinationDirectory = '/usr/lib')
work dizini içerisindeki bir kütüphaneyi öntanımlı olarak install dizini altında /usr/lib içerisine kopyalar.
pisitools.dolib("libz.a")
pisitools.dolib("lib/libpci.a")
pisitools.dolib("libbz2.so.1.0.2", "/lib")
dolib_a (sourceFile, destinationDirectory = '/usr/lib')
work dizini içerisindeki bir statik kütüphaneyi öntanımlı olarak install dizini altında /usr/lib içerisine gerekli dosya izinleri ile kopyalar.
pisitools.dolib_a("lib/libpci.a")
pisitools.dolib_a("libdb1.a")
dolib_so (sourceFile, destinationDirectory = '/usr/lib')
work dizini içerisindeki bir paylaşımlı kütüphaneyi öntanımlı olarak install dizini altında /usr/lib içerisine gerekli dosya izinleri ile kopyalar.
pisitools.dolib_so("libdb1.so.2")
doman (*sourceFiles)
work dizini içerisinden yolu verilen dosya ya da dosya listesini install dizni altındaki /usr/share/man/ altına kopyalar. Metakarakter kullanılabilir.
pisitools.doman("logrotate.8")
pisitools.doman("doc/bash.1", "doc/bashbug.1", "doc/builtins.1", "doc/rbash.1")
pisitools.doman("*.[1-8]")
domo (sourceFile, locale, destinationFile )
work dizini içerisindeki yolu sourceFile ile verilen bir po dosyasını, locale ile belirlenen dil için derleyerek bir mo dosyası oluşturur ve bu dosyayı install altındaki /usr/share/locale/LOCALE/LC_MESSAGES dizini içerisine destinationFile ile verilen isimle kopyalar.
pisitools.domo("po/tr.po", "tr", "pam_login.mo")
domove (sourceFile, destination, destinationFile = '')
install dizini içerisindeki yolu sourceFile ile verilen dosyayı, yine install dizini içerisindeki yolu destination ile verilen dizin içerisine eğer belirtilmişse destinationFile ismi ile taşır.
pisitools.domove("/usr/bin/passwd", "/bin/")
pisitools.domove("/usr/bin/yacc", "/usr/bin", "yacc.bison")
pisitools.domove("/usr/docs/", "/usr/share/doc/%s/html/" % get.srcTAG())
dosed (sourceFile, findPattern, replacePattern = '')
work dizini içerisindeki yolu verilen sourceFile içerisinde istenen değişiklikleri yapar (FIXME: dosed dökümantasyonunun biraz daha genişletilmesi gerekli).
pisitools.dosed("gcc/version.c", "", "")
pisitools.dosed("sshd_config", "(?m)(#UsePAM ).*", r"UsePAM yes")
pisitools.dosed("unix/Makefile", "-O3", get.CFLAGS())
pisitools.dosed("Make.Rules", "HAVE_NDBM_H=yes", "HAVE_NDBM_H=no")
pisitools.dosed("Makefile.def", "CC=cc", "CC=%s" % get.CC())
pisitools.dosed("automake.texi", "(?m)(@setfilename.*)automake", r"1automake1.7")
dosym (sourceFile, destinationFile)
install dizini içerisinde göstereceği yol sourceFile ile verilmiş olan ve install dizin içerisindeki yolu destinationFile ile verilmiş bir symlink oluşturur.
pisitools.dosym("gzip", "/bin/gunzip")
pisitools.dosym("libdb1.so.2", "/usr/lib/libdb.so.2")
pisitools.dosym("../bin/lsmod", "/sbin/lsmod")
pisitools.dosym("/usr/X11R6/include/X11", "/usr/include/X11")
insinto (destinationDirectory, sourceFile, destinationFile = '', sym = True)
work dizini içerisindeki yolu sourceFile ile verilmiş olan bir dosyayı install dizini içerisindeki yolu destinationDirectory ile verilmiş olan dizin içerisine, eğer verilmişse destinationFile ismi ile, eğer verilmemişse kendi adı ile kopyalar. Dosyanın work dizini içerisindeki uid/guid ve izinleri korunur. destinationFile parametresi kullanılmamışsa, sourceFile için metakarakter kullanılabilir.
pisitools.insinto("/opt/rar/bin", "rar")
pisitools.insinto("/etc/", "doc/nanorc.sample", "nanorc")
pisitools.insinto("/etc/hotplug", "etc/hotplug/*map")
newdoc (sourceFile, destinationFile)
work dizini içerisindeki yolu sourceFile ile verilmiş olan dosyayı /usr/share/doc/PACKAGE/ dizini içerisine destinationFile adı ile kopyalar.
pisitools.newdoc("extras/volume_id/README", "README_volume_id")
pisitools.newdoc("gprof/ChangeLog.linux", "gprof/ChangeLog.linux")
pisitools.newdoc("bfd/PORTING", "bfd/PORTING")
newman (sourceFile, destinationFile)
work dizini içerisindeki yolu sourceFile ile verilmiş olan dosyayı /usr/share/man/manPREFIX/ dizini içerisine destinationFile adı ile kopyalar.
pisitools.newman("less.nro", "less.1")
remove (sourceFile)
install dizini içerisindeki yolu sourceFile ile verilmiş olan dosyayı siler.
pisitools.remove("/usr/lib/libdb_cxx.so")
rename (sourceFile, destinationFile)
install dizini içerisindeki yolu sourceFile ile verilen dosyayı, bulunduğu dizinde destinationFile olarak isimlendirir.
pisitools.rename("/usr/bin/bash", "bash.old")
removeDir (destinationDirectory)
install dizini içerisindeki yolu destinationDirectory ile verilmiş olan dizini tüm içeriği ile beraber siler.
pisitools.removeDir("/usr/lib")
Autotools
configure (parameters = "")
Kaynağı parameters ile verilen parametreler ve PİSİ'nin ön tanımlı yapılandırma parametreleri ile yapılandırır. Fonksiyonun parametreli ile ya da parametresiz çağırıldığı farketmeksizin, her durumda prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir parametreleri öntanımlı değerleri configure betiğine gönderilir. Bu öntanımlı değerler ``PisiKaynakDizini/pisi/actionsapi/variables.py ''içerisinden görüntülenebilir.''
rawConfigure (parameters = "", prefix="")
Kaynağı parameters ile verilen parametreler ile hiçbir öntanımlı yapılandırma parametresi olmaksızın yapılandırır.
autotools.rawConfigure()
autotools.rawConfigure("--prefix %s/usr --with-doxywizard" % get.installDIR())
autotools.rawConfigure("--enable-nls --enable-freetype --disable-xmltest")
compile (parameters = "")
make (parameters = "")
Kaynağı parameters ile verilen parametreler ile inşa eder.
autotools.make()
autotools.make("local-all")
autotools.make("LIBS=%s" % get.LDFLAGS())
autotools.make("-j1")
install (parameters = "")
Kaynağı parameters ile verilen parametreler ve PİSİ'nin ön tanımlı kurulum parametreleri ile kurulum dizini içerisine kurar.
autotools.install()
autotools.install("libdir=%s/usr/lib" % get.installDIR())
rawInstall (parameters = "")
Kaynağı verilen parametreler ile kurulum dizini içerisine kurar.
autotools.rawInstall("DESTDIR=%s" % get.installDIR())
autotools.rawInstall("DESTDIR="%s" docdir=/usr/share/doc/%s/html" % (get.installDIR(), get.srcTAG()))
aclocal (parameters = "")
configure.in dosyasının içeriğine göre bir aclocal.m4 oluşturmak için çağırılır.
autotools.aclocal("-I cmulocal -I config")
autotools.aclocal("-I m4")
autotools.aclocal()
autoconf (parameters = "")
configure betiğinin oluşturulması için çağırılır.
autotools.autoconf()
autoreconf (parameters = "")
configure betiğinin tekrar oluşturulması için çağırılır.
autotools.autoreconf()
automake (parameters = "")
makefile dosyasının yaratılması için çağırılır.
autotools.automake("-afc")
autotools.automake("--add-missing")
autotools.automake()
autoheader (parameters = "")
configure için şablon dosyalarının yaratılması için çağırılır.
autotools.autoheader()
Cmaketools
configure(parameters = '', sourceDir = '.', installPrefix = '%s' % get.defaultprefixDIR())
Kaynağı verilen parametreler ile yapılandırır.
cmaketools.configure()
cmaketools.configure(installPrefix = "%s" % (get.kdeDIR()))
cmaketools.configure("-DCMAKE_BUILD_TYPE=None -DKDEDIR=%s" % get.kdeDIR(), sourceDir = "..")
make(parameters = "")
Kaynağı ''parameters'' ile verilen parametreler ile inşa eder.
cmaketools.make()
cmaketools.make("LIBS=%s" % get.LDFLAGS())
cmaketools.make("-j1")
install (parameters = '', argument = 'install')
Kaynağı ''parameters'' ile verilen parametreler ve PİSİ'nin ön tanımlı kurulum parametreleri ile kurulum dizini içerisine kurar.
cmaketools.install()
cmaketools.install("libdir=%s/usr/lib" % get.installDIR())
rawInstall (parameters = '', argument = 'install')
Kaynağı install'dan farklı olarak sadece ''parameters'' ile verilen parametreler ile kurar.
cmaketools.rawInstall("PREFIX=%s" % get.installDIR())
Libtools
preplib (sourceDirectory = "/usr/lib")
Belirtilen dizin için ldconfig komutunu çalıştırır.
gnuconfig_update (None)
En yeni config.* dosyalarını kaynak üzerine kopyalar.
libtoolize (parameters = "")
Bir kaynağı libtool kullanabilecek hale getirir. Bunun, için kaynak dizininde "/usr/bin/libtoolize" uygulamasını parameters ile verilmiş parametreler ile çağırır.
gen_usr_ldscript (dynamicLib)
Pardus /lib dizini altında dinamik, /usr/lib altında da statik olarak kritik kütüphanelere sahip olduğundan, bağlama (linking) problemleri ile karşılaşmamak için /usr/lib dizini altında sahte bir dinamik kütüphane oluşturmamız gerekiyor. Bu amaçla /usr/lib dizini altında 'dynamicLib' parametresi ile verilen isimde bir dosyayı yazma modu ('w') ile açarak, boş bir dosya oluşturuyoruz. Daha sonra da içerisine açıklama niteliğinde karakter dizisi yerleştirerek, ardından dosya izinlerini değiştiriyoruz (öntanımlı 0755).
Shelltools
Pisitools ile yer yer benzer işlevler sunar (örneğin pisitools.domove() ile shelltools.move() teorik olarak aynı işlevi sunarlar). Fakat shelltools modülü, pisitools modülünün paket yapıcıya sunduğu rahatlığı sunmaz. Pisitools modülü ile çalışılırken, fonksiyon çağrılarına çalışma dizinleri otomatik olarak eklenirken, shelltools ile paket yapıcı daha özgürdür ve biraz daha dikkat etmek zorundadır, çünkü çalışma dizini dışında kalan, sistemin gerçek dosyalarına da erişme şansı vardır.
Paket yapıcıların gerekmediği sürece shelltools modülünü kullanmamaları, bunun yerine eğer mümkünse ihtiyaç duydukları işlevleri pisitools modülünden karşılamaları beklenir.
can_access_file (sourceFile)
Tam yolu sourceFile ile verilmiş olan dosyanın erişilebilir olup olmadığını bilgisini döndürür.
shelltools.can_access_file("/usr/share/terminfo/%s" % termfile)
can_access_directory (destinationDirectory)
Tam yolu destinationDirectory ile verilmiş olan dizinin erişilebilir olup olmadığını bilgisini döndürür.
makedirs (destinationDirectory)
Tam yolu destinationDirectory ile verilmiş olan dizini oluşturur.
shelltools.makedirs("%s/build" % get.workDIR())
shelltools.makedirs("%s/build-default-i686-pc-linux-gnu-nptl" % get.workDIR())
chmod (sourceFile, mode = 0755)
Tam yolu sourceFile ile verilen dosyanın izinlerini değiştirir. Metakarakter kullanılabilir.
shelltools.chmod("config/config.sub")
shelltools.chmod(get.installDIR() + "/lib/libz.so.*")
shelltools.chmod("%s/usr/lib/misc/pt_chown" % get.installDIR(), 4711)
shelltools.chmod(get.installDIR() + "/etc/ssh/sshd_config", 0600)
unlink (sourceFile)
Tam yolu sourceFile ile verilmiş olan dosyayı siler.
shelltools.unlink(get.workDIR() + '/' + get.srcDIR() + "/missing")
unlinkDir (sourceDirectory)
Tam yolu sourceDirectory ile verilmiş olan dizini ve altdizinlerini siler.
shelltools.unlinkDir(get.workDIR() + "/tmpbuild")
move (sourceFile, destinationFile)
Tam yolu sourceFile ile verilmiş dosya ya da dizini tam yolu destinationFile ile verilmiş dosya ya da dizine taşır. sourceFile içinde metakarakterler kulanılabilir.
shelltools.move("ac-wrapper.sh", "%s/usr/lib/misc/" % get.installDIR())
shelltools.move("proc/*.h", "%s/usr/include/proc/" % get.installDIR())
copy (sourceFile, destinationFile)
Tam yolu sourceFile ile verilmiş olan bir dosyayı tam oylu destinationFile ile verilmiş bir dosya olarak kopyalar. sourceFile içinde metakarakterler kulanılabilir.
shelltools.copy("Makefile.pre.in", "%s/usr/lib/python2.3/config/" % get.installDIR())
shelltools.copy("scripts/*", "%s/usr/bin/" % get.installDIR())
copytree (source, destination, sym=False)
Tam yolu source ile verilmiş olan dizini, tam yolu destination ile verilmiş hedefe kopyalar.
shelltools.copytree("include/linux/", "%s/usr/include/linux/" % get.installDIR())
shelltools.copytree("include/asm-generic/", "%s/usr/include/asm-generic/" % get.installDIR())
touch (sourceFile)
Tam yolu sourceFile ile verilen dosyanın son erişim tarihini erişim anı yapar, eğer dosya yoksa onu yaratır.
shelltools.touch(get.workDIR() + "aclocal.m4")
shelltools.touch("gcc/c-gperf.h")
cd (directoryName = '')
Çalışma dizinini tam yolu directoryName ile verilen dizin içerisine değiştirir.
shelltools.cd("build_unix")
shelltools.cd("%s/build-default-i686-pc-linux-gnu-nptl" % get.workDIR())
ls (source)
Tam yolu source ile verilen dizin ya da dosyaların bir listesini döndürür, bu liste içerisindeki her bir dosya üzerinde bir işlem yapmak gerektiği durumlarda kullanılabilir, metakarakterlerden yararlanılabilir.
shelltools.ls(get.installDIR() + "/usr/lib/*w.*")
for file in shelltools.ls(get.installDIR() + "/usr/lib/*w.*"):
shelltools.ls(get.installDIR() + "/bin/")
export (key, value)
key ile tanımlanmış isimdeki bir ortam değişkenini value değeri ile set eder.
shelltools.export("WANT_AUTOCONF", "2.5")
shelltools.export("CXX", get.CXX())
shelltools.export("LDFLAGS", get.LDFLAGS() + "-Wl,-z,now")
shelltools.export("LC_ALL", "C")
system (command)
command ile verilen komutu kabuğa işletir, kabukten dönen sonuç geridönüş değeridir.
shelltools.system("./update-pciids.sh &> /dev/null")
shelltools.system("./autogen.sh")
isLink (sourceFile)
Tam you sourceFile ile verilen dosyanın link olup olmadığı bilgisini döndürür.
shelltools.isLink(get.installDIR() + '/maybe/link')
realPath (sourceFile)
Tam you sourceFile ile verilen linkin işaret ettiği gerçek dizinin yolunu döndürür.
shelltools.realPath(get.installDIR() + link)
baseName (sourceFile)
sourceFile ile verilen dosya yolunun gösterdiği dosyanın adını döndürür (os.path.basename()). Aşağıdaki örnekteki gibi durumlarda kullanılabilir.
shelltools.baseName(shelltools.realPath(link))
dirName (sourceFile)
Tam yolu sourceFile ile verilen bir dosya yolunun son dizinlerden ibaret olan kısmını döndürür (bu kimi zaman verilen sourceFile'ın tamamıdır).
sym (sourceFile, destinationFile)
Göstereceği yol sourceFile ile verilmiş olan ve tam yolu destinationFile ile verilmiş bir symlink oluşturur.
Get
Get modülü, paket inşa ortamındaki sabit değerleri, dinamik değerleri ve ortam değişkenlerini okumak için kullanılır.
curDIR (None)
O an üzerinde çalışılan dizinin yolunu döndürür.
get.curDIR()
*curKERNEL (None)
Kullanılan kernel'in sürümünü döndürür.
get.curKERNEL()
curPERL (None)
Kullanılan Perl'in sürümünü döndürür.
get.curPERL()
curPYTHON (None)
Kullanılan Python'un sürümünü döndürür.
get.curPYTHON()
pkgDIR (None)
Paketin açıldığı ve içerisinde work ve install dizinlerinin olduğu dizinin tam yolunu döndürür.
get.pkgDIR()
workDIR (None)
work dizininin tam yolunu döndürür. *
```installDIR (None)
install dizininin tam yolunu döndürür.
get.installDIR()
srcNAME (None)
Kaynak paketinin adını döndürür (automake-wrapper-1.7-3 için, automake-wrapper).
get.srcNAME()
srcVERSION (None)
Paketin kaynak versiyonunu döndürür (automake-wrapper-1.7-3 için, 1.7).
```srcRELEASE (None)
Paket kaynağının dağıtım tarafından çıkarılmış kaçıncı sürümü olduğunu döndürür (automake-wrapper-1.7-3 için, 3)
get.srcRELEASE()
srcTAG (None)
Paket adı + '-' + mainstream sürüm numarası + '-' + dağıtım sürüm numarası'ndan oluşan ismi döndürür (automake-wrapper-1.7-3 için, automake-wrapper-1.7-3).
get.srcTAG()
srcDIR (None)
Paket adı + '-' + mainstream sürüm numarası'ndan oluşan ismi döndürür (automake-wrapper-1.7-3 için, automake-wrapper-1.7).
get.srcDIR()
ARCH (None)
Üzerinde çalışılan bilgisayarın işlemci mimarisini döndürür.
arch = "linux-x86-64" if get.ARCH() == "x86_64" else "linux-x86-sse2"
bits = "64" if get.ARCH() == "x86_64" else "32"
minimumcpu = "" if get.ARCH() == "x86_64" else "--cpu=pentium2"
cpu = "x86-64" if get.ARCH() == "x86_64" else "sse"
mmx = "--enable-mmx" if get.ARCH() == "i686" else "--disable-mmx"
optimizationtype = "--enable-amd64" if get.ARCH() == "x86_64" else "--enable-mmx"
libdir = "lib64" if get.ARCH() == "x86_64" else "lib"
flags = "%s -fPIC" % get.CFLAGS() if get.ARCH() == "x86_64" else get.CFLAGS()
WorkDir = get.ARCH()
WorkDir = "%s/%s" % (get.ARCH(), get.srcNAME())
HOST (None)
CFLAGS (None)
CXXFLAGS (None)
LDFLAGS (None)
docDIR (None)
sbinDIR (None)
infoDIR (None)
manDIR (None)
dataDIR (None)
confDIR (None)
localstateDIR (None)
defaultprefixDIR (None)
kdeDIR (None)
qtDIR (None)
qtLIBDIR (None)
AR (None)
AS (None)
CC (None)
CXX (None)
LD (None)
NM (None)
RANLIB (None)
F77 (None)
GCJ (None)
Kde
configure *(parameters = "")
Kaynağı parameters ile verilen parametreler ve PİSİ'nin ön tanımlı yapılandırma parametreleri ile yapılandırır.
kde.configure()
make (parameters = "")
Kaynağı parameters ile verilen parametreler ile inşa eder.
kde.make()
install (parameters = 'install')
Kaynağı parameters ile verilen parametreler ve PİSİ'nin ön tanımlı kurulum parametreleri ile kurulum dizini içerisine kurar.
kde.install()
Perlmodules
configure (parameters = "")
Perl kaynağını verilen parametreler ile yapılandırır.
perlmodules.configure()
perlmodules.configure("/usr")
perlmodules.configure('BUILD_SPAMC="yes"
ENABLE_SSL="yes"
CONTACT_ADDRESS="root@localhost"
SYSCONFDIR=/etc
DATADIR=/usr/share/spamassassin')
make (parameters = "")
Perl kaynağını verilen parametreler ile derler.
perlmodules.make()
perlmodules.make("test")
install (parameters = 'install')
Perl kaynağını verilen parametreler ile kurar.
perlmodules.install()
Pythonmodules
configure (parameters = "")
Python kurulum dosyasının (setup.py) yapılandırmasını çalıştırır.
pythonmodules.configure()
compile (parameters = "")
Kaynağı verilen parametreler ile derler.
pythonmodules.compile()
install (parameters = "")
parameters ile belirtilen kaynak için python setup.py install komutunu install dizini içerisinde çalıştırır.
pythonmodules.install()
pythonmodules.install("--install-lib=/usr/lib/pardus")
pythonmodules.install("--prefix=/usr")
run (parameters = "")
parameters ile belirtilen kaynağı python ile işletir.
pythonmodules.run()
fixCompiledPy (lookInto = '/usr/lib/%s/' % get.curPYTHON())
Derlenmiş Python dosyalarını (.pyc, .pyo) paketten siler.
pythonmodules.fixCompiledPy()
pythonmodules.fixCompiledPy("/usr")
pythonmodules.fixCompiledPy("/usr/share/doc")
pythonmodules.fixCompiledPy("/usr/kde/4/share/apps/frescobaldi/lib")
Scons
make (parameters = "")
Kaynağı parameters ile verilen parametreler ile inşa eder.
scons.make('CC="%s" CXX="%s"' % (get.CC(), get.CXX()))
scons.make("prefix=/usr
DESTDIR=%s
ash=1
portaudio=1
portmidi=1
oss=0
optflags="%s"```" % (get.installDIR(), get.CFLAGS()))
install (parameters = 'install')
Kaynağı parameters ile verilen parametreler ve PİSİ'nin ön tanımlı kurulum parametreleri ile kurulum dizini içerisine kurar.+
scons.install()
scons.install("PREFIX='%s/usr' swig_install install" % get.installDIR())
scons.install("prefix='/usr' destdir='%s' install" % get.installDIR())
|__pspec.xml
|__actions.py
|__translations.xml
|__files
|__comar
Bu dosyadaki python kodları, pisi paketi yapılmak istenen yazılımın kaynak dosyasından derlenmesi ve install dizinine sanal bir kurulum yapılması için pisi tarafından çalıştırılır.
Python kodları kolay yazılıp okunan bir yapıdadır. Bir fonksiyon def fonksiyonadı(argüman1, argüman2): şeklinde, veriler de değişken=veri şeklinde tanımlanabilir. # işaretinden sonra yazılanlar açıklama satırlarıdır. Örneğin;
Yukarıdaki python betiği ekrana “Pisi Linux” yazacaktır. Görüldüğü gibi fonksiyonu kullanırken verilen parametrelerin değeri, fonksiyon tanımında belirtilen değişken adlarıyla fonksiyon içinde kullanılabiliyor.
Burada dikkat edilmesi gereken nokta fonksiyon tanımından sonra fonksiyonun içeriğini oluşturan kodların dört karakter b