# 1.102.3

# Erstellen und Installieren von im Sourcecode vorliegenden Programmen

Beschreibung: Prüfungskandidaten sollten in der Lage sein, ein ausführbares Programm aus dem Quellcode zu erstellen und zu installieren. Dieses Lernziel beinhaltet die Fähigkeit, ein Source-Paket aus einem Archiv zu extrahieren. Kandidaten sollten in der Lage sein, einfache Anpassungen im Makefile vorzunehmen, wie z.B. Pfade zu ändern oder zusätzliche Verzeichnisse einzubinden.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- gunzip
- gzip
- bzip2
- tar
- configure
- make

### Grundsätzlicher Vorgang

Ein Programm wird von seinem Programmierer (oder seinen Programmierern) in vielen einzelnen Quellcode-Dateien geschrieben. Diese Dateien enthalten den Quellcode in der Programmiersprache, die vom Programmierer benutzt wurde, also beispielsweise C.

Ein Compiler muß jetzt jede dieser einzelnen Dateien in sogenannte Objekt-Code Dateien compilieren. Diese Objekt-Dateien enthalten dann den Maschinencode, der vom Compiler erzeugt wurde, sind aber noch nicht selbst lauffähig. Für jede einzelne Quellcode-Datei wird eine entsprechende Objektdatei erzeugt. In der Regel tragen diese Dateien die Namensendung `.o`.

Erst im nächsten Schritt werden die verschiedenen erzeugten Objektdateien zusammen mit eventuellen weiteren Libraries zu einer ausführbaren Datei verbunden. Dieser Vorgang wird Linken (engl. to link - verbinden) genannt. Das Ergebnis dieses Vorgangs ist die ausführbare Datei, die dann verwendet werden kann.

Der Compilier- und Linkvorgang besteht also aus vielen Einzelschritten. Damit nicht bei jedem Compiliervorgang alle diese Einzelschritte angegeben werden müssen, gibt es das Programm make. Dieses Programm erhält seine Informationen welche Dateien mit welchem Compiler wie übersetzt werden müssen und welche Objektdateien dann wie zu welcher ausführbaren Datei zusammengefügt werden sollen aus einer Datei mit Namen Makefile.

Ein Programmierer kann also neben seinem Programm ein dazu passendes Makefile erstellen, so daß alle Schritte, die für die Compilierung notwendig sind, vom Programm make ausgeführt werden können. Dazu erstellt er im Makefile bestimmte Regeln, die dann die entsprechenden Befehle enthalten, die notwendig sind um eine Regel auszuführen.

Der Name einer Regel wird dann dem Programm make als Parameter mitgegeben. Das Programm sucht dann das Makefile nach der entsprechenden Regel ab und führt die dort gefundenen Befehle aus.

make arbeitet außerdem mit den Zeitmarken der Dateien. Bei einem zweiten Compiliervorgang wird für jede Objektdatei überprüft, ob die Zeitmarke der dazu passenden Quellcode-Datei älter als die der Objektdatei ist. Nur wenn die Zeitmarke der Quellcodedatei jünger als die der Objektdatei ist, wird die Quellcodedatei erneut compiliert.

Mit Hilfe dieser Technik ist es auch für einen Nicht-Programmierer einfach möglich, komplexe Programme, die im Quellcode vorliegen, selbst zu übersetzen und zu installieren. Im Linux-Bereich haben sich dazu bestimmte Standards herausgebildet, die im weiteren Verlauf besprochen werden sollen.

### Format eines Quellcode-Paketes

Quellcode-Pakete werden im Linux-Bereich immer als Tar-Archive ausgeliefert. In der Regel sind diese Archive komprimiert, damit sie schneller übertragen werden können. Ein unkomprimiertes tar-Paket trägt die Endung `.tar`, ein mit gzip komprimiertes Paket hat entweder die Endung `.tar.gz` oder `.tgz`. Ist das Archiv mit bzip2 komprimiert worden, so lautet die Endung `.tar.bz2`.

Das tar-Programm von Linux ist in der Lage mit Archiven direkt umzugehen, die mit gzip komprimiert wurden, Archive, die mit bzip2 komprimiert wurden, müssen vorher entpackt werden.

Die Befehle zum Entpacken eines Tar-Archivs lauten also

      tar -xzvf Archivname.tar.gz

für ein mit gzip gepacktes Archiv und

      bzcat Archivname.tar.bz2 | tar -xvf -

für ein mit bzip2 komprimiertes Archiv. Dabei ist zu beachten, daß zwischen dem Parameter f und dem folgenden Bindestrich ein Leerzeichen steht. Eine genauere Beschreibung des tar-Programms findet sich in der Vorbereitung auf die LPI102 Prüfung im Abschnitt 1.111.5 - Aufrechterhaltung einer effektiven Datensicherungsstrategie.

Moderne Versionen von tar können auch `.bz2`-Archive direkt entpacken. Dazu muß statt dem `z` ein `j` angegeben werden.

Als Ergebnis dieses Vorganges wird jetzt ein Verzeichnis erstellt, das den Quellcode des zu compilierenden Programmes enthält.

### Erstellen des Makefiles

Ein sehr einfaches Programm enthält jetzt bereits das passende Makefile, das für die Compilierung notwendig ist. Nachdem aber heute die meisten Programme von der Existenz bestimmter Libraries abhängig sind, ist in den meisten Fällen zunächst eine genaue Prüfung der in diesem System vorliegenden Besonderheiten nötig. Dazu dient das GNU-Autoconf Paket, das einen entsprechenden Test des Systems ermöglicht und aus den entsprechenden Ergebnissen dieses Tests das Makefile erstellt.

Wenn das Verzeichnis bereits eine Datei enthält, die den Namen `Makefile` trägt, so ist dieser Schritt nicht mehr nötig. Fehlt diese Datei jedoch aber es existieren die Dateie `Makefile.in` und `configure` und die Datei `configure` ist ausführbar, dann muß das Makefile erst erstellt werden.

Dazu wird einfach das Script configure in diesem Verzeichnis aufgerufen. Der Befehl erfordert die Eingabe eines Pfades (`./`) um zu verhindern, daß ein anderes Programm diesen Namens benutzt wird. Er lautet also einfach

      ./configure

Jetzt wird das System nach allen möglichen Dingen durchsucht, die notwendig sind, um das Programm zu compilieren. Fehlen entsprechende Elemente, so wird darauf hingewiesen und kein Makefile erstellt. Sind aber alle Voraussetzungen erfüllt, so endet das configure-Script mit der Meldung

      Creating Makefile

und erstellt unser Makefile. Jetzt erst kann die wirkliche Compilierarbeit beginnen.

### Manuelles Veärndern des Makefiles

In manchen Fällen sind noch manuelle Veränderungen am Makefile notwendig. Diese Veränderungen beziehen sich in der Regel auf Pfadangaben zu bestimmten Programmen oder Angaben, wohin das Programm nach erfolgter Compilierung installiert werden soll. Diese Variablen können zumeist in den ersten paar Zeilen des Makefiles verändert werden.

Variablen werden in Makefiles ähnlich definiert, wie in Shellscripts. Eine einfache Definition sieht beispielsweise folgendermaßen aus:

      installprefix=/usr/local

Der Zugriff auf Variableninhalte erfolgt aber über eine Konstruktion mit Dollarzeichen und geschweiften Klammern, also etwa `${Variablenname}`. Es könnte also folgendermaßen weitergehen:

      installprefix=/usr/local
      installdir=${installprefix}/foo
      mandir=${installprefix}/man
      confdir=${installdir}/etc

Das würde zu folgenden realen Verzeichnisnamen führen:

- installprefix=`/usr/local`
- installdir=`/usr/local/foo`
- mandir=`/usr/local/man`
- confdir=`/usr/local/foo/etc`

Wenn wir jetzt daran Veränderungen vornehmen wollen, so können wir das durch entsprechende Anpassungen an unser System tun. Um beispielsweise dafür zu sorgen, daß das Programm seine Konfigurationsdateien nicht unter `/usr/local/foo/etc` sucht, sondern unter `/etc/foo`, so verändern wir die entsprechende Zeile in

      confdir=/etc/foo

Manchmal finden sich in solchen Variablen auch ganze Listen von Verzeichnissen, die z.B. nach Include-Dateien durchsucht werden sollen. Auch solche Listen können natürlich entsprechend angepasst werden, um beispielsweise mehr Verzeichnisse aufzunehmen. In der Regel werden Listenelemente durch Leerzeichen voneinander getrennt.

### Aufruf von make

Wenn alle Veränderungen am Makefile abgeschlossen wurden, so kann das Programm jetzt compiliert werden. Dazu wird einfach der Befehl

      make

eingegeben. Er compiliert jetzt das Programm nach der Regel, die im Makefile `all` genannt wurde. Der Aufruf ist also einfach eine Abkürzung für

      make all

Ist dieser Befehl fehlerfrei abgearbeitet worden, dann ist das Programm jetzt compiliert. Das heißt, es liegen jetzt für jede Quellcodedatei eine Objektdatei vor und es existiert das fertige ausführbare Programm. Damit das Programm auch noch in die vorgesehenen Verzeichnisse kopiert (installiert) wird, haben die meisten Makefiles noch eine Regel, die `install` heisst und entsprechend mit

      make install

aufgerufen wird. Dadurch werden die notwendigen Dateien in die vorgesehenen Zielverzeichnisse kopiert. Um alle Objektdateien wieder zu löschen kann der Befehl

      make clean

benutzt werden, um sicherzustellen, daß bei einem zweiten Compiliervorgang alles erneut übersetzt wird.

### Zusammenfassung

Nachdem ein Quellcode-Paket ausgepackt wurde müssen praktisch immer die drei einfachen Befehle

      ./configure
      make
      make install

in dem Verzeichnis ausgeführt werden, in dem der Quellcode liegt. In der Regel ist mindestens für `make install` das root-Recht erforderlich, denn dieser Befehl installiert das Programm ja an Orte im System, an denen niemand außer root Schreibrecht hat.