- předchozí článek - následující článek - obsah - úvodní stránka - - předchozí část - následující část - první část -

Linuxové noviny Květen 1998

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?

Kompilace

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.

Rychlý start

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

Vysvětlení

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.

SPEC soubor

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.

Příkaz rpm -b

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.

Zdrojové RPM soubory

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


- předchozí část - následující část - první část - - předchozí článek - následující článek - obsah - úvodní stránka -