Avancerede spec-file options

Der er mange ting, man kan gøre i en spec-fil ud over de, der lige er nødvendige for at kunne lave sine egne rpm-pakker. Her er nogle af de mere avancerede, som man kan støde på:  

Provides & Requires

en rpm-pakke indeholder oplysninger om, hvilke andre programmer, dynamisk loadede biblioteker og evt. andre ting pakker, som det er nødvendigt at have installeret for at program-pakken skal kunne fungere. Dette står selvfølgelig også i spec-filen.

rpm-programmet finder automatisk ud af, hvilke dynamiske libraries en pakke behøver, og hvilke biblioteker en pakke eventuelt stiller til rådighed for andre. Så det behøver man ikke bekymre sig om, og det er jo heldigvis de fleste af den slags afhængigheder.

Hvis en pakke indeholder scripts som skal fortolkes (f.eks. Perl-programmer, eller Tcl/Tk scripts), vil rpm-programmet også automatisk opdage det, og notere i pakken at den pågældende fortolker er nødvendig.

Men ud over det, så er der to tags: Provides og Requires som man bruger til at fortælle hvilke pakker et program stiller til rådighed eller kræver.

Et eksempel på dette er sammenhængen mellem fetchmail programmet og sendmail. fetchmail fungerer ved at hente post fra en mail-server, og så aflevere det til den lokale smtp-dæmon, almindeligvis sendmail. D.v.s. for at kunne bruge fetchmail, er man nødt til at have sendmail installeret også. Dette gøres i spec-filerne for de to pakker, ved at have linien

    Provides: smtpdaemon
 
i sendmail's spec-fil, og den tilsvarende

    Requires: smtpdaemon

i fetchmail's spec-fil.  Ordet "smtpdaemon" er tilfældig valgt - det kunne være hvad som helst - men det giver selvfølgelig mening at beskrive den service som sendmail stiller til rådighed som en "smtp dæmon".

Man kan også kræve, at det ikke bare er en bestemt pakke, der er installeret, men en bestemt version. F.eks. kræver util-linux pakken i RedHat 5.1's en bestemt version af pam pakken, som er en "authentication" pakke (bruges bl.a. til at verificere et login). pam-pakken skal være mindst version 0.59, så i util-linux spec-filen står der:

    Requires: pam >= 0.59
 

Flere pakker fra samme sourcefil

Nogle gange er det praktisk at producere flere binære rpm-pakker ud fra en og samme source-fil. Det er typisk shared libraries såsom libc, der bruger det - man har een source fil, men ud fra den danner man så både en pakke der kun indeholder run-time biblioteket, samt en eller flere pakker der indeholder include-filer, biblioteker til statisk linkning, til profiling m.m.

Det kontrolleres selvfølgelig også via spec-filen. Man skal ikke til at lave flere spec-filer med samme source - i stedet er der en udvidet syntaks i spec filen, så man kan fortælle rpm-programmet hvilke binære rpm-pakker der skal dannes, og hvordan filerne skal fordeles imellem dem.

Et eksempel er glibc spec-filen. Den starter på normal vis (jeg har klippet lidt):

    Summary: GNU libc
    Name: glibc
    Version: 2.0.7

    %description
    Contains the standard libraries that are used by multiple programs on
    the system.

men så kommer der noget nyt: Det beskriver glibc-devel pakken:

    %package devel
    Summary: Additional libraries required to compile
    Group: Development/Libraries/Libc
    Requires: kernel-headers

    %description devel
    To develop programs which use the standard C libraries (which nearly all
    programs do), the system needs to have these standard header files and object
    files available for creating the executables.
 
Det starter med en %package devel linie - det betyder, at de efterfølgende tags beskriver en ny, binær rpm-pakke, som hedder det samme som "hoved-pakken", men med "-devel" tilføjet. Man kan skrive værdier for alle tags i forbindelse med %package - f.eks. har glibc og glibc-devel forskellig værdi af "Group:" tag'en, og glibc-devel har andre requirements end hoved-pakken.

Sådan en ekstra pakke skal selvfølgelig også have nogle filer, og her bruger man samme udvidede syntaks som med %description. F.eks. nogle filer i glibc-devel pakken:

    %files devel
    /usr/lib/libc.a
    /usr/lib/libcrti.o
 

Flersprogede rpm-pakker

Summary og Description felterne i en spec-fil er tekster, som den almindelige bruger let kan komme til at læse - de dukker op, f.eks. når man ser på hvad en rpm-pakke indeholder med rpm -qi. Så ville det jo være rart, hvis man kunne få en letforståelig forklaring - på sit eget sprog.

Det kan man godt - hvis ellers spec-filen indeholder oversættelser til det sprog, man ønsker. Hvis du har RedHat 5.1 installeret, kan du f.eks. få beskrivelser af alle rpm-pakkerne på flydende tysk - prøv

    LANGUAGE=de rpm -qi mount

I spec filen ser det således ud:

    Name: mount
    Summary: Programs for mounting and unmounting filesystems
    Summary(de): Programme zum Montieren und Abmontieren von Dateisystemen

    %description
    Mount is used for adding new filesystems, both local and networked, to
    your current directory structure.

    %description -l de
    Mount wird zum Hinzufügen neuer Dateisysteme (lokal und im Netzwerk)
    zu Ihrer aktuellen Verzeichnisstruktur verwendet.

Syntaksen skulle være til at forstå - man skal blot kende sprog-koden, som er en eller anden ISO standard kode. Dansk hedder da og svensk se, men desværre er der ikke dansk/svenske oversættelser med i RedHat's pakker - endnu!