- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka - - p°edchozφ Φßst - nßsledujφcφ Φßst - prvnφ Φßst -

LinuxovΘ noviny 07/98

Dal╣φ sekce spec-souboru

Jan Kasprzak, 17. Φervence 1998

V minulΘm Φφsle na╣eho serißlu o systΘmu RPM jsem zaΦal detailn∞ popisovat formßt spec-souboru, kter² °φdφ vytvß°enφ RPM balφku. Vysv∞tlil jsem, jak² v²znam majφ jednotlivΘ tagy v hlaviΦce souboru, a nynφ budu pokraΦovat v²kladem o dal╣φch sekcφch spec-souboru. N∞kterΘ sekce jsou povinnΘ, jinΘ nepovinnΘ. Sekce zaΦφnß znakem % a sv²m nßzvem na zaΦßtku °ßdku. Po°adφ sekcφ ve spec-souboru nenφ definovßno - zde budou jednotlivΘ sekce uvedeny v jakΘmsi logickΘm uspo°ßdßnφ.

Se sekcφ %description jsme se u╛ setkali. Tato sekce je povinnß a obsahuje textovou informaci o urΦenφ a pou╛itφ balφku. Tuto sekci vyu╛φvß nap°φklad instalaΦnφ program Red Hat Linuxu, kdy╛ se klßvesou F1 dotß╛eme na podrobn∞j╣φ informace o balφku.

Dal╣φ sekce je nazvanß %changelog a jak ji╛ jejφ nßzev pravφ, zachycuje protokol o zm∞nßch ve spec-souboru (nikoli tedy v softwaru samotnΘm. JednotlivΘ zßznamy zaΦφnajφ hv∞zdiΦkou na prvnφ pozici °ßdku, nßsleduje datum a jmΘno Φlov∞ka, kter² zm∞nu provedl. Na dal╣φch °ßdcφch pak m∙╛e b²t popis zm∞ny. P°φklad Φßsti sekce %changelog z balφku ssh je na v²pisu P°φklad sekce changelog.

* Thu Jun 11 1998 Jan "Yenya" Kasprzak <kas@fi.muni.cz>
- updated to 1.2.25.
- fixed truncated .pam patch.
- built on RedHat 5.1 (and tested upgrade on 5.0 too).

* Wed May 20 1998 Jan "Yenya" Kasprzak <kas@fi.muni.cz>
- Updated to 1.2.23:
- removed the -NYP patch (no longer necessary).
- removed the -tmpfile patch (no longer necessary).
- added %post scripts linking the ssh*1 binaries and manpages as ssh*
        if no such links exist. This will allow a coexistence of
        ssh1 and ssh2 RPMs on one system.

V²pis Φ. 5: P°φklad sekce changelog

Sekce %prep

Tato sekce ji╛ nenφ jen pouh² text, ale je to shellov² skript. ┌kolem tohoto skriptu je rozbalit p°φslu╣nΘ zdrojovΘ archivy a nainstalovat pot°ebnΘ zßplaty. Tento skript (stejn∞ jako skripty z dal╣φch sekcφ) je spu╣t∞n shellem s parametrem -e, kter² °φkß, ╛e shell mß ukonΦit provßd∞nφ skriptu s chybou, skonΦφ-li libovoln² z p°φkaz∙ ve skriptu s chybou (s nenulovou nßvratovou hodnotou). Na tuto skuteΦnost je pot°eba pamatovat p°i psanφ skript∙. Nenφ nap°φklad mo╛nΘ pou╛φvat konstrukce typu

test -r /etc/ssh/ssh_host_key && ssh-keygen blabla

Namφsto toho je nutnΘ pou╛φt nßsledujφcφ ekvivalent:

if test -r /etc/ssh/ssh_host_key;
	then ssh-keygen blabla; fi

Skript z tΘto sekce, stejn∞ jako ostatnφ skripty, mß k dispozici n∞kterΘ specißlnφ prom∞nnΘ prost°edφ. Uvßdφm je zde spolu s p°φklady hodnot nebo s implicitnφmi hodnotami:

  • RPM_SOURCE_DIR=/usr/src/redhat/SOURCES - adresß°, ve kterΘm jsou ulo╛eny zdrojovΘ archivy a zßplaty. Skript %prep odsud m∙╛e rozbalovat tyto archivy a aplikovat zßplaty.
  • RPM_BUILD_DIR=/usr/src/redhat/BUILD - adresß°, ze kterΘho je skript spu╣t∞n. Sem se pak rozbalφ jednotlivΘ zdrojovΘ archivy a zde probφhß kompilace.
  • RPM_DOC_DIR=/usr/doc - adresß°, do kterΘho se uklßdß dokumentace k balφku.
  • RPM_ARCH=i386 - architektura, pro kterou se aktußlnφ balφk vytvß°φ.
  • RPM_OS=Linux - operaΦnφ systΘm, pro kter² se aktußlnφ balφk vytvß°φ.
  • RPM_OPT_FLAGS="-O2 -fno-strength-reduce -m486" - optimalizaΦnφ p°epφnaΦe pro kompilßtor jazyka C.
  • RPM_BUILD_ROOT=/tmp/ssh-root - specifikace adresß°e BuildRoot.
  • RPM_PACKAGE_NAME=ssh - jmΘno balφku.
  • RPM_PACKAGE_VERSION=1.2.25 - verze softwaru.
  • RPM_PACKAGE_RELEASE=1i - verze RPM balφku.

Makra

Skript %prep vykonßvß ve v∞t╣in∞ balφk∙ podobnou Φinnost - vezme soubor SourceN a rozbalφ jej v p°φslu╣nΘm adresß°i, m∞l by nastavit sprßvn∞ vlastnφka a p°φstupovß prßva v∙bec, a dßle aplikuje zßplaty. Tato Φinnost se opakuje natolik Φasto, ╛e pro ni systΘm RPM poskytuje makra - tedy zkratky pro vφce p°φkaz∙. Takov² typick² %prep-skript s jednφm zdrojov²m archivem a jednou zßplatou pak vypadß asi takto:

  %prep
  %setup
  %patch -p1

Makro %setup vezme zdrojov² archiv, uveden² v hlaviΦce jako Source, resp. Source0, rozbalφ jej do adresß°e BUILD, zm∞nφ vlastnφka v╣ech soubor∙ na superu╛ivatele (to pouze v p°φpad∞, ╛e balφk vytvß°φ superu╛ivatel) a nastavφ bity r a x pro v╣echny u╛ivatele.

Makro %patch aplikuje zßplatu, uvedenou v hlaviΦce jako patch, resp. patch0. P°epφnaΦ -p1 z na╣eho p°φkladu je p°edßn programu patch(1).

Skript %prep samoz°ejm∞ nemusφ sestßvat pouze z volßnφ maker %setup a %patch. M∙╛e obsahovat i dal╣φ p°φkazy, nap°φklad je-li program konfigurovßn pomocφ systΘmu GNU autoconf a modifikujeme-li konfiguraΦnφ soubor configure.in, m∙╛eme v tΘto sekci p°egenerovat skript configure p°φkazem autoreconf (tuto konstrukci naleznete mimo jinΘ i ve spec-souboru Secure Shellu - tam se p°idßvß podpora pro PAM do configure.in, a musφ se tedy p°egenerovat configure. Krom∞ toho makra mohou mφt i parametry, kter²mi se specifikujφ dal╣φ vlastnosti. K t∞mto vlastnostem se vrßtφme v dal╣φm dφle na╣eho serißlu.

Sekce %build - kompilace softwaru

Tato sekce, stejn∞ jako p°edchozφ, je interpretovßna jako shellovsk² skript. Tento skript by m∞l provΘst vlastnφ kompilaci softwaru. Ve v∞t╣in∞ p°φpad∙ si vystaΦφme s nßsledujφcφ formou:

  %build
  ./configure
  make CFLAGS="$RPM_OPT_FLAGS" all

P°φkazu configure, pokud jej program podporuje, m∙╛eme samoz°ejm∞ dßvat i dal╣φ parametry (t°eba --with-gcc --prefix=/usr). Tohle je v∙bec dost diskutabilnφ v∞c: podle Linux Filesystem Hierarchy Standard (FHS, d°φve FSSTND) by lokßln∞ instalovan² software m∞l b²t instalovßn do adresß°e /usr/local, zatφmco software, kter² pat°φ k systΘmu samotnΘmu by m∞l b²t v /usr. Ov╣em je software, kter² zabalφte do RPM a distribuujete, souΦßstφ systΘmu, nebo je spφ╣ blφ╛e lokßlnφ instalaci? M∙j nßzor na tuto problematiku je ten, ╛e /usr/local bylo zavedeno proto, aby bylo mo╛nΘ ty lokßln∞ instalovanΘ v∞ci odli╣it. Ale mßme-li RPM, mßme na odli╣enφ jinΘ a lep╣φ prost°edky (nap°φklad polo╛ku Distribution nebo Packager v hlaviΦce RPM balφku). Moje RPM balφky se tedy instalujφ p°φmo do systΘmov²ch adresß°∙, nikoliv do /usr/local.

Sekce %install - instalace softwaru

InstalaΦnφ sekce je takΘ shellovsk² skript. ┌Φelem tohoto skriptu je p°emφstit konfiguraΦnφ soubory, zkompilovanΘ binßrnφ soubory, dokumentaci a r∙znΘ dal╣φ soubory na mφsto jejich pou╛itφ. ┌pln∞ nejjednodu╣╣φ formou tΘto sekce je p°φkaz make install. Ale chceme-li umo╛nit rekompilaci RPM balφku i u╛ivateli, kter² nenφ superu╛ivatelem, m∞li bychom spec-soubor navrhovat tak, aby pou╛φval tag BuildRoot. Pak instalace probφhß do adresß°e $RPM_BUILD_ROOT mφsto ko°enovΘho adresß°e. V∞t╣ina Makefile-soubor∙ p°edpoklßdß, ╛e bude k dispozici aspo≥ zßkladnφ struktura adresß°∙ a soubor∙ v systΘmu. Proto v∞t╣inou v tΘto sekci musφme pot°ebn² strom adresß°∙ p°edem vytvo°it. Sekce pak m∙╛e vypadat takto:

  %install
 mkdir -p ${RPM_BUILD_ROOT}/usr/{bin,lib,man/man1}
 make prefix="${RPM_BUILD_ROOT}/usr" install

Je dobrΘ v∞d∞t, ╛e ne v╣echny programy jsou schopny b²t kompilovßny s jin²m prefixem, ne╛ se kter²m jsou pak instalovßny. V takov²ch p°φpadech nezbude ne╛ ruΦn∞ zjistit, co p°esn∞ d∞lß p°φkaz make install, a jeho Φinnost pak nasimulovat v sekci %install s p°φslu╣n²m BuildRoot. U n∞kter²ch balφk∙ je i tento postup p°φli╣ nßroΦn², a proto se instalujφ p°φmo na mφsto urΦenφ. Takov²to balφk pak ov╣em m∙╛e rekompilovat jen superu╛ivatel. P°φkladem takovΘho balφku je nap°φklad tetex.

Pokud balφk nepou╛φvß BuildRoot, je podstatn∞ nßroΦn∞j╣φ jej odladit. TakovΘto lad∞nφ a pokusnß instalace by m∞ly probφhat na jinΘm poΦφtaΦi, ne╛ vlastnφ kompilace. M∙╛e se toti╛ stßt (a je t∞╛kΘ to odhalit), ╛e do balφku zapomeneme p°ibalit n∞kter² d∙le╛it² soubor. Na p∙vodnφm poΦφtaΦi v╣e funguje, proto╛e tento soubor tam zbyl po make install. Jinde balφk ale sel╛e.

Sekce %clean - smazßnφ meziprodukt∙

Pokud p°i kompilaci vznikajφ n∞jakΘ meziprodukty mimo adresß° BUILD, nap°φklad v /tmp, je na sekci %clean, aby tyto meziprodukty promazala.

V p°φ╣tφ Φßsti tohoto serißlu se dozvφme, jak specifikovat soubory pat°φcφ k balφku a jakΘ dal╣φ skripty mohou ve spec-souboru b²t. *


- p°edchozφ Φßst - nßsledujφcφ Φßst - prvnφ Φßst - - p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -