Tvorba RPM balíků |
Jan Kasprzak, 15. května 1998 |
V předchozích dílech našeho seriálu o systému RPM jsme rozebírali
všechny vlastnosti RPM z hlediska uživatele. V další části se budeme
věnovat RPM z hlediska vlastní tvorby RPM balíků. Co tedy dělat,
máme-li nějaký software a chceme jej zabalit do RPM balíku?
První činnost, kterou je nutno před vlastním zabalením softwaru do
formátu RPM udělat, je zkompilovat software pod Linuxem a ujistit se,
jestli vůbec pod Linuxem funguje. V následujícím budeme předpokládat,
že software lze bez problémů zkompilovat a že také funguje. Jako
příklad si vezmeme program gmemusage, který slouží k měření
obsazení operační paměti jednotlivými procesy. K jeho zkompilování
a nainstalování stačí spustit příkazy make a make install.
Bez jakéhokoli vysvětlování uvedu příklad, jak vyrobit RPM-balík gmemusage (vysvětlení bude následovat):
- Jako root nakopírujte soubor http://reality.sgi.com/raju/software/gmemusage-0.2.tar.gz
do adresáře /usr/src/redhat/SOURCES/.
- Nakopírujte soubor na výpise Soubor SPEC pro gmemusage pod názvem gmemusage-0.2.spec do adresáře /usr/src/redhat/SPECS/.
- V adresáři /usr/src/redhat/SPECS spusťte příkaz
rpm -ba gmemusage-0.2.spec. Výsledkem by měl být zdrojový
RPM soubor gmemusage-0.2-1.src.rpm v adresáři
/usr/src/redhat/SRPMS (k čemu jsou zdrojové RPM soubory,
uvidíme později) a binární RPM pro danou architekturu (gmemusage
jsem zkoušel vyrábět pouze pro platformu i386 a sparc,
ale pro sparc měl program jisté problémy. Binární RPM soubor
je v RPMS/i386/gmemusage-0.2-1.i386.rpm.
- Nově vytvořený RPM soubor lze nainstalovat příkazem
rpm -Uvh RPMS/i386/gmemusage-0.2-1.i386.rpm.
Summary: graphics memory usage meter
Name: gmemusage
Version: 0.2
Release: 1
Source: http://reality.sgi.com/raju/software/gmemusage-0.2.tar.gz
Copyright: GPL
Group: Utilities/System
Packager: Jan "Yenya" Kasprzak <kas@fi.muni.cz>
BuildRoot: /tmp/gmemusage-root
%description
This tool displays the bar graph describing memory usage of processes
on the Linux box. Uses /proc filesystem.
%prep
%setup
%build
make OPTIM="$RPM_OPT_FLAGS"
%install
mkdir -p $RPM_BUILD_ROOT/usr/X11R6/{bin,man/man1}
make PREFIX=$RPM_BUILD_ROOT/usr/X11R6 install
%files
%attr(0775,root,root) /usr/X11R6/bin/gmemusage
%attr(0644,root,root) /usr/X11R6/man/man1/gmemusage.1
|
Výpis č. 6: Soubor SPEC pro gmemusage
A teď zpět k tomu, co jsme vlastně v předchozí sekci udělali. Je
vidět několik základních faktů:
- RPM využívá adresář /usr/src/redhat.
- používá se příkaz rpm -ba
- tvorba balíku je řízena souborem s koncovkou .spec.
- vytváří se zároveň zdrojový i binární RPM soubor.
Adresář /usr/src/redhat obsahuje tyto podadresáře (lze změnit
v souboru /etc/rpmrc, což umožní vyrábět RPM balíky i jako běžný
uživatel):
- SPECS - obsahuje spec-soubory, které řídí vlastní sestavování
RPM balíku.
- SOURCES - zde jsou zdrojové soubory, ze kterých se balík vytváří.
- BUILD - do tohoto adresáře se rozbalí zdrojové soubory a probíhá zde
kompilace.
- RPMS/architektura - sem se uloží výsledné RPM soubory.
- SRPMS - zde budou výsledné zdrojové RPM soubory.
Tento soubor řídí celou kompilaci. Jeho příklad byl uveden, jednotlivé
možnosti budou podrobně popsány v následujících dílech tohoto seriálu.
Na začátku souboru je hlavička, která popisuje, o jaký balík se jedná,
odkud pochází zdrojový text, kdo balík vytvořil, jaká je jeho licence,
a množství dalších informací, později z balíku vypsatelných pomocí
rpm -q.
Dále následují jednotlivé sekce - jsou odděleny klíčovým slovem
s procentem na začátku řádku. V našem příkladu jsou použity tyto sekce:
- %description - popis balíku, který dále rozvíjí krátkou informaci
ze Summary: v hlavičče souboru.
- %prep - příprava na kompilaci. Tato sekce se vykoná jako shellovský
skript a má za úkol provést rozbalení zdrojového archívu, aplikaci
případných záplat, konfiguraci a podobně. Ve výše uvedeném souboru
tato sekce obsahuje jediný příkaz - makro (pozor, ne sekci)
%setup, které dělá přesně to, že do adresáře BUILD
rozbalí archív, uvedený v hlavičče jako Source: z adresáře
SOURCES. Tedy z celého tam uvedeného URL se použije pouze
část za posledním lomítkem. Ostatní slouží jen pro informaci.
- %build - vlastní kompilace. Jde opět o shellovský skript. Zde
je dobré si všimnout proměnné $RPM_OPT_FLAGS - jednotlivé
skripty dostávají od RPM přednastavené některé proměnné. Tato
proměnná je jednou z nich a obsahuje implicitní volby předávané
kompilátoru pro optimalizaci. Takže změnou tohoto parametru
například v /etc/rpmrc můžeme dosáhnout toho, aby se všechny
nově kompilované balíky stavěly s těmito volbami.
- %install - vlastní instalace souborů v balíku. V běžných případech
se v tomto skriptu spouští příkaz make install. Je ovšem
dobré, pokud rekompilace RPM balíku neprovede instalaci do skutečného
systému, ale někam do vlastního stromu. Tato vlastnost se jmenuje
Buildroot a zapíná se uvedením stejnojmenného parametru v hlavičce
spec-souboru. RPM pak vytvoří jmenovaný adresář a nastaví
skriptům (včetně toho %install) proměnnou
$RPM_BUILD_ROOT. Výhoda tohoto přístupu je v tom, že takto
může bez modifikace spec-souboru vytvořit RPM balík
i běžný uživatel, nikoliv jen superuživatel.
- %files - popisuje, které soubory mají být zahrnuty do RPM balíku.
Tato sekce není shellovský skript, ale seznam.
Je možno též specifikovat atributy jednotlivých souborů, čímž
umožníme vytvořit RPM balík i běžnému uživateli. Neuvedeme-li
atributy, RPM vezme takové atributy, jaké má jmenovaný soubor
v době tvorby balíku.
K vytváření RPM balíků se používá příkaz rpm -b. Jeho argumentem
je .spec soubor. Akceptuje následující přepínače:
- -p Vykoná pouze %prep sekci ve spec-souboru.
- -l Zkontroluje, jestli soubory jmenované v sekci %files
skutečně existují.
- -c Vykoná %prep a %build.
- -i Vykoná %prep, %build a %install.
- -b Vytvoří binární RPM soubor (po vykonání %prep,
%build a %install).
- -a Vytvoří binární a zdrojový RPM soubor (po vykonání
%prep, %build a %install).
- --short-circuit Používá se ve spojitosti s -bc a -bi.
Vykoná pouze jmenovanou sekci, bez předchozích.
- --timecheck číslo Vypíše varování, pokud se snažíme do RPM balíku
zabalit soubor starší než daný počet sekund.
- --clean Smaže kompilační strom příslušného balíku v adresáři
/usr/src/redhat/BUILD po skončení tvorby balíku.
- --test Otestuje syntaxi spec-souboru, neprovádí
žádné kompilační akce.
- --sign Vytvoří balík s PGP podpisem.
Kromě rpm -b lze také použít rpm -t a jako parametr uvést
soubor ve formátu tar.gz. Takovýto archív se rozbalí a jako spec-soubor se použije první soubor s koncovkou .spec, obsažený
v archívu. Při kompilaci se samozřejmě neprovádí sekce %prep.
Již několikrát padla zmínka o zdrojových RPM souborech. To je soubor
s koncovkou .src.rpm. Takovýto soubor obsahuje v sobě spec-soubor příslušného balíku, dále všechny soubory potřebné
k sestavení binárního RPM balíku (zejména soubory uvedené v hlavičce
v položce Source) a případnou ikonku RPM balíku.
Zdrojový RPM balík lze zpracovávat třemi způsoby. První možnost je
tento balík nainstalovat pomocí rpm -i. Všechny soubory, které
zdrojový balík obsahuje, jsou nainstalovány do adresáře SOURCES
a spec-soubor je poté přesunut do adresáře SPECS. Další
dvě možnosti jsou vytvoření binárního RPM balíku pro danou
architekturu, případně vytvoření jak binárního, tak i zdrojového RPM
balíku. Dosáhneme toho příkazem rpm --recompile balík.src.rpm,
případně rpm --rebuild balík.src.rpm. Oproti příkazu rpm
-ba se navíc implicitně smaže kompilační adresář tak, jako kdybychom
použili --clean.
To zatím jako úvod do problematiky tvorby vlastních RPM balíků stačí.
Příště se podrobněji vrátíme k formátu spec-souboru
a k podrobnostem této problematiky.
|