\section{\textit{./configure ; make ; make install} }
Ein Softwarepaket, welches durch \textit{Autoconf} unterst\"utzt wird,
beinhaltet meistens ein Skript namens ``configure''. Will man das Paket
installieren, ist im idealen Fall nur eine Folge von drei Kommandos
einzugeben.

Das im Paket enthaltene ``configure'' muss immer als erstes
aufgerufen werden; optional auch mit einer \"uberweltigenden Menge an
Kommandozeilenparametern, die mit dem Aufruf 
\texttt{./configure~--help}\footnote{Da das aktuelle ``Working Direktory''
nicht im Suchpfad (PATH Umgebungvariable) eingetragen sein sollte, ist es
notwedig, dem \texttt{configure} ein ``./'' voranzustellen.} eingesehen werden
k\"onnen. Das Skript ermittelt einige Details zur Systemumgebung und bereitet
den Quellcodeverzeichnisbaum auf die Kompilierung vor. Das Ergebnis eines
erfolgreich durchgelaufenen ``configure''s sind einige neu
angelegte Dateien im Verzeichnisbaum des Softwarepakets, unter anderem auch
die ``Makefile''.

Ist eine ``Makefile''\footnote{Das ``Makefile'' kann auch in
Kleinbuchstaben geschrieben sein, f\"ur das ``Make'' Programm spielt
es keine Rolle. Es hat sich allerdings eingeb\"urgert das ``M'' gro"s
zu schreiben, da bei einem Aufruf von \texttt{ls}, die
gro"sgeschriebenen Dateien als erstes aufgelistet werden und somit
nicht in der Auflistung st\"oren.} im Verzeichnisbau des Quellcodes
vorhanden, kann mit dem Aufruf \texttt{make} die Erstellung der
Software erfolgen.  ``Make'' liest sich die ``Makefile'' ein, und
arbeitet die dort definierten Schritte ab,
wobei meistens Compiler mit den entsprechenden Dateinamen und Optionen
als Argumente aufgerufen werden.

Nach dem sich ``Make'' ohne Fehler beendet hat, sollte das ausf\"uhrbare
Programm nun irgendwo im Quellcodebaum vorliegen und gegebenen Falls auch
schon gestartet werden k\"onnen. Durch den Aufruf \texttt{make~install}
wird das Paket in den daf\"ur vorhergesehenen Pfad kopiert, die Rechte der
installierten Dateien werden gesetzt, und die letzten Vorbereitungen
werden getroffen, um die Software lauff\"ahig zu machen. Nat\"urlich ist es
wichtig, selbst entsprechende Rechte zu haben, wenn man etwas bspw. nach
\texttt{/usr/bin} kopieren will; folglich sollte man das ``install''-Target als
``root'' ausf\"uhren.

\subsection{Das Konfigurieren}
Wie schon erw\"ahnt wurde, erkennt ``configure'' eine riesige
Menge an Kommandozeilenparameter, mit Hilfe derer das zu erstellenden
Programm konfiguriert werden kann. Neben den Optionen, welche das zu
erstellende Programm selbst zur Konfiguration anbietet, gibt es schon
durch \textit{Autoconf} standardisierte Parameter, von denen nur
wenige hier vorgestellt werden sollen.

Um sich eine Liste aller Optionen angzeigen zu lassen, die von dem
vorliegenden Skript unterst\"utzt werden, ist lediglich die
Kommandozeile 
\begin{verbatim}
./configure --help
\end{verbatim}
abzusetzten. Die Ausgabe dieses Kommandos unterscheidet sich von Paket
zu Paket nur in den paketspezifischen Optionen. Es sei von daher
empfohlen, die Liste der verf\"ugbaren Optionen an das
Konfigurationsskript vor dem Erstellen eines Pakets wenigstens zu
\"uberfliegen. In folgender Auflistung sind nun einige der wichtigen
Optionen aufgef\"uhrt.

\begin{description}
        \item[\textnormal{\texttt{--prefix}}] \hfill \\ Jedes Paket
          hat ein Installationsprefix. Sieht man sich einmal die
          Verzeichnisstruktur eines UNIX-artigen Systems an, wird man
          festellen, dass es mindestens zwei \"ahnlich strukturierte
          B\"aume im Dateisystem gibt. Zum einen den unter dem
          Wurzelknoten (\texttt{/}) und zum anderen unter
          \texttt{/usr} aber auch \texttt{/usr/local}.  Die Software
          wird unterhalb des angegebenen Pr\"afixes installiert. Folgender
          Aufruf ist denkbar:
\begin{verbatim}
./configure --prefix=/home/pete/test
\end{verbatim}

        \item[\textnormal{\texttt{--enable-\textit{feature[=arg]}}} 
          \label{ref:enable-feature}] \hfill \\
                Nicht alle, aber die meisten Pakete bieten selbst definierte
                Optionen an, die vor der Erstellung gesetzt werden
                k\"onnen. Eine Auflistung der Features, welche ein Paket zur
                Konfiguration anbietet, befindet sich in der Ausgabe des
                Kommandos \texttt{./configure~--help}. Mit der
                \texttt{--enable-\texttt{feature}} Option kann eine
                Eigenschaft mit in die Software einkonfiguriert werden, falls
                sie es nicht schon standardm\"a"sig wird. Bei einigen Optionen
                kann man auch ein optionales Argument \"ubergeben. Bei welchen
                Optionen dies geht, sollte ebenfalls in der Hilfeausgabe des
                Skripts stehen. Die \"Ubergabe des Arguments an die Option
                erfolgt wie im folgenden Beispiel gezeigt:
                \begin{verbatim}
./configure --enable-buffers=128
                \end{verbatim}
                Wird der ``enable''-Option kein Argument \"ubergeben,
                so wird es standardm\"a"ig auf ``yes'' gesetzt. Eine
                Besonderheit stellt das das ``no'' Argument. M\"ochte
                man ein Feature g\"anzlich aus dem Program entfernen,
                so fern es der Quellcode unterst\"utzt, kann man
                \texttt{--enable-\textit{feature}=no} oder
                \texttt{--disable-\textit{feature}} angeben.

        \item[\textnormal{\texttt{--disable-\textit{feature}}}] \hfill \\
                Mit dieser Option wird ein bestimmtes Feature
                ausgeschaltet.  Beispielsweise k\"onnte ein Programm
                zus\"atzlich eine GUI anbieten. Ist diese nicht
                erw\"unscht, k\"onnte es \"uber die
                \texttt{--disable-gui} Option abgeschaltet werden.  \\
                Das \texttt{--disable-feature} und
                \texttt{--enable-\textit{feature}} geh\"oren logisch
                zusammen. Das hei"st, wenn es eine Optionen
                \texttt{--enable-gui} gibt, dann gibt es auch eine
                Option \texttt{--disable-gui}. Nat\"urlich macht es
                keinen Sinn einen Aufruf des Skripts mit beiden
                Optionen zu machen.

        \item[\textnormal{\texttt{--with-\textit{package[=arg]}}}]
                \hfill \\ Gelegentlich ist es notwendig anzugeben,
                unter welchem Pfad sich bestimmte Headerfiles und
                Libraries befinden. Dies ist vor allem dann der Fall,
                wenn ben\"otigte Bibliotheken in einem exotischen
                Verzeichnis installiert wurden.  Angenommen die GTK+
                Bibliothek ist unter \texttt{/usr/local} installiert
                worden und das zu erstellende Programm ben\"otigt
                diese.  Sollte ``configure'' fehlerhaft abbrechen,
                kann man versuchen dem Skript die Option
                \texttt{--with-gtk=/usr/local} mit auf den Weg zu
                geben, um explizit auszudr\"ucken, dass unter dem
                angegebenen Pr\"afix die GTK+ Headers und Libs zu
                finden sind.
\end{description}

Wie schon mehrmals erw\"ahnt versteht ``configure'' noch viele andere
Optionen.  Der Leser sollte sich an dieser Stelle irgendein Paket
seiner Wahl aus dem Internet herunterladen, dieses entpacken und nach
einem Skript namens ``configure'' suchen. Sollte eines vorhanden sein,
steht dem Experimentieren nichts mehr im Wege.

\subsection{Das Erstellen}
In diesem Stadium, nach dem ``configure'' erfolgreich abgelaufen ist,
sollte man die ``Makefile'' im Verzeichnisbaum des Pakets
vorfinden. Diese Datei, wie auch einige andere Dateien, sind vom
vorhin gestarteten Skript generiert worden. Das ``Makefile''
enth\"allt einige ``Targets'', die \"ublich f\"ur die von
\textit{Autoconf}'s ``configure'' generierten ``Makefile''s sind.

Es folgt eine Auflistung der gebr\"auchlisten Aufrufe von ``Make'' im
Zusammenhang mit der generierten ``Makefile''.

\begin{description}
\item[\textnormal{\texttt{make all}}] \hfill \\
  Dieser Aufruf sollte alle ben\"otigten Dateien kompilieren und die
  Paketprogramme erstellen. Nach erfolgreichem Ablauf, sollten sich die
  ``Binaries'' unterhalb des Paketverzeichnisbaums befinden.
\item[\textnormal{\texttt{make check}}] \hfill \\
  ``Make'' sollte alle ``Selbst-Tests'' anstarten, die das Paket beinhalten
  kann.
\item[\textnormal{\texttt{make install}}] \hfill \\
  Instaliert die Software unterhalb des zuvor mit ``configure'' definierten
  Pr\"afixes.
\item[\textnormal{\texttt{make clean}}] \hfill \\
  ``S\"aubert'' den Quellcodebaum. Dies resultiert \"ublicherweise darin, alle
  w\"arend der Kompilierung erstellten Objektdateien sowie die erstellten
  Programme zu l\"oschen.  Die von ``configure'' erstellten Dateien werden
  jedoch nicht gel\"oscht.
\item[\textnormal{\texttt{make distclean}}] \hfill \\
  ``S\"aubert'' noch sauberer als \texttt{make clean} :-) L\"oscht auch die
  von ``configure'' erstellten Dateien.  ``distclean'' leitet sich aus dem
  Ausdruck ``distribution clean'' ab und soll den Verzeichnisbaum so
  s\"aubern, dass alle generierten Files neu erstellt werden m\"ussen.
\end{description}

Statt \texttt{make~all} kann auch nur \texttt{make} eingegeben werden, da das
Target ``all'' immer als erstes in der ``Makefile'' steht, wodurch sich somit
die beiden Aufrufe entsprechen.

\subsection{Das Installieren}
Wie schon im vorhergehen Abschnitt gezeigt, wird die erstellte Software mit dem
Kommando \texttt{make~install} ins System installiert und zwar unterhalb des
mit der Option ``prefix'' angegeben Pfades (z.B. \texttt{/usr/local}).
\"Ublicherweise werden die ausf\"uhrbaren Programme nach \texttt{bin} kopiert
und die Rechte der Dateien gesetzt. Konfigurationsdateien laden oft im
\texttt{etc} Verzeichnis. \texttt{share/\textit{prog}} dient oft zur Ablage
f\"ur zus\"atzliche Dateien, welche die Software ben\"otigt.  Nat\"urlich wird
all diesen Verzeichnissnamen das Pr\"afix vorangestellt.

Zum Abschlu"s noch ein Tipp \"uber das Erstellen eines Softwarepakets
im Bin\"arformat. Angenommen man will ein Paket erstellen, dieses
Installieren, die installierten Dateien in ein Tar-Archiv packen und
anschliessend dieses einem Freund zuschicken, damit er sich Arbeit spart.
Da der Befehl \texttt{make~install} die Dateien in das System installiert, ist
es schwierig festzuhalten, welche Files wohin kopiert wurden. Eine
M\"oglichkeit w\"are es, das Pr\"afix auf einen leeren Verzeichnisbaum zu
setzten und die Software dorthin zu installieren. Das macht aber im
allgemeinen keinen Sinn und kann unter Umst\"anden zu Problemen f\"uhren.
Der Trick besteht darin, die Software einfach mit dem gew\"unschten
Pr\"afix zu kompilieren, also bspw. mit \texttt{--prefix=/usr}, und vor dem
Installieren eine Makevariable auf ein tempor\"ares, leeres Verzeichnis zu
setzten, in welches die Softwarekomponenten kopiert werden. Gibt es in der
Makefile die \texttt{DESTDIR} Variable (mit \texttt{grep DESTDIR Makefile}
ersichtlich), kann mit dem Kommando
\begin{verbatim}
make DESTDIR=/tmp/software install
\end{verbatim}
das Paket in das angegebene Verzeichnis installiert werden. Dieses
kann man ``tarren'' und seinen Freunden zuschicken.
