| 
| 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.
  |