<!doctype linuxdoc system>
<!-- $Id: RPM-HOWTO-sl.sgml,v 1.9 2002/04/11 16:35:50 roman Exp $ -->

<article>

<title>RPM-HOWTO
<author>Donnie Barnes, &lt;djb@redhat.com&gt;
<date>v3.0, 3. november 1999

<toc>

<sect>Uvod

<p>RPM je kratica za <bf/R/ed Hat <bf/P/ackage <bf/M/anager, program za
upravljanje paketov podjetja Red Hat. Kljub omembi Red Hata v imenu
je to popolnoma odprt sistem za pakiranje, ki ga lahko 
uporablja vsakdo. Uporabnikom omogoča, da vzamejo izvirno kodo novega
programja in jo zapakirajo v paket z izvirno ali binarno obliko.
Paket z binarno obliko programja je enostavno namestiti in mu slediti,
paket z izvirno kodo pa je enostavno preoblikovati. RPM vzdržuje zbirko
podatkov za vse pakete in datoteke v njih, kar lahko uporabimo za
preverjanje paketov in iskanje informacij o datotekah in/ali paketih.

Podjetje Red Hat Software vzpodbuja izdajatelje drugih distribucij, da
si ogledajo RPM in ga uporabijo pri pripravi svojih distribucij. RPM
je precej prilagodljiv in ga je enostavno uporabljati, obenem pa je osnova
za zelo obsežne sisteme. Poleg tega je popolnoma odprt in vsem na
voljo. Zelo veseli bomo vaših obvestil o napakah in 
popravkih zanje. RPM je dovoljeno uporabljati in razširjati v skladu z
določili GNU GPL.

Podrobnejši opis RPM je na voljo v knjigi avtorja Eda Baileyja
<em>Maximum RPM</em>. Vzamete si jo lahko ali jo naročite na <url
url="http://www.redhat.com/">.

<sect>Pregled

<p>Najprej dovolite, da vam nekoliko predstavimo RPM. Zasnovan je bil zato, 
da bi omogočil uporabo ,,čiste`` izvirne kode. RPP (prejšnji sistem za pakiranje 
podjetja Red Hat, s katerim nima RPM nič
skupnega) je uporabljal modificirano izvirno kodo, iz katere je
izdelal pakete z izvirno obliko.

Načeloma je mogoče namestiti izvirni RPP in ga potem brez težav
zgraditi. Vendar izvirna koda v takem paketu ni nujno enaka
izvirniku, nikjer pa ni zapisano, katere spremembe je treba
opraviti, da se bo paket zgradil. Prvotno izvirno kodo pa je treba
vzeti ločeno. Z RPM dobimo prvotno izvirno kodo, ločeno v istem paketu
pa še popravke, ki so bili uporabljeni pri izdelavi binarne oblike.
To je velika prednost. Zakaj? Razlogov je več. Eden je ta, da vam ob
izidu nove različice programa ni treba vedno začeti od začetka, da bi
program prevedli v Red Hat Linuxu. Ogledate si lahko tudi popravek in
tako ugotovite, kaj boste morda morali še postoriti, da se bo program
prevedel. Tako so privzete nastavitve pri prevajanju enostavno vidne.

RPM je zasnovan tudi z zmogljivimi možnostmi poizvedovanja. V skupni
zbirki podatkov lahko iščemo nameščene pakete ali pa posamične
datoteke. Poiščemo lahko tudi, v kateri paket sodi določena datoteka,
oziroma od kod izvira. Paketi RPM so stisnjene arhivske datoteke,
vendar lahko po njih iščemo enostavno in hitro, saj imajo glavo
z vsemi potrebnimi informacijami o vsebini. To omogoča hitro iskanje.

Paketi RPM podpirajo tudi zmogljivo možnost preverjanja. Če vas skrbi,
da ste izbrisali datoteko, pomembno za neki paket, lahko to
enostavno preverite. O morebitnih nepravilnostih boste obveščeni. Če
je treba, lahko zdaj paket znova namestite. Ohranijo se tudi vse
vaše nastavitvene datoteke.

Za mnogo drugih idej in zasnov, ki so uporabljene pri RPM, bi se radi
zahvalili vsem, ki skrbijo za distribucijo BOGUS. Čeprav je bil RPM v celoti
napisan v Red Hat Software, njegovo delovanje temelji na kodi, ki so
jo napisali pri BOGUS (PM in PMS).

Drugo izdajo tega spisa je novembra 1998 prevedel Andrej Grauf, to
(tretjo) pa aprila 2002 Primož Peterlin
<tt>&lt;primoz.peterlin@biofiz.mf.uni-lj.si&gt;</tt>.

<sect>Splošne informacije
<p>
<sect1>Kako do RPM?
<p>
Najlažja pot, da pridete do RPM, je, da namestite Red Hat Linux. A tudi če
tega ne želite, lahko RPM vseeno dobite in uporabljate. Najdete ga
na naslovu <url url="http://www.rpm.org/">.

<sect1>Zahteve za RPM

<p>RPM bi se moral prevesti v vseh sistemih, podobnih Unixu. Preveden
in v rabi je v sistemih Tru64 Unix, AIX, Solaris, SunOS in
praktično vseh različicah Linuxa.

Za izgradnjo paketov RPM iz izvirne kode potrebujete tudi vse
programe, ki so navadno potrebni za izgradnjo paketov,
npr. <tt>gcc</tt>, <tt>make</tt> itd.

<sect>Raba RPM

<p>V najenostavnejši obliki lahko z RPM namestimo paket s prevedenim
programjem:
<tscreen><verb>
rpm -i foobar-1.0-1.i386.rpm
</verb></tscreen>
Enako enostaven je ukaz za odstranitev paketa:
<tscreen><verb>
rpm -e foobar
</verb></tscreen>
Nekoliko bolj zapleten, a nadvse uporaben ukaz omogoča namestitev
paketov prek FTP. Če ste povezani v omrežje in bi želeli namestiti nov
paket, morate podati samo veljavni naslov URL, denimo:
<tscreen><verb> rpm -i
ftp://ftp.pht.com/pub/linux/redhat/rh-2.0-beta/RPMS/foobar-1.0-1.i386.rpm
</verb></tscreen>
Ne pozabite, da se bo ta RPM zdaj preverjal in/ali nameščal prek FTP.

To so preprosti ukazi. RPM se lahko uporablja na več različnih
načinov. Pregled možnosti, zajetih v vašo izdajo RPM, dobite z ukazom
<tscreen><verb>
rpm --help
</verb></tscreen>

Podrobnejši opis možnosti najdete v priročniku za RPM, ki ga prikličete na zaslon
z ukazom:
<tscreen><verb>
man rpm
</verb></tscreen>

<sect>Kaj pa lahko dejansko počnemo z RPM?

<p>RPM je zelo uporabno orodje in, kot boste videli, ima kar nekaj
izbir. Njihova uporabnost je najlaže razvidna iz zgledov. Omenili smo
že, kako namestiti in odstraniti pakete, zdaj pa si oglejmo še nekaj
drugih zgledov:

<itemize>

 <item>Denimo, da ste ponesreči zbrisali nekaj datotek, niste pa
       povsem prepričani, kaj ste zbrisali. Če želite preveriti ves svoj 
       sistem in ugotoviti, kaj bi lahko manjkalo, uporabite
<tscreen><verb>
rpm -Va
</verb></tscreen>

 <item>Denimo, da naletite na neznano datoteko. Da bi ugotovili,
       kateremu paketu pripada, uporabite:
<tscreen><verb>
rpm -qf /usr/X11R6/bin/xjewel
</verb></tscreen>
Rezultat bi lahko bil nekaj takega kot:
<tscreen><verb>
xjewel-1.6-1
</verb></tscreen>

 <item>Našli ste paket RPM z imenom koules, pa ne veste, kaj je
       to. Kaj več o njem izveste z ukazom:
<tscreen><verb>
rpm -qpi koules-1.2-2.i386.rpm
</verb></tscreen>
Rezultat, ki bi ga lahko dobili:
<tscreen><verb>
Name        : koules                   Distribution: Red Hat Linux Colgate
Version     : 1.2                      Vendor: Red Hat Software
Release     : 2                        Build Date: Mon Sep 02 11:59:12 1996
Install date: (none)                   Build Host: porky.redhat.com
Group       : Games                    Source RPM: koules-1.2-2.src.rpm
Size        : 614939
Summary     : SVGAlib action game with multiplayer, network, and sound support
Description : This arcade-style game is novel in conception and excellent in
execution. No shooting, no blood, no guts, no gore.  The play is simple,
but you still must develop skill to play.  This version uses SVGAlib to
run on a graphics console.
</verb></tscreen>

 <item>Zdaj bi radi videli, katere datoteke ta paket RPM namesti.
       Uporabite:
<tscreen><verb>
rpm -qpl koules-1.2-2.i386.rpm
</verb></tscreen>
Rezultat:
<tscreen><verb>
/usr/doc/koules
/usr/doc/koules/ANNOUNCE
/usr/doc/koules/BUGS
/usr/doc/koules/COMPILE.OS2
/usr/doc/koules/COPYING
/usr/doc/koules/Card
/usr/doc/koules/ChangeLog
/usr/doc/koules/INSTALLATION
/usr/doc/koules/Icon.xpm
/usr/doc/koules/Icon2.xpm
/usr/doc/koules/Koules.FAQ
/usr/doc/koules/Koules.xpm
/usr/doc/koules/README
/usr/doc/koules/TODO
/usr/games/koules
/usr/games/koules.svga
/usr/games/koules.tcl
/usr/man/man6/koules.svga.6
</verb></tscreen>
</itemize>
To je le nekaj zgledov. Bolj domiselnih se boste zlahka domislili
sami, ko boste v RPM bolj domači.

<sect>Izdelava paketov RPM

<p>Pakete RPM je razmeroma enostavno zgraditi, še posebej, če se
programje v vašem sistemu že gladko prevede. Predpostavili bomo, da
že znate prevesti program iz izvirne oblike. Če ne, morate verjetno
pred tem spisom prebrati še kaj.

Osnovni potek izdelave paketov RPM je naslednji:
<itemize>
  <item>Poskrbite, da se izvirna koda paketa, ki ga želite zgraditi,
  prevede v vašem sistemu.
	  <item>Izdelajte popravek za vse spremembe, ki ste jih morali
  opraviti v izvirni kodi, da se je prevedla.
  <item>Ustvarite specifikacijsko datoteko za paket.
  <item>Preverite, ali je vse na svojem mestu.
  <item>Z RPM zgradite paket.
</itemize>
Pri normalnem delovanju RPM zgradi tako binarne kot izvirne pakete.

<sect1>Datoteka Spec

<p>
Začeli bomo z obravnavo datoteke spec. Ta datoteka je potrebna za
izdelavo paketov. Obsega opis paketa, skupaj z navodili za izdelavo
in seznamom vseh programov, ki bodo nameščeni.

V navadi je, da datoteke spec poimenujemo v skladu s standardnim
dogovorom. Imenovala naj bi se: <em>ime paketa</em> -vezaj-
<em>številka različice</em> -vezaj- <em>številka izdaje</em> -pika-
<tt>spec</tt>. Tako zagotovimo, da ob hkratni namestitvi več različic
programa v sistemu ne nastane zmeda.

Oglejmo si kratko datoteko spec (<tt>eject-2.0.2-1.spec</tt>):
<tscreen><verb>
Summary: A program that ejects removable media using software control.
Name: eject
Version: 2.0.2
Release: 3
Copyright: GPL
Group: System Environment/Base
Source: http://metalab.unc.edu/pub/Linux/utils/disk-management/eject-2.0.2.tar.gz
Patch: eject-2.0.2-buildroot.patch
BuildRoot: /var/tmp/%{name}-buildroot

%description
The eject program allows the user to eject removable media
(typically CD-ROMs, floppy disks or Iomega Jaz or Zip disks)
using software control. Eject can also control some multi-
disk CD changers and even some devices' auto-eject features.

Install eject if you'd like to eject removable media using
software control.

%prep
%setup -q
%patch -p1 -b .buildroot

%build
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/man/man1

install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject
install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README TODO COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

%changelog
* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com> 
- auto rebuild in the new build environment (release 3)

* Wed Feb 24 1999 Preston Brown <pbrown@redhat.com> 
- Injected new description and group.

[ Drugi vnosi sprememb so izpuščeni, da izpis ni predolg. ] 
</verb></tscreen>


<sect1>Glava
<p>
Glava obsega nekaj standardnih polj, ki jim morate izpolniti. Pri
nekaterih posebej opozorimo na podrobnosti. Izpolniti je treba
naslednja polja:
<itemize>
  <item><tt>Summary</tt>: Enovrstični opis paketa.
  <item><tt>Name</tt>: ime se mora ujemati z imenom datoteke paketa RPM, ki ga
       nameravate uporabiti.
  <item><tt>Version</tt>: ime različice se mora ujemati z imenom
  paketa RPM, ki ga
       nameravate uporabiti.
  <item><tt>Release</tt>: Številka izdaje paketa za isto različico
  (npr. če za izdelani
       paket ugotovimo, da je rahlo okvarjen in ga je treba znova 
       ustvariti, bo naslednji paket imel številko izdaje 2).
	    <item><tt>Copyright</tt>: Vrstica označuje, pod kakšnimi
  pogoji je paket mogoče uporabljati, razmnoževati in
  razširjati. Navadno se uporabljajo licence GPL, BSD, MIT, javna
  last (public domain), program za pokušino (distributable) ali
  komercialne licence.
  <item><tt>Source</tt>: Vrstica kaže na nahajališče prvotne izvirne datoteke HOME.
       Potrebovali jo boste, če boste želeli znova vzeti prvotno
  izvirno kodo, denimo, ko boste obnavljali različico programa. Opozorilo: pot do datoteke v tej
       vrstici <em>se mora</em> ujemati s potjo do datoteke v vašem
       sistemu, zatorej ne spreminjajte imena izvirne
  datoteke. Določimo lahko tudi več kot
       eno izvirno datoteko:
<tscreen><verb>
Source0: blah-0.tar.gz
Source1: blah-1.tar.gz
Source2: fooblah.tar.gz
</verb></tscreen>
Te datoteke bi šle v imenik SOURCES. (Struktura imenika je obravnavana
  pozneje v  razdelku ,,Imeniška struktura izvora``.)
  <item><tt>Patch</tt>: To je mesto, na katerem boste lahko našli popravek, če ga boste
       morali znova zajeti. Opozorilo: Ime datoteke se mora ujemati z
       imenom <em>vašega</em> popravka. Prav
       tako, kot imamo lahko več virov, imamo lahko tudi več
  popravkov, denimo:
       Rezultat bo videti nekako tako:
<tscreen><verb>
Patch0: blah-0.patch
Patch1: blah-1.patch
Patch2: fooblah.patch
</verb></tscreen>
Tudi te datoteke gredo v imenik SOURCES.
  <item><tt>Group</tt>: Kategorija, v katero sodi
  program. Visokonivojski namestitveni programi, npr. gnorpm,
  uporabljajo hierarhično razvrstitev programja. Zadnja različica
  hierarhije je na voljo v datoteki <tt>/usr/doc/rpm-*/GROUPS</tt>,
       trenutna drevesna struktura skupine pa je:
<tscreen><verb>
Amusements/Games
Amusements/Graphics
Applications/Archiving
Applications/Communications
Applications/Databases
Applications/Editors
Applications/Emulators
Applications/Engineering
Applications/File
Applications/Internet
Applications/Multimedia
Applications/Productivity
Applications/Publishing
Applications/System
Applications/Text
Development/Debuggers
Development/Languages
Development/Libraries
Development/System
Development/Tools
Documentation
System Environment/Base
System Environment/Daemons
System Environment/Kernel
System Environment/Libraries
System Environment/Shells
User Interface/Desktops
User Interface/X
User Interface/X Hardware Support
</verb></tscreen>
  <item><tt>BuildRoot</tt>: S to vrstico pri izdelavi in namestitvi navedeni
       imenik označimo kot korenski imenik za gradnjo paketa. To
  možnost lahko uporabite 
       pri preizkušanju paketa, preden ga namestite v svoj računalnik.
  <item><tt>%description</tt>: Ni ravno del glave, vendar ga vseeno
  opišimo tu. Za en paket in/ali podpaket je potrebna ena opisna
       označba. To je večvrstično polje, ki naj obsega
       razumljiv opis paketa.
</itemize>

<sect1>Prep
<p>
Prep je drugi razdelek v datoteki spec. V njem navedemo vse, kar je
treba storiti z izvirno kodo, da jo pripravimo za prevajanje.

Pazite: v teh razdelkih dejansko navedemo kar skript ukazne lupine. Če
bi že imeli napisan skript, ki dearhivira datoteko z izvirno kodo in
izvede popravke, bi ga lahko enostavno prilepili pod oznako
<tt>%prep</tt>. Delo pa si lahko malce poenostavimo z uporabo makroukazov, 
vgrajenih v RPM.

Prvi izmed teh makroukazov je <tt>%setup</tt>. V najpreprostejši obliki
(brez stikal ukazne vrstice) preprosto dearhivira datoteko z izvirno
kodo in se premakne v imenik z izvirno kodo. V ukazu lahko uporabite
tudi naslednja stikala:

<itemize>
  <item><tt>-n ime</tt> nastavi ime delovnega imenika na dano ime.
       Privzeta vrednost je <tt>$NAME-$VERSION</tt>. Druge možnosti so
       <tt>$NAME</tt>, <tt>${NAME}${VERSION}</tt> ali karkoli
       uporablja arhivska datoteka tar.
       Ne pozabite, da spremenljivke ,,<tt>$</tt>`` niso prave
       spremenljivke, ki so na voljo v datoteki spec. Tu jih uporabljamo
       samo kot zgled. V svojem paketu morate uporabiti pravo ime in
       različico, ne pa spremenljivke.
  <item><tt>-c</tt> ustvari omenjeni imenik in se premakne vanj,
       <em>preden</em> dearhivira arhivsko datoteko.
  <item><tt>-b #</tt> pred premikom v imenik razpakiramo <tt>Source#</tt> (# =
       0,1 ...) To
       stikalo nima smisla skupaj  s <tt>c</tt>, zato te kombinacije ne
       uporabljajte. Stikalo je uporabno samo, kadar imamo več
       izvirnih datotek.
  <item><tt>-a #</tt> najprej se pomaknemo v imenik in nato dearhiviramo Source#.
  <item><tt>-T</tt> S tem stikalom onemogočimo privzeti način
       dearhiviranja za <tt>Source0</tt>. Obvezno zahteva stikalo
       <tt>-b 0</tt> ali <tt>-a 0</tt> za dearhiviranje. Uporabite ga,
       kadar so na voljo sekundarni viri.
  <item><tt>-D</tt> delovnega imenika pred dearhiviranjem ne
       zbriši. Vsebina arhiva bo dodana k že obstoječim datotekam v
       delovnem imeniku. Stikalo je primerno samo, kadar
       imamo več kot en nastavitveni makroukaz. Uporabljalo naj bi se
       samo v drugem in naslednjih nastavitvenih makroukazih, nikoli
       pa ne v prvem.
</itemize>

Naslednji makroukaz na voljo je <tt>%patch</tt>. Pomaga pri
avtomatizaciji procesa uvajanja popravkov v vire. V njem lahko
uporabite več stikal, ki so navedena spodaj:
<itemize>
  <item><tt>#</tt> bo na izvirni kodi uporabil popravek <tt>Patch#</tt>
  <item><tt>-p #</tt> določi število imenikov, ki jih je treba pri
  ukazu        <tt>patch(1)</tt> izpustiti iz poti
  <item><tt>-P</tt> Makroukaz <tt>%patch</tt> pozna dve obliki
  skladnje. V prvi številko popravka kar dopišemo na koncu ukaza, v
  drugi pa uporabimo stikalo <tt>-P</tt>. Drugi popravek, denimo,
  lahko tako izvedemo z ukazom <tt>%patch2</tt> ali <tt>%patch -P
  2</tt>. Prva oblika privzeto izvede popravek <tt>Patch</tt> (ali
  <tt>Patch0</tt>), s stikalom <tt>-P</tt> pa to preprečimo. To stikalo je
       uporabno v drugem ali naslednjih makroukazih <tt>%patch</tt>, ki zahtevajo
       drugačno vrednost kot prvi makro.
<item><tt>-b</tt> <em>pripona</em> določa, da se prvotna datoteka shrani
  z imenom <em>ime.pripona</em>.
</itemize>

To naj bi bili vsi makri, ki jih potrebujete. Ko jih boste pravilno
sestavili, lahko opravite tudi druge nastavitve, ki jih je treba
opraviti s skripti ukazne lupine. Vse vrstice pred makrom
<tt>%build</tt> (obravnavan v naslednjem razdelku) se izvedejo v
ukazni lupini. V zgornjem zgledu si oglejte, kaj vse lahko
opravimo na tem mestu.

<sect1>Prevajanje

<p>
V tem razdelku dejansko sploh ni makrov. Sem preprosto napišemo vse
ukaze, potrebne za to, da izvirno kodo prevedemo in zgradimo program, ko je
arhiv z izvirno kodo že dearhiviran, popravki vneseni, mi pa smo se že
premaknili v delovni imenik. Tudi ti ukazi se posredujejo ukazni
lupini, tako da lahko sem vpišemo katerekoli veljavne ukaze ukazne
lupine, skupaj s komentarji.

<bf>Pomembno:</bf> Trenutni delovni imenik se v vsakem razdelku
ponastavi na vrh izvirnega imenika. Ne pozabite tega. Če je treba,
se lahko premaknete v podimenike z ukazom <tt>cd</tt>.

Spremenljivka <tt>RPM_OPT_FLAGS</tt> se določi glede na vrednosti v
nastavitveni datoteki <tt>/usr/lib/rpm/rpmrc</tt>. V njej lahko
preverite, ali so uporabljene vrednosti primerne za vaš sistem
(navadno so). Če niste prepričani, te spremenljivke v datoteki Spec ne
uporabljajte, saj je njena raba neobvezna.

<sect1>Nameščanje
<p>
Tudi v tem razdelku ni makrov. Vanj vstavite ukaze, s katerimi
namestite program. Če imate na voljo ukaz <tt>make install</tt>, sodi
sem. Če ga nimate, lahko bodisi popravite datoteko <tt>Makefile</tt>
tako, da bo podpirala <tt>make install</tt>, bodisi program ,,ročno``
namestite z ukazi ukazne lupine. Svoj trenutni imenik lahko obravnavate
kot vrh izvirnega imenika.

Z branjem spremenljivke <tt>RPM_BUILD_ROOT</tt> izveste, kateri
imenik je v glavi nastavljen kot korenski imenik gradnje
(<tt>BuildRoot</tt>). Nastavljanje vrhnjega imenika sicer ni obvezno,
je pa nadvse priporočljivo, da med izdelavo paketov RPM ne ponečedimo
svojega sistema s programi, ki niso v datoteki RPM. Pomnite: podatki o
nameščenih programih se ne osvežujejo ob izdelavi paketa RPM, temveč

šele ob namestitvi binarnega paketa.

<sect1>Higiena sistema
<p>
Pametno je, da pred začetkom gradnje paketa vedno zagotovimo, da
začenjamo v čistem imeniku, v katerem ni ostankov prejšnjih
gradenj. Pri tem si lahko pomagamo z makroukazom <tt>%clean</tt>. Za
njim preprosto navedemo ukaze, ki odstrelijo stari korenski imenik
gradnje. Previdneži bodo, pred ga bodo uporabili, preverili, ali ni
spremenljivka <tt>RPM_BUILD_ROOT</tt> nastavljena na <tt>/</tt>...

<sect1>Izbirni pred- in ponamestitveni/odstranitveni skripti
<p>
Vstavite lahko skripte, ki se izvedejo pred namestitvijo ali odstranitvijo
binarnih paketov ali po njiju. Ob namestitvi paketov, ki vsebujejo
deljene knjižnice, bomo, denimo, tu pognali ukaz <tt>ldconfig</tt>.
Makroukazi za vsak skript so v obliki:
<itemize>
  <item>%pre je makro, ki izvede prednamestitvene skripte.
  <item>%post je makro, ki izvede ponamestitvene skripte.
  <item>%preun je makro, ki izvede predodstranitvene skripte.
  <item>%postun je makro, ki izvede poodstranitvene skripte.
</itemize>
Vsebina teh razdelkov mora biti v skladnji ukazne lupine (brez
glave<tt>#!/bin/sh</tt>).

<sect1>Datoteke
<p>
V tem razdelku <em>moramo</em> navesti vse datoteke, ki se namestijo z
binarnim paketom. RPM ne more vedeti, katere binarne datoteke se
namestijo kot rezultat ukaza <tt>make install</tt>. Bile so
sicer zamisli, da bi pred namestitvijo paketa in po njej z ukazom
<tt>find</tt> prešteli vse datoteke v sistemu. V večuporabniškem
sistemu to ne gre, ker lahko med nameščanje paketa tečejo tudi drugi
procesi, ki tudi sami ustvarjajo datoteke.

Na voljo je nekaj makroukazov za posebna opravila.
Navedeni in opisani so spodaj:
<itemize>
  <item><tt>%doc</tt> se uporablja za označevanje dokumentacije v izvirnem paketu,
       ki jo želite namestiti z binarnim paketom. Spisi se bodo
       namestili v imenik
       <tt>/usr/doc//$NAME-$VERSION-$RELEASE</tt>. S tem makrom lahko v ukazni
       vrstici navedete tudi več spisov hkrati, ali pa ločeno z uporabo
       makra <tt>%doc</tt> za vsakega posebej.
  <item><tt>%config</tt> se uporablja za označevanje nastavitvenih datotek v
       paketu. Sem spadajo datoteke, kot so <tt>sendmail.cf</tt>, <tt>passwd</tt> itd. Če
       paket z nastavitvenimi datotekami pozneje odstranite, se
       bodo odstranile vse nespremenjene datoteke, vse spremenjene
       datoteke pa bodo dobile prvotno ime s pripono
       <tt>.rpmsave</tt>. Tudi pri tem makroukazu
       lahko navedete tudi več datotek.
  <item><tt>%dir</tt> označuje, da posamični imenik na seznamu datotek
       sodi k paketu. Če navedemo ime imenika <em>brez</em>
       makra <tt>%dir</tt>, bodo vse datoteke v tem imeniku del
       prevedenega paketa in pozneje nameščene kot del paketa.
<item><tt>%defattr</tt> omogoča, da za datoteke, navedene za njim,
       navedemo privzete prilastke. Slednje navajamo v obliki
       (<em>način</em>, <em>lastnik</em>, <em>skupina</em>), pri čemer
       je <em>način</em> osmiško število, ki določa zaščito (v enaki skladnji,
       kot jo pozna <tt>chmod</tt>), <em>lastnik</em> je uporabniško ime
       lastnika, <em>skupina</em> pa ime skupine, ki bi ji radi
       pripisali datoteke. Z znakom <tt>-</tt> pustimo vrednost polja
       na enaki vrednosti, kot jo ima ob namestitvi (v zgledu je,
       denimo, <em>način</em> puščen nespremenjen).
  <item><tt>%files f &lt;ime datoteke&gt;</tt> nam omogoča, da
       datoteke navedemo v poljubni
       datoteki znotraj korenskega imenika gradnje. To je uporabno takrat, 
       kadar zna paket sam sestaviti seznam
       datotek. Datoteko s seznamom preprosto dodamo tu, namesto da bi
       tipkali seznam datotek.
</itemize>

Največja nevarnost pri navajanju datotek je navajanje
imenikov. Če, denimo, po nesreči navedete <tt>/usr/bin</tt>, bodo v vašem
binarnem paketu vse datoteke, ki so v imeniku <tt>/usr/bin</tt> v
vašem sistemu.

<sect1>Dnevnik sprememb
<p>
Tu si zapisujemo, kakšne spremembe smo opravili, ko smo paket
osvežili. Posebej pri popravljanju starega paketa RPM je
koristno, da navedemo vse spremembe, ki smo jih opravili.

Skladnja je enostavna. Vsak nov vnos začnemo z zvezdico (<tt>*</tt>),
tej sledi datum, naše ime in naš e-poštni naslov. Datum naj bo v
enaki obliki, kot ga vrne ukaz
<tscreen><verb>
date +"%a %b %d %Y"
</verb></tscreen>
Preostanek vnosa je prosto besedilo, ki pa naj bo vseeno urejeno v
neki koherentni obliki.

<sect>Gradnja paketa
<p>
<sect1>Struktura imenika z izvirno kodo
<p>
Najprej potrebujemo pravilno strukturiran delovni imenik, v katerem
bomo zgradili paket. Nastavitve zanj so v datoteki
<tt>/etc/rpmrc</tt>. Večina ljudi uporablja kar <tt>/usr/src</tt>.

Morda boste morali za delovni imenik ustvariti naslednje imenike:
<itemize>
  <item><tt>BUILD</tt> je imenik, v katerem RPM izvaja celotno gradnjo. Za
       gradnjo bi sicer načeloma lahko uporabili katerikoli imenik;
       RPM pa privzeto izbere tega.
  <item><tt>SOURCES</tt> je imenik, v katerega moramo vstaviti prvotne
       izvirne datoteke (navadno kot stisnjeni arhiv tar) in
       popravke. RPM bo, glede na privzeto nastavitev, iskal v tem
       imeniku.
  <item><tt>SPECS</tt> je imenik, v katerem naj bi bile vse datoteke spec.
  <item><tt>RPMS</tt> je imenik, v katerega RPM po gradnji shrani binarne
  pakete RPM.
  <item><tt>SRPMS</tt> je imenik, v katerega RPM shrani izvirne pakete RPM.
</itemize>

<sect1>Preizkusna gradnja
<p>
Verjetno je pametno, če za začetek dosežete, da se programje, ki bi ga
radi pripravili kot paket RPM, gladko prevede v vašem sistemu. Ob tem
hkrati pripravimo še popravke, če so potrebni. Izvirno arhivsko
datoteko razpakirajte v imeniku <tt>BUILD</tt> in imenik, v katerega se je
razpakirala, nespremenjen preimenujte v <em>imenik</em><tt>.orig</tt>
(namesto <em>imenik</em> seveda uporabite pravo ime imenika). Potem še
enkrat razpakirajte arhivsko datoteko. Vse spremembe, ki jih bo treba
opraviti, opravimo v tem imeniku, imenik s pripono <tt>.orig</tt> pa
pustimo pri miru. Premaknemo se vanj in sledimo navodilom za
prevajanje programa ter popravimo, kar je treba. Ko se program
gladko prevede, počistimo imenik (navadno z ukazom <tt>make
clean</tt>). Pazimo tudi, da počistimo vse ostanke, ki jih pusti
skript <tt>configure</tt>. Potem se vrnemo v imenik nad imenikom s
programjem in izvedemo ukaz
<tscreen><verb>
diff -uNr imenik.orig imenik &gt; ../SOURCES/dirname-linux.patch
</verb></tscreen>
S tem smo ustvarili popravek, ki ga lahko uporabimo v datoteki Spec.
Oznaka "linux" v imenu popravka rabi zgolj za identifikacijo. Morda
boste za oznako popravka raje uporabili kaj bolj opisnega,
npr. "config" ali "bugs". Dobro je, da datoteko s popravki, ki ste jo
ustvarili, pred uporabo pregledate in preverite, ali niste po
nesreči dodali vanjo kakšnih prevedenih datotek.

<sect1>Izdelava seznama datotek
<p>
Zdaj, ko imamo izvirno datoteko, ki se prevede, in ko vemo, kako to
storiti, jo prevedimo in namestimo (navadno z ukazom <tt>make
install</tt>). Opazujte izpis ob namestitvi in iz njega sestavite
seznam datotek, ki ga boste dodali v datoteko Spec. Datoteko Spec
navadno pišemo hkrati z omenjenimi koraki. Praviloma začnemo z enostavno
datoteko, v katero vstavimo enostavnejše dele, potem pa jo po korakih
dopolnimo.

<sect1>Izdelava paketov z RPM
<p>
Ko imamo datoteko spec, smo pripravljeni za izdelavo svojega paketa.
Najuporabnejši način za to je uporaba ukaza v naslednji
obliki:
<tscreen><verb>
rpm -ba foobar-1.0.spec
</verb></tscreen>
Skupaj s stikalom <tt>-b</tt> lahko koristno uporabite tudi druge izbire:
<itemize>
  <item><tt>p</tt> pomeni: izvedi samo korak prep datoteke spec.

  <item><tt>l</tt> je namenjen preverjanju seznama datotek in opravi
       nekaj preskusov na <tt>%files</tt>.

  <item><tt>c</tt> izvede koraka prep in compile. To je primeren
       način, kadar niste prepričani, ali se bo vaša izvirna datoteka
       sploh prevedla. Sprva se zdi neuporaben, ker se boste verjetno
       igrali z izvirno datoteko tako dolgo, dokler se ne prevede, in
       šele potem uporabili RPM. Ko pa se boste privadili uporabe RPM,
       boste spoznali, da vam bo ta izbira v nekaterih primerih v
       pomoč.

  <item><tt>i</tt> izvede korake prep, compile in install.
  <item><tt>b</tt> izvede korake prep, compile in install ter zgradi
  binarni paket.
  <item><tt>a</tt> zgradi vse (tako izvirne kot tudi binarne pakete).
</itemize>
Za izbiro b je tudi nekaj določil:
<itemize>
  <item><tt>--short-circuit</tt> bo skočil neposredno na določen korak
       (uporablja se lahko samo v kombinaciji s <tt>c</tt> in <tt>i</tt>).
  <item><tt>--clean</tt> po končanem prevajanju odstrani delovni
       imenik, v katerem se je paket prevajal.

  <item><tt>--keep-temps</tt> ohranijo se vse začasne datoteke in
       skripte, ki so bili ustvarjeni v <tt>/tmp</tt>. Z izborom
       <tt>-v</tt> lahko vidite, katere datoteke so se ustvarile v
       <tt>/tmp</tt>.

  <item><tt>--test</tt> ne izvede nobenih dejanskih stopenj, izvede pa
  keep-temp.
</itemize>

<sect1>Preskušanje
<p>
Ko imamo izvirni in binarni paket RPM, ju je treba
preizkusiti. Najenostavneje in najbolj učinkovito je, da ga preizkusite
v drugem računalniku. Ne nazadnje ste v svojem velikokrat izvedli ukaz
<tt>make install</tt>, tako da se mora zdaj precej verjetno brez
težav namestiti.

Paket lahko sicer iz delovnega sistema odstranite z ukazom <tt>rpm -e
imepaketa</tt> in ga znova namestite, vendar to ni zanesljiva metoda,
saj ste v istem sistemu paket nameščali tudi mimo sistema RPM, z
<tt>make install</tt>. Če ste, denimo, na seznamu datotek kakšno
datoteko pozabili, je z ukazom <tt>rpm -e</tt> ne boste odstranili. Ko
boste paket znova namestili, bo sistem spet popoln, paket RPM pa bo še
vedno ostal nepopoln. Vedite tudi, da ste paket ustvarili z ukazom
<tt>rpm -ba imepaketa</tt>, večina pa ga bo zgolj namestila z
ukazom <tt>rpm -i imepaketa</tt>. Zato pazite, da pri korakih prevajanja
in nameščanja ne izvajate česa, kar je treba napraviti tudi pri
nameščanju prevedenih programov.

<sect1>Kaj storiti z novimi paketi RPM
<p>
Ko ste izdelali svoj paket RPM nečesa (pri čemer to nekaj še ni bilo
pakirano kot RPM), lahko svoje delo delite z drugimi. Predpostavljamo
seveda, da ste pripravili paket RPM nečesa, kar se sme prosto
razširjati. To lahko storite tako, da paket naložite v strežnik FTP
<url url="ftp://incoming.redhat.com/">.

<sect1>Kaj zdaj?
<p>
Oglejte si zgornja razdelka o preizkušanju in tem, kaj narediti z novimi
paketi RPM. Želimo, da so na voljo vsi paketi RPM, kar jih je, in da
so izdelani dobro. Vzemite si čas in jih temeljito preskusite, potem pa
jih ponudite v skupno dobro. Prosimo, preverite tudi, ali nalagate
samo <em>prosto programsko opremo</em>. Komercialne programske opreme
ter programja za pokušino <em>ne</em> nalagajte, razen če avtorske
pravice to izrecno dopuščajo. Sem spadajo, denimo, <tt>ssh</tt>,
<tt>pgp</tt> itd.

<sect>Gradnja paketov RPM za različna strojna okolja
<p>
RPM se lahko uporablja za izdelavo paketov za procesorje Intel i386,
Digital Alpha (če uporablja Linux), Sparc in druge. Številne
lastnosti poenostavljajo izdelavo paketov za različna strojna
okolja. Prva izmed njih je direktiva "optflag" v <tt>/etc/rpmrc</tt>.
Uporablja se lahko za postavitev oznak, ki se uporabljajo pri
izgradnji programske opreme za vrednosti, ki so specifične za določeno
arhitekturo. Naslednja lastnost so makroukazi "arch" v datoteki Spec.
Uporabljate jih lahko v različne namene, odvisno od strojnega okolja,
za katero pripravljate paket. Podobna lastnost je direktiva "Exclude"
v glavi.

<sect1>Zgled datoteke Spec
<p>
Sledi del datoteke Spec za paket "fileutils". Napisana je tako, da
se lahko zgradi na računalnikih s procesorji Alpha in Intel.
<tscreen><verb>
Summary: GNU File Utilities
Name: fileutils
Version: 3.16
Release: 1
Copyright: GPL
Group: Utilities/File
Source0: prep.ai.mit.edu:/pub/gnu/fileutils-3.16.tar.gz
Source1: DIR_COLORS
Patch: fileutils-3.16-mktime.patch

%description
These are the GNU file management utilities.  It includes programs
to copy, move, list, etc, files.

The ls program in this package now incorporates color ls!

%prep
%setup

%ifarch alpha
%patch -p1
autoconf
%endif
%build
configure --prefix=/usr --exec-prefix=/
make CFLAGS="$RPM_OPT_FLAGS" LDFLAGS=-s

%install
rm -f /usr/info/fileutils*
make install
gzip -9nf /usr/info/fileutils*

.
.
.
</verb></tscreen>

<sect1>Optflags
<p>
V zgledu vidite, kako se uporablja direktiva "optflag" iz
<tt>/etc/rpmrc</tt>. Glede na strojno okolje, v katerem gradite, se
ustrezna vrednost posreduje spremenljivki <tt>RPM_OPT_FLAGS</tt>. Da
bi lahko namesto navadne direktive, ki jo uporabljate
(npr. <tt>-m486</tt> ali <tt>-O2</tt>), uporabljali to spremenljivko,
boste morali popraviti datoteko Makefile za vaš paket. Boljši občutek
za to, kaj je treba storiti, dobite tako, da namestite ta
izvirni paket, ga razpakirate in preučite Makefile. Potem si oglejte
popravek za Makefile in videli boste, kakšne spremembe je treba
opraviti.

<sect1>Makroukaz
<p>
Makroukaz <tt>%ifarch</tt> je pri vsem tem zelo pomemben. Največkrat
boste morali narediti popravek ali dva, ki sta specifična samo za
določeno strojno okolje. V tem primeru vam RPM dopušča, da napravite
popravek samo za to strojno okolje.

V zgornjem zgledu ima fileutils popravke za 64-bitne računalnike. Trenutno
se ta popravek uporablja samo za procesorje Alpha. Okrog
popravka za 64 bitne procesorje dodajmo makro <tt>%ifarch</tt>:
<tscreen><verb>
%ifarch alpha
%patch1 -p1
%endif
</verb></tscreen>
S tem zagotovimo, da se popravek uporabi samo v strojnih okoljih s
procesorji Alpha.

<sect1>Izločevanje trojnih okolij iz paketa
<p>
Da je laže vzdrževati izvirne pakete RPM za vsa strojna okolja v enem
imeniku, je vgrajena možnost "izločevanje" paketov za določene
arhitekture. Tako lahko še vedno uporabljamo ukaze, kot je
<tscreen><verb>
rpm --rebuild /usr/src/SRPMS/*.rpm
</verb></tscreen>,
in z njim izdelamo vse pakete. Če določen paket še ni bil prenesen v
dano strojno okolje, vam ni treba drugega kot to, da v glavo
datoteke Spec tega paketa dodaste vrstico:
<tscreen><verb>
ExcludeArch: alpha
</verb></tscreen>
Potem znova izdelajte izvirni paket v strojnem okolju, v katerem je
bil prvotno izdelan. Dobili boste izvirni paket, ki se prevede na
procesorjih Intel, na procesorjih Alpha pa se enostavno preskoči.

<sect1>Konec
<p>
Paket RPM je navadno laže prilagoditi za delo v več strojnih okoljih, 
kakor programje pripraviti do tega, da se prevede v novem
strojnem okolju. S tem, ko je prenesenih vse več težavnih paketov, pa
tudi to postaja vse laže. Če se vam zatakne, je navadno najbolje, da
si ogledate podoben paket, ki je že prenesen, in razčlenite, kako so
težavo rešili v njem.

</article>
