From Mageia wiki
Jump to: navigation, search


Synopsis:
Bu belge, Mageia Linux için uygulama paketlerinin hazırlanmasında kısa ve özet bir rehber olması amacıyla hazırlanmıştır. Burada; RPM paketlerinin oluşturulması doğaldır ki, Mageia Linux' a göre anlatılmıştır. Ancak, diğer RPM temelli dağıtımlar için paket hazırlamak isteyenlere yardımcı olabilecek bilgiler vermektedir.

RPM paketlerinin oluşturulması, dikkat isteyen ve belirli kurallara bağlı olan bir işlemdir. Çeşitli uygulamaların ama özellikle kütüphanelerin sistemde yer alış biçimi ve derlenme özellikleri çeşitli kurallarla sıkı sıkıya bağlıdır. Bu kuralların varlığı, paketlerin bir standarda tabi olmasını, dolayısıyla sistemin kararlılığını bozmayacak yapıda olmalarını sağlamak içindir. RPM paketlerini oluşturacak olanların bu kurallara uymaları çok önemlidir.

Bu makalede paketleme konusunda rehberlik etmek amacıyla özet olarak yazılmıştır. Bu nedenle paketleme kuralları ve diğer önemli konular bu makaleye alınmamıştır. Bu konular için Paketleme sayfasındaki bağlantıları takip etmeniz yararlı olacaktır.

Warning!
RPM paketlerini kök kullanıcı olarak derlemek oldukça tehlikeli bir iştir. Sisteminiz çökebilir. Paketleme işlemi mutlaka normal kullanıcı olarak gerçekleştirilmelidir!

Ön Söz

Bu makale hazırlanırken; okuyucunun "linux kullanımını bilen", temel komutlarına, linux dizin yapısına aşina olan ve en azından yazılım kurmak için rpm kullanmış bir kişi olduğu varsayılmıştır.

Bu makalede Mageia Linux için gerek src.rpm paketlerinden gerekse uygulamanın kendi kaynak kodlarından RPM paketi oluşturma işlemleri anlatılmaktadır.

RPM temelde üç şeyi ifade eder:

  • paketleri kurmak veya kaldırmak için tasarlanmış bir uygulama;
  • rpm uygulaması tarafından oluşturulan paketlerin (kaynak veya ikili) biçimi;
  • Uygulamanın nasıl kurulacağını veya kaldırılacağını açıklayan bir dosya ile beraber uygulamanın kaynak kodu veya ikili çalıştırılabilir dosya içeren paket.

Kullanıcı açısından rpm uygulaması, rpm paketleri üzerinde çalışan bir uygulamadır. Pek çok işlevi yanında temel işlevleri:

  • bağımlılıkları denetleyerek paketi kurmak veya kaldırmak,
  • bir paketi kurarken, uygulamanın kullanıma hazır hale getirilmesi için gerekli işlemleri yapmak,
  • bir pakete ait olup da kazara silinmiş dosyaları yeniden yüklemek,
  • bir paketin önceden kurulmuş olup olmadığını denetlemek,
  • belli bir dosya ile ilgili paketi bulmak v.b.


Geliştiriciler açısından ise, rpm uygulaması verilen işletim sistemi platformunda uygulamanın kurulabilmesi için gerekli tüm dosya ve bilgileri tek bir rpm paketi içine yerleştiren bir paketleyicidir.

Kaynak kodlarını içeren ( .src.rpm ) ve ikili ( .<işlemci_mimarisi>.rpm ) paketleri iyi anlamak gereklidir.

İlki, adından da tahmin edebileceğiniz gibi, özgün yazılım kaynak kodlarını ve uygulamanın yapılandırılmasını, derlenmesini ve kurulmasını sağlayan her türlü ek dosyayı ve yamaları (varsa) içerir. Ayrıca, rpm paketinin oluşturulması için zorunlu olan; gerekli yamaların uygulanmasını, kaynak kodların derlenmesi için gerekli işlemleri, hangi yamaların yapılacağını, dosyaların kurulumda hangi dizine yerleşeceğini ve diğer talimatları barındıran .spec dosyasını barındırır.

İkincisi ise derlenmiş ve kuruluma hazır ikili dosyaları ve belgeler, simgeler, yapılandırma dosyaları v.b. dosyaları içerir. Ayrıca, dosyaların doğru dizinlere yerleştirilmesini sağlar ve uygulamanın düzgün biçimde çalıştırılabilmesi için gerekli işlemleri yapar.


Temel Bilgi

Asıl olarak RPM Red Hat Linux için geliştirilmişse de diğer dağıtımlarda da (Mageia, Suse, gibi) ; kullanılmaktadır.

Özgün RPM kaynak kodlarına buradan ulaşabilirsiniz.

Warning!
Şu anda iki farklı geliştirici grubu tarafından geliştirilmesi süren iki farklı RPM uygulaması vardır. İlki Red Hat bünyesinde geliştirilen RPM diğeri ise Red Hat' in eski çalışanlarından olup şirketten ayrılan eski bir rpm geliştiricisi olan Jeff Johnson ve ekibince geliştirilen RPM5 projeleridir. Mageia Linux diğer pek çok dağıtım gibi (OpenSuse, Fedora v.b.) Red Hat' in geliştirdiği rpm uygulamasını kullanmaktadır.

Mageia Linux için oluşturacağınız rpm paketleri diğer dağıtımlarla uyumlu olmayacaktır. Çünkü hem Mageia Linux hem de diğer dağıtımların kendine özgü yapılandırmaları vardır.

Kavramlar

  • Makro (rpm macro) : RPM .spec dosyalarında kullanılan temel değişkenlerdir. Bunlar bir dizini (%{_datadir} : /usr/share); bir komutu (%{__rm} : /usr/bin/rm) veya bir ufak betiği (%{configure}) ifade ederler. Böylece; .spec dosyası RPM tarafından işlenirken, makronun ifade ettiği değer yerinde kullanılır. Makrolar, Mageia Linux işletim sisteminde /etc/rpm/macros.d dizini içinde yer alan dosyalarda tanımlanmışlardır.

Makrolar, rpm paketlerinde belirli bir standartı sağlamak için kullanılırlar. Böylece farklı bilgisayarlara kurulan rpm paketleri kendilerinden beklenen amacı doğru biçimde yerine getirirler. Ayrıca, makrolar vasıtasıyla, pek çok işlem hızlı ve basit biçimde yerine getirilir.


Note:
%setup
makrosu .spec dosyalarının olmazsa olmaz makrosudur. Bu makro, makalenin devamında anlatılacağı üzere, varsa eski derleme dizinini siler, yeni bir derleme dizini oluşturur, kaynak arşivi derleme dizinine açar ve kabuk ortamında derleme dizinine giriş yapar. .spec dosyasında sadece
%setup

satırı yazmamız bu işlemler için yeterlidir. Makro kullanmasaydık, örneğin abc-1.2 uygulamasını paketlemek için .spec dosyamıza şunları yazmak zorunda kalacaktık:

cd ~rpm/BUILD
rm -rf abc-1.2
gzip -dc ~rpm/SOURCES/abc-1.2.tar.gz | tar -xvvf -
if [ $? -ne 0 ]; then
  exit $?
fi
cd abc-1.2
cd ~rpm/BUILD/abc-1.2
chown -R root.root .
chmod -R a+rX,g-w,o-w .
  • Kaynak arşiv (source archive): Paketlenecek uygulamanın kaynak kodlarının yer aldığı dosyaları barındıran ve genellikle tar.bz2 veya tar.gz biçimindeki sıkıştırılmış dosyalardır.
  • Yama (patch) :Bir uygulamanın belirli özelliklerini değiştirmek veya bir hatayı düzeltmek için patch veya diff araçları ile oluşturulan fark dosyalarıdır. Özgün uygulama kaynak kodları ile değiştirilmiş kaynak kodları arasındaki farkları .diff veya .patch uzantılı dosyalara yazılır. Bu yamalar paketlenirken aşağıda anlatıldığı biçimde uygulanarak istenen sonuç elde edilmiş olur.

Öncelikli İşlemler

Gerekli paketleri sisteminize kurun

Şu paketler sisteminizde kurulu olmalıdır:

  • rpm : Mageia Linux için yamalanmış Red Hat paket yönetim sistemi
  • rpm-build: Paketleri derlemek için gerekli betikleri bulunduran paketleme uygulaması
  • spec-helper: Paket boyutunu çeşitli işlemlerle ufaltan bir uygulama
  • libtool: Paylaşılmış kütüphaneler oluşturmak için gerekli bir uygulama
  • rpmlint: Oluşturulan rpm paketlerini ve src.rpm paketlerini hatalara karşı denetleyen bir araç.

Gerekli dizinleri oluşturun

Paketlerin derlenebilmesi için rpm, bazı dizinlerin ev dizininizde bulunmasına gerek duyar. Bu dizinleri aşağıdaki komutla oluşturabilirsiniz:

mkdir -p ~/rpm/{BUILD,BUILDROOT,RPMS/$ARCH,RPMS/noarch,SOURCES,SRPMS,SPECS,tmp}

Bu komuttaki $ARCH ibaresini paketin kurulacağı işlemci mimarisine göre değiştirin. Temelde, bu ibare i586/x86_64/sparc/alpha/ppc mimarilerinden biridir. Birden fazla mimaride paket oluşturacaksanız her mimari için ayrı bir RPM/$ARCH dizini oluşturmalısınız.

Gerekli dizin yapısının açıklaması:

  • ~/rpm/BUILD: Kaynak dosyanın açılarak derleneceği dizin
  • ~/rpm/BUILDROOT: Bir kurulumun taklit edileceği dizin
  • ~/rpm/RPMS: Oluşturulan paketlerin yer alacağı alt dizinleri kapsayan dizin.
  • ~/rpm/RPMS/i586: i586 işlemci mimarisine oluşturulan paketlerin yer alacağı dizin.
  • ~/rpm/RPMS/x86_64: AMD64 işlemci mimarisine oluşturulan paketlerin yer alacağı dizin.
  • ~/rpm/RPMS/noarch: İşlemci mimarisinden bağımsız paketlerin yer alacağı dizin.
  • ~/rpm/SOURCES: Kaynak dosyaların (abc.tar.bz2 dosyası,.patch uzantılı yamalar v.b.) bulunduğu dizin.
  • ~/rpm/SPECS: Paket oluşturma işlmei talimatlarını içeren .spec betiğinin bulunduğu dizin.
  • ~/rpm/SRPMS: Paket oluşturma işlemi bittiğinde kaynak rpm (.src.rpm) paketlerinin yer alacağı dizin.
  • ~/rpm/tmp: Paketler derlenirken rpm tarafından oluşturulan geçici dosyalar. Bu dosyalar genellikle .spec dosyalarından ayrıştırılan birer kabuk betiğidir ve hataları görebilmeniz için oldukça yararlıdır.
Not Edin!:
~/rpm/RPMS dizini altındaki mimari dizinlerinin var olması zorunludur. Aksi halde paket derleme işlemi hata verir.

.rpmmacros dosyasını oluşturun

.rpmmacros yapılandırma dosyası temel yapılandırma dosyası olup ev dizini içerisinde elle oluşturulmalıdır:

Dosya: .rpmmacros
Dosya Konumu: ~/.rpmmacros

%_topdir                %(echo $HOME)/rpm
%_tmppath               %(echo $HOME)/rpm/tmp

# Paketlerinizin, kendiliğinden GPG ile imzalanmasını istiyorsanız aşağıdaki satırları kullanın.
# 'Mageia' ibaresini kendi GPG imza adınızla değiştirin.
# Kendiliğinden imzalanmasını istemiyorsanız daha sonra rpm --resign komutu ile elle
#imzalayabilirsiniz.
# Paketler, rpm veritabanına kayıtlı bir imza ile imzalanmamışlarsa veya imzasız olduğunda
#kurulum sırasında rpm veya paket yöneticiniz uyarı verebilir.
# 
%_signature             gpg
%_gpg_name              Mageia
%_gpg_path              ~/.gnupg

# İsminizi ve e-posta adresinizi aşağıdaki %packager bölümüne yazın. Ayrıca %vendor ile
#belirtilen sağlayıcı kısmındaki "Mageia" ibaresini değiştirebilirsiniz.
%packager               Aınız Soyadınız <e@posta.adresiniz>
%distribution           Mageia Linux
%vendor                 Mageia

# Kendi paket ekinizi kullanmak ve paketlerdeki mdv ibaresini kullanmak istemiyorsanız;
# aşağıdaki satırın önündeki # işaretini kaldırarak "foo" ibaresini değiştirin.
# Bu durumda wine-1.1.43-1mdv2008.0.i586.rpm biçimindeki paket ismi 
# wine-1.1.43-1foo2008.0.i586.rpm biçiminde olur.
#%distsuffix             foo
Warning!
%optflags parametresini bu dosyada belirtmeyin; çünkü sistem geneli bir değer /usr/lib/rpm/manbo/rpmrc dosyasında yer almaktadır.

Paket Oluşturma

Kaynak RPM paketinden oluşturma

Bu seçenek, bir yazılımın dağıtım için önceden paketlenmiş olması halinde söz konusudur.

Not Edin!:
Peki neden zaten paketlenmiş olan bir yazılımı yeniden paketleyesiniz ki?
  • Yazılımın yeni bir sürümü çıkmıştır; yeni sürüm fazladan bir çaba gerektirmeden o yazılımın src.rpm dosyasından oluşturulabilmektedir ve bu yeni sürüm Mageia veri kaynaklarında yer almamaktadır.
Yapmanız gereken, belki de, SPEC Dosyası üzerinde sadece sürüm numarasını değiştirerek yeniden paketlemektir.
  • Yazılım, kullanmak istediğiniz özellikler sunmaktadır; ancak belki genel sistem kararlılığını engelleme ihtimali belki de diğer ülkelerin yasalarına göre patent ihlali oluşturduğundan kullanmak istediğiniz bazı özellikler pakette sunulmamıştır.
Yapmanız gereken, belki de, bu özellikleri sağlayacak biçimde SPEC Dosyasını yeniden düzenlemek ve yeniden paketlemektir.
  • Yazılım için hiç Mageia rpm paketi yoktur ama bir başka dağıtımın src.rpm dosyası vardır.
Yapmanız gereken, belki de, Mageia ile uyumluluğu sağlayacak biçimde SPEC Dosyasını yeniden düzenlemek ve yeniden paketlemektir.

Mageia Linux' un kaynak RPM paketleri, Mageia Linux için güncelleme veri kaynağı olarak kullandığınız herhangi bir yansıdaki SRPMS dizini altında bulunur.

Kaynak rpm paketini bilgisayarınıza indirdiğinizde şu komutla dosyanın daha önceden oluşturduğunuz rpm dizinine kurulmasını sağlayın:

$ rpm -ivh paket_adı.src.rpm

{{note|

$ rpm -ivh firefox3.6-ext-mozzemberek-0.1.5-3mvt2010.0.src.rpm
$ cd ~/rpm
~/rpm]$ ls -R *
SRPMS: SPECS: firefox-ext-mozzemberek.spec SOURCES: mozzemberek-0.1.5.tar.gz install_dir.patch FF-3.6-compability.patch RPMS: noarch/ i586/ x86_64/ BUILD:


Gördüğümüz üzere kaynak RPM paketimizin içindekiler önceden oluşturmuş olduğumuz rpm dizinindeki alt dizinlere açıldı. Bu alt dizinlere baktığımızda; yazılımın kaynak arşivinin (mozzemberek-0.1.5.tar.gz) ve pakette kullanılan yamaların (install_dir.patch ile FF-3.6-compability.patch), SOURCES alt dizininde; firefox-ext-mozzemberek.spec doyasının ise SPECS alt dizininde yer aldığını görüyoruz. Böylece, .spec dosyasını inceleyerek üzerinde değişiklik yapabileceğimiz gibi kaynak kodlarını inceleyerek yamalar hazırlayabiliriz.

Gerek spec dosyası gerekse kaynak kodlarla işimiz bittiğinde paketi oluşturmak için aşağıdaki komutu veririz:

$ rpmbuild -ba firefox-ext-mozzemberek.spec
Not Edin!:
RPM paketi oluşturmak ile ilgili eski yazılarda, yukarıdaki komutun 'rpm -ba olarak kullanıldığını görebilirsiniz. Rpm uygulamasının eski sürümlerinde olan bu özellik; yeni sürümlerde bulunmamaktadır. Paket oluşturmak için artık rpmbuild komutu kullanılmaktadır.
$ cd ~/rpm/SPECS
~/rpm/SPECS rpmbuild -ba firefox-ext-mozzemberek.spec
~/rpm/SPECS ls -l ~/rpm/RPMS/x86_64
-rw-r--r-- 1 kullanıcı kullanıcı 1292035 2009-11-18 14:21 firefox3.6-ext-mozzemberek-0.1.5-3mvt2010.0.x86_64.rpm
~/rpm/SPECS ls -l ~/rpm/SRPMS
-rw-r--r-- 1 kullanıcı kullanıcı 1292035 2009-11-18 14:21 firefox3.6-ext-mozzemberek-0.1.5-3mvt2010.0.src.rpm

Paketin oluşturulması tamamlandıktan sonra yukarıdaki örnekte de görebileceğiniz gibi ~/rpm/RPMS/x86_64 dizini içerisinde paketimiz oluşturuldu. Ayrıca, paketimizin kaynak paket dosyası da ~/rpm/SRPMS dizininde oluşturuldu.

Not Edin!:
Bir rpm paketinin oluşturulması zaman alıcı bir işlemdir. Çünkü kaynak kodlar açılacak, varsa yamalar uygulanacak, kodlar derlenecek ve paket haline getirilecektir. Özellikle, çekirdek (kernel) paketlerinin oluşturulması, makinenizin işlemci ve bellek özelliklerine göre birkaç saat alabilir.

Bir kaynak RPM paketi üzerinde hiçbir değişiklik yapmadan yeniden derleme yapmak isterseniz aşağıdaki komutu kullanabilirsiniz; bu durumda yeni bir src.rpm paketi oluşturulmaz:

$ rpmbuild --rebuild firefox3.6-ext-mozzemberek-0.1.5-3mvt2010.0.src.rpm
Not Edin!:
Mageia Linux paketlerinin .spec> ve kaynak kod dosyalarını svn deposunda da bulabilirsiniz.

Özgün kaynak arşivinden (tar arşivi) oluşturma

Sourceforge veya [KDE-Look] sitalerinden birinde işinize yarayacak bir uygulama bulduğunuzu ve bu uygulamanın Mageia Linux rpm paketlerinin bulunmadığını düşünelim. Bu uygulamayı paketleyerek, hem sisteminizde düzgün bir kurulum yapma hem de bu paketi başkalarıyla paylaşarak onların da sistemlerine düzgün ve zahmetsiz kurulum yapma imkanı elde etmelerini sağlarsınız.

Uygulamanın tar ile arşivlenmiş kaynak arşivini indirin ve SOURCES dizinine koyun.


Ön denetlemeler

Lisans
GPL lisansından başka bir çok farklı lisans ile lisanslanımış uygulamalar bugün internetten edinilebilmektedir. Bu açıdan, uygulamanın lisansının üzerinde özgürce işlem yapabileceğiniz (mesela kaynak kodu yamalayabileceğiniz) ve özgürce başkalarına dağıtabileceğiniz bir lisans türü olduğundan emin olun. Mageia Linux için kabul edilebilir lisans türleri için ingilizce olan Mageia Lisans Politikası sayfasına bakın.
Tar Arşivi
RPM paketlerinde, başka kullanıcıların da paket üzerinde çalışabilmelerini sağlamak amacıyla kaynak arşivleri özgün biçimde tutulur. Üzerlerinde herhangi bir değişiklik yamalar ile yapılır. Mümkünse kaynak arşivin bziplenmiş tar arşivi kullanılır:.tar.bz2. Uygulamanın sitesinden bu biçimdeki kaynak arşivinin indirilmesi önerilir. Yamalar (diff aracılığı ile oluşturulan .patch veya .diff uzantılı metin dosyaları) veya herhangi bir metin biçimindeki (yapılandırma dosyaları, betikler v.b.) olduğu gibi; yani sıkıştırılmadan kullanılır.

SPEC Dosyası

İşte geldik! Bu bölüm, makalemizin en önemli bölümüdür. SPEC dosyası, RPM için gerekli tüm bilgi ve komutları içerir. Spec dosyası en iyi anlaşılması gereken dosyadır.Bu nedenle başlı başına bir yazı konusudur. Lütfen RPM SPEC Dosyası makalesini inceleyin.

Derleme

Spec dosyanız hazır olduğunda, derin bir nefes alın ve şu komutu verin:

$ rpmbuild -ba paket_adı.spec

Bu komuta --clean anahtarını da ekleyerek ~rpm/BUILD dizini içindeki dosyaların, paket oluşturulduktan sonra kendiliğinden silinmesini sağlayabilirsiniz.

Paket oluşturma işlemi sonunda iki sonuç elde edersiniz:

  • 0.01% ihtimalle: + exit 0 çıktısını komut satırında görürsünüz.

Tebrikler, paketi oluşturdunuz!

  • 99.99% ihtimalle: başka çıktıları komut satırında görürsünüz ve mutlaka bir hata var demektir.

Siz ikinci ihtimalle karşılaşanlardansanız, üzülmeyin. Bu sizin bir uzaylı olmadığınıza kanıttır! Çok daha fazla belge okuyarak, SPEC dosyasını yeniden gözden geçirerek, bilenlere sorarak, başka paketlerin spec dosylarını inceleyerek öğrenmenin tam da zamanı gelmiş demektir.!

Bir RPM Paketini Denetlemek

Bu konu için ayrıca Mageia Hata Takip sistemini de incelemeniz önerilir.


Temel Denetlemeler

Gerçekleştirilecek ilk adımlar şunlardır:

  • RPM paketleri doğru dizinler içinde oluşturulmuş mu? (~/rpm/SRPMS/ ve ~/rpm/RPMS/{i586,x86_64,noarch}/ dizinleri içinde mi?)
  • Aşağıdaki komut ile elde edilen bilgiler doğru mu?
$ rpm -qlivp --changelog paket_adı.(src.)rpm


Paketi Hatalar Karşı Denetlemek

Bir sonraki adımda rpmlint aracını kullanarak paketimizi hatalara karşı ve rpm kurallarına uygunluğu açısından denetlemeliyiz. rpmlint aracını şu şekilde kullanırız:

$ rpmlint paket_adı.<archtype>.rpm

Rpmlint bize hataları ve rpm paketleme kurallarına aykırı durumları bildirecektir. Daha ayrıntılı bilgi için rpmlint' i -i anahtarı ile kullanın. Hem oluşturduğumuz rpm hem de src.rpm paketlerini bu şekilde denetleyin.

Kurulum Denetimi

Tercihen, paketi oluşturduğumuz bilgisayar başka; bir bilgisayarda paketinizi kurun veya kurulu olan resmi paket yerine yükseltme yapın. Bu aşamada şu hususları denetleyin:

  • Beklenilen tüm dosyalar, beklenilen doğru dizinlerde ve beklenilen doğru sahiplik/izinlerle oluşturuldu mu?
  • Kurulumda öngörülen değişiklikler sisteme doğru olarak uygulandı mı?
  • Tüm ikili dosalar çalıştırılabilir durumda mı? Paket ile gelen belgeler erişilebilir durumda mı?

Kurulum Öncesi (Pre-installation) ve Kurulum Sonrası (Post-installation) Betikleri

Temeller

RPM paket biçim, aslında basit bir paket yönetiminden (sisteme paket içeriğini kopyalamaktan) çok daha fazlasını sunar.

Bir paketleyiciye büyük bir yetenk de sunar: kurulum öncesi ve kurulm sonrası betikleri. Bu betikler, paketin kurulumu sonrasında ve paketin kaldırılması sonrasında işletilecek bir kaç satır kod hazırlama imkanı sunarlar.

Bu betikler tüm sh kabuğu kodlarını çalıştırabilirler.

Dört temel betik vardır:

Not Edin!:
Bu betiklerin hiç biri kullanıcı ile etkileşimli olmamalı; yani kullanıcıdan bir girdi beklememelidir.
  • %pre - Bu betik paket sisteme kurulmadan hemen önce çalıştırılır.
  • %post - Bu betik paketin sisteme kurulmasından hemen sonra çalıştırılır.
  • %preun - Bu betik paketin sistemden kaldırılmasından hemen önce çalıştırılır.
  • %postun - Bu betik paketin sistemden kaldırılmasından hemen sonra çalıştırılır.

Bu betikler ile sayısız işlemin yapılması sağlanabilir. Unutulmaması gereken, paketin kurulacağı sisteme zarar vermeyecek biçimde yazılmış olmalarıdır. Bu betikler örneğin:

  • Paketle kurulan uygulamanın belirli zamanlarda kendiliğinden çalışabilmesi için cron görevi tanımlamakta,
  • chkconfig çalıştırılması suretiyle, paketin içerdiği artsürecin (daemon) her sistem açılışında çalıştırılması,
  • ...

gibi işlemler için kullanılır.

Yükseltme işlemini yapmak

RPM paket yönetim sisteminde bir paket kolayca yükseltilebilir/güncellenebilir. Ancak bu işlem, basit bir paket kurma/kaldırmadan daha karmaşık bir işlemdir. Buradaki temel sorun, güncelleme yapan paketin %postun betiği eski sürümlü paketin %post betiğinden sonra çalışması ve sonucunda tüm %post betik işlemlerinin kaybolmasıdır.

Bir eylemin sadece ilk kurulumda gerçekleşmesinden ve yükseltme/güncellemelerde gerçekleştirilmemesinden emin olmak, genellikle yararlıdır. Benzer şekilde, bir eylemin gerçekleşmesinin sadece sistemden kaldırma sırasında gerçekleştirilmesi ancak yükseltmede yapılmaması da önemlidir. Bu durum, rpm işleyişinde %pre, %preun, %post ve %postun betikelri ile öntanımlı olarak sağlanmaktadır.

Yeni bir rpm paketi kurulduğunda 1 değeri yeni rpm paketinin %pre betiğine ve 1 değeri de yeni rpm paketinin %post betiğine geçirilir. Bir paket yükseltildiğinde 2 değeri yeni rpm paketinin %pre betiğine ve 2 değeri de yeni rpm paketinin %post betiğine geçirilirken; 1 değeri eski rpm paketinin %preun betiğine ve 1 değeri de eski rpm paketinin %postun betiğine geçirilir.

Tablo A-1. Pre ve Post betiklerine geçirilen parametre değerleri
Parametre \ Betik %pre %post %preun %postun
İlk kez kurulum için 1 1 N/C N/C
Bir yükseltme/güncelleme için 2 2 1 1
Bir sistemden kaldırma için N/C N/C 0 0

Bu sayede, paketleyicinin değişik işlemlerde (yükseltme veya kaldırma) betiklerini farklı biçimde çalıştırması sağlanmış olur.

  • Kurulum betiklerinde ( %post, %pre ), $1 "1" değerine eşitse bu bir ilk kez kurulumdur; bir yükseltme değildir.
  • Kaldırma betiklerinde ( %postun, %preun ) $1 "0" değerine eşitse bu bir kaldırma işlemidir; başka bir değere eşitse bu ya bir yükseltme ya da aynı paketin yeniden kuruluma zorlanması işlemidir.

Bu durumun denetlenmesi için şu "if" sh kabuğu işleci kullanılır:

%postun
if [ $1 = 0 ]; then
    // kaldırmalara özgü işlemleri gerçekleştir.
fi
if [ $1 = 1 ]; then
    // yükseltmelere özgü işlemleri gerçekleştir.
fi

RPM Dosya Tetikleyicileri

"%post -p /sbin/ldconfig" veya "%update_menus" gibi tekrarlanan işlemler için RPM Dosya Tetikleyicileri kullanılarak daha temiz bir spec dosyası oluşturulur.

Daha fazla makro

  • Info sayfalarını sisteme yerleştirmek:
%post
%__install_info %{name}.info

%preun
%__install_info %{name}.info
  • Menüleri düzenlemek:
%post
%{update_menus}

%postun
%{clean_menus}
  • Yerelleştirme dosyalarını temiz bir biçimde sistemde oluşturmak:
  • %install bölümünde aşağıdaki makro eklenir:
%find_lang %{name}
  • %files bölümünde aşağıdaki makro kullanılır:
%files -f %{name}.lang


  • Sistem önyükleme betikleri (Initscript) makroları. Kendine ait sistem önyükleme betiği (/etc/init.d dizinindeki betikler) sunan paketler kurulurken chkconfig --add .. benzeri bir komut ile sistem önyükleme komutlarına yerleştirilmesi gerekir. Oysa ki yükseltmelerde bu tarz bir komut yürütülmez ve üstelik önceki var olan betik kaldırılmadan önce durdurulmalı ve yeni betik çalıştırılmalıdır. Bu tarz işlemlerin yükünden önyükleme makroları ile kurtuluruz:
%post
%_post_service <Sistem_önyükleme_betiği-adı>

%preun
%_preun_service <Sistem_önyükleme_betiği-adı>
  • Hayalet dosyaları işlemek. Çoğunlukla oyunlarda olmak üzere, paketler bazen gerçekte olmayan dosyalara gereksinim duyarlar. Bu aşamada imdadımıza hayalet dosyalar yetişir:
%install

(...)

mkdir -p $RPM_BUILD_ROOT/var/lib/games
touch $RPM_BUILD_ROOT/var/lib/games/methanescores

%post
%create_ghostfile /var/lib/games/powermanga.hi root games 664

(...)

%files
%attr(664, root, games) %ghost /var/lib/games/powermanga.hi

%create_ghostfile makrosunun açılımı şu biçimdedir:

if [ ! -f /var/lib/games/powermanga.hi ]; then 
  touch /var/lib/games/powermanga.hi
  chown root.games /var/lib/games/powermanga.hi
  chmod 664 /var/lib/games/powermanga.hi
fi 
  • .desktop / MIME türü haritaları ilişkilendirmesi : XDG menü sistemi bir uygulama ve bir MIME türü arasında .desktop dosyaları ile ilişkilendirme yapmayı olanaklı kılmaktadır. Sisteme bu tip bir .desktop dosyası kuruluyorsa/kaldırılıyorsa, update-desktop-database aracı mutlaka çalıştırılmalıdır:
%post
%update_desktop_database

%postun
%clean_desktop_database
  • Freedesktop.org MIME türü veritabanı : Sistemde kurulu tüm MIME tiplerinin listelendiği veritabanı da MIME ile ilgili her paket kurulumunda/kaldırılmasında güncellenmelidir :
%post
%update_mime_database

%postun
%clean_mime_database
  • Simge ön belleği : /usr/share/icons/hicolor dizinine (veya diğer freedesktop simge teması dizinlerine, mesela /usr/share/icons/gnome veya /usr/share/icons/crystalsvg ) kurulacak/kaldırılacak simgeleri barındıran tüm paketler mutlaka simge önbelleğini güncellemelidir.(/usr/share/icons, /usr/share/icons/mini veya /usr/share/icons/large dizinlerine kurulacak diğer simgeler için böyle bir mecburiyet yoktur) :
...
%file
...
%{_iconsdir}/hicolor/*
%{_iconsdir}/crystalsvg/*
....

%post
%update_icon_cache hicolor
%update_icon_cache crystalsvg

%postun
%update_icon_cache hicolor
%update_icon_cache crystalsvg
  • GConf şema kaydı : GNOME GConf şemaları (schema) mutlaka şağıdaki makrolar kullanılarak kurulur/kaldırılır :
...
# Her şema anahtarı, /etc/gconf/schemas/<anahtar_adı>.schemas dosyası ile bağlantılı olmalıdır.
%define schemas apps_gnome_settings_daemon_default_editordesktop_gnome_font_rendering desktop_gnome_peripherals_keyboard_xkb fontilus themus

%post
%post_install_gconf_schemas %{schemas}

%preun
%preun_uninstall_gconf_schemas %{schemas}
  • Scrollkeeper veritabanı güncelleme: scrollkeeper veritabanı (docbook biçimli belgeleri fihristlemede kullanılır.) mutlaka bir .omf dosyası kurulur/kaldırılırken güncellenmelidir:
...
%post
%update_scrollkeeper

%postun
%clean_scrollkeeper

Urpmi ve rpmdrake ile etkileşime girmek

Bazen, paket kurulumu öncesinde veya sonrasında kullanıcıyı belirli hususlarda uyarmak veya bilgilendirmek gereklidir.rpmdrake-2.1.3-11mdk ve üst rpm sürümleri bu işlevi desteklemektedir: RPM; README.install.urpmi, README.update.urpmi veya README.urpmi adlarındaki dosyaları kendiliğinden aramakta ve bu dosya içeriğini görüntülemektedir.

README.install.urpmi dosyası sadece paketler kurulurken; README.update.urpmi dosyası sadece paketler yükseltilirken; README.urpmi dosyası ise her iki durumda da görüntülenir.

RPM paketlemede bir başka yol : checkinstall

Kişisel kullanım için RPM paketi oluşturmanın belki de en kolay yolu checkinstall kullanmaktır.

  • Paketlenecek kaynak arşiv açılarak alışılmış
$ ./configure && make

adımları uygulanır.

  • Bundan sonra ise make install adımı yerine kök olarak checkinstall uygulanır.
  • Bu durumda uygulanacak adımlar şöyle olacaktır:
$ ./configure && make
$ su
Password:
# checkinstall
  • Adım adım checkinstall soruları cevaplanarak RPM paketi oluşturulması sağlanabilir. Checkinstall ayrıca oluşturulan RPM paketinin kendiliğinden sisteme kurulmasını da sağlayacaktır.
Warning!
Başkaları ile paylaşacağınız RPM paketlerini mutlaka yukarıda uzunca anlatılan usulüne uygun olarak oluşturun!

Yararlı Dış Bağlantılar

İngilizce Bağlantılar

Türkçe Bağlantılar

  • Enixma dergisi sayıları:

Kaynak

Hazırlayan= Atilla Öntaş