21.2Programme selbst kompilieren
Es gibt zumeist nur zwei Gründe dafür, Linux-Programme selbst zu kompilieren: Entweder finden Sie für das gewünschte Programm und Ihre Distribution kein Binärpaket mit dem fertig kompilierten Programm, oder Sie möchten das Programm mit einer vom Standard abweichenden Konfiguration kompilieren.
Bevor Sie zur Tat schreiten, müssen einige Voraussetzungen erfüllt sein:
-
Die GNU Compiler Collection (Pakete gcc und gcc-c++) muss installiert sein. Diese Pakete enthalten Compiler für C und C++.
-
Hilfswerkzeuge wie make, automake, autoconf etc. müssen installiert sein. Diese Programme sind für die Konfiguration und Durchführung des Kompilationsprozesses erforderlich.
-
Die Entwicklerversionen diverser Bibliotheken müssen installiert sein. Die Namen der entsprechenden Pakete enden bei Red Hat, Fedora und SUSE üblicherweise auf -devel, bei Debian und Ubuntu auf -dev. Beispielsweise enthält glibc-devel bzw. libc6-dev die Entwicklungsdateien für die glibc-Basisbibliothek. Welche Entwicklerpakete Sie sonst noch brauchen, hängt von der Natur des Programms ab, das Sie kompilieren möchten. Fehlermeldungen, in denen sich der Compiler oder Linker über fehlende Bibliotheken beklagt, sind ein eindeutiges Indiz dafür, dass Sie ein wichtiges Entwicklerpaket übersehen haben.
Bei Debian und Ubuntu definiert das Metapaket build-essential Abhängigkeiten für die wichtigsten Entwicklerpakete. Deswegen führt die Installation von build-essential automatisch zur Installation diverser weiterer Pakete, die zusammen die Grundausstattung für die Programmentwicklung in C/C++ bilden. Unter Ubuntu sind die durch build-essential definierten Pakete standardmäßig installiert; unter Debian führen Sie apt-get install build-essential aus.
Um die Grundvoraussetzungen für die Programmentwicklung in Fedora zu erfüllen, führen Sie am einfachsten yum groupinstall development-tools aus. Auch für die KDE- und Gnome-Programmentwicklung gibt es eigene Paketgruppen: kde-software-development und gnome-software-development.
Unter RHEL und CentOS gibt es wie in Fedora eine Paketgruppe mit Entwicklungswerkzeugen. Ihr Name lautet allerdings einfach development.
Angehende SUSE-Entwickler installieren in YaST alle Pakete des Paketschemas Grundlegende Entwicklungsumgebung. Falls Sie vorhaben, KDE- oder Gnome-Programme zu entwickeln, installieren Sie auch die Selektionen KDE- bzw. Gnome-Entwicklung. Wenn Sie zypper vorziehen, führen Sie zypper install -t pattern devel_basis bzw. devel_kde bzw. devel_gnome aus.
Code auspacken
Im Internet finden Sie den Quellcode zumeist in komprimierten TAR-Archiven. Nach dem Download entpacken Sie den Code in ein lokales Verzeichnis:
Eine Alternative zu den TAR-Archiven sind Quellcodepakete, die exakt den Code enthalten, aus dem ein bestimmtes Programm Ihrer Distribution kompiliert wurde. Die Quellcodepakete finden Sie in der Regel auf dem (FTP-)Server Ihrer Distribution. Bei Distributionen auf Basis von RPM-Paketen befinden sich die Quellcodedateien in SRPM-Paketen mit der Dateikennung *.src.rpm. Zur Installation führen Sie wie üblich rpm -i aus:
Es hängt von der Distribution ab, wo der Quellcode nun tatsächlich landet:
Fedora, Red Hat: |
/usr/src/redhat/ |
SUSE: |
/usr/src/packages/ |
-
SOURCES/name.tar.xxx enthält den eigentlichen Code. Das TAR-Archiv muss wie oben beschrieben entpackt werden.
-
SOURCES/name-xxx.patch (Red Hat) oder SOURCES/name.dif (SUSE) enthält distributionsspezifische Veränderungen am ursprünglichen Code. Wenn Sie die Codedateien entsprechend ändern (patchen) möchten, führen Sie das folgende Kommando aus:
user$ cd name-quellcodeverzeichnis user$ patch < name.dif/patchJe nachdem, welches Verzeichnis gerade aktuell ist und wie die Verzeichnisangaben innerhalb der Patch-Datei sind, müssen Sie zusätzlich die Option -p1 angeben (siehe man patch).
-
SPECS/name.spec enthält eine Paketbeschreibung, die auch zur Erstellung von RPM-Paketen dient. Wenn Sie aus selbst kompilierten Programmen wieder ein RPM-Paket erstellen möchten, müssen Sie dazu das Kommando rpmbuild einsetzen, auf das ich hier aber nicht eingehe. Lesen Sie man rpmbuild!
Bei Debian-basierten Distributionen befindet sich der Quellcode in mehreren Dateien, die Sie am besten mit apt-get source in das aktuelle Verzeichnis installieren:
Im aktuellen Verzeichnis finden Sie nun drei neue Dateien und ein Verzeichnis:
-
paketname.dsc enthält eine Kurzbeschreibung des Pakets.
-
paketname.orig.tar.gz enthält ein TAR-Archiv mit dem ursprünglichen Quellcode des Programmentwicklers.
-
paketname.diff.gz enthält alle Debian- bzw. Ubuntu-spezifischen Änderungen am Originalquellcode.
-
Das neue Verzeichnis paketname/ enthält schließlich den bereits extrahierten Inhalt von paketname.diff.gz, wobei alle Änderungen aus der diff-Datei bereits ausgeführt wurden.
Programm kompilieren
Zum Kompilieren und Installieren von Programmen sind drei Kommandos erforderlich, die manchmal auch als »Dreischritt« bezeichnet werden: ./configure, make und make install. Die drei Kommandos werden im Folgenden näher beschrieben. Dabei setze ich voraus, dass Sie sich im Quellcodeverzeichnis befinden.
configure ist ein Script, das testet, ob alle erforderlichen Programme und Bibliotheken verfügbar sind. Da sich das Script im lokalen Verzeichnis befindet, muss es in der Form ./configure ausgeführt werden. Das Script adaptiert die Datei Makefile, die alle Kommandos enthält, um die diversen Codedateien zu kompilieren und zu linken. Bei manchen (zumeist eher kleineren Programmen) kann es sein, dass es das Script configure nicht gibt. In diesem Fall führen Sie sofort make aus.
make löst die Verarbeitung der Compile- und Link-Kommandos aus. Sie sehen nun (manchmal schier endlose) Nachrichten und Warnungen der verschiedenen Compiler-Läufe über das Konsolenfenster huschen. Solange kein Fehler auftritt, können Sie diese Meldungen getrost ignorieren. Als Ergebnis sollte sich im Quellcodeverzeichnis nun die ausführbare Datei name befinden.
In vielen Fällen können Sie das Programm nun sofort starten (Kommando ./name) und testen. Beachten Sie aber, dass insbesondere Netzwerk-Dienste eine spezielle Konfiguration erfordern und zumeist nur durch Init-Scripts korrekt gestartet werden!
Der letzte Schritt besteht darin, das Programm allen Benutzern zugänglich zu machen. Dazu müssen die Programm- und eventuell auch Bibliotheksdateien in öffentlich zugängliche Verzeichnisse kopiert werden. Das erfordert root-Rechte. Vor der Ausführung von make install sollten Sie sicherstellen, dass das betreffende Programm nicht schon installiert ist. Wenn das der Fall ist, sollte es vorher deinstalliert werden.
Mögliche Probleme
Während des Kompilierens können vielfältige Probleme auftreten. Am wahrscheinlichsten ist, dass irgendwelche Compiler-Hilfswerkzeuge oder zum Kompilieren notwendige Entwicklerversionen von Bibliotheken fehlen. Diese Probleme werden in der Regel bereits durch configure festgestellt und lassen sich meist relativ leicht beheben, indem das fehlende Paket einfach installiert wird.
Schon schwieriger wird es, wenn configure nach Bibliotheken verlangt, die in Ihrer Distribution nicht oder nicht in der erforderlichen Version verfügbar sind: Dann müssen Sie sich im Internet auf die Suche nach der betreffenden Bibliothek machen und eventuell zuerst die Bibliothek kompilieren.
Zu komplexen Programmen, wie Apache oder mplayer, finden Sie im Internet richtiggehende Kompilieranleitungen, in denen Schritt für Schritt beschrieben wird, was in welcher Reihenfolge installiert und kompiliert werden muss.
Noch problematischer ist es, wenn während der Kompilierung ein Syntaxfehler auftritt, die Kompilation also mit einer Fehlermeldung abbricht. Schuld daran ist oft nicht ein Programmfehler, sondern eine Inkompatibilität zwischen Ihrem Compiler und dem Code. Manche Programme können nur mit einer bestimmten Version von gcc kompiliert werden, wobei es oft gerade nicht die neueste Version sein muss. Die Lösung besteht hier darin, die gewünschte Compiler-Version zu installieren. Auch hierzu finden Sie im Internet oder in den README-Dateien zum Quellcode oft genaue Anweisungen.
Selbst kompilierte Programme oder Bibliotheken können die Paketverwaltung durcheinanderbringen. Das Problem besteht darin, dass das selbst kompilierte Programm abc zwar nun auf Ihrem System installiert ist, die RPM- oder DEB-Datenbank aber nichts davon weiß. Wenn Sie nun versuchen, das Paket xyz zu installieren, das von abc abhängt, kommt es zu einer Fehlermeldung wegen scheinbar nicht erfüllter Paketabhängigkeiten. Mit rpm können Sie das Paket dank der Optionen --nodeps und --force dennoch installieren.
Die eleganteste Lösung besteht darin, das Programm nicht mit make install zu installieren, sondern zuerst in ein Paket zu verpacken und dieses dann zu installieren. Das setzt voraus, dass Sie sich zuerst mit den Kommandos zum Erstellen von Paketen vertraut machen. Außerdem ist diese Vorgehensweise ziemlich umständlich, insbesondere wenn ein Programm mehrfach getestet und neu kompiliert werden muss.
Beispiele
Der Platz in diesem Buch reicht nicht aus, um auch eine Einführung in die Programmierung in C und C++ zu geben. Da ich aber in der Vergangenheit immer wieder diesbezügliche Fragen erhalten habe, finden Sie hier eine kurze Anleitung, wie Sie das klassische »Hello World«-Programm in C und C++ programmieren und kompilieren. Für die C-Version schreiben Sie mit einem Editor die folgenden Zeilen in die Datei hello.c:
Mit den folgenden Kommandos kompilieren Sie das Programm und führen es aus:
Der vergleichbare Code in C++ sieht so aus:
Zum Kompilieren verwenden Sie nun g++ statt gcc:
Anjuta, KDevelop, Eclipse, Emacs oder Vi?
Wenn Sie unter Linux eine komfortable Entwicklungsumgebung zur Programmierung in C oder C++ suchen, sollten Sie KDevelop (KDE) oder Anjuta (Gnome) ausprobieren. Eine mögliche Alternative ist die Entwicklungsumgebung Eclipse, die zwar speziell für Java optimiert ist, aber auch für andere Programmiersprachen verwendet werden kann. Echte Unix/Linux-Freaks betrachten auch die Editoren Vi und Emacs als Entwicklungsumgebung.