Ein Vergleich mit dem Make-System
Simon Lembke (WI4139)
Für jeden Befehl, der innerhalb einer Regel ausgeführt wird, startet eine Make eine eigene Shell und überprüft nach der Ausführung deren Rückgabewert. Wenn dieser ungleich 0 ist, bedeutet das für Make, dass ein Fehler aufgetreten ist. Normalerweise werden danach keine weiteren Befehle mehr ausgeführt, da das Ziel, ein Programm zu aktualisieren, nicht mehr möglich scheint.
Besonders in großen Projekten, in denen das Kompilieren sehr viel Zeit
in Anspruch nimmt, ist es manchmal wünschenswert, den Prozess trotzdem
fortzusetzen, um weitere Fehler in anderen Quellen angezeigt zu bekommen. Dazu
kann man Make mit dem Parameter -k bzw. --keep-going starten.
In diesem Fall würde Make zwar die weiteren Befehle der aktuellen Regeln
ignorieren, jedoch probieren, die restlichen Vorbedingungen zu erfüllen.
Alle Regeln, die auf der gescheiterten Regel aufbauen, werden allerdings nicht
mehr ausgeführt.
In manchen Fällen bedeutet die Fehlermeldung eines ausgeführten Programms
nicht, dass das eigentliche Ziel nicht mehr erreicht werden kann. So wird man
z.B. immer versuchen, das Verzeichnis, in dem die Klassen abgelegt werden sollen,
vor dem Kompilieren zu erstellen. Sollte das Verzeichnis bereits existieren,
wird ein Programm wie mkdir zwar einen Fehler melden, der Abbruch des
Make-Prozesses ist aber wenig sinnvoll. Daher kann man Fehler von einzelnen
Befehlen ignorieren lassen, indem man ihnen ein Minuszeichen vorsetzt.
-mkdir ${BUILDDIR}
Sollte nun beim Ausführen ein Fehler auftreten, so wird dieser zwar ausgegeben, er hat aber keinen Einfluss auf den weiteren Ablauf des Build-Prozesses.
Problematisch sind Unterbrechungen bei Make immer dann, wenn ein Programm bereits angefangen hat, die Zieldatei zu schreiben. Dadurch wurde das Änderungsdatum schon aktualisiert und ein weiterer Durchlauf von Make würde diese halb fertige Datei eventuell nicht aktualisieren. Daher löscht Make bei einem Abbruch von außen, z.B. per STRG-C, die Zieldatei, wenn sie ein aktuelles Änderungsdatum hat. Aus Kompatibilitätsgründen zu anderen Make-Varianten geschieht dies jedoch nicht, wenn Make durch einen Fehler abbricht. Man kann diese Funktion aber explizit einschalten, indem man eine Regel mit dem Ziel .DELETE_ON_ERROR in das Makefile einfügt.
Die Fehlerbehandlung in Ant ist den einzelnen Tasks überlassen. Viele von Ihnen haben dafür ein Attribut, über das man steuern kann, ob ein Fehler zum Abbruch des Build-Prozesses führen soll.
<javac srcdir=“${srcdir}“ destdir=“${builddir}“ failonerror=“false“ />
Wenn nun ein Fehler auftritt, der nicht unterdrückt werden soll, lösen die Tasks eine BuildException aus und die Ausführung von Ant wird abgebrochen. Leider gibt es noch keine Möglichkeit, eine keep going-Funktion wie unter Make zu aktivieren, es ist jedoch angedacht etwas Vergleichbares in Ant2 zu implementieren.