13.4 Sekundärsoftware aus Quellen
Würden Sie einen Porsche-Motor in einen Smart einbauen? Oder umgekehrt einen Porsche mit einem Smart-Motor versehen? Genau dies geschieht im übertragenen Sinne bei der Verwendung gängiger Betriebssysteme. Die Entwickler versuchen stets, Diener vieler Herren zu sein, ohne dabei auf die Stärken und Schwächen der Hardware einzugehen, auf der das System eingesetzt werden soll.
Fast unendlich flexibel
Linux besitzt die einzigartige Möglichkeit, voll konfigurierbar und skalierbar zu sein. Das System macht in der Armbanduhr als Embedded-System eine ebenso gute Figur wie als Cluster-Betriebssystem des Rechnerparks einer Universität. Das Geheimnis besteht darin, dass das System quelloffen ist und daher (einen entsprechenden Compiler vorausgesetzt) auf viele Systeme portiert und an diese angepasst werden kann. Der folgende Abschnitt zeigt, wie Sie selbst eine optimale Anpassung der Software an den heimischen PC erreichen.
Bei jedem Programm für Linux haben Sie die Möglichkeit, selbst Hand anzulegen und die Quellpakete eigenhändig zu kompilieren und zu installieren. Dies funktioniert jedoch nicht immer auf Anhieb, da hierbei die Abhängigkeiten nicht automatisch aufgelöst werden. Die allermeisten Entwickler von Programmen stellen auf ihrer Website die Quellpakete der Programme zur Verfügung. Diese sind meist im tar.gz- oder einem anderen Format gepackt und müssen mit einem Packprogramm wie zum Beispiel guitar oder Ark (KDE) entpackt werden.
13.4.1 Der Linux-Dreisprung
Um die entpackten Dateien weiterbearbeiten zu können, müssen Sie der Besitzer der Dateien sein oder Root-Rechte haben. Meist werden die Dateien nach dem Muster des folgenden Dreisprungs (dem Linux-Dreisprung) kompiliert und installiert. Zunächst wird über das Konfigurationsskript configure die eigentliche Kompilierumgebung angepasst, und es wird geprüft, ob sämtliche für den Übersetzungsprozess notwendigen Pakete auf dem System zur Verfügung stehen. Bei etwaigen Fehlermeldungen müssen Sie dann meist die sogenannten Developer-Pakete, die die fehlenden Bibliotheken oder Header enthalten, nachinstallieren. Das vorangestellte Kürzel ./ bedeutet, dass die Konfigurationsroutine aus dem aktuellen Verzeichnis aufgerufen wird. Beim Kompilieren über make wird der Quellcode des Programms in eine ausführbare Datei umgewandelt. Danach wird diese Datei über
sudo make install
installiert, sie wird also in den Programmordner verschoben, mit anderen Dateien und Bibliotheken verknüpft, und eventuell wird ein Eintrag im GNOME- bzw. KDE-Menü erstellt. Dazu sind meist Root-Rechte erforderlich, daher die Verbindung mit sudo.
Abbildung 13.6 Der »Linux-Dreisprung«
»Readme« beachten!
Bei vielen Programmen liegt den gepackten Dateien eine Anleitung namens README oder INSTALL bei, die Sie unbedingt beachten sollten! Hier finden Sie oftmals wertvolle Tipps und Anleitungen, ohne die Sie viele Programme nicht kompilieren können. Es ist oft der Fall, dass Sie dem Compiler bestimmte Flags mit auf den Weg geben müssen. Dies sind Optionen, die für den reibungslosen Ablauf der Kompilierung sorgen. So habe ich zum Beispiel ein Programm bei mir im Einsatz, das sich nur durch den etwas länglichen Befehl
sudo ../configure --with-FC=gfortran --with-CC=/usr/local/bin/gcc
--with-FFLAGS='-DUNIX=1 -DLINUX=1 -DG95' --with-CFLAGS='-DUNIX=1
-DLINUX=1 -march=native' --with-LDFLAGS='-lstdc++-static'
--x-libraries=/usr/X11/lib --x-include=/usr/X11R6/include
--host=x86_64-linux
konfigurieren und damit kompilieren lässt. Im obigen Beispiel ist übrigens die relativ neue Option -march=native angegeben, mit deren Hilfe der Compiler selbständig die richtige Architektur Ihres Rechners ermittelt. Das Kompilieren kann eine sehr zeitaufwendige Sache sein, wenn Sie die Compiler-Flags alle selbst erarbeiten müssen. Darum ist das Lesen der obligatorischen Readme-Datei ein Muss.
13.4.2 Installation unter Ubuntu
Im Folgenden finden Sie eine kurze Übersicht darüber, was beim Kompilieren von Sekundärsoftware speziell unter Ubuntu/Debian-Systemen zu beachten ist. Stellen Sie zunächst sicher, dass die beiden Pakete build-essential und checkinstall auf Ihrem System installiert sind. Sämtliche der folgenden Schritte finden innerhalb einer Konsole statt. Zunächst besorgen Sie sich die Quelltext-Dateien des gewünschten Programms aus dem Internet.
Handelt es sich um ein Ubuntu-Standard/Universe/Multiverse-Paket, dann haben Sie es besonders einfach: Die Quellen können Sie sich auch aus dem Repository beschaffen. Anderenfalls verfahren Sie so, wie in dem folgenden Abschnitt beschrieben.
Entpacken der Quellen
Die Quelltext-Dateien, die das Programm ausmachen, sind stets gepackt und komprimiert. Normalerweise werden dabei Verzeichnisse mit dem Archivierungsprogramm tar (vergleiche Kapitel 24, »Befehlsreferenz«) in einer Datei mit der Endung .tar zusammengefasst. Um Bandbreite zu sparen, werden diese tar-Archive dann auch noch mit gzip komprimiert, so dass letztlich Dateien der Form <progname>.tgz oder <progname>.tar.gz zur Verfügung stehen. Manchmal wird auch nicht mit gzip, sondern mit dem Programm bzip2 komprimiert. Das Archiv hat dann einen Namen der Form <progname>.tar.bz2.
Verzeichnis anlegen
Zunächst sollten Sie ein Verzeichnis anlegen, in dem das heruntergeladene Archiv gespeichert wird. Das kann zum Beispiel der Ordner packages im Heimverzeichnis sein. Dort können Sie dann das Archiv nach dem Download entpacken. Für Archive mit der Endung *.tgz oder *.tar.gz geht das folgendermaßen:
tar -xzf Dateiname
Für Archive mit der Endung .tar.bz2 verwenden Sie:
tar -xjf Dateiname
Beachten Sie, dass zum Entpacken und Kompilieren der Software noch keine Root-Rechte erforderlich sind. Normalerweise entsteht beim Entpacken ein neues Verzeichnis mit dem Namen des Pakets, in das Sie mit cd Verzeichnisname wechseln.
Installationsanweisung lesen und Konfigurieren
Zugegeben, fast alle Installationen laufen nach dem gleichen Verfahren ab – aber manchmal gibt es eben doch Abweichungen. Deshalb lohnt es sich, in Dateien wie INSTALL und README nach Hinweisen auf benötigte Programme und Bibliotheken oder mögliche Probleme samt Lösungen zu suchen. Auch eventuell abweichende Installationsverfahren sind hier erklärt. Diese Dateien können bequem mit einem Editor Ihrer Wahl gelesen werden, notfalls tut es auch der Pager less auf der Kommandozeile.
Der folgende Befehl startet die Erstellung einer Konfigurationsdatei, die später zur eigentlichen Übersetzung des Quellcodes und zur Installation benötigt wird:
./configure --prefix=/usr/local
Das geänderte Präfix trägt der speziellen Ubuntu-Verzeichnisstruktur Rechnung, in den meisten Fällen können Sie aber das Präfix auf der Voreinstellung belassen. Optionale Features des Programms können Sie mit Optionen wie ---enable-xyz ein- und mit ---disable-xyz ausschalten. Die vollständige Auflistung aller möglichen Optionen bringt:
./configure --help
Wenn Sie Glück haben, läuft der Konfigurationsprozess ohne Fehlermeldungen durch. Meist endet die Ausgabe mit einer ausdrücklichen Erfolgsmeldung und der Aufforderung, jetzt make zu starten. Bei weniger Glück fehlt die eine oder andere Komponente, und Sie erhalten eine Fehlermeldung, die wie folgt aussehen kann:
checking for XML::Parser... configure:
error: XML::Parser perl module
is required for intltool
Fehlende Abhängigkeiten
Was können Sie mit dieser Meldung anfangen? Alle benötigten Informationen stecken in der Fehlermeldung: Es wird etwas benötigt, das mit »xml«, »parser« und »perl« zu tun hat. Also müssen Sie nach einem Paket suchen, das all diese Bestandteile im Namen enthält. Dazu verwenden Sie das Tool
aptitude:
aptitude search ~nxml~nparser~nperl
p libxml-parser-perl -
Perl module for parsing XML files
~n leitet dabei ein Wort ein, das als Teil eines Paketnamens gesucht werden soll. Hilft das noch nicht? Dann könnte ~d Sie weiterbringen. Dieser Parameter durchsucht statt des Paketnamens gleich den gesamten Beschreibungstext. In diesem Fall war der erste Befehl allerdings schon erfolgreich: Er führte zum Paket libxml-parser-perl. Installieren Sie das benötigte Paket über sudo apt-get install libxml-parser-perl und starten Sie die Konfiguration erneut. Benötigte Pakete beginnen meist mit lib. Stehen mehrere Pakete zur Auswahl, dann ist dasjenige richtig, das auf -dev endet. Der nächste Schritt ist mit make meist einfach. Währenddessen können Sie je nach Programmgröße und Rechenleistung eine Tasse Kaffee holen oder an etwas anderem arbeiten.
Was tun bei Fehlern?
Auch bei make kann einmal etwas schiefgehen. Der erste Schritt ist wieder die Untersuchung der Ausgabe. Dabei kommt es diesmal nicht auf die letzten Zeilen an, die meist nur Folgefehler enthalten, sondern auf eine Zeile, die, wenn Sie Glück haben, auf eine fehlende Datei mit der Endung .h verweist. Haben Sie diese Datei gefunden, ist das Problem schon so gut wie gelöst, und der größte Aufwand ist die Erstellung einer Fehlermeldung an den Programmautor wegen eines unvollständigen configure-Skripts, das die fehlende Komponente nicht bemerkte.
Sie müssen nun herausbekommen, welches Paket die fehlende Datei enthält. Dazu muss das Paket apt-file aus dem Universe-Repository installiert sein. Die folgende Befehlsfolge aktualisiert zunächst die Datenbank von apt-file:
sudo apt-file update
Suche mit apt-file
Da Sie auf das Debian-Paketsystem zugreifen, sind Root-Rechte erforderlich (sudo). Nun können Sie mit sudo apt-file search Dateiname nach der fehlenden Datei suchen. Das fehlende Paket ist zu installieren, danach kann make erneut gestartet werden. Glücklicherweise arbeitet es beim letzten Arbeitsstand weiter und fängt nicht wie configure ganz von vorn an.
Der Befehl sudo checkinstall startet die Verwandlung des Programms in ein simples .deb-Paket und stößt dessen Installation an. Dabei werden einige Fragen gestellt, die Sie meist mit der -Taste bestätigen können. Schlägt die Installation fehl, finden sich Informationen in der Ausgabe von dpkg, die Sie sich anzeigen lassen sollten. Wird dabei gemeldet, dass Dateien aus anderen Paketen überschrieben werden müssten, sollten Sie dies sehr gründlich abwägen. Eine Installation ließe sich in solchen Fällen zwar mit sudo dpkg --force-overwrite -i Paketname erzwingen, von dieser Vorgehensweise ist jedoch abzuraten, da Sie dadurch meist ein inkonsistentes System riskieren.
13.4.3 Abweichende Installationsverfahren
Manche Programme verzichten auf ein configure-Skript und werden nur mit make gebaut, andere verwenden ganz andere Systeme wie SCONS. Für all diese Verfahren gilt: Die eigentliche Installation sollten Sie durch Einsatz von checkinstall abfangen, da nur so das Paketsystem über die neuen Programme Bescheid weiß und das ungewollte Überschreiben von Dateien verhindert werden kann. Vor dem eigentlichen Installationsbefehl muss daher checkinstall eingefügt werden – aus sudo ./install.sh oder sudo scons install wird sudo checkinstall ./install.sh oder sudo checkinstall scons install. In den meisten Installationsanleitungen, die nicht für Ubuntu geschrieben sind, fehlt sudo oder ist durch su ersetzt. Bei Ubuntu müssen Sie jedoch stets sudo verwenden.
Tipp 208: Alternativen: dh_make und fakeroot |
Als Alternative zu checkinstall und dem Vorspiel mit configure und make bietet sich die Kompilierung mittels dh_make und die Erstellung des Pakets über fakeroot an. Der Vorteil ist, dass weniger Befehle ausgeführt werden müssen und dass fakeroot das *.deb-Paket ohne Nachfrage erstellt. |
Zusätzlich müssen hierfür die folgenden Pakete installiert sein: |
dh-make |
fakeroot |
Die Schritte sind bis zu der Stelle, an der ./configure auszuführen ist, dieselben. Entpacken Sie also das Quelltext-Archiv, und wechseln Sie in das entpackte Verzeichnis. |
Anstelle von ./configure führen Sie nun aber dh_make aus. Die Frage nach dem Pakettyp beantworten Sie bitte immer mit »Single Binary«, also »s«. Dies erstellt die Regeln für fakeroot, führt anschließend das configure-Skript aus und erzeugt eine Sicherheitskopie des Ordners mit dem Quelltext. Anschließend wird das Programm mit |
fakeroot debian/rules binary |
kompiliert und sofort danach das .deb-Paket im Unterordner erstellt. Dieses lässt sich dann wie gewohnt mit dpkg installieren, wozu wieder Root-Rechte benötigt werden. |
KDE-Programme kompilieren
Für sämtliche KDE-Programme gilt, dass bei configure das Präfix auf /usr festgelegt werden muss: ./configure --prefix=/usr
Ein einfaches Beispiel
Das folgende Beispiel zeigt die Kompilierung und Installation des klassischen Video-Players MPlayer aus Quellen.
- Laden Sie von der Seite des Projekts MPlayer (www.mplayerhq.hu) eine aktuelle Version des Programms herunter, und entpacken Sie diese wie folgt
in Ihrem Heimatverzeichnis:
tar -xjf MPlayer-<Version>.tar.bz2
- Begeben Sie sich nun in das entpackte Quellverzeichnis, bereiten Sie die Quellen vor,
und kompilieren Sie diese:
user$ cd MPlayer-<Version>
user$ ./configure
Detected operating system: Linux
Detected host architecture: i386
Checking for cc version ... 4.0.2, bad
Checking for gcc version ... 4.0.2, bad
Checking for gcc-3.4 version ... 3.4.5, ok
Checking for host cc ... gcc-3.4
...
user$ make - Im vorliegenden Fall wurde übrigens der bei Ubuntu als Standard installierte C-Compiler gcc-4 als schlecht eingestuft. Auf dem vorliegenden System ist allerdings noch parallel der gcc-3.4 installiert, mit dem sich die Software problemlos installieren lässt.
- Bevor die Software installiert wird, empfiehlt es sich, diese zunächst lokal (d. h.
in dem Verzeichnis, in dem sie kompiliert wurde), zu testen:
./mplayer <Testfilm>
- Verläuft der Test erfolgreich, so kann das Programm schließlich per sudo checkinstall installiert werden.
Deinstallation möglich
Die Verwendung von checkinstall bei der MPlayer-Installation ist eigentlich nicht notwendig: Freundlicherweise geben die Maintainer der Software dem Anwender die Möglichkeit, die Software bei Nichtgefallen per make uninstall zu deinstallieren. Mehr noch: In einem Unterordner debian finden Sie einige Informationen darüber, wie sich leicht ein Debian-Paket erstellen lässt.
Ein komplexes Beispiel
Schwieriger wird die Kompilierung, wenn das Quellpaket auf anderen Paketen aufbaut und insbesondere sogenannte Headerdateien benötigt. Ein prominentes Beispiel ist das beliebte Videoumwandlungsprogramm transcode. Gerade dann, wenn Sie Videomaterial umwandeln wollen, macht sich eine perfekte Optimierung der Software bemerkbar.
Transcode
Sie finden den Quellcode von Transcode unter www.transcoding.org. Gehen Sie zum Kompilieren von transcode folgendermaßen vor:
- Entpacken Sie zunächst die Quellen mittels:
tar xvfz transcode-<Version>.tar.gz
- Wechseln Sie nun in das Quellverzeichnis, und versuchen Sie, die Quellen mit einigen
komplexen Optionen zu konfigurieren. Im Normalfall werden Sie zunächst einmal versuchen,
das Paket ohne Sonderoptionen zu kompilieren. Die beschriebene Vorgehensweise dient
ausschließlich zur Demonstration. Mehr zu diesen Optionen erfahren Sie über ./configure ---help.
cd transcode-<Version>
./configure --prefix=/usr/local \
--enable-avifile --enable-ogg --enable-libdv \
--enable-mjpegtools --enable-a52 - Nun sollten Sie von einigen Fehlermeldungen erschlagen werden, die darauf beruhen,
dass etliche .dev-Dateien (also im Wesentlichen Header) für die vorgewählten Optionen nicht zur Verfügung
stehen:
ERROR: option '--enable-mjpegtools' failed:
cannot compile mjpegtools/yuv4mpeg.h
mjpegtools/yuv4mpeg.h can be found in the following packages:
mjpegtools http://mjpeg.sourceforge.net/
... - Die obige Meldung resultiert also aus der Option ---enable-mjpeg tools. Sie können nun entweder auf die Option verzichten oder die fehlende Headerdatei ausfindig machen. Wir wählen letzteren Weg.
- Wir verwenden das Werkzeug apt-file, um das zur fehlenden Datei gehörende Paket zu finden:
apt-file search yuv4mpeg.h
libmjpegtools-dev:usr/include/mjpegtools/yuv4mpeg.h ... - Die Datei befindet sich also im Paket libmjpegtools-dev, das nachinstalliert werden soll:
sudo apt-get install libmjpegtools-dev
- Danach wird die aufgerufene Konfigurationsroutine zumindest nicht mehr an der Prüfung der MJPEG-Header scheitern. Auf diese Weise installieren Sie sämtliche benötigten Header, bis die Konfiguration glatt durchläuft.
- Schließlich können Sie das Programm dann mittels make und checkinstall kompilieren und installieren.
Leider kann es, wie oben bereits erwähnt wurde, auch vorkommen, dass der Kompiliervorgang mit make infolge eines Fehlers im Konfigurationsskript stecken bleibt. Auch in diesem Fall ist zu 99 % eine fehlende Headerdatei der Übeltäter; es ist also mitunter Detektivarbeit angesagt, um derart komplexe Programme zu kompilieren.
Der einfache Weg
Sicher werden Sie sich fragen, ob die Sache mit dem Kompilieren von Programmen aus Quellen nicht auch einfacher zu realisieren ist. Dazu müssen Sie ein klein wenig tiefer ins System eindringen. Zu fast jedem Ubuntu-Paket finden Sie stets ein gleichnamiges Quellpaket, vorausgesetzt, diese sogenannten Sources werden in der Datei /etc/apt/sources.list durch das Schlüsselwort deb-src definiert. Im Falle der Ubuntu-Standard/Universe/Multiverse-Pakete müssen Sie lediglich das Kommentarzeichen # vor den Quellverzeichnissen löschen, um diese zu aktivieren.
# Auszug aus /etc/apt/sources.list
# Binärpakete
deb http://de.archive.ubuntu.com/ubuntu <version> universe multiverse main ...
# Quellpakete
deb-src http://de.archive.ubuntu.com/ubuntu <version> universe multiverse ...
Um nun für unser spezielles Beispiel transcode die Quellen freizuschalten, ist folgender Eintrag in der Datei sources.list vorzunehmen:
## Videorepository Marillat
deb ftp://ftp.nerim.net/debian-marillat/ sarge main
deb-src ftp://ftp.nerim.net/debian-marillat/ sarge main
Danach ist wie üblich ein sudo apt-get update vorzunehmen. Möchten Sie nun die Quellen eines Pakets wie zum Beispiel transcode auf den Rechner befördern, so müssen Sie den folgenden Befehl verwenden:
sudo apt-get source <Paketname>
Die Quellen landen dabei im aktuellen Verzeichnis. Sollen sie gleich nach dem Herunterladen kompiliert werden, so ergänzen Sie den Befehl um den Parameter -b. Da bei einer derart komplexen Software wie transcode aber mit Sicherheit einige unaufgelöste Abhängigkeiten auftreten, sollten Sie stattdessen den folgenden Befehl verwenden:
sudo apt-get build-dep transcode
In diesem Fall werden sämtliche Programme und Bibliotheken, die für eine erfolgreiche Kompilierung des Programms erforderlich sind, auf dem Rechner installiert. Damit hätten Sie einen einfachen Weg aus dem Abhängigkeitsdschungel beim Kompilieren gefunden. Im Falle von transcode wird das Programm mit sämtlichen denkbaren Optionen kompiliert, wenn Sie von der Default-Konfiguration der Quellen ausgehen.
Tipp 209: Quellcode-Diff-Dateien erstellen |
Die folgenden Kommandos bestimmen die Unterschiede zwischen zwei Quelldateien und erzeugen diff-Dateien <Datei.patch1> und <Datei.patch2> im unified-Stil: |
diff -u <Datei.alt> <Datei.neu> > <Datei.patch1> |
Die diff-Datei (alternativ wird sie auch Patch-Datei genannt) wird verwendet, um Veränderungen zu beschreiben. Jeder, der diese Datei erhält, kann diese Änderungen wie folgt auf eine andere Datei anwenden: |
patch -p0 <Datei> < <Datei.patch1> |
Wenn drei Versionen des Quellcodes vorliegen, können diese einfacher mit diff3 vermengt werden: |
diff3 -m <Datei.meine> <Datei.alt> <Datei.deine> > <Datei> |
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.