====== Mageia RPM HOWTO =======
====== Úvod ======
Toto HowTo bylo napsáno s cílem pomoci lidem vytvářet softwarové balíčky, které lze začlenit do distribuce [[:start|Mageia]]. Důraz bude kladen na odlišnosti [[:software:instalace:rpm|rpm balíčků]] Mageie od jiných distribucí využívajících ''rpm''. Tento dokument by měl být užitečný vývojářům Mageie, stejně jako ostatním lidem. \\ \\
Distribuce [[:start|Mageia]] je vytvářená pomoci různých spolupracovníků, testerů a překladatelů. Pro více informací se, prosím, podívejte na stránku [[https://wiki.mageia.org/en/Contributing|přispívání (en)]].
Tvorba ''rpm'' balíčků pod [[:root|rootem]] je nebezpečná, protože binární balíčky jsou nainstalovány do systému dříve, než jsou zabaleny do balíčku. Nechcete-li kompromitovat svůj systém, vytvářejte balíčky vždy jako normální uživatel.
====== Předmluva ======
V tomto dokumentu se předpokládá, že se čtenář dokáže v Linuxu orientovat. Zná základní příkazy, adresářovou strukturu a má zvládnutou přinejmenším instalaci rpm balíčků.
Tento dokument je koncipován jako návod krok za krokem k získání [[:software:instalace:rpm|rpm balíčku]], který se hladce začlení do distribuce Mageia, buď z předchozího zdrojového [[:software:instalace:rpm|rpm]] nebo ze zdrojového souboru ''tar''.
''RPM'' může označovat tři věci:
* program určený k instalaci nebo tvorbě balíčků
* formát použitý v balíčcích (zdrojových nebo binárních) vytvořených programem ''rpm''
* soubor označovaný také jako balíček, obsahující buď binární nebo zdrojové kódy společně s information header (více viz. [[.rpm_popis|popis formátu souboru rpm]]) o tom, jak instalovat a odinstalovat program
Program ''rpm'' je z pohledu uživatele výkonný správce balíčků. Funguje jako "dirigent" při jakékoli práci s ''rpm'' balíčky. Mimo jiné může:
* instalovat nebo aktualizovat balíčky s kontrolou závislostí
* během instalace provádí akce nutné k zajištění funkčnosti instalovaného programu
* obnovuje omylem smazané soubory patřící k balíčku
* vypíše, je-li balíček již instalován
* zjistí, ke kterému balíčku patří jednotlivý soubor
* ověří současnou instalaci, nakolik jsou naplněny požadavky instalovaných balíčků na závislé balíčky
* ...
Z programátorského hlediska je program [[:software:instalace:rpm|rpm balíček]], který obsahuje v jediném ''rpm'' souboru všechny informace potřebné k instalaci programu pro danou platformu.
Je důležité od počátku rozlišovat rozdíly mezi zdrojovým ''rpm'' balíčkem (''*.src.rpm'') a binárním (''*..rpm'') balíčkem.
* První (''*.src.rpm'')obsahuje kompletní zdrojový strom od původního programátora plus všechny dodatečné balíčky přidané za účelem konfigurace, kompilace a instalace programu. Obecně vzato skládá se ze souboru ''spec'' (soubor říkající programu ''rpm'', které operace se musí vykonat za účelem vytvoření balíčku) a záplat, pokud existují.
* Druhý typ souboru (''*..rpm'') obsahuje binární kompilační program a všechny soubory (dokumentace, konfigurační soubory, ikony,...), které budou instalovány na cílový systém. Také obsahuje proceduru, které zajistí uloženi souborů na správná místa a akce, které se musí vykonat, aby byl program funkční.
====== Instalace softwaru ======
===== Základy =====
Původně byl program ''rpm'' navržen pro práci v [[http://www.redhat.com/|Red Hat Linux]], ale pracuje i v dalších distribucích založených na ''rpm'': [[http://www.mageia.org|Mageia]], [[http://www.mandrivalinux.com/|Mandriva Linux]], [[http://www.suse.com/index_us.html|Suse]] atd.; ''rpm'' je již na těchto systémech nainstalován.
Můžete získat ''vanilla rpm'' distribuci od Red Hatu: ftp://ftp.rpm.org/pub/rpm/dist
Budete-li binární ''rpm'' budete sestavovat pro Mageiu, nemusí správně fungovat v dalších distribucích, přestože Mageia dělá maximum pro kompatibilitu s Red Hat.
===== Sestavení pro Mageiu =====
Tvorba balíčků pro Cauldron (tedy vývojovou verzi Mageie) je vždy náchylná k malým záplatám a vylepšením používaného programu ''rpm''. Měli byste nainstalovat následující balíčky:
* balíček ''rpm'' od Red Hatu s našimi záplatami
* balíček ''rpm-build'' obsahující scripty používané k tvorbě balíčků
* balíček ''spec-helper'', pracovní nástroj pro minimalizaci specfiles, zajišťující automatické činnosti jako např. stripping binárek a komprimaci manuálových stránek
* balíček ''libtool'' používaný ke konfiguraci scriptů určených ke tvorbě sdílených knihoven
* balíček ''rpmlint'' zajišťující kontrolu platnosti vygenerovaného ''src.rpm'' souboru
====== Přípravné úkoly ======
===== Instalace nezbytných balíčků =====
Pro tvorbu rpm balíčků musíte mít nainstalovánu příslušnou sadu programů. Pro pokyny k instalaci viz [[http://wiki.mandriva.com/en/Docs/Basic_tasks/Installing_and_removing_software|Installing and removing software]] (nebo návody na [[http://www.mandrivalinux.cz/modules/dokuwiki/doku.php?id=instalace-software|této wiki]]).
===== Vytvoření požadovaných složek =====
K sestavování balíčků potřebuje program ''rpm'' speciální adresářový strom ve vašem domovském adresáři. Tento strom může být vytvořen následujícím příkazem (v jednom řádku):
[[:system:prikazovy_radek#konzole|{{wiki:icons:konzole.png?40 |Konzole}}]]
mkdir -p ~/rpm/{BUILD,RPMS/$ARCH,RPMS/noarch,SOURCES,SRPMS,SPECS,tmp}
Přepište řetězec ''$ARCH'' na označení architektury, pro kterou budete balíčky připravovat. Základní jsou ''i586'', ale může být také ''x86_64/sparc/alpha/ppc''.
__Ujistěte se, že adresářový strom má tento tvar__:
* ''~/rpm/BUILD'': adresáře vytváření
* ''~/rpm/BUILDROOT'': adresář, kde instalace budou simulovány
* ''~/rpm/RPMS'': obsahuje adresáře pro každou architekturu, které budou obsahovat binární balíčky
* ''~/rpm/RPMS/i586'': adresář pro uložení balíčků pro procesory ''i586''
* ''~/rpm/RPMS/x86_64'': adresář pro uložení balíčků pro procesory ''AMD64'', ''Core 2 duo'' a pozdější
* ''~/rpm/RPMS/noarch'': totéž pro ''noarch'' balíčky (bez závislosti na procesoru)
* ''~/rpm/SOURCES'': zdrojové soubory (např. ''mujbalicek.tar.bz2'')
* ''~/rpm/SPECS'': ''spec'' soubory, ty musí být nejprve vytvořeny
* ''~/rpm/SRPMS'': zdrojové ''rpm'' po tvorbě balíčku
* ''~/rpm/tmp'': adresář pro dočasné soubory během tvorby balíčku
Adresářová struktura po ''~/rpm/RPMS'' je pro ''rpm'' nezbytná. Jestliže neexistuje, obdržíte chybové hlášení.
===== Tvorba souboru .rpmmacros =====
K tvorbě balíčků potřebujete mít v domovském adresáři konfigurační soubor ''.rpmmacros'':
[[:system:prikazovy_radek#konzole|{{wiki:icons:konzole.png?40 |Konzole}}]]
%_topdir %(echo $HOME)/rpm
%_tmppath %(echo $HOME)/rpm/tmp
# Pokud chcete, aby vaše balíčky byly podepsány GPG automaticky, přidejte tyto tři řádky
# nahrazením 'Mageia' vaším GPG názvem. Můžete také použít rpm --resign
# podepsat balíčky později.
%_signature gpg
# _gpg_name obsahuje jméno zadané při vytváření GPG klíče
%_gpg_name Mageia
%_gpg_path ~/.gnupg
# Přidejte vaše jméno a e-mail do %packager uvedené níže. Možná také chcete
# nahradit vendor sebou.
%packager John Doe
%distribution Mageia
%vendor Mageia
# Pokud chcete, aby vaše balíky měli svůj vlastní distsuffix místo mga, přidejte jej
# zde tak jako toto
#%distsuffix foo
Varujeme před změnou nastavení parametru ''%optflags'', které je nastaveno pro váš systém v ''/usr/lib/rpm/mageia/rpmrc''.
====== Tvorba RPM ======
===== Z existujícího zdrojového RPM =====
Toto je obecný příklad pro balíčky, které jsou již v distribuci obsaženy.
Nejnovější ''rpm'' soubory z repozitáře Cauldron jsou dostupné na mnoha zrcadlech, jejichž seznam je k dispozici v [[http://mirrors.mageia.org/distrib?version=cauldron&arch=i586|Cauldron Mirrors - i586]], [[http://mirrors.mageia.org/distrib?version=cauldron&arch=x86_64|Cauldron Mirrors - x86_64]]. Tam najdete:
* v podadresáři ''SRPMS'' zdrojový ''rpms'' ([[:zdroje#core_repozitare|core]], [[:zdroje#nonfree_repozitare|nonfree]], [[:zdroje#tainted_repozitare|tainted]]) a dále cpu architekturu (např. ''i586'', ''x86_64'', ...)
* ''media/core'' pro binární ''rpms'' repozitáře [[:zdroje#core_repozitare|core]]
* ''media/nonfree'' pro binární ''rpms'' repozitáře [[:zdroje#nonfree_repozitare|nonfree]]
* ''media/tainted'' pro binární ''rpms'' repozitáře [[:zdroje#tainted_repozitare|tainted]]
Když najdete zdrojový ''rpm'', který chcete upravit pro Mageiu, stačí spustit příkaz:
[[:system:prikazovy_radek#konzole|{{wiki:icons:konzole.png?40 |Konzole}}]]
rpm -ivh mujbalicek.src.rpm
Tím nainstalujete všechny zdrojové soubory do vašeho ''rpm'' adresářového stromu. Můžete také nastavit [[:system:prikazovy_radek:rpm#urpmi|urpmi]] ke stažení zdroje ze zrcadla.
=== Příklad:===
[[:system:prikazovy_radek#konzole|{{wiki:icons:konzole.png?40 |Konzole}}]]
[camille@valstar ~/rpm]$ rpm -i /cauldron/SRPMS/core/ktron-4.5.95-1.mga1.src.rpm
[camille@valstar ~/rpm]$ ls -R *
SRPMS:
SPECS:
ktron.spec
SOURCES:
ktron-4.5.95.tar.bz2
RPMS:
noarch/ i686/ i586/ i386/
BUILD:
Ve výpisu vidíme, že ''rpm'' nainstaloval do našeho adresářového stromu pro tvorbu ''rpm'' zdrojový soubor ''ktron-4.5.95.tar.bz2'' a soubor ''spec''. Ještě před tvorbou balíčku novější verze může být pro vás přínosem, jestliže si znovu vytvoříte balíčky současných verzí, abyste lépe rozuměli, jak je balíček sestaven a kompilován. Magický příkaz pro sestavení balíčku je ''rpmbuild'' s volbou ''buildall'':
[[:system:prikazovy_radek#konzole|{{wiki:icons:konzole.png?40 |Konzole}}]]
[camille@valstar ~/rpm]$ cd ~/rpm/SPECS
[camille@valstar ~/rpm]$ rpmbuild -ba ktron.spec
[camille@valstar ~/rpm]$ ls -l ~/rpm/RPMS/i586/ktron-4.5.95-1.mga1.i586.rpm
[camille@valstar ~/rpm]$ ls -l ~/rpm/SRPMS/ktron-4.5.95-1.mga1.src.rpm
Jakmile je tvorba u konce (v případě některých velkých balíčků jako je například ''kernel'' může trvat celé hodiny) bez chyb, získáte binární ''rpm'' a ''src.rpm'' v podadresáři ''~/rpm/RPMS/i586'' respektive ''~/rpm/SRPMS/''. Pokud chcete instalovat binární ''rpm'', musíte se přihlásit jako [[:root|root]], například pomocí příkazu ''su'' (a odhlášení klávesovou zkratkou Ctrl+d). Pro účely tvorby balíčků ''rpm'' a ''src.rpm'' nikdy nepotřebujete být [[:root|root]].
Logovací záznamy o tvorbě balíčku mohou být velmi dlouhé a lze je ukládat pro pozdější prohlížení. Já používám ''emacs'' nebo ''xemacs'' a použiji druhé okno se shellem (Alt+x shell) a uložím buffer jako ''ktron''. LOG, například, po dokončení.
V podadresářích ''~/RPM/BUILD'' obvykle potřebujete zpřístupnit záplaty ke zdrojovým souborům (existuje-li jedna nebo více záplat, byly uloženy v ''~/rpm/SOURCES''), k binárkám, zkompilovaným knihovnám, man stránkám atd. Soubor ''spec'' popisuje zdroje a soubory se záplatami a jak sestavit balíček a jak celou sadu správně nainstalovat.
Nyní si vysvětlíme, co vše je potřeba udělat, aby v případě vylepšení balíčku ''ktron'' byl správně upraven soubor ''spec'' a pak znovu vytvořen balíček.
Je důležité si uvědomit, že každý balíček udržovaný v Mageii je uložen v SVN systému. To umožňuje zaznamenávat všechny změny v balíčku tak, aby se vývojář mohl kdykoli podívat do archívu a zkontrolovat předchozí modifikace a je-li to nutné, vrátit se ke starší verzi.
Každý soubor ''spec'' je uložen v kořeni ''''. Jsou přístupné na stránkách http://svn.mageia.org .
Pro další detailní informace o přístupu do SVN systému nahlédněte na stránku [[https://wiki.mageia.org/en/Packagers_svn|Mageia SVN FAQ]].
===== Ze zdrojového souboru =====
Najdete-li například na [[http://freecode.com/|Freecode]] nebo [[http://sourceforge.net/|Sourceforge]] zajímavý program, který upozorní, že čaj je hotový, můžete ho chtít zpřístupnit všem uživatelům Mageie, kteří rádi pijí čaj. Nejlepším způsobem je nejspíš vytvořit pro něj ''rpm'' balíček podle standardů Mageie.
Stáhněte tarball a uložte jej v adresáři ''SOURCES''.
==== Předběžné kontroly ====
* **//Licence//**: - dnes převažuje GPL licence, nicméně existuje i sada v současnosti používaných ne-GPL licencí. Pečlivě zkontrolujte licenci software a ujistěte se, že je možné včlenit program do distribuce a ve kterém úložišti: [[:zdroje#core_repozitare|core]] (bez licence), [[:zdroje#nonfree_repozitare|nonfree]] (non-free licence) nebo [[:zdroje#tainted_repozitare|tainted]] (záležitostmi v oblasti patentů uvnitř). Nelze přijmout uzavřený (non-open) software. Také nemůžeme přijmout program, jehož licence neumožňuje volnou distribuci. Dávejte na takové programy pozor! Seznam přijatelných licencí lze nalézt na stránce [[https://wiki.mageia.org/en/Licensing_policy|Mageia Licences]].
* ** //Komprimace tarballu// **: - s ohledem na minimalizaci práce se doporučuje použít původní tarball bez jakýchkoli modifikací. Jsou-li zdrojové soubory poskytované ve více různých komprimačních formátech, obvykle volíme ''.tar.bz2'' nebo lepší kompresní algoritmus ''tar.xz''. Vyhýbejte se komprimaci záplat v textových formátech (vytvořené např. programem ''diff'' a podobnými) a dalších konfiguračních záznamů ''/ script'' (textových souborů), které obvykle zabírají malý prostor, zatímco komprimace komplikují kontrolu změn v Subversion diffs (a Subversion také používá nějakou formu komprimace). Z bezpečnostních důvodu důrazně doporučujeme u balíčků s vysokým bezpečnostním rizikem neupravovat původní zdrojový soubor, bude-li to měnit kontrolní součet (checksum) souboru. Pro tyto druhy balíčků doporučujeme ponechat původní formu (formát) souboru tak, aby kdykoli bylo možné pomocí ''md5sum''/''gpg'' porovnat hodnoty s těmi, které jsou uvedeny na stránkách poskytovatele programu uvedených v sekci download. Jedním příkladem, kde lze využít výjimky byl např. ''OpenSSH''.
===== Obsah souboru spec =====
A jsme u nejdůležitější části tohoto dokumentu. Soubor ''spec'' obsahuje všechny informace potřebné pro ''rpm'', aby:
* mohl sestavit program a vytvořit zdrojový a binární ''rpms'',
* instaloval a odinstaloval program z počítače konečného uživatele.
Skutečnost, že tyto informace jsou spojené v jedné řadě za sebou může být pro začátečníka matoucí. Ve skutečnosti lze totéž vidět ve zdrojovém ''tar'' stromu, který tyto informace již obsahuje. Během instalační procedury jsou vyjmuty a spuštěny příkazem ''make install'' do zdrojového stromu, obě části jsou pevně provázané.
Stručně řečeno, soubor ''spec'' popisuje "simulovanou" kompilaci a instalaci, řekne programu ''rpm'', které soubory vzniklé tímto "instalováním" jsou zabalené a jak mají být nakonec nainstalovány do uživatelského systému. Příkazy jsou provedeny prostřednictvím shellu ''/bin/sh'' např. jako ''[-f configure.in]&& autoconf'' jsou platné.
Tato část není určena k podrobnému vysvětlení všech vlastností souboru ''spec''. Kniha [[http://rikers.org/rpmbook/|MaximuRPM]] (viz Section 7) popisuje detaily. Vše co se nyní chystáme udělat, je rychlý přehled vlastností použitých v jednom běžném vzorovém souboru ''spec'' v Mageii.
Budete-li vytvářet další a další balíčky ''rpm'', zjistíte, že existují různé volby, o kterých vám nemůžeme nic říci. ''RPM'' je extrémně rozšiřitelné, takže nalezení všech možností necháme na čtenářích za domácí cvičení. Dobrý způsob, jak se dozvědět více je projít nějaké soubory ''spec'' a podívat se, jak jsou vytvořeny.
Příklady ''spec'' souborů a patchů můžete vidět [[http://svn.mageia.org/svn/packages/cauldron|zde]]
[[:system:prikazovy_radek#konzole|{{wiki:icons:konzole.png?40 |Konzole}}]]
Name: gif2png
Version: 2.0.1
Release: %mkrel 1
Summary: Tools for converting websites from using GIFs to using PNGs
Source0: http://www.tuxedo.org/~esr/gif2png/%{name}-%{version}.tar.bz2
Source1: %{name}-%{version}-mga-addon.tar.bz2
Patch0: gif2png-2.0.1-bugfix.patch
URL: http://www.tuxedo.org/~esr/gif2png/
Group: Applications/Multimedia
License: MIT-like
Requires: python
%description
Tools for converting GIFs to PNGs. The program gif2png converts GIF files
to PNG files. The Python script web2png converts an entire web tree, also
patching HTML pages to keep IMG SRC references correct.
%prep
%setup -q -a 1
%patch -p1
%build
%configure
%make
%install
rm -rf %{buildroot}
%makeinstall
%files
%defattr(0755,root,root)
%doc README NEWS COPYING AUTHORS
%{_mandir}/man1/gif2png.1*
%{_mandir}/man1/web2png.1*
%{_bindir}/gif2png
%{_bindir}/web2png
%changelog
* Mon Nov 02 2010 Camille Begnis 2.0.1-1mga1
- Upgraded to 2.0.1
* Mon Oct 25 2011 Camille Begnis 2.0.0-1mga1
- Specfile adaptations for Mageia
- add python requirement
- gz to bz2 compression
Nyní si podrobněji rozebereme každý řádek z tohoto souboru:
Upozorňujeme, že znak ''%'' na začátku řádku může mít různý význam:
* začátek sekce (''prep'', ''build'', ''install'', ''clean'')
* vestavěný shellový script s makry (''setup'', ''patch'')
* příkazy používané v některých sekcích (''defattr'', ''doc'', ...)
==== Sekce header (hlavička) ====
Name: gif2png
Jméno balíčku, které bude použito v databázi balíčků na počítači uživatele. Z osvědčených postupů by jméno mělo být malými písmeny. Všimněte si, že ''%{name}'' je odkaz na předchozí definici.
Version: 2.0.1
Release: %mkrel 1
Na tomto místě musíme vysvětlit, jak se jméno balíčku vytváří. Je důležité respektovat standardy, aby byla vaše práce pochopitelná pro ostatní.
Existují i některé značky (tagy), které by bylo užitečné znát, ale které nejsou ve vzorovém souboru ''spec'' použity, ale na které je možné někdy narazit. Nelze očekávat, že si je budete pamatovat všechny, pokud s vytvářením ''rpm'' balíčků začínáte, a později je užitečné vytvořit si jejich seznam.
* binární balíček je pojmenován takto: ''jméno-verze-vydání.arch.rpm'' (např. ''gif2png-2.0.1-1.mga1.i586.rpm'' pro 32 bit. nebo ''gif2png-2.0.1-1.mga1.x86_64.rpm'' pro 64 bit. architekturu z našeho příkladu)
* zdrojový balíček je pojmenován následovně: ''jméno-verze-vydání-src.rpm'' (např. ''gif2png-2.0.1-1.mga1.src.rpm'' v našem příkladu)
Jméno je obvykle zvoleno podle názvu hlavního binárního balíčku, ačkoli postačujícím důvodem může být i známost jiného názvu.
Verze je číslo z nezáplatovaného zdroje. Jde o číslo verze z jména v původním komprimovaném souboru: ''jméno-verze.tar.gz''.
Vydání (release) je číslo následované písmeny ''mga1'' (znamenající "Mageia 1"; toto je naprosto nezbytné) je přírůstkové číslo zvyšující se o jednu při každém dalším sestavení balíčku. Sestavení se může opakovat kvůli záplatě použité ve zdroji, úprava souboru ''spec'', přidání ikon atp.
Summary: tools for converting websites from using GIFs to using PNGs
Tento řádek obsahuje jednořádkový popis balíčku. Počet písmen by mělo být max. 79, bez tečky na konci, první znak velké písmeno a bez mezery na začátku textu.
Source0: http://www.tuxedo.org/~esr/gif2png/%{name}-%{version}.tar.bz2
Tento řádek říká, který zdrojový soubor byl použit pro vytvoření ''rpm'' balíčku. Všimněte si, že před jménem souboru předchází kompletní URL (není povinné), ukazující, kde je původní zdroj k dispozici.; program ''rpm'' tuto URL odstraní, uchová čistý název souboru a vyhledá ho v adresáři ''SOURCE''. Pokud říkáme, že kompletní URL není povinné, je nutné zdůraznit, že je vysoce doporučené, aby ostatní mohli zdrojové soubory najít, snadno provést aktualizaci nebo novou kompilaci. Také to umožní nástrojům jako je ''rpmbuildupdate'' provést automatické zkompilování nové verze.
Existuje-li více než jeden zdrojový soubor, použijí se další řádky s označením ''Source1:...'', ''Source2:...'', atd.
Všimněte si, že ''% {name}'' a ''% {version}'' jsou odkazy na předchozí tagy.
Patch0: gif2png-2.0.1-bugfix.patch
Pro existenci tohoto nepovinného tagu existují dva důvody:
* použili jste na zdrojový soubor patch (záplatu), která musí být použita před kompilací (sestavením balíčku). Všimněte si, že všechny patche jsou také komprimované ve formátu ''bzip2''. I když nějaký patch je tak malý, že nemá smysl ho kopírovat, musí být převeden do uvedeného formátu.
* byli jste upozorněni na patch pro verzi vašeho softwaru někde na síti a stáhli jste si ho; nebo jej vybrali z upstreamu (ze SVN, GIT, ... atd.).
Mějte na paměti, že soubor s patchem musí být umístěn do adresáře ''SOURCES''; ve zdrojích může být i více záplat, pak musí být pojmenovány ''Patch1'', ''Patch2'' atd.
URL: http://www.tuxedo.org/~esr/gif2png/
Další nepovinný, ale vysoce doporučený řádek. Uvádí domovskou stránku (home page) programu.
Group: Multimedia
Určuje, ve které skupině programů bude tento program umístěn. Tato vlastnost je využívaná správci balíčků jako je např. [[:system:mcc#sprava_softwaru|rpmdrake]].
Kompletní struktura skupin, kterou lze použít, se liší od Red Hatu, lze ji najít na stránkách [[https://wiki.mageia.org/en/RPM_groups_policy|RPM Groups (en)]]. Tento údaj je povinný. Při vynechání se může váš balíček zamíchat mezi jiné s odlišným určením ve skupinách využívaných Mageia instalátorem nebo v grafickém správci balíčků.
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
Tento řádek nesmí být vynechán, je velmi důležitý. Programu ''rpm'' říká, že instalovaný program použije konkrétní kořenový adresář (fingovaný ''/'') na počítači, kde je kompilován. Jsou k tomu dva důvody:
* vytváříte-li balíčky ''rpm'' a nemáte oprávnění [[:root|roota]], nemůžete instalovat sadu programů v obvyklých adresářích.
* nainstalování do pracovního stromu může smíchat soubory z balíčků s jinými.
Nejdůležitější je však to, že to může vyvolat bezpečnostní riziko. Mnoho lidí používá pro ''buildroot'' adresář ''/var/tmp'' nebo ''/tpm''. Není to důležité, pokud jste jediný uživatel počítače, ale pokud máte více uživatelů, kteří sestavují stejný balíček ve stejnou dobu, ''rpm'' bude blít (Pozn. překl.: angl. barf, zvracet - ponechal jsem pro radost). Proto je důležité definovat ''%{_tmppath}'' uvnitř vašeho domovského adresáře!
License: MIT-like
Definice licence kterou vybral autor a která bude použita pro zabalený balíček. Většinou jde o GPLv2. Kompletní seznam schválených licencí najdete na stránkách [[https://wiki.mageia.org/en/Licensing_policy|Mageia Licensing Policy]], zejména část [[https://wiki.mageia.org/en/Licensing_policy#standard_license_names|Standard license names]] pro úplný seznam platných licencí a pravidel.
Requires: python
Řádek byl přidán, protože jeden z programů obsažených v balíčku je script pythonu. Takže je zapotřebí ''python'', který ho vykoná. Můžete zadat nepovinné minimum (nebo konkrétní verzi), například:
Requires:python>=1.5.1
%description
Tools for converting GIFs to PNGs. The program gif2png converts GIF files
to PNG files. The Python script web2png converts an entire web tree, also
patching HTML pages to keep IMG SRC references correct.
Tento tag je vcelku zvláštní, protože obsahuje text vytvořený z různých řádků a odstavců, je-li to nutné. Obsahuje úplný popis instalovaného softwaru. Účelem je pomoci uživateli v rozhodnutí, zda chce balíček instalovat nebo ne.
Můžete se zkusit zeptat se sám sebe: "A co překlad (translations)?" Pro zlepšení čitelnosti ''spec'' souborů je překlad souhrnu (''summary'') a popisu (''descriptions'') uložen v samostatném souboru nazvaném ''.po''.
==== Sekce prep (přípravná) ====
%prep
%setup -q -a 1
%patch0 -p1
Do této části je zapsán první script, který má program ''rpm'' provést. Jeho úlohou je:
* vytvořit hlavní podadresář programu (v adresáři ''BUILD''),
* rozbalit původní zdroje do adresáře vytvořeného v předchozím kroku,
* použít vybrané záplaty na zdrojové soubory.
Může být následován jakýmkoli příkazem, který je zapotřebí pro přípravu zdroje ke kompilaci.
%setup -q -a 1
Toto je odkaz na vestavěný script, který:
* přejde do adresářového stromu pro kompilaci
* rozbalí zdroj(e) (''q''uietly, ''-q'', potichu)
* změní vlastníka a práva u zdrojových souborů.
Defaultně rozbalí první zdroj (v našem příkladě ''Source0''); pro každý další zdrojový soubor (archivy) musíte použít příslušné parametry. V našem příkladu ''-a 1'' říká, že také chceme extrahovat zdroj číslo ''1'' (v našem příkladě ''Source1'').
Existují i další zajímavé přepínače, které můžeme použít společně s příkazem ''%setup'':
|Přepínač:|Popis:|
|''-c jméno''| - přepínač ''-c'' říká, že nejprve je vytvořen nejvyšší adresář ''jméno''; pak příkazem ''cd'' přejde do tohoto adresáře a pak rozbalí ''SourceO''. To je užitečné, pokud je archiv extrahován bez nadřazeného adresáře.|
|''-D''| - nevymaže adresář před rozbalením. Může být užitečné, máte-li více než jedno setup makro. Mělo by být použito pro nastavení jiného makra než prvního (nikdy ne v případě jen jednoho).|
|''-T''| - tato volba mění standardní nastavení pro rozbalení zdroje (untarring) a vyžaduje ''-b 0'' nebo ''-a 0'' pro získání hlavního zdrojového souboru nekomprimovaného programem ''tar''. Je zapotřebí pokud existuje druhý zdroj.|
|''-n jméno''| - je-li ''jméno rpm'' jiné než ''jméno'' zdroje, který je zapotřebí rozbalit, použijte tento vypínač. Například: Je-li jméno ''rpm'' sestaveno podle vzoru ''program-verze-revize'' a rozbalený zdroj má jméno ''program-verze-datum'', nebude program ''rpm'' schopen přejít do správného adresáře ''program-verze'', použijte přepínač ''-n program-verze-datum''. Pak program ''rpm'' uvidí nový adresář, ve kterém může pokračovat v činnosti.|
%patch0 -p1
Jde o makro zodpovědné za použití záplat na zdrojové soubory; jeho parametr ''-p<číslo>'' přesměruje program k záplatě.
Podíváte-li se do patch souboru, uvidíte, že některé cesty jsou definovány:
--- cairo-1.7.6-orig/src/cairo-ft-font.c 2008-09-29 21:43:13.000000000 +0100
+++ cairo-1.7.6/src/cairo-ft-font.c 2008-09-29 21:52:19.000000000 +0100
@@ -1705,7 +1705,9 @@
options->base.subpixel_order = other->base.subpixel_order;
}
- if (options->base.hint_style == CAIRO_HINT_STYLE_DEFAULT)
+ options->base.hint_style = CAIRO_HINT_STYLE_DEFAULT;
+
+ if (other->base.hint_style != CAIRO_HINT_STYLE_DEFAULT)
options->base.hint_style = other->base.hint_style;
if (other->base.hint_style == CAIRO_HINT_STYLE_NONE)
V tomto případě ''-p1'' znamená, že oprava by měla ignorovat ''cairo-1.7.6/'', ''-p2'' by znamenalo, že také ignorovat ''src/'' a tak dále ...
Představme si, kdyby existovala další záplava deklarovaná pomocí ''Patch1'': ..v sekci ''header'' by jste přidali další řádek: ''%patch1 -p1''. Přidání ''-b .vaše_přípona'' je také dobrý způsob, jak můžete nechat druhé zjistit, co vaše záplata dělá a kdo ji vytvořil. Například, pokud vytvořil záplatu Fred, pak může napsat ''%patch -p1 -b .fred'', pokud ale Barney, pak může zadat ''%patch -p1 -b .barney''.
==== Sekce build (stavební) ====
%build
Tato část obsahuje scripty přímo zodpovědné za kompilace software.
Sestává z příkazů vydaných po rozbalení ze zdrojového stromu.
%configure
Řádek používaný pro konfiguraci automaticky konfigurovaných zdrojů. ''%configure'' může nastavit ''./configure'' s řadou rozšíření, jako např. ''export CFLAGS="$RPM_OPT_FLAGS"'' před konfigurací, a volby jako ''i586-mageia-linux %%--%%prefix=/usr %%--%%datadir=/usr/share'' atp.
Někdy nejsou všechny volby konfiguračním scriptem podporovány. V takovém případě musíte zjistit příčinu a zajistit ''./configure'' s vhodnými parametry. Zadejte cílovou platformu do volání ''configure'', pokud je podporuje, pomocí ''%{targetplatform}'' ; specifikace architektury musí být zrušena v souborech ''spec''; pro ix86 bude rozšířeno na ''i586-mageia'', jak ukazuje výše uvedený příklad.
Pro přehled o tom, co vlastně dělá ''rpm'' při vydávání ''%configure2_5x'', můžete spustit ''rpm - eval % configure2_5x'' v terminálu.
Všimněte si, že budete potřebovat balíček ''libtool'' aby bylo možné použít ''%configure'' na tvorbu balíčků sdílených knihoven.
Během tvorby a testování vašich balíčků by jste si měli ověřit, je-li cílový počítač architektury ''i586''; zvláště pokud kompilujete pro vyšší verzi procesoru, standardní chování scriptu ''configure'' je zjistit si typ vašeho procesoru a optimalizovat kompilaci pro něj. Účelem parametru ''%configure'' je toto chování změnit.
%make
Jednoduché makro, které v podstatě zajistí kompilaci s vhodným parametrem pro víceprocesorové stroje ''-j<číslo>'' . Pro zdroje používající ''xmkmf'' by jste měli nahradit ''make'' tímto příkazem:
make CDEBUGFLAGS="$RPM_OPT_FLAGS" CXXDEBUGFLAGS="$RPM_OPT_FLAGS"
Ve většině případů (nikoli však ve všech) toto jednoduché nastavení ''make'' funguje.
==== Sekce install (instalační) ====
%install
Tato sekce bude obsahovat script zodpovědný za simulovanou instalaci balíčku v ''rpm'' adresáři: ''%{buildroot}'' nebo ekvivalentní ''$RPM_BUILD_ROOT''.
Bude obsahovat všechny nezbytné příkazy potřebné k tomu, aby software mohl fungovat na uživatelském počítači.
rm -rf %{buildroot}
Toto je první z instalačních příkazů sekce ''%install''; vyčistí případný předchozí instalační adresář.
%makeinstall
Tento řádek zajistí simulovanou instalaci software do adresáře pro autokonfiguraci zdroje. Toto makro je pro spouštění ''make install'' vybaveno mnoha volbami, aby se instaloval software v ''%{buildroot}'', např. ''prefix=$RPM_BUILD_ROOT%{_prefix} bindir=$RPM_BUILD_ROOT%{_bindir}'' nebo jednodušeji ''DESTDIR=%{buildroot}''. Znovu se podívejte, jak toto makro je rozšířeno, použijte ''rpm - eval% makeinstall_std''.
V některých případech konfigurační script nemusí fungovat správně, a může být potřeba objevit v Makefiles další potřebné parametry pro správnou instalaci. Jedním z nejčastějších z nich je, že někdy budete muset použít ''make DESTDIR=$RPM_BUILD_ROOT install'' nebo jen ''%makeinstall_std''. Seznam běžně používaných proměnných pro ''Makefile'' můžete najít v [[http://www.gnu.org/prep/standards/html_node/Directory-Variables.html#Directory-Variables|Gnu|Coding Standard page]].
Pro úsporu místa na disku a zkrácení času přenosu souboru, Mageia používá xy pro komprimaci man- a info- stránek. Tuto vlastnost ovládá přímo ''rpm'' program Mageii.
To vše se musí připravit, aby se mohly zabalit připravené soubory.
==== Sekce Clean (vyčistit) ====
%clean
Tato sekce je určena k pročištění adresářového stromu ''$RPM_BUILD_ROOT''.
rm -rf $RPM_BUILD_ROOT
Tím je práce na novém balíčku dovršena.
Tato část je zastaralá a toto bude automaticky provedeno samotném ''RPM''. To by mělo být odstraněno ze ''SPEC'' souborů a již nepoužívat.
==== Sekce files (soubory) ====
%files
Tato část se sestává ze seznamu souborů, které budou vybírány ze simulovaného adresářového stromu připravovaného do balíčku. Projděte si krásný návod (fine manual) pro seznámení se s dalšími volbami, které nejsou použity v tomto příkladu.
Seznam souborů musí být zapsán ručně to souboru ''spec''. Má být tvořen seznamem všech souborů vytvořených v adresářové struktuře. Aby se to mohlo vytvořit, napište ''rpmbuild -bi muj_balicek.spec''. Parametr způsobí, že se příprava balíčku zastaví, jakmile ''rpm'' dokončí simulovanou instalaci. Pak můžete adresáře projít ''~/rpm/BUILDROOT/gif2png'' (v našem případě) a rozhodnout se, které soubory chcete v balíčku mít. Zpravidla to budou všechny.
**Poznámka:** Nepoužívejte pro tvorbu seznamu ''find'', ale tvořte ho po jednotlivých souborech (můžete tak odhalit chyby v nových verzích). Jedinou výjimkou jsou ''locales'', v nichž by se měl použít ''find_lang %{name}'' v sekci ''%install'' a nahraďte nadpis sekce ''%files'' za ''%files -f %{name}.lang''.
Poznámka k adresářové struktuře: Soubory instalované z vašeho balíčku by měly respektovat doporučení FHS, viz [[http://www.pathname.com/fhs|pathname.com/fhs]]
%defattr(-,root,root)
Tenhle tag definuje vlastnosti nastavované u každého souboru, který bude nakopírován do uživatelova systému. Čtveřice argumentů znamená:
|''-''| - všechny atributy pro standardní soubory zůstanou nezměněny|
|''root''| - vlastník souboru je root|
|''root''| - skupina vlastníka je root|
|''0755''| - soubor práv nastavených ve všech adresářích vlastněných tímto balíčkem; v tomto případě je ''0755'' (''rwxr-xr-x'')|
''%defattr(-,root,root)'' je zbytečné a mělo by být odstraněno, pokud jej naleznete. ''%defattr'' použijte pouze pokud opravdu chcete změnit výchozí oprávnění z upstream všech souborů následujícího po makru ''%defattr''. Zřídka je toto potřebné.
%doc README NEWS COPYING AUTHORS
Speciální tag ''%doc'' určuje soubory, které se stanou součástí dokumentace balíčku. Zde vyjmenované soubory budou uloženy v ''/usr/share/doc/gif2png-2.0.1/''. Adresář pro ně bude také automaticky vytvořen. Soubory určené v tagu ''%doc'' jsou uloženy v relativních umístěních k vašemu rozbalenému zdrojovému adresáři ''BUILD''.
%{_mandir}/man1/gif2png.1*
%{_mandir}/man1/web2png.1*
Také soubory ''man'' nebo ''info'' do tohoto seznamu je doporučeno zapisovat jednotlivě.
Možná se divíte, proč se používá název ''gif2png.1*'' místo ''gif2png.1.xz''. Důvodem je uchovat si možnost záměny s dalšími systémy, které by mohly využívat ''gzip'' komprimaci namísto ''xz'' využívaného v Mageii. Pokud najdete odkaz na ''xz'' komprimaci v souborech ''spec'', změňte zástupný znak (''*''). Zpravidla můžete dokonce použít ''%{_mandir}/man1/*'', což převezme všechny soubory, které může ''find'' najít.
%{_bindir}/gif2png
%{_bindir}/web2png
Jak můžete vidět, máte k dispozici makro pro každý druh činnosti, kterou potřebujete. Zde jsou některé z nejužitečnějších (podívejte se do ''/usr/lib/rpm/macros'' pro celý seznam): ''%{_prefix}'', ''%{_bindir}'', ''%{_sbindir}'', ''%{_datadir}'', ''%{_libdir}'', ''%{_sysconfdir}'', ''%{_mandir}'', ''%{_infodir}''. Pro hry můžete použít ''%{_gamesbindir}'' a ''%{_gamesdatadir}''.
==== Sekce changelog (deník změn) ====
%changelog
Tato část slouží k zaznamenání různých změn provedených v balíčku. Každé nové vydání balíčku musí souhlasit s odstavcem v této části stejně tak, jako povýšení čísla vydání (release) pokud nejde o změnu čísla verze (version number). Odstavce musí mít níže uvedené strukturování.
* Mon Nov 02 2010 Camille Begnis %%%% 2.0.1-1mga1
* první řádek odstavce začíná hvězdičkou (''*'') a údaje jsou odděleny mezerníkem:
* tři pozice pro den v týdnu,
* tři pro měsíc,
* dvě číslice pro den v měsíci,
* čtyři číslice pro rok,
* křestní jméno a příjmení osoby, která balíček připravila, oddělené mezerníkem,
* v lomených závorkách (<>) emailovou adresu,
* následuje číslo verze a vydání současné úpravy
- Upgraded to 2.0.1
Následuje řádek o modifikacích balíčku, začínajících ''-''. Tady je příklad:
* ''spec'' file stolen from ''korganizer''
* last snapshot before release
* Mageia adaptations
* Fix bug in ''/etc/zsh'' use ''USERNAME'' instead of ''USER''
* Remove petit bouchon which annoys other players
* Improve ''/etc/z*'' to source the ''/etc/profile.d/'' files
* fix typo in examples directory name
* fixed QT libs version requirements
* add patch to handle Earl Grey tea
V dokončeném ''rpm'' balíčku budou uchovány jen záznamy o změnách mladší jednoho roku. Pokud toto chování chcete změnit, můžete upravit hodnotu ''%_changelog_truncate''.
===== Kompilace balíčku =====
Náš soubor ''spec'' je úplně dokončen. Hluboce se nadechněte, sedněte si a zadejte: ''rpmbuild -ba mypackage.spec''. Můžete také přidat parametr ''%%--%%clean'', který zajistí vyčištění adresáře ''BUILD'' po dokončení vytváření balíčku. Tuto volbu oceníte, máte-li málo místa na disku.
Nyní máte dvě možnosti, podle toho, co se zobrazí na posledním řádku výpisu probíhajícího procesu tvorby ''rpm'':.
- 0.01% pravděpodobnost: +exit 0
- 99.9% pravděpodobnost: jiné případy.
Nastala druhá možnost? Gratulujeme, test jste zvládli, již nejste neználek.
Štěstí, čas a prohlížení voleb dostupných v procesu tvorby ''rpm'' ( ''man rpmrebuild'' ) pro ladění vaší práce, inspirace z ostatních ''spec'' souborů atd.
Přímá cesta ve tvorbě balíčků je tato: ''rpmbuild -bs %%--%%rmspec %%--%%rmsource'' (za účelem odstranění pozůstatků z předešlé kompilace) a nakonec ''rpmbuild %%--%%rebuild''.
===== Optimalizace kompilace =====
Po potvrzení příkazu ke kompilaci balíčku můžete vidět hlášení jako např. ''foo-devel is necessary for foo2'' (=balíček ''foo-devel'' je nutný pro balíček ''foo2'').
To znamená, že ''rpm'' pro dokončení kompilace potřebuje informace z jiných balíčků používaných pro vývoj (zpravidla je soubor pojmenován ''foo.h''). Pokud je nemáte, kompilace se zastaví, nebo příslušná vlastnost bude ve vašem balíčku chybět.
Chcete-li kompilovat mnoho oficiálních balíčků (pro Mageiu), musíte mít předinstalováno mnoho ''devel'' balíčků. Pokud není deklarovaný ve vašem souboru ''spec'' a je přitom nezbytný, balíček bude vytvořen v clusteru. Bude funkční, ale nepřítomnost této informace zabrání kompilaci na počítačích, kde chybí příslušný ''devel'' balíček. Tvorba, debugging a aktualizace bude daleko obtížnější.
Podívejte se na domovskou stránku programu nebo README/INSTALL soubory ve zdrojovém tarball souboru, kde obvykle naleznete informace o potřebných součástech.
Pro omezení chyb při kompilaci typu "nesplněných závislostí" je potřeba mít nainstalovány základní ''devel'' balíčky:
* ''glibc-devel''
* ''libncurses5-devel''
* ''libstdc++6-devel''
Poté již stačí nainstalovat jen ''devel'' balíčky vyžadované příkazem ''rpmbuild'' pro konkrétní kompilovaný balíček.
Po spuštění kompilace pozorně sledujte zprávy jako ''checking for ...'' ve výstupu ''.configure''
Jestliže vidíte něco jako ''checking for foo... foo.h not found'', znamená to, že potřebný hlavičkový soubor nebyl v systému nalezen. Hledejte ''devel'' balíček, který obsahuje ''foo.h'', ale buďte obezřetní: můžete najít více než jeden balíček obsahující komponentu se stejným názvem. Vyberte balíček "more obvious" - ve smyslu více příbuzný s kompilovaným balíčkem. Nevybírejte balíček ''network'', pokud kompilujete zvukovou aplikaci (například).
Po nalezení jej nainstalujte do systému a nezapomeňte přidat jeho jméno do sekce ''BuildRequires'' v souboru ''SPEC''.
Chybějící hlavička může být také nalezena během kompilace sama. Jestliže se kompilace zastaví, zkontrolujte další chybějící ''foo.h'' a použijte tentýž postup.
====== Testování RPM ======
Měli by jste také zkontrolovat stránky [[https://bugs.mageia.org/|bugzily]] pro případné další informace o tomto námětu.
===== Základní testy =====
Prvním krokem jsou:
* jsou ''rpms'' vytvořené v příslušných adresářích se správnými jmény? (v ''~/rpm/SRPMS'' a ''~/rpm/RPMS/i586/'')
* jsou informace získané příkazem ''rpm -qlivp %%--%%changelog mypackage.(src.)rpm'' správné?
===== Použití rpmlint =====
V dalším kroku musíte použít ''rpmlint'', který provede některé testy balíčku. ''rpmlint'' je nástroj pro kontrolu běžných chyb v ''RPM'' balíčcích. Je nastaven pro kontrolu Mageia balíčků (v závislosti na různých politik RPM balení v Mageii), ale měly by tak fungovat se všemi balíčky RPM. Používají také SUSE a RedHat.
Napište
rpmlint muj_balicek.<$ARCH>.rpm
a získáte zprávu o testovaném balíčku. Pro zvýšení preciznosti testu použijte přepínač ''-i''. Měli by jste kontrolovat jak ''rpm'', tak i ''src.rpm''.
Můžete nakonfigurovat ''rpmlint'' se souborem ''~/.rpmlintrc'' nebo ''/etc/rpmlintrc''. Měli byste nastavit alespoň následující:
from Config import *
setOption("Packager","login@email.org")
# default value
# setOption('Packager', 'Mageia Team |@mageia.org')
addFilter("E: .* no-signature")
addFilter("W: .* invalid-packager")
addFilter("E: .* no-packager-tag")
addFilter("E: .*-debug .*")
addFilter("W: .*-debug .*")
# not very clean, but easier to maintain
release_tag = os.popen("rpm %%--%%eval '%mkrel 1'").readlines()[0][1:-1]
setOption('ReleaseExtension', release_tag)
Pokud máte v úmyslu vytvořit ''rpm'' vhodné pro zařazení úložiště Mageie, měli byste také zajistit, že balíček ''rpmlint-mageia-policy'' je nainstalován, neboť obsahuje různé konfigurace a politiky používané baliči Mageie.
''rpmlint'' zkontroluje spoustu věcí, jako: tagy, binárky, konfigurační soubory, umístění, oprávnění, vlastnictví, FHS dodržování, zdroje, menu, skripty, ''spec'' soubor obsahu ... Pro více informací se podívejte na ''/usr/share/rpmlint/config.d/mageia.error.list''.
===== Test instalováním =====
Na libovolný počítač - ale raději na jiný, než na kterém byla prováděna kompilace - proveďte aktualizaci nebo instalaci a pak zkontrolujte:
* Jsou všechny očekávané soubory vytvořené v předpokládaných místech, s předpokládanými právy a vlastníky?
* Jsou všechny instalační modifikace (pokud existují) funkční?
* Jsou všechny binárky spustitelné a je dokumentace dostupná konečným uživatelům?
Perfekcionisté by měli zkoušet různé instalace a odinstalace ke kontrole, jsou-li všechny vlastnosti implementovány korektně, například bez požadovaných balíčků.
Jsou-li všechny testy úspěšné, jste již skoro hotovi a můžete přikročit k poslednímu kroku: předložení balíčku
====== Něco se děje špatně? ======
No, zdá se, že jste četli toto HowTo, což je dobrý začátek. Pokud jste nenašli svou odpověď tady, měli byste se pokusit v daném pořadí:
===== Pro obecné RPM záležitosti =====
* Oficiální RPM-HOWTO (instalován společně s ''rpm'' programem na vašem systému).
* Kniha od Red Hat "Maximum RPM", která je dostupná na http://www.redhat.com/docs/books/max-rpm/max-rpm-html
* Poslat dotaz mageia-dev, které jste si předplatili před dlouhou dobou na začátku čtení těchto HOWTO stránky.
====== Specifika Mageia RPM: ======
Napište oddělení Mageia Quality Assurance.
Cítíte-li, že informace, které jste získali, mohou být užitečné pro ostatní čtenáře tohoto dokumentu, nezdráhejte se podat návrh na změnu či doplnění správci tohoto dokumentu.
====== Před a poinstalační scripty ======
===== Základy =====
Balíček ''rpm'' je ve skutečnosti o něco složitější, než jednoduchý archív obsahující soubory rozbalované do příslušných adresářů na systému uživatele.
Systém nabízí programátorovi zásadní vlastnost: před a poinstalační scripty. Umožňuje to napsat kód, který se provede na hostitelském počítači během instalace nebo odinstalování balíčku.
Tyto scripty jsou vykonány jakýmkoli platným příkazem shellu. Čtyři z nich jsou základní:
Existují určité námitky ohledně těchto scriptů, které je potřeba vzít do úvahy. Za prvé, každý musí vejít do bufferu 8192, za druhé neměli by být interaktivní. Jakmile bude vyžadován vstup uživatele, zkazí to neinteraktivní instalační proceduru.
* ''%pre'' - script je vykonán jen před instalováním balíčku do systému.
* ''%post'' - script vykonán jen po instalaci balíčku do systému
* ''%preun'' - script vykonán jen před odinstalací balíčku
* ''%postun'' - script vykonán jen po odinstalací balíčku
Možnosti takových scriptů mohou být velmi rozsáhlé, a musí být navrženy s velkou pozorností, aby nepoškodily hostitelský systém. Uvědomujte si, že scripty poběží s právy [[:root|roota]]... Souvisí s úlohou správce systému, který musí nové programy do systému instalovat. Například:
* přidat úlohu pro ''cron'' k periodickému spouštění programu
* spustit ''chkconfig'' pro spuštění služby během startu systému
* ...
===== Zacházení s aktualizacemi =====
Fakt, že balíček může být aktualizován, a ne jen jednoduše instalován nebo odstraněn, to komplikuje... Problémem je, že script ''%postun'' z aktualizačního balíčku je spouštěn až po scriptu ''%post'' starší verze. Tím je všechen výsledek dosažený scriptem ''%post'' ztracen...
Proto je často užitečné zajistit, které akce se mají provést jen během instalace, avšak ne během aktualizace. Podobně také které se mají provést jen během odinstalování a ne během aktualizace. ''RPM'' zajišťuje tyto potřeby tím, že přidal standardní argument ke scriptům ''%pre'', ''%prein'', ''%post'' a ''%postun''. Tento argument signalizuje počet instancí tohoto ''rpm'', který bude instalován na počítač po dokončení aktuálního scriptu. Například je-li nový balíček instalován, pak bude ''1'' předána scriptu ''%pre'' i ''%post''. Pokud probíhá aktualizace, bude předán parametr ''2'' scriptům ''%pre'', ''%post'' z nového ''RPM'', ''1'' pak scriptům ''%preun'' a ''%postun'' starého balíčku.
|''Parametr / Script''|''%pre''|''%post''|''%preun''|''%postun''|
|první instalace|''1''|''1''|''N/C''|''N/C''|
|aktualizace|''2''|''2''|''1''|''1''|
|odinstalace|''N/C''|''N/C''|''0''|''0''|
To umožní programátorovi zajistit různé chování scriptů v závislosti na operaci: instalaci nebo aktualizaci.
* instalační scripty (''%post'', ''%pre'' ) zkontrolují, zda parametr ''$1 = 1'', pak jde o instalaci, pokud ne, jde o aktualizaci.
* odinstalační scripty (''%postun'', ''%preun'') zkontrolují, zda parametr ''$1 = 0'', pokud ano, jde o normální odinstalaci; pokud ne, jde o aktualizaci nebo přeinstalaci stejné verze s parametrem ''%%--%%force''.
Pro otestování tohoto argumentu se používá následující ''if'':
%postun
if [ $1 = 0 ]; then
// Do stuff specific to uninstalls
fi
if [ $1 = 1 ]; then
// Do stuff specific to upgrades
fi
Jediný test stačí k tomu, aby vyvolal podle okolností správné akce.
====== Filetriggers - Spouštěče souborů ======
''rpm filetriggers'' je používáno k odstranění opakujících se úloh jako je ''%post -p /sbin/ldconfig'' nebo ''%update_menus''.
====== Další makra ======
Při kompilaci ''RPM'' pro Mageiu máte k dispozici více maker, k usnadnění vytvoření souboru ''spec''.
* Manipulace s info stránkami. Příklad je nejlepší učitel:
%post
%__install_info %{name}.info
%preun
%__install_info %{name}.info
* Snadné zacházení s lokalizacemi. Nejlepším způsobem není ručně vkládat ''.mo'' soubory, které jsou obvykle uloženy v ''/usr/share'', ale použít zvláštní makro v sekci ''%install'', které pro to vytvoří speciální soubor:
%find_lang %{name}
Pak použijete soubor v seznamu:
%files -f %{name}.lang
* Tvorba makra. Vytvořená makra ''%configure'' a ''%makeinstall'' jsou nyní docela velké. Přesně určí prefix, ale také každý běžný adresář (jako např. ''bindir'', ''datadir'' atd.); pracují bezchybně s balíčky malé a střední velikosti, u ostatních je zapotřebí určité pozornosti. Makro ''%make'' vykoná příkaz ''make'' s vhodným parametrem ''-j <číslo>'' pro využití výkonu počítače s více procesory. Pokud potřebujete spustit ručně script ''./configure'', **NIKDY** nemá mít pevně uvedenou architekturu; k tomu slouží makro ''%{targetplatform}'' (nebo přímo ''%{tartetcpu}'', bude-li to nutné).
* Kompilace serverových aplikací. Pro kompilace bezpečnějších serverů používáme zvláštní makro, ''%serverbuild'', které používáme před vlastní kompilací. To umožní bezpečné nastavení přepínačů. Sekce ''%build'' bude vypadat asi takto:
%build
%serverbuild
%configure
%make
* Makro ''initscript''. Pokud instalujete balíčky, které poskytují vlastní initscripty (soubory v adresáři ''/etc/init.d''), potřebují být přidány pomocí volání, které vypadá jako ''chkconfig %%--%%add'' ..., ale ne jako v případě aktualizací, ale potřebuje zajistit restart služby již běžící; při odinstalaci musí jednat odlišně (opačně). Máme makro, které to zajistí bez chyby:
%post
%_post_service
%preun
%_preun_service
* Manipulace s ''ghostfiles''. Většina her a některé jiné balíčky používají proměnlivý soubor, který může být i nepřítomen. V takových případech jsou užitečné ghostfiles (soubor duch, neviditelný soubor). Tady je příklad:
%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
Makro ''%create_ghostfile'' expanduje takto:
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
Můžete kdykoli zkontrolovat obsah daného makra pomocí ''rpm %%--%%eval'':
$ rpm --eval %update_icon_cache
if [ -x /usr/bin/gtk-update-icon-cache ]; then
/usr/bin/gtk-update-icon-cache --force --quiet /usr/share/icons/%{1} || true; fi
Můžete také zobrazit seznam všech hodnot a maker používané ''rpm'' od maker a ''rpmrc'' souborů: ''rpm - showrc''
Níže uvedené informace jsou ponechané ze staršího [[http://wiki.mandrivalinux.cz/system:prikazovy_radek:tvorba_rpm#dalsi_makra|návodu]]
* Mapování MIME asociací v souboru ''.desktop'': systém menu ''XDG'' umožňuje nastavení asociací mezi aplikací a MIME typy v souboru ''.desktop''. Spusťte utilitu ''update-desktop-database'' , je-li takový soubor ''.desktop'' v systému instalován nebo odinstalováván, použijte makro, které je uvedeno v následujícím příkladu:
%post
%update_desktop_database
%postun
%clean_desktop_database
* Databáze MIME typů Freedesktop.org: Databáze používá seznam všech dostupných MIME typů s magickými čísly nebo vzorovými příponami, které měly být aktualizovány použitím makra podle následujícího příkladu:
%post
%update_mime_database
%postun
%clean_mime_database
* Vyrovnávací paměť pro ikony (Icon cache): Pokud balíčky obsahující ikony uložené v ''/usr/share/icons/hicolor'' (nebo v dalších adresářích obsahujících používané ikony, jako je ''/usr/share/icons/gnome/'' nebo ''/usr/share/icons/crystalsvg/'' ) musí být aktualizovaná icon cache, jak je uvedeno níže (ikon uložených v ''/usr/share/icons'', ''/usr/share/icons/mini'' nebo ''/usr/share/icons/large'' se tento požadavek netýká):
...
%file
...
%{_iconsdir}/hicolor/*
%{_iconsdir}/crystalsvg/*
....
%post
%update_icon_cache hicolor
%update_icon_cache crystalsvg
%postun
%update_icon_cache hicolor
%update_icon_cache crystalsvg
* Schéma registrace GConf: Schémata GConf v prostředí GNOME musí být instalovaná/odinstalovaná použitím tohoto makra:
...
# each schema key here corresponds to a file named /etc/gconf/schemas/.schemas
%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}
* Aktualizace databáze Scrollkeeper: Databáze ''scrollkeeper'' (používaná pro indexy ''docbook'' dokumentace) by měla být aktualizována při instalaci souboru ''.omf'' takto:
...
%post
%update_scrollkeeper
%postun
%clean_scrollkeeper
====== Součinnost urpmi a rpmdrake ======
Někdy je zapotřebí zobrazit upozornění pro uživatele, jestliže například probíhá instalace či aktualizace zvláštní verze balíčku.
Následující formáty jmen souborů může být použito:
* ''README.install.urpmi'' - zobrazí, když je balíček původně nainstalován
* ''README.version.upgrade.urpmi'' a ''README.version.update.urpmi'' - zobrazí, když je balíček aktualizován na verzi ''version'' nebo vyšší, od verze, která je nižší než ''version''(''version'' by měl být buď balíček ''version'', ''epoch:version'', ''version-release'', nebo ''epoch:version-release'', kratší tím lépe).
Také jsou podporovány ''README.urpmi'' (zobrazuje ve všech případech) a ''README.upgrade.urpmi'' / ''README.update.urpmi'' (vždy zobrazena při upgradu). Ty by neměly být používány, protože způsobují zprávu ukazující v každé následné aktualizace, a to i v případě, že uživatel již viděl zprávu mnohokrát.
HOW TO DO (příklad s ''README.install.urpmi''):
* umístit ''README.install.urpmi'' ve zdrojích / adresáře
* přidat do ''spec'' jako ''SourceX'': ''README.install.urpmi'' (nahradit ''X'' s odpovídajícím číslem)
* v ''%install section'': ''install -m644 %{SOURCEX} README.install.urpmi'' (všimněte si zde absenci ''%buildroot'')
* v '' %files'' sekci, přidejte ''README.install.urpmi'' v ''%doc'' makru nebo přidejte ''%doc'' makro, pokud tam žádný není
====== Alternativa: checkinstall ======
''checkinstall'' je již dlouhou dobu nefunkčním. Přesto z historického hlediska jistě zajímavým nástrojem na tvorbu RPM.
Velmi snadná cesta ke kompilaci balíčků ''rpm'' pro osobní použití je instalovat balíček ''checkinstall''. Kompilace ze zdrojových kódů (obvykle ''./configure && make && sudo make install'') je pozměněna tak, že příkaz ''make install'' je nahrazen příkazem ''checkinstall''. Tím se velmi zjednoduší kompilace ''rpm''.
Výhoda je v tom, že nemusíte obcházet správce balíčků, kompilujete-li programy ze zdrojových souborů. (Nepochybně lepší způsob je vytvářet ''rpm'' "řádně", jak je popsáno výše, zejména chcete-li je distribuovat ostatním.)
====== Některé odkazy ======
* [[http://milux.php5.cz/rpm.php?str=rpm&styl=spol|Milux - Linuxový zápisník - Správa balíků softwaru - RedHat Package Manager]]
* [[http://arklinux.org/ark-rpm-howto.html|Ark linux howto]]
* [[http://www-106.ibm.com/developerworks/library/l-rpm1/|IBM article on rpm building]]
* [[http://www.redhat.com/magazine/002dec04/features/betterliving-part2/|A redhat magazine article on rpm building]]
* [[http://www.gurulabs.com/GURULABS-RPM-LAB/GURULABS-RPM-GUIDE-v1.0.PDF|Pdf tutorial on rpm building made by GuruLabs]]
* [[http://fedora.redhat.com/docs/drafts/rpm-guide-en/|Red Hat RPM Guide]]
//Originál překladu - [[https://wiki.mageia.org/en/Packagers_RPM_tutorial]]. Zde naleznete [[.tvorba_rpm_zkraceno|zkrácenou verzi]] tohoto článku//