<!-- DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN" -->

<!-- Chapter: Package Management -->
<chapter id="packaging">
 <title>Packages - Softwarebeheer</title>

 <para>
Net als andere besturingssystemen heeft ook Linux tamelijk goed gedefinieerde
manieren om software op het systeem te installeren. De software wordt
gewoonlijk in de vorm van bundels, genaamd ``packages'' gedistribueerd.
De packages zelf zijn in veel verschillende vormen beschikbaar, afhankelijk
van de inhoud en voor welke distributie ze zijn ontworpen.
Software wordt gewoonlijk als broncode gedistribueerd of in de vorm
van klaar-voor-gebruik zijnde binary's, gecompileerd voor bepaalde
systeemomgevingen.
 </para>

<!-- Section1: Tarballs -->
<sect1 id="tarballs">
  <title>Tarballs</title>

  <para>
Tarballs zijn met tar en gzip gecomprimeerde bestandsarchieven 
(met de extensie .tar.gz
of.TGZ) die worden gebruikt om broncode te distribueren. Deze maken
gewoonlijk gebruik van de GNU Autotools waardoor de gebruiker de broncode
zelf op het doelsysteem kan compileren. De GNU Autotools zijn samengesteld 
uit drie utility's - autoconf, automake en libtool, waarmee ontwikkelaars
software kunnen maken die op een diversiteit aan systemen kan worden
gecompileerd, gebruik makend van de faciliteiten beschikbaar op de 
doelcomputer.
  </para>

   <orderedlist>
    <listitem>
     <para>Decomprimeer het package en pak het uit in &eacute;&eacute;n of
andere subdirectory.</para>
     <screen>
      <command>tar -xzf &lt;bestandsnaam&gt;</command>
      <command>cd &lt;package-directory&gt;</command>
     </screen>
    </listitem>
   </orderedlist>

  <para>
Gebruik onderstaande stappen in de hierboven gecre&euml;erde directory.
Hiermee kan een eindgebruiker de broncode uit het package compileren zonder
ook maar iets af te hoeven weten van de programmeertaal C!
De enige vereiste is dat de compiler, relevante library's en header 
bestanden op het systeem zijn ge&iuml;nstalleerd.
  </para>

  <orderedlist continuation="continues">
   <listitem>
    <para>
     Gebruik de volgende opdracht voor het configureren van de broncode
     voor een correcte compilatie op het huidige systeem.
    </para>

    <screen><command>./configure</command></screen>

    <para>
     Aan het script <command>configure</command> kunnen een aantal opties
worden doorgegeven, die kunnen worden gebruikt om specifieke delen van de
software te (de-)activeren of om alternatieve library's te specificeren, enz.
Een lijst met de mogelijke opties kan worden verkregen uit het script zelf:
    </para>

    <screen><command>./configure --help</command></screen>
   </listitem>
  </orderedlist>

  <orderedlist continuation="continues">
   <listitem>
    <para>
     De volgende twee opdrachten worden gebruikt om zowel de software te
compileren als het ook te installeren op het systeem. Hierbij zijn alleen
voor de tweede opdracht rootprivileges vereist, aangezien bij deze opdracht
de bestanden her en der worden ge&iuml;nstalleerd.
    </para>

    <screen>
     <command>make</command>
     <command>make install</command>
    </screen>
   </listitem>
  </orderedlist>

  <para>
Het enige probleem van deze benadering is, is dat er geen manier is
om alle ge&iuml;nstalleeerde bestanden op het systeem bij te houden.
Ook is er wellicht niet altijd een makkelijke manier om de installatie van
software op een zuivere manier ongedaan te maken. De volgende opdracht kan
wel worden gebruikt om te achterhalen welke bestanden waar werden
ge&iuml;nstalleerd.
  </para>

  <screen><command>make -n install</command></screen>

 </sect1>

<!-- Section1: RPMs -->
 <sect1 id="rpms">
  <title>RPM - De Redhat Package Manager</title>

  <para>
De Redhat Package Manager afgekort tot ``RPM'' is een
gebruikelijke manier om voorgecompileerde binary's als ook broncode
te distribueren, die wordt toegepast in een paar populaire distributies
zoals Redhat, SuSE en Mandrake. De binary's worden geleverd in de vorm van
`*.rpm' bestanden die simpelweg rpm's worden genoemd.
RPM onderhoudt een database van alle packages die op het systeem worden
ge&iuml;nstalleerd samen met de services waarin ze voorzien en die ze
nodig hebben. Deze database wordt gebruikt om bij te houden welke bestanden
op het systeem worden ge&iuml;nstalleerd en welke packages van het systeem 
worden verwijderd. Het wordt ook gebruikt om alle afhankelijkheden die 
tussen packages kunnen bestaan te verifi&euml;ren. Ze worden gemanipuleerd
met de opdracht <command>rpm</command> in combinatie met de relevante
opties, waarvan er een aantal hieronder worden aangegeven.
</para>

  <variablelist>
   <varlistentry>
    <term>Installeren</term>
    <listitem>
     <screen><command>rpm -ivh &lt;packagename&gt;</command></screen>
<para>
Deze opdracht wordt gebruik om een nieuw rpm (package) op het systeem te
installeren. RPM
is verantwoordelijk voor het controleren van alle afhankelijkheden
die voor een specifiek package nodig zijn. Het vervolgt de installatie
alleen wanneer andere benodigde packages voor dit package beschikbaar
zijn en anders retourneert het een foutmelding en breekt de installatie af.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>Upgraden</term>
    <listitem>
     <screen><command>rpm -Uvh &lt;packagename&gt;</command></screen>
     <para>
Dit dient voor het upgraden van een bestaand package of voor het installeren
ervan als het nog niet op het systeem voorkomt. Ook in dit geval, zal RPM
de nodige afhankelijkheidscontroles uitvoeren voordat packages worden
aangepast.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>De-installeren</term>
    <listitem>
     <screen><command>rpm -e &lt;packagename&gt;</command></screen>
     <para>
Dit wordt gebruikt voor het verwijderen, d.w.z. het ongedaan maken van de
installatie van op het systeem bestaande packages. Nogmaals, er zal geen 
actie worden ondernomen tenzij aan alle afhankelijkheden is voldaan;
RPM zal het package alleen verwijderen als het vaststelt dat geen
van de bestanden uit het package nodig is voor een ander package.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>Ondervragen van de database</term>
    <listitem>
     <screen><command>rpm -q &lt;packagename&gt;</command></screen>
     <para>
De opdracht rpm kan ook worden gebruikt om met behulp van de 
opdrachtregeloptie <option>-q</option> ge&iuml;nstalleerde packages
te ondervragen. Deze opdracht kan met andere opties worden aangevuld
om te verzoeken om specifieke informatie over een package. De manpage
van rpm voorziet in een uitstekende hulp over alle verschillende dingen
die met rpm kunnen worden bewerkstelligd.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>Broncode rpm's</term>
    <listitem>
     <para>
Soms worden packages gedistribueerd in de vorm van broncode in rpm bestanden,
welke nu worden benoemd met de extensie ``.srpm'', eenvoudigweg
rpm's genoemd. Dit is een manier om het packagebeheer van RPM te combineren
met de veelzijdigheid van tarballs met broncode.
De srpm bevat de tarball met broncode en een ``.spec'' bestand, 
waarin alle informatie staat die RPM nodig heeft om de tarball te verwerken.
Het enige dat de gebruiker met de srpm kan doen is het opnieuw compileren!
     </para>
     <screen><command>rpm --rebuild &lt;srpm-bestand&gt;</command></screen>
     <para>
      RPM opent de srpm en verwerkt de tarball hierin net als een
normale gebruiker de make opdrachten zou hebben gebruikt.
Tenslotte wordt een nieuw rpm binair package aangemaakt wat op het systeem
kan worden ge&iuml;nstalleerd.
     </para>
     <para>Je kunt de SRPM ook installeren zoals je dat met broncode zou
doen door gebruik te maken van de normale installatie-opties.
Alles zal ergens onder /usr/src/Redhat/ worden ge&iuml;nstalleerd. 
Je kunt het nu net als elke andere tarball met broncode gebruiken!
     </para>
    </listitem>
   </varlistentry>
  </variablelist>

  <note>
   <title>Maximum RPM</title>
   <para>
    Er is uitgebreide informatie over RPM beschikbaar in de vorm van een
boek met de naam <ulink url="http://www.rpmdp.org/rpmbook/">Maximum
    RPM</ulink>, gepubliceerd door Redhat. In dit boek wordt alles beschreven
wat er valt te weten over RPM vanaf een introductie packagebeheer tot
aan het maken van je eigen packages en zelfs het gebruik van de RPM
library API om toepassingen te cre&euml;eren waar mogelijkheden
voor packagebeheer in zijn opgenomen.
   </para>
  </note>

  <note>
   <title>Systeeminstallatie</title>
<para>
Bij distributies waar gebruik wordt gemaakt van RPM zoals RedHat en SuSE,
is het installatieprogramma zelf in staat om voor afhankelijkheden te 
zorgen. Dus wanneer Linux de eerste maal in aangepaste modus wordt
ge&iuml;nstalleerd, kan de gebruiker gewoon de benodigde packages opgeven.
De installatiescripts zullen automatisch de packages opnemen die 
nodig zijn voor de geselecteerde packages en de gebruiker vragen
om bevestiging van de geselecteerde packages.
</para>
  </note>
 </sect1>

<!-- Section1: Debian packages -->
 <sect1 id="deb">
  <title>De Debian methode</title>
  <para>Debian maakt voor het distribueren van software gebruik van 
een packageformaat genaamd "deb". Het packagebeheer wordt volledig
uitgevoerd door een set tools die de afhankelijkheidscontrole,
remote installaties, enz. zeer goed uitvoert.
</para>

  <sect2 id="apt">
   <title>APT</title>
   <para>Dit is wat de Debian manpages hebben te zeggen over APT
   (Advanced Package Tool:</para>
   <blockquote>
    <para>APT is een beheersysteem voor softwarepackages. Het is nog
in ontwikkeling; de geweldige front-ends zijn nog niet beschikbaar.
    Zie in de tussentijd alsjeblieft apt-get(8).</para>
   </blockquote>
  </sect2>

  <sect2 id="apt-get">
<title>apt-get: Packagebeheer was nog nooit zo makkelijk!</title>
<para>apt-get is de basistool wat je het meeste nodig hebt om packages
op je systeem te beheren. Het heeft een volledige database met
packages beschikbaar voor installatie, en is gebaseerd op gebruikersopdrachten,
het zal installeren, de installatie ongedaan maken, upgraden, enz. en helpen
het systeem in een gezonde conditie te houden voor alle typen.
Laten we eens kijken wat er allemaal bij dit proces komt kijken.
</para>
   <variablelist>
    <varlistentry>
     <term>Sources</term>
     <listitem>
      <para>apt-get moet een paar lokaties kennen waar het packages
voor de intallatie kan ophalen. Deze lijst wordt beheerd in een bestand
met de naam <filename>/etc/apt/sources.list</filename>. Hier is een
voorbeeld van een lijst met bronnen:
      </para>
      <example>
       <title>Listing van /etc/apt/sources.list</title>
       <screen><prompt>$ </prompt><command>cat <filename>/etc/apt/sources.list</filename></command>

<computeroutput>
# Zie sources.list(5) voor meer informatie, denk er vooral
# aan dat je alleen gebruik kunt maken van http, ftp of bestands-URI's
# CDROM's worden beheerd via de apt-cdrom tool.

#deb http://http.us.debian.org/debian stable main contrib non-free
#deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free

deb http://http.us.debian.org/debian unstable main contrib non-free
deb http://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free
# Haal het commentaarteken weg als je wilt dat de apt-get source functie werkt
#deb-src http://http.us.debian.org/debian stable main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US stable non-US

#deb file:/mnt/woody1/debian unstable contrib main non-free
#deb file:/mnt/woody2/debian unstable contrib main non-free
#deb file:/mnt/woody3/debian unstable contrib main non-free
</computeroutput></screen>
      </example>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term>Cache</term>
     <listitem>
      <para>Zoals we kunnen zien, kan het systeem zodanig worden
geconfigureerd dat het packages van verschillende lokaties ophaalt.
Zodra deze zijn gedownload, worden ze in een cache gebied 
<filename class="directory">/var/cache/apt/</filename> geplaatst.</para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term>Afhankelijkheidscontrole</term>
     <listitem>
      <para>De deb packages onderhouden een lijst met afhankelijkheden van
packages die moeten worden ge&iuml;nstalleerd wil een bepaald package werken.
Wanneer je tracht een package te installeren of ook maar upgraden, dan zal
apt gaan zoeken naar onvervulde afhankelijkheden en dan een lijst maken
met datgene dat moet worden bijgewerkt of ge&iuml;nstalleerd, nog voordat
het benodigde package wordt verwerkt.
      </para>
      <example>
       <title>Package afhankelijkheden in Debian</title>
       <screen><prompt># </prompt><command>apt-get install kword</command>

<computeroutput>
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  kdebase-libs koffice-libs 
The following NEW packages will be installed:
  kdebase-libs koffice-libs kword 
0 packages upgraded, 3 newly installed, 0 to remove and 160  not upgraded.
</computeroutput></screen>
      </example>
      <para>Aangezien het reeds een lijst heeft met alle beschikbare packages,
      zal het systeem simpelweg vragen om bevestiging om het vervullen
van alle afhankelijkheden op te starten. De gebruiker hoeft zich niet bezig
te houden met het bijgewerkt houden van zijn systeem in termen van die
afhankelijkheden.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term>dpkg en dselect</term>
     <listitem>
      <para>dpkg is een tool waarmee de gebruiker kan werken met individuele
packages, zoals het ondervragen van de inhoud, controleren van de versie,
configuratie, enz. Het kan ook worden gebruik wanneer je een individueel
deb bestand dat je wellicht hebt wilt installeren. Dit bestand zal alle
afhankelijkheidsinformatie bevatten, wat dpkg net als apt-get zal verwerken.
      </para>
      <para>dselect is een tekstfront-end voor apt-get. Hiermee kan de
gebruiker de lijst met bronnen configureren, packages uit een lijst met
bekende packages selecteren, enz. Het is handig wanneer je de packagestructuren
wilt onderzoeken op zoek naar datgene wat je wellicht interessant lijkt.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </sect2>
 </sect1>

</chapter>

<!-- Keep this comment at the end of the file
Local variables:
fill-column:75
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-namecase-general:t
sgml-general-insert-case:lower
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
sgml-parent-document:("NGL.sgml" "book" "chapter")
End:
-->
