Paket oluşturma

Arch Linux Türkiye Belgeleri sitesinden
Atla: kullan, ara


Konu başlıkları

Başlangıç

Öncelikle, gerekli araçların kurulu olduğundan emin olun. Şu paketleri kurmanız yeterlidir:

  • abs: Arch derleme sistemi (Arch Build System)
  • base-devel: (paket grubu) kaynak koddan derlemek için gerekli araçları (make vs.) barındırır.
  • fakeroot (base-devel grubunda yer alır): Normal kullanıcıya root izinlerini vererek inşa ortamında paket oluşturmasını sağlar. Böylece sistem genelinde ayar yapmaya gerek kalmaz. Eğer inşa süreci dahilinde, inşa ortamı dışında dosya oluşturulmaya çalışılırsa fakeroot hata verir. Fakeroot sayesinde, daha kaliteli ve düzgün kurulu paketler sağlanır.

Eğer bu araçlar kurulu değilse, şu şekilde kurabilirsiniz:

# pacman -S abs base-devel fakeroot

Paket oluşturmak için anahtar araç makepkg aracıdır. Şu işleri yapar:

  1. Bağımlılık kontrolü yapar.
  2. Kaynak dosyaları belirtilen konumlardan indirir.
  3. Kaynak dosya arşiv içerisinde ise arşivi açar.
  4. fakeroot ortamında kaynak kodu derler ve paket haline getirir.
  5. Kitaplıklardan ve ikili dosyalardan sembolleri ayıklar.
  6. Her pakette yer almak üzere paket meta bilgilerini oluşturur.
  7. Oluşturulan paketi sıkıştırır.
  8. Komutun çalıştırıldığı yere paket dosyasını koyar.

abs isteğe bağlı olarak kullanılmaktadır. İkili paketler kullanmak yerine abs kullanarak inşa dosyaları yardımıyla kaynak kodundan paket oluşturup, kurabilirsiniz. Ayrıca PKGBUILD dosyalarını resmi (core ve extra deposu paketleri) ve gayriresmi (topluluk paketleri) olarak bir arada tutmanızı sağlar. Hangi depoların kullanılacağını /etc/abs.conf dosyasında belirtebilirsiniz. Tüm ABS ağacını indirmek için abs komutunu çalıştırmanız yeterlidir.

# abs

Ayrıca ev dizininizde de bir abs dizini oluşturmanız tavsiye edilir:

$ mkdir ~/abs

Paket Dosyası

makepkg, yazılımı derlemek için yazılımın kaynak kodlarını indirir. Daha sonra arşivi açar, kaynak kodları derler ve kurulabilir bir paket haline getirir. İşlem bittikten sonra paketismi-MİMARİ-pkg.tar.gz şeklinde bir dosyayı komutun verildiği dizinde oluşturur. Bu .tar.gz arşivinin içinde şu dosyalar bulunur:

  • Kurulacak dosyalar
  • .PKGINFO: pacman veritabanı için gerekli metaveri. (bağımlılık tablosu vs.)
  • .FILELIST: paket içerisinde bulunan dosyaların listesi
  • .INSTALL: paketin kurulum esnasında, güncelleme yaparken veya kaldırılması esnasında çalıştırılacak komutları barındırır. (Eğer PKGBUILD dosyasında tanımlanmışsa bu dosya mevcut olur, aksi takdirde yer almaz.

Dosyaları Hazırlamak

Öncelikle kaynak kodu indirip, arşivi bir yere açıp derlemeyi deneyin. Çoğu yazılım 3 aşamadan sonra derlenip kurulmaktadır. Bu 3 aşama şunlardır. Bu üç aşamayı PKGBUILD dosyasında da uygulayabilirsiniz:

./configure --prefix=/usr
make
make install

makepkg çalıştırıldığında, komutun çalıştırıldığı dizinde PKGBUILD dosyasını arar. Eğer bir PKGBUILD dosyası o dizinde var ise, makepkg otomatik olarak kaynak kodu indirir ve PKGBUILD dosyasında verilen komutlar çerçevesinde paket haline getirir. Komutlar Bash sözdizimine aykırı olmamalıdır. Başarılı bir derleme işleminden sonra paket dosyası, paket meta verisi vs. gibi bilgilerin yer aldığı 'paketadı.pkg.tar.gz arşivi oluşturulur. Oluşturulan bu paket pacman -U paketadı.pkg.tar.gz komutu ile kurulabilir.

Yeni bir paket oluşturmak için öncelikle çalışacağınız bir dizin oluşturun (mesela ~/abs/paketadı), daha sonra paket prototipi örneğini /usr/share/pacman/PKGBUILD.proto çalışma dizininize kopyalayın. Eğer isterseniz başka bir pakete ait PKGBUILD dosyasını da kopyalayabilirsiniz, böylece örnek üzerinden çalışarak PKGBUILD yapısını daha kolay da anlayabilirsiniz.

PKGBUILD Değişkenleri

Aşağıdaki değişkenler PKGBUILD dosyasında tanımlanabilir:

  • pkgname
    • Paketin adını ifade eder. Sadece alfa nümerik karakterlerden oluşabilir ve bütün karakterler küçük harfle yazılmalıdır. Eğer kaynak dosyasının adı ve sürümü xyz-2.5.5 ise pkgname adının xyz olması tavsiye edilir.
  • pkgver
    • Paketin sürümü. Bu değer yazılımın sürüm numarası ile aynı olmalıdır. Noktalama işaretleri, harf ve sayı barındırabilir FAKAT tire (-) barındıramaz. Eğer yazılımın sürüm numarası 0.99-10 gibi bir değer ise, 0.99_10 olarak yazılmalıdır.
  • pkgrel
    • Paketin Arch Linux'daki sürüm numarası. Eğer PKGBUILD'de değişiklik yapılmışsa, pkgrel değeri değiştirilmelidir. Paketin belirli sürümünün PKGBUILD'inde değişiklik yapılmışsa, bu sayı bir artırılmalıdır. Yeni bir sürüm çıkarıldığında ise (pkgver) bu değer tekrar 1 olmalıdır.
  • pkgdesc
    • Paket açıklaması. 80 karakterlik bir açıklama yeterlidir. Açıklamada paketin ismi tekrar yazılmamalıdır. Mesela "Nedit is a text editor for X11" yerine "A text editor for X11" yazmak daha mantıklıdır.
  • arch
    • Mimarinin belirtilmesi için gerekli diziyi (array) ifade eder. Şimdilik i686 ve/veya x86_64 kullanılmaktadır. Mesela arch=('i686' 'x86_64'). Ayrıca any değeri de kullanılabilir fakat resmi Arch depoları bu değer desteklememektedir.
  • url
    • Yazılımın web sitesini ifade eder.
  • license
    • Yazılımın yayınlandığı lisansı ifade eder. Lisanslar [core] deposundaki licenses paketi içerisinde gelir. (/usr/share/licenses/common dizinini inceleyebilirsiniz.) Eğer yazılım bu lisanslardan birini kullanıyorsa, license satırına o lisans adı yazılmalıdır. Mesela, license=('GPL'). Eğer paketlediğiniz yazılımın lisansı licenses paketinde bulunmuyorsa, şunlar yapılabilir:
      1. Lisans dosyaları /usr/share/licenses/paketadı/ altına konulabilir, mesela: /usr/share/licenses/foobar/LICENSE
      2. Eğer yazılım kaynak kod ile birlikte gelmiyorsa fakat web sitesinde yer alıyorsa, lisansı kopyalayıp pakete dahil edebilirsiniz.
      3. Lisans olarak custom yazabilirsiniz. Tercihen, custom yerine custom:Lisans adı da yazabilirsiniz. Birden fazla pakette yer alan lisanslar licenses paketine dahil olur.
    • BSD, MIT, ZLIB ve Python lisansları münhasır lisanslar olduklarından licenses paketine dahil olmazlar. Bu yüzden license satırına bunları yazmak yerine, yazılım içerisinden çıkan lisansı /usr/share/licenses/paketadı/LICENSE olarak koymanız tavsiye edilir. Ancak yine de license satırında lisans türünü belirtmeniz gereklidir. Mesela: license=('Python')
    • Yazılım birden çok lisansa sahip ise, bunları dizi içerisinde yazabilirsiniz, mesela: license=('GPL' 'custom:Lisans adı')
    • (L)GPL bir çok revizyona sahip olduğu için bunları şu şekilde tanımlayabilirsiniz:
      • (L)GPL - (L)GPLv2 ve sonraki sürümleri
      • (L)GPL2 - sadece (L)GPL2 ise
      • (L)GPL3 - (L)GPL3 ve sonraki sürümleri
  • groups
    • Paketin dahil olduğu grubu belirler. Mesela, kdebase paketini kurduğunuzda, kde grubundaki paketleri kurar.
  • depends
    • Yazılımın çalışması için gerekli bağımlılıkları belirlemenizi sağlar. Eğer bir yazılım başka bir yazılımın belirli bir sürümüne ihtiyaç duyuyorsa, >= operatörü mutlaka kullanılmalıdır. mesela, depends=('foobar>=1.8.0'). Bağımlılıkları yazarken, bağımlılık olarak yazdığınız paketlerin bağımlılıklarını yazmanıza gerek yoktur. Mesela, gtk2 paketi glib2 ve glibc paketlerine ihtiyaç duyar. Sadece glib2'yi bağımlılık olarak yazmanız yeterlidir. glibc zaten glib2 bağımlılığı olduğu için, depends'e tekrar glibc yazılmasına gerek yoktur.
  • makedepends
    • Yazılımın inşası için gerekli, ancak çalışması için gerekli olmayan bağımlılıkları ifade eder.
  • optdepends
    • Gerekli olmayan ancak yazılıma ekstra katkı sağlayan bağımlılıkları ifade eder. İsteğe bağlı bağımlılıklara kısa bir açıklama yazılması da gereklidir. Örnek olarak:
optdepends=('cups: printing support'
'sane: scanners support'
'libgphoto2: digital cameras support'
'alsa-lib: sound support'
'giflib: GIF images support'
'libjpeg: JPEG images support'
'libpng: PNG images support')
  • provides
    • Oluşturduğunuz bir paket, başka bir paketin vasfını üstleniyorsa, bu satırı kullanabilirsiniz. Mesela, qt kitaplığını kendinize göre yamalayıp başka bir isimle yayınladığınızda bu satırı kullanabilirsiniz. Mesela, paketinizin adı qtmod olsun, bu qtmod paketi qt 4.5 ile aynı işlevi görüyor olsun, bu durumda qtmod paketine provides=('qt=4.5') satırını koyduğunuzda, qt bağımlılığı gerektiren paketlere qtmod paketini qt olarak gösterebilirsiniz.
  • conflicts
    • Paketin çakıştığı paketleri ifade eder. Ayrıca depends'deki gibi sürüm numarası da belirtebilirsiniz.
  • replaces
    • Paketin değiştirdiği paketi ifade eder. Eğer paket eski, sizin yaptığınız paket bu paketi geçersiz kılıyorsa (obsolete) bu satırı kullanabilirsiniz.
  • backup
    • dosya.pacsave adıyla yedeği alınacak dosyaları ifade eder. Bu satır genellikle /etc içerisindeki yapılandırma dosyalarında kullanılır. Dosya yolları ilişkili şekilde kullanılmalıdır (relative) mesela etc/pacman.conf. Absolute path kullanılmamalıdır (/etc/pacman.conf).
  • options
    • Bu dizi makepkg aracının davranış biçimini değiştirmeye yarar. Seçenek ayarlamak için, seçenek adını diziye yazmanız yeterlidir. Öntanımlı davranışı değiştirmek için seçeneğin önüne ! koymanız yeterlidir. Seçenek olarak şunlar kullanılabilir:
      • strip - Kitaplık ve ikili dosyalardan sembolleri ayıklar.
      • docs - /doc dizinlerini saklar.
      • libtool - libtool (.la) dosyalarını paketlere ekler.
      • emptydirs - boş dizinleri de pakete alır.
      • zipman - man ve info sayfalarını gzip kullanarak sıkıştırır.
      • ccache - Derleme esnasında ccache kullanılmasını sağlar. ccache ile sorun oluşturan paketler için !ccache kullanılması tavsiye edilir.
      • distcc - Derleme esnasında distcc kullanılmasını sağlar. distcc ile sorun oluşturan paketler için !distcc kullanılması tavsiye edilir.
      • makeflags - Derleme esnasında kullanıcı tanımlı makeflags kullanılır. Özel makeflag değerleri ile sıkıntı yaratan paketler için !makeflags kullanılması tavsiye edilir.
      • force - Sistem güncellemesi sırasında, paket güncellemesi olmasa bile, paketi kurulmaya zorlar.
  • install
    • Paket içerisine alınacak .install betiğini ifade eder. pacman kurulum, güncelleme ve kaldırma esnasında betik çalıştırma yeteneğine sahiptir. Betik şu fonksiyonları uygulayabilir:
      • pre_install - Betik, paket arşivi açılmadan önce çalıştırılır.
      • post_install - Betik, paket arşivi açıldıktan sonra çalıştırılır.
      • pre_upgrade - Betik, paket arşivi açılmadan önce çalıştırılır.
      • post_upgrade - Betik, paket arşivi açıldıktan sonra çalıştırılır.
      • pre_remove - Betik, dosyalar silinmeden önce çalıştırılır.
      • post_remove - Betik, dosyalar silindikten sonra çalıştırılır.
    • Örnek bir .install prototipi /usr/share/pacman/proto.install altında bulunabilir.
  • source
    • İnşa için gerekli kaynak dosyalarını belirtmeye yarar. Yazılımın kaynak kodu için gerekli konumu genelde HTTP ve FTP protokolünü kullanarak indirmeniz için gereklidir. Daha önce tanımlanan pkgname ve pkgver değişkenleri burada kullanılabilir. Örneğin:
      • source=(http://example.com/$pkgname-$pkgver.tar.gz)
    • Eğer, kendi oluşturduğunuz yamalar ve ekstra dosyalar var ise ve bu dosyalar herhangi bir konumdan indirilebilecek durumda değil ise, bu dosyaları da source dizisinde tanımlamanız gerekmektedir.
  • noextract
    • source içerisinde yer alan arşivlerin açılmasını es geçmek için kullanılır. Bazı durumlarda bazı zip dosyaları bsdtar tarafından açılamaz, bunun yerine unzip kullanılması gerekebilir. Bu nedenle bu diziyi kullandığınızda makedepends satırına unzip'i eklemeniz gereklidir.
cd $srcdir/$pkgname-$pkgver
unzip [source].zip
  • md5sums
    • Kaynak dosyalara (source dizisi) md5 doğrulaması yapmak için kullanılır. makepkg -g kullanarak otomatik olarak md5sums oluşturabilirsiniz.

Bu sıralamada ilerleyerek, paket dosyası oluşturabilirsiniz. Önemli olan oluşturduğunuz paketin Bash sözdizimine uygun olmasıdır.

build() fonksiyonu

PKGBUILD değişkenlerinden sonra sırada paketi hazır hale getirmek için build() fonksiyonu kullanılmalıdır. Bu fonksiyon konsol komutlarını kullanarak paketi derlemeyi sağlar. Bu fonksiyonu kullanarak yapacağınız ilk iş kaynak dizine girmektir:

cd $srcdir/$pkgname-$pkgver

Daha sonra paketin derlenmesi için gereken komutları uygulayabilirsiniz. build() fonksiyonu her komutu fakeroot ortamında gerçekleştirir. Eğer kaynak kod içerisinde configure betiği var ise --prefix=/usr kullanın. Bir çok uygulama öntanımlı /usr/local kullanmasına rağmen Arch Linux'da /usr dizini kullanılır. Örnek PKGBUILD.proto dosyasında da görebileceğiniz üzere /usr kullanılmaktadır.:

./configure --prefix=/usr
make || return 1

Son aşamada ise derlenen dosyalar pkg/ dizinine konulur:

make DESTDIR=$pkgdir install || return 1

Bazı ekstra durumlarda, yazılım tek dizinden çalıştırılmayı bekler. Böyle durumlarda, bu yazılımları gereken dizine koyabilirsiniz. Mesela $pkgdir/opt. Genellikle yazılımlar pkg/ dizininin altında dizinleri kendileri oluşturur. Oluşturamadığı durumlarda makepkg hata verir. Böyle durumlarda mkdir -p kullanarak gereken dizinleri oluşturabilirsiniz.

build() içerisinde kullanabileceğiniz değişkenler şunlardır:

  • startdir - PKGBUILD'in olduğu dizini ifade eder.
  • srcdir - Kaynak dizini ifade eder.
  • pkgdir - Kurulum dizinini ifade eder. Derlenen kaynak dosyaları burada yer alır. Yer almıyorsa buraya dizin hiyerarşisine uyarak konulmalıdır.

Ek Rehber

Yukarıda anlatılanlardan yola çıkarak paketinizde şu şekilde düzenlemelere gidebilirsiniz.

  • Dizi içerisindeki tüm öğeler boşluk ile ayrılmalıdır.
  • Eğer mümkünse boş satırları silin. (boş değişkenler de dahil)
  • Mümkün oldukça kritik derleme işlemleri için || return 1 kullanın:
make || return 1
make DESTDIR=$pkgdir install || return 1
  • PKGBUILD dosyasında çok ihtiyaç olmadıkça kendi oluşturduğunuz değişkenler kullanmayın. Bu değişkenlerin makepkg değişkenleri ile çakışma ihtimali doğabilir. Eğer gerçekten değişken tanımlamanız gerekiyorsa değişken adının başına alt çizgi (_) koyun. Mesela:
_customvariable=
  • /usr/libexec kullanmamaya özen gösterin. Onun yerine /usr/lib/paketadı kullanmaya özen gösterin.
  • Paket meta verisindeki paket sorumlusu (packager) değişkeni /etc/makepkg.conf'dan tanımlanabilir.
  • Yapılandırma dosyaları /etc dizini altına konmalıdır. Eğer birden fazla yapılandırma dosyası var ise, /etc altında bir alt dizin oluşturup bütün yapılandırma dosyalarını oraya koyabilirsiniz. Mesela, apache /etc/httpd dizinini kullanır.
  • Paket dosyaları genel dizin rehberine uygun olmalıdır.
    • /etc/ - Sistem yapılandırma dosyaları
    • /usr/bin - Çalıştırılabilir uygulamalar
    • /usr/sbin - Çalıştırılabilir sistem uygulamaları
    • /usr/lib - Kitaplıklar
    • /usr/include - Header dosyaları
    • /usr/lib/pkgname - Modüller, eklentiler, vs.
    • /usr/share/man - Man sayfaları
    • /usr/share/pkgname - Uygulama verisi
    • /usr/share/licenses/pkgname - Paket lisansı
    • /etc/pkgname - Yapılandırma dosyaları
  • Paketler şu dizinleri kesinlikle içermemelidir.
    • /dev
    • /home
    • /media
    • /mnt
    • /proc
    • /root
    • /selinux
    • /sys
    • /tmp
    • /var/tmp

Paketi Test Etmek

PKGBUILD dosyanızı başarıyla tamamladıktan sonra, makepkg komutunu kullanarak paket haline getirebilirsiniz. makepkg komutunu verdikten sonra, eğer PKGBUILD hatalı ise uyarı alırsınız ve işlem sonlanır. Paket başarıyla oluşturulursa, makepkg komutunu verdiğiniz dizinde paketadı..pkg.tar.gz isimli bir dosya oluşur. Bu paketi

pacman -U paketadı..pkg.tar.gz 

komutunu vererek kurabilirsiniz. Daha sonra paket bilgisini test etmek ve içeriğini görmek için sırasıyla şu komutları verebilirsiniz:

pacman -Qi paketadı
pacman -Ql paketadı 

Eğer her şey istediğiniz gibi ise paketinizi yayınlayabilirsiniz. Yine de, depends yani bağımlılıkları kontrol etmenizde fayda vardır.

ldd ve namcap

Bağımlılıklar paketleme sırasında en sık karşılaşılan sorunun başında gelir. Bağımlılık kontrolü gerçekleştirmek için iki tane mükemmel araç bulunur. Bunlar ldd ve namcap'dir. ldd uygulama için gerekli paylaşımlı kütüphaneleri gösterir:

$ ldd gcc
linux-gate.so.1 =>  (0xb7f33000)
libc.so.6 => /lib/libc.so.6 (0xb7de0000)
/lib/ld-linux.so.2 (0xb7f34000)

Diğer araç ise Arch Linux'a özgü namcap aracıdır. Hem PKGBUILD hem de pkg.tar.gz'yi kontrol edebilir. Hatalı izin var ise uyarıda bulunabilir, eksik bağımlılıkları kontrol edebilir ve gereksiz bağımlılıkları da ayrıca belirtir. namcap'i kurman için şu komutu verin:

$ pacman -S namcap

namcap'i şu şekillerde kullanabilirsiniz:

$ namcap PKGBUILD

veya

$ namcap pkgname.tar.gz

namcap bağımlılıkları bulmasına rağmen, sonuç her zaman doğru olmayabilir. Bu yüzden gerekli bağımlılıkları paketlediğiniz yazılımın belgelerinden öğrenmenizde fayda vardır.

AUR'a Paket Göndermek

AUR'a paket göndermek için şu yönergeleri takip edebilirsiniz:

  1. Öncelikle AUR'a kayıt olun ve bir AUR hesabı edinin.
  2. core, extra ve community depolarını paket göndermeden önce kontrol edin. Eğer göndermek istediğiniz paket bu depolardan birinde zaten yer alıyorsa paketinizi göndermeyin.
  3. AUR'a paket göndermek için, eğer sadece tek bir PKGBUILD dosyanız var ise doğrudan gönderebilirsiniz. Eğer birden fazla dosyanız var ise, makepkg --source ile inşa dosyalarını arşive alabilirsiniz. Sonra bu arşivi AUR'a yükleyebilirsiniz.
  4. AUR'daki Gönder bağlantısına tıklayarak uygun bir kategori seçip yükleyebilirsiniz.

Özet

  1. Paketlemek istediğiniz yazılımın kaynak kodunu indirin.
  2. Yazılımı derlemeyi deneyin.
  3. /usr/share/pacman/PKGBUILD.proto dosyasını, PKGBUILD adı ie çalışmak istediğiniz dizine koyun.
  4. PKGBUILD dosyasını kendi ihtiyaçlarınıza göre düzenleyin.
  5. makepkg çalıştırarak yazılımı paketleyin.

Ayrıca bkz

Harici Bağlantılar

Kişisel araçlar
GOOGLE
Diğer dillerde