Ein Vergleich mit dem Make-System
Simon Lembke (WI4139)
Um dem Make-System mitzuteilen, welche Aufgaben bewältigt werden sollen, muss man ein so genanntes Makefile erstellen. Darin gibt man Regeln an, aus welchen Quellen ein Ziel erstellt wird und welche Befehle dazu notwendig sind. Ein solcher Block aus Quel-len, Ziel und den Befehlen wird folgendermaßen aufgeschrieben:
Ziel : Quelle Quelle ... Befehl Befehl
Da in dem Befehlsteil beliebige Kommandos stehen können, hat Make keine
Möglichkeit zu erkennen, ob es sich noch um Befehle oder den Beginn einer
neuen Regel handelt. Um diese Unterscheidung zu ermöglichen, müssen
Befehlszeilen immer mit einem Tabulator beginnen.
Bei gewöhnlichen Regeln betrachtet Make sowohl das Ziel als auch die Quellen
als Da-teien, wobei die Zieldatei mit Hilfe der Befehle aus den Quelldateien
erzeugt wird. Ein Beispiel:
Test.class : Test.java javac -d . Test.java
Mit dieser Regel mit dem Make-System gesagt, wie die Datei Test.class aus der Datei Test.java erstellt wird.
Das reine Ausführen von Befehlen ist aber nicht Sinn und Zweck des Make-Systems. Eine Aneinanderreihung von Compiler-Aufrufen ließe sich mit einem Shell-Script bzw. einer Batch-Datei wesentlich schneller erledigen und würde keine zusätzlichen Programme erfordern. Das Besondere an Make ist, dass die Befehle einer Regel nur ausgeführt werden, wenn es wirklich notwendig ist. Hier kommen die Abhängigkeiten von Quellen und Zielen ins Spiel. Da man dem System mitgeteilt hat, von welchen Quellen ein bestimmtes Ziel abhängt, kann es anhand der Änderungsdaten von Quellen und Ziel feststellen, ob die Quellen nach dem letzten Erstellen des Ziels verändert wurden. Nur wenn dies der Fall ist werden die zu der Regel gehörenden Befehle ausgeführt.
In den meisten Fällen bestehen Programme aus mehreren Teilen, und nicht alle Teile müssen neu übersetzt werden, wenn sich eine Quelldatei geändert hat. Wenn z.B. mehrere Klassen in einer JAR-Datei zusammengefasst werden sollen und sich eine Klasse ändert, dann muss auch nur die geänderte Klasse neu kompiliert werden. Da es sich bei Quellen und Zielen für gewöhnlich um Dateien handelt, können die Quellen einer Regel gleichzeitig Ziel einer anderen Regel sein. Dadurch kann man ein Projekt in Unterprojekte aufteilen:
test.jar : a.class b.class c.class jar -cf test.jar a.class b.class c.class
a.class : a.java javac -d . a.java
b.class : b.java javac -d . b.java
c.class : c.java javac -d . c.java
Wenn nun die Datei test.jar neu erstellt werden soll, wird zuerst überprüft, ob eine oder mehrere der Quellen Regeln darstellen. Ist dies der Fall, werden zunächst diese Regeln überprüft und gegebenenfalls deren Befehle ausgeführt. Erst danach werden die Änderungsdaten von test.jar und den class-Dateien verglichen.
Wenn keine Parameter angegeben werden sucht Make im aktuellen Verzeichnis nach
einer Datei, die makefile oder Makefile heißt. Die Entwickler
von GNU Make empfehlen Makefile, da dieser Name in einem Verzeichnislisting
normalerweise recht weit oben steht. Danach wird in der gefundenen Datei die
erste Regel ausgeführt.
Mit den Parametern -f <Datei> bzw. --file <Datei>
kann ein anderer Dateiname angegeben werden. Außerdem kann man angeben,
welche Regeln ausgeführt werden sollen, indem man die entsprechenden Namen
ans Ende der Parameterliste schreibt. Bei der Installation ist uns bereits make
install begegnet. Hierbei wurde also nach der Datei makefile oder
Makefile gesucht und die darin enthaltene Regel install ausgeführt.