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:
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: ime paketa -vezaj-
številka različice -vezaj- številka izdaje -pika-
spec
. Tako zagotovimo, da ob hkratni namestitvi več različic
programa v sistemu ne nastane zmeda.
Oglejmo si kratko datoteko spec (eject-2.0.2-1.spec
):
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. ]
Glava obsega nekaj standardnih polj, ki jim morate izpolniti. Pri nekaterih posebej opozorimo na podrobnosti. Izpolniti je treba naslednja polja:
Summary
: Enovrstični opis paketa.Name
: ime se mora ujemati z imenom datoteke paketa RPM, ki ga
nameravate uporabiti.Version
: ime različice se mora ujemati z imenom
paketa RPM, ki ga
nameravate uporabiti.Release
: Š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).Copyright
: 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.Source
: 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 se mora ujemati s potjo do datoteke v vašem
sistemu, zatorej ne spreminjajte imena izvirne
datoteke. Določimo lahko tudi več kot
eno izvirno datoteko:
Te datoteke bi šle v imenik SOURCES. (Struktura imenika je obravnavana pozneje v razdelku ,,Imeniška struktura izvora``.)Source0: blah-0.tar.gz Source1: blah-1.tar.gz Source2: fooblah.tar.gz
Patch
: To je mesto, na katerem boste lahko našli popravek, če ga boste
morali znova zajeti. Opozorilo: Ime datoteke se mora ujemati z
imenom vašega popravka. Prav
tako, kot imamo lahko več virov, imamo lahko tudi več
popravkov, denimo:
Rezultat bo videti nekako tako:
Tudi te datoteke gredo v imenik SOURCES.Patch0: blah-0.patch Patch1: blah-1.patch Patch2: fooblah.patch
Group
: Kategorija, v katero sodi
program. Visokonivojski namestitveni programi, npr. gnorpm,
uporabljajo hierarhično razvrstitev programja. Zadnja različica
hierarhije je na voljo v datoteki /usr/doc/rpm-*/GROUPS
,
trenutna drevesna struktura skupine pa je:
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
BuildRoot
: 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.%description
: 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.
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
%prep
. Delo pa si lahko malce poenostavimo z uporabo makroukazov,
vgrajenih v RPM.
Prvi izmed teh makroukazov je %setup
. 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:
-n ime
nastavi ime delovnega imenika na dano ime.
Privzeta vrednost je $NAME-$VERSION
. Druge možnosti so
$NAME
, ${NAME}${VERSION}
ali karkoli
uporablja arhivska datoteka tar.
Ne pozabite, da spremenljivke ,,$
`` 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.-c
ustvari omenjeni imenik in se premakne vanj,
preden dearhivira arhivsko datoteko.-b #
pred premikom v imenik razpakiramo Source#
(# =
0,1 ...) To
stikalo nima smisla skupaj s c
, zato te kombinacije ne
uporabljajte. Stikalo je uporabno samo, kadar imamo več
izvirnih datotek.-a #
najprej se pomaknemo v imenik in nato dearhiviramo Source#.-T
S tem stikalom onemogočimo privzeti način
dearhiviranja za Source0
. Obvezno zahteva stikalo
-b 0
ali -a 0
za dearhiviranje. Uporabite ga,
kadar so na voljo sekundarni viri.-D
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.Naslednji makroukaz na voljo je %patch
. Pomaga pri
avtomatizaciji procesa uvajanja popravkov v vire. V njem lahko
uporabite več stikal, ki so navedena spodaj:
#
bo na izvirni kodi uporabil popravek Patch#
-p #
določi število imenikov, ki jih je treba pri
ukazu patch(1)
izpustiti iz poti-P
Makroukaz %patch
pozna dve obliki
skladnje. V prvi številko popravka kar dopišemo na koncu ukaza, v
drugi pa uporabimo stikalo -P
. Drugi popravek, denimo,
lahko tako izvedemo z ukazom %patch2
ali %patch -P
2
. Prva oblika privzeto izvede popravek Patch
(ali
Patch0
), s stikalom -P
pa to preprečimo. To stikalo je
uporabno v drugem ali naslednjih makroukazih %patch
, ki zahtevajo
drugačno vrednost kot prvi makro.-b
pripona določa, da se prvotna datoteka shrani
z imenom ime.pripona.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
%build
(obravnavan v naslednjem razdelku) se izvedejo v
ukazni lupini. V zgornjem zgledu si oglejte, kaj vse lahko
opravimo na tem mestu.
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.
Pomembno: 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 cd
.
Spremenljivka RPM_OPT_FLAGS
se določi glede na vrednosti v
nastavitveni datoteki /usr/lib/rpm/rpmrc
. 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.
Tudi v tem razdelku ni makrov. Vanj vstavite ukaze, s katerimi
namestite program. Če imate na voljo ukaz make install
, sodi
sem. Če ga nimate, lahko bodisi popravite datoteko Makefile
tako, da bo podpirala make install
, bodisi program ,,ročno``
namestite z ukazi ukazne lupine. Svoj trenutni imenik lahko obravnavate
kot vrh izvirnega imenika.
Z branjem spremenljivke RPM_BUILD_ROOT
izveste, kateri
imenik je v glavi nastavljen kot korenski imenik gradnje
(BuildRoot
). 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.
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 %clean
. Za
njim preprosto navedemo ukaze, ki odstrelijo stari korenski imenik
gradnje. Previdneži bodo, pred ga bodo uporabili, preverili, ali ni
spremenljivka RPM_BUILD_ROOT
nastavljena na /
...
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 ldconfig
.
Makroukazi za vsak skript so v obliki:
#!/bin/sh
).
V tem razdelku moramo navesti vse datoteke, ki se namestijo z
binarnim paketom. RPM ne more vedeti, katere binarne datoteke se
namestijo kot rezultat ukaza make install
. Bile so
sicer zamisli, da bi pred namestitvijo paketa in po njej z ukazom
find
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:
%doc
se uporablja za označevanje dokumentacije v izvirnem paketu,
ki jo želite namestiti z binarnim paketom. Spisi se bodo
namestili v imenik
/usr/doc//$NAME-$VERSION-$RELEASE
. S tem makrom lahko v ukazni
vrstici navedete tudi več spisov hkrati, ali pa ločeno z uporabo
makra %doc
za vsakega posebej.%config
se uporablja za označevanje nastavitvenih datotek v
paketu. Sem spadajo datoteke, kot so sendmail.cf
, passwd
itd. Če
paket z nastavitvenimi datotekami pozneje odstranite, se
bodo odstranile vse nespremenjene datoteke, vse spremenjene
datoteke pa bodo dobile prvotno ime s pripono
.rpmsave
. Tudi pri tem makroukazu
lahko navedete tudi več datotek.%dir
označuje, da posamični imenik na seznamu datotek
sodi k paketu. Če navedemo ime imenika brez
makra %dir
, bodo vse datoteke v tem imeniku del
prevedenega paketa in pozneje nameščene kot del paketa.%defattr
omogoča, da za datoteke, navedene za njim,
navedemo privzete prilastke. Slednje navajamo v obliki
(način, lastnik, skupina), pri čemer
je način osmiško število, ki določa zaščito (v enaki skladnji,
kot jo pozna chmod
), lastnik je uporabniško ime
lastnika, skupina pa ime skupine, ki bi ji radi
pripisali datoteke. Z znakom -
pustimo vrednost polja
na enaki vrednosti, kot jo ima ob namestitvi (v zgledu je,
denimo, način puščen nespremenjen).%files f <ime datoteke>
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.Največja nevarnost pri navajanju datotek je navajanje
imenikov. Če, denimo, po nesreči navedete /usr/bin
, bodo v vašem
binarnem paketu vse datoteke, ki so v imeniku /usr/bin
v
vašem sistemu.
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 (*
),
tej sledi datum, naše ime in naš e-poštni naslov. Datum naj bo v
enaki obliki, kot ga vrne ukaz
Preostanek vnosa je prosto besedilo, ki pa naj bo vseeno urejeno v neki koherentni obliki.date +"%a %b %d %Y"