Von Robert
In der heutigen Zeit bekommt man schon viele Programme als Binaries, dass heißt sie müssen vom User nicht mehr selbst kompiliert werden, sondern liegen für die betreffende Linux Distribution in kompilierter Form vor. Aber jeder User wird im Laufe seiner Arbeit irgendwann einmal in die Situation kommen, ein Programm selber kompilieren zu müssen.
Zwar ist jede Distribution mit vielen Programmen ausgestattet, aber diese sind nicht immer auf dem neuesten Stand. Und wenn man diese nun alle immer aktuell halten möchte, wird man nicht drum herum kommen, sich mit dem Kompilieren zu beschäftigen und auseinanderzusetzen. Auch bei Exoten, wird man nicht am Kompilieren vorbeikommen, besonders wenn man sie auf nicht alltäglichen System wie Alpha/Linux einsetzen will.
Der Quelltext eines Programmes, auch Source Code genannt beinhaltet den unkompilierten Programm-Code, zum Beispiel im C-Format oder einem anderen. In vielen Source-Paketen, welche man im Internet findet sind des weiteren noch vorkompilierte Bibliotheken, Include / Header Dateien und Man-Pages enthalten.
Libraries oder auch Bibliotheken enthalten einen schon vorkompilieren Programmcode, der von anderen Programmen benutzt werden kann. Zum Beispiel benötigen alle C-Programme die libc Library und alle X11 Programme die libX11 Library.
Die Header Dateien teilen dem Compiler mit, welche Funktionen sich in der Bibliothek befinden und welche Parameter diese Funktion hat und was an sie übergeben wird. Es ist also eine Schnittstelle zwischen dem Programm und der Bibliothek.
Hat man sich das gewünschte Source-Paket aus dem Internet runtergeladen, muss man es zuerst auf der Festplatte entpacken. Die meisten Pakete sind mit tar und dann mit gzip (oder bzip2) gepackt.
Zunächst sollte man sich den Inhalt des Archives ansehen, und prüfen, ob es sich in einem Unterverzeichnis befindet.
$ tar tvfz program-src.tar.gz
$ tar xvfz program-src.tar.gz
Nachdem nun der Quelltext entpackt worden ist, muss der Quelltext so konfiguriert werden, das er sich kompilieren lässt. Dazu sollte man insbesondere die mitgelieferten ReadMe und Help Dateien lesen. Auch die Datei INSTALL enthält oft sehr wichtige Hinweise zur Vorgehensweise.
Eine Installation geschieht meistens nach folgenden Schritten:
(Makefile) - optional: Makefile von Hand bearbeiten.
./configure - Konfiguration, aller nötigen Einstellungen zur Installation und Erstellung das Makefile‘s.
make - make liest das Makefile aus, arbeitet es ab und kompiliert das Programm.
Root-Login - um den Befehl make install auszuführen, muss man sich nun als Root auf dem System einloggen.
make install - ist normalerweise dafür da, das fertige Programm und alle benötigten Dateien (z.B. configs und Man-Pages) zu installieren, sprich an ihren Bestimmungsort zu kopieren.
In den folgenden Abschnitten werden die einzelnen Punkte nun erläutert.
In vielen älteren Source Versionen musste man das Makefile, welches in einer Grundform vorhanden war, von Hand an sein bestehendes System anpassen. In der heutigen Zeit wird dieses vom Configure-Script erledigt, aber dazu mehr im nächsten Abschnitt. Durch eine gute ReadMe, oder Kommentare im Makefile, wird es dem User ermöglicht, das Makefile an die vorhandenen Bedingungen anzupassen. Im folgenden wird ein kurzer Auszug dargestellt.
Listing 1: Auszug Makefile
# edit the following variables according to your need: INCLUDE = /usr/local/include # Include Dateien LIB = /usr/local/lib DEST = /usr/local/bin # Destination Folder MAN = /usr/local/man # Manual Folder ####### CC = gcc # der zu nutzende Compiler DEFINES = -DLINUX CFLAGS = $ (DEFINES) -O2 LIBS = -1X11 -1m
Der Quelltext der meisten neueren Programme nutzt das Configure-Script, um das Makefile anzupassen, somit fällt die aufwendige Bearbeitung per Hand weg. Das Configure-Script prüft bei der Ausführung, um welches Betriebssystem es sich handelt, welche Bibliotheken nötig sind, und es wird das passende Makefile erstellt.
$ ./configure
$ ./configure --prefix=/usr/local/program
$ ./configure --prefix=/usr/local/program checking for gcc... no configure: error: no acceptable gcc found in $PATH
$ ./configure --prefix=/usr/local/program checking for gcc... gcc checking for C compiler default output... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes ....... configure: creating ./config.status config.status: creating Makefile config.status: creating config.h Configure is done.
# This is the Makefile for program
# You should never need to edit this.
#
# $Id: Makefile.in,v 1.33 2002/09/27 22:16:24 wcc Exp $
SHELL = /bin/sh
top_srcdir = .
srcdir = .
prefix = /usr/local/program
DEST = ${prefix}
......
./configure wie z.B. --libir=/path/to/include
Nach der Erzeugung des Makefile, steht der Kompilierung des Source-Codes nichts mehr im Weg. Der einfachste Aufruf zum Kompilieren, welcher in 99,5% aller Fälle benutzt wird, lautet:
$ make
$ make make[1]: Entering directory `/usr/local/program-src/src‘ (This may take a while. Go get some runts.) gcc -pipe -g -O2 -Wall -I.. -I.. -DHAVE_CONFIG_H -c botcmd.c gcc -pipe -g -O2 -Wall -I.. -I.. -DHAVE_CONFIG_H -c botmsg.c gcc -pipe -g -O2 -Wall -I.. -I.. -DHAVE_CONFIG_H -c dns.c make: error: Xlib.h not found
$ find / -name xlib.h /usr/X11R6/include/Xlib.h
CFLAGS = $ (DEFINES) -O2 -I/usr/X11R6/
$ CFLAGS=-/usr/X11R6 ./configure
$ ./configure --libdir=/usr/X11R6
$ make make[1]: Entering directory `/usr/local/program-src/src‘ (This may take a while. Go get some runts.) gcc -pipe -g -O2 -Wall -I.. -I.. -DHAVE_CONFIG_H -c botcmd.c gcc -pipe -g -O2 -Wall -I.. -I.. -DHAVE_CONFIG_H -c botmsg.c gcc -pipe -g -O2 -Wall -I.. -I.. -DHAVE_CONFIG_H -c dns.c ........ All modules compiled. make[1]: Leaving directory `/usr/local/program-src/src/mod‘ modules made: -rwxr-xr-x 1 lamont lamont 9012 Sep 16 12:27 assoc.so -rwxr-xr-x 1 lamont lamont 12860 Sep 16 12:27 dns.so -rwxr-xr-x 1 lamont lamont 13692 Sep 16 12:27 wire.so Now run "make install" to install your program.
Das gewünschte Programm ist nun fertig kompiliert, und muss nun noch an die richtige stelle kopiert werden. Handelt es sich nur um eine Datei, könnte man es auch "von Hand" durchführen, aber da viele Programme nicht nur aus der Binary sondern aus vielen Dateien, wie z.B. Config‘s, Man-Pages oder anderen bestehen, würde es sehr schnell in Arbeit ausarten. Statt dessen lässt man make diese Aufgabe erfüllen, hierzu ist es nun nötig sich als Root auf dem System einzuloggen:
# make install Program v1.6.034 (C) 2004 Robert Madlo (C) 2004 Planet-rcs.de Installing in directory: ‘/usr/local/program/‘. Copying done. Installation completed.
# make -n install
# touch ts # make install # find / -cnewer ts > logfile
Das program-src.tar.gz Archiv brauchen wir nicht mehr. Hingegen sollten wir das program-src Verzeichnis anders behandeln. Manche Programme unterstützen ein make deinstall, da benötigen wir auch dieses Verzeichnis weiterhin, da es wichtige Informationen für eine Deinstallation enthält. Allerdings enthält das Verzeichnis auch temporär angelegte Dateien, die für uns keinen Nutzen mehr haben. Diese können wir einfach entfernen:
$ cd /usr/local/program-src/ $ make clean
$ rm -rf /usr/local/program-src/