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:
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.
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.gzfü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.
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
./configureJetzt 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 Makefileund erstellt unser Makefile. Jetzt erst kann die wirkliche Compilierarbeit beginnen.
Variablen werden in Makefiles ähnlich definiert, wie in Shellscripts. Eine einfache Definition sieht beispielsweise folgendermaßen aus:
installprefix=/usr/localDer 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}/etcDas würde zu folgenden realen Verzeichnisnamen führen:
confdir=/etc/fooManchmal 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.
makeeingegeben. 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 allIst 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 installaufgerufen wird. Dadurch werden die notwendigen Dateien in die vorgesehenen Zielverzeichnisse kopiert. Um alle Objektdateien wieder zu löschen kann der Befehl
make cleanbenutzt werden, um sicherzustellen, daß bei einem zweiten Compiliervorgang alles erneut übersetzt wird.
./configure make make installin 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.