Ein Vergleich mit dem Make-System
Simon Lembke (WI4139)
Die Entwickler von Ant sind mit dem Ziel angetreten, ein plattformunabhängiges
Build-Werkzeug zu schreiben, und das haben sie größtenteils auch
geschafft. Natürlich muss auf dem System ein JDK vorhanden und lauffähig
sein, doch da Ant hauptsächlich zum Erstellen von Java-Anwendungen eingesetzt
wird, und auch diese dann zumindest die virtuelle Maschine benötigen, ist
dieser Punkt wohl vernachlässigbar.
Die Plattformunabhängigkeit von Ant ergibt sich durch den Verzicht auf
direkte Zugriffe auf Befehle eines betriebssystemspezifischen Kommandointerpreters.
Die Funktionen des Dateisystems, das Kompilieren der Klassen und alle anderen
Aufgaben werden in der virtuellen Maschine abgebildet. Dadurch muss man sich
beim Verwenden der Tasks keine Gedanken über irgendwelche Architekturen
machen. Es ist zwar möglich externe Programme auszuführen, dies ist
aber meistens unnötig, da Ant mit Hilfe der Tasks bereits einen sehr großen
Funktionsumfang hat. Wer dennoch nicht darauf verzichten kann oder will, legt
sich damit zwangsläufig auf ein Betriebssystem oder eine Gruppe von Betriebsystemen
fest.
Das Problem der Pfade bzw. der Pfad-Trennzeichen existiert in Ant nur bedingt.
Attribute wie classpath akzeptieren verschiedene Schreibweisen und
externen Programmen, die z.B. über einen exec-Task ausgeführt
werden, kann man Pfade als Parameter übergeben, die Ant vor dem Aufruf
automatisch an das lokale System anpasst.
Was eigentlich ein sehr großer Vorteil von Make ist, nämlich den
kompletten Funktionsumfang der jeweiligen Shell nutzen zu können, wird
leider schnell zum Nachteil, wenn man ein Makefile auf unterschiedlichen Systemen
einsetzen will. Dabei ist gar nicht primär entscheidend, welches Betriebsystem
installiert ist, sondern welche Shell und welche zusätzlichen Befehle zur
Verfügung stehen. Gerade zwischen Unix und Windows unterscheiden sich die
einfachsten Befehle zum Kopieren oder Löschen von Dateien schon am Namen,
von den möglichen Parametern ganz zu schweigen. Doch auch innerhalb von
Betriebssystemgruppen kann es zu Problemen kommen. Während der Befehl „mkdir“
unter einigen Unix-Varianten die Option -p kennt, ist sie unter anderen
Varianten nicht vorhanden.
Ein durchaus übliches Verfahren ist dabei die Auslieferung von mehreren
Makefiles, aus denen der Anwender eines auswählen muss, dass seinem System
am nächsten kommt. Dies bedeutet natürlich immer mehrfachen Pflegeaufwand
und eine größere Fehleranfälligkeit. Es gibt einige Programme,
die bestimmte Vorbedingungen auf dem jeweiligen System prüfen und das Makefile
entsprechend anpassen. Aber auch hier muss der Entwickler vorher definieren,
welche Aufgaben wie auf den verschiedene Systemen bewältigt werden können.
Auch beim Übergeben von Pfaden an die auszuführenden Befehle ergeben
sich Probleme. Betrachtet man z.B. den classpath für den Java-Compiler,
so müssen die einzelnen Verzeichnisse unter Windows durch ein Semikolon,
unter Unix aber durch einen Doppelpunkt getrennt werden. Es ist daher zwar möglich,
Make auf den unterschiedlichsten Systemen laufen zu lassen, die Entwicklung
von universellen Makefiles aber gestaltet sich äußerst schwierig
und ist teilweise sogar unmöglich.