RPM-HOWTO <author>Donnie Barnes, <djb@redhat.com> <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><primoz.peterlin@biofiz.mf.uni-lj.si></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 <ime datoteke></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 > ../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>