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

Linuxové noviny 11-12/98

Tvorba RPM balíků - pokračujeme

Jan Kasprzak, 1. listopadu 1998

Makra

V předchozích částech tohoto seriálu jsme viděli v činnosti některá makra (například %setup nebo %patch v sekci %prep). Nyní se na problematiku maker zaměříme detailněji.

Makro %setup a jeho možnosti

Toto makro má (jak víme) za úkol vzít zdrojový archív a rozbalit jej v adresáři BUILD. Předpokládá se, že vznikne adresář balík-verze, ve kterém budou všechny potřebné soubory. Ale co když zdrojový archív obsahuje jiný horní (top-level) adresář nebo se dokonce rozbaluje přímo do pracovního adresáře? Co dělat, pokud máme více zdrojových archívů (například X Window System má tři)?

  • -n adresář - tímto přepínačem makra %setup říkáme, že horní adresář se jmenuje jinak, než implicitní balík-verze.

  • -c - přepínač -c říká, že RPM má horní adresář vytvořit, přepnout se do něj a pak teprve začít rozbalovat archív Source0.

  • -D - makro %setup implicitně smaže horní adresář, pokud tento existuje. Máme-li ovšem více zdrojových archívů, musíme všem voláním makra %setup kromě prvního říct, aby tento adresář nebyl smazán. Dosáhneme toho právě přepínačem -D.

  • -T - neřekneme-li jinak, makro %setup rozbalí archív Source0. Pokud je tento archív již rozbalen (například v dalších voláních tohoto makra), je nutné uvést přepínač -T.

  • -a číslo
  • -b číslo - rozbalí zdrojový archív Sourcečíslo. Přepínač -a (after) provede rozbalení až po přepnutí se do adresáře BUILD/balík-verze (nebo jiného), přepínač -b (before) toto provede před přepnutím se do tohoto adresáře, čili v adresáři BUILD.

Příklad

Máme-li dva zdrojové archívy, můžeme mít ve spec-souboru například toto:

...
Source0: balík-1.0.tar.gz
Source1: balík-fonts-1.0.tar.gz
...
%prep
%setup
%setup -T -D -a 1
...

Makro %patch - aplikace záplat

Makro %patch akceptuje podobné přepínače, jako program patch. Navíc je zde pouze specifikace toho, který soubor se má použít. Následující dva řádky jsou ekvivalentní a aplikují soubor, uvedený v hlavičce jako Patch2:

%patch2
%patch -P 2

Kromě velkého -P toto makro akceptuje ještě přepínače -s, -E, -pN a -b suffix.

Větvení

RPM je ideální nástroj pro generování balíků pro různé architektury a různé operační systémy z jednoho konfiguračního souboru. Svět ale není ideální, a proto je někdy potřeba upravit běh kompilace nebo vlastnosti balíku pro daný systém nebo danou architekturu. V kterémkoli ze skriptů nebo v sekci %files lze říct, že určitá část platí pouze pro některou architekturu nebo operační systém. K tomu lze použít direktivy %ifarch a %ifos (případně %ifnarch a %ifnos), s dalšími direktivami %else a %endif. Význam je intuitivně jasný, proto uvedu jen příklady. V sekci %prep například může být:

...
%ifarch alpha sparc64
%patch4 -p1 -b .64-bit
%endif
...

Podobně je možné v sekci %files zařadit nebo nezařadit určité soubory do distribuce podle konkrétní architektury nebo operačního systému.

Uživatelská makra

Ve spec-souboru si uživatel může definovat i svá vlastní makra pomocí syntaxe %define makro hodnota. Makro lze použít pomocí znaku procento jedním ze dvou ekvivalentních způsobů:

%makro
%{makro}

RPM má dvě předdefinovaná makra: %PACKAGE_VERSION a %PACKAGE_RELEASE. Tato makra umožní mít verzi balíku pouze na jednom místě a psát následující text:

...
Version: 1.2.26
Source0:\
  ftp://.../.../ssh-%{PACKAGE_VERSION}.tar.gz
Source1:\
  ftp://.../.../ssh-%{PACKAGE_VERSION}.tar.gz.sig
...

Více balíků v jednom souboru?

Někdy je vhodné rozdělit soubory, které vzniknou například překompilováním zdrojového tar.gz archívu, do více balíků. Jde-li například o knihovnu, vytvářejí se typicky dva balíky. V jednom z nich je sdílená knihovna plus případná obecná dokumentace, konfigurační soubory a podobně, a ve druhém (obvykle nazvaném knihovna-devel je statická verze knihovny a její hlavičkové soubory). Nebo například u síťové aplikace lze mít zvlášť balík serveru a zvlášť klienta.

Systém RPM umožňuje takovéto balíky vytvářet najednou, to jest z jednoho zdrojového archívu a jednoho spec-souboru. Výsledkem je kromě několika binárních RPM souborů jen jeden zdrojový (src.rpm) RPM-soubor.

Z jednoho zdrojového RPM souboru lze tedy vytvářet více binárních tzv. sub-balíků (sub-packages). Každý takovýto balík by měl mít ovšem svoji hlavičku (tagy Summary, Group a další). Hlavičku sub-balíku uvedeme do spec-souboru za direktivu %package:

...
Name: libpenguin
Summary: The Penguin library
Group: Penguins/Libraries
...
%package devel
Group: Development/Penguins
Summary: The Static Penguin library\
    and its header files
...
%package -n penguin-builder
Group: Development/Penguins
Summary: The Penguin User Interface Builder
...

Výsledkem by pak byly balíky libpenguin-verze-release.arch.rpm, libpenguin-devel-verze-release.arch.rpm a penguin-builder-verze-release.arch.rpm. Pokud chceme vytvořit sub-balík s úplně novým názvem (bez prefixu z hlavního balíku), použijeme direktivu %package -n jméno.

Každý sub-balík musí mít svůj tag Group a Summary. Ostatní tagy lze zdědit z hlavního balíku. Kromě toho musí být pro každý sub-balík uvedena sekce %description (uvádí se se stejným argumentem jako direktiva %package, včetně flagu -n):

%description devel
...
%description -n penguin-builder

Podobně je možné uvádět speciální pre- a post-instalační skripty a spouště pro jednotlivé balíky:

%post -n penguin-builder
...
%trigger devel -- penguin-builder
...

I sekce %files je pak rozdělena na část hlavního balíku a část sub-balíků. Pokud sekci %files pro daný sub-balík neuvedeme vůbec, RPM daný binární RPM soubor nevytvoří (uvedeme-li sekci %files prázdnou, vytvoří se RPM soubor, který neobsahuje žádné soubory, jen hlavičku a případné skripty). Takže umístíme-li tuto sekci do větvení, můžeme sub-balík vytvářet jen pro některé architektury:

%ifarch alpha
%files alpha-fix
/usr/bin/foobar-alpha-fix
%doc README-alpha-fix
%endif

Závěr

Tím končí seriál o RedHat Package Manageru, systému RPM. Snažil jsem se v tomto seriálu se aspoň dotknout každé problematiky, která se týká používání tohoto systému a tvorby balíků v něm. Podrobnější informace o RPM lze nalézt v knize Maximum RPM, na WWW stránkách RPM http://www.rpm.org nebo v diskusním listu, zaměřeném na systém RPM rpm-list@redhat.com. Archív listu je dostupný na adrese http://archive.redhat.com/rpm-list/. *


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