Kurze Antwort: Weil make
es nicht gut ist. Sogar an der C-Front tauchen viele Alternativen auf.
Lange Antwort: Es make
gibt mehrere Fehler, die es kaum zum Kompilieren von C und überhaupt nicht zum Kompilieren von Java geeignet machen. Sie können es erzwingen, Java zu kompilieren, wenn Sie möchten, aber erwarten, dass Probleme auftreten, von denen einige keine geeignete Lösung oder Problemumgehung haben. Hier sind ein paar:
Abhängigkeitsauflösung
make
erwartet von Natur aus, dass Dateien eine baumartige Abhängigkeit voneinander haben, wobei eine Datei die Ausgabe der Erstellung mehrerer anderer Dateien ist. Dies schlägt in C bereits fehl, wenn es sich um Header-Dateien handelt. make
erfordert, dass eine make
spezifische Include-Datei generiert wird, um die Abhängigkeit einer C-Datei von ihren Header-Dateien darzustellen, sodass eine Änderung an letzterer dazu führen würde, dass die vorherige Datei neu erstellt wird. Da die C-Datei selbst jedoch nicht neu erstellt (lediglich neu erstellt) wird, muss für make häufig das Ziel als angegeben werden .PHONY
. Glücklicherweise unterstützt GCC das automatische Generieren dieser Dateien.
In Java kann die Abhängigkeit zirkulär sein, und es gibt kein Tool zum automatischen Generieren von Klassenabhängigkeiten im make
Format. ant
Die Depend
Aufgabe kann stattdessen die Klassendatei direkt lesen, bestimmen, welche Klassen importiert werden, und die Klassendatei löschen, wenn eine davon veraltet ist. Ohne dies kann eine nicht triviale Abhängigkeit dazu führen, dass Sie gezwungen sind, wiederholte saubere Builds zu verwenden, wodurch der Vorteil der Verwendung eines Build-Tools entfällt.
Leerzeichen in Dateinamen
Während weder Java noch C die Verwendung von Leerzeichen in Ihren Quellcodedateinamen fördern, make
kann dies auch dann problematisch sein, wenn sich die Leerzeichen im Dateipfad befinden. Überlegen Sie beispielsweise, ob Ihr Quellcode in vorhanden ist C:\My Documents\My Code\program\src
. Dies würde ausreichen, um zu brechen make
. Dies liegt daran, dass make
Dateinamen als Zeichenfolgen behandelt werden. ant
behandelt Pfade als spezielle Objekte.
Scannen von Dateien zum Erstellen
make
erfordert die explizite Einstellung, welche Dateien für jedes Ziel erstellt werden sollen. ant
Ermöglicht die Angabe eines Ordners, der automatisch nach Quelldateien durchsucht werden soll. Es mag wie eine kleine Annehmlichkeit erscheinen, aber bedenken Sie, dass in Java jede neue Klasse eine neue Datei benötigt. Das Hinzufügen von Dateien zum Projekt kann schnell zu einem großen Problem werden.
Und das größte Problem mit make
:
make ist POSIX-abhängig
Javas Motto lautet "Kompilieren, einmal überall ausgeführt". Es ist jedoch nicht beabsichtigt, diese Kompilierung auf POSIX-basierte Systeme zu beschränken, bei denen die Java-Unterstützung tatsächlich am schlechtesten ist.
Build-Regeln make
sind im Wesentlichen kleine bash
Skripte. Obwohl es einen Port von make
Windows gibt, muss dieser mit einem Port von Windows gebündelt werden bash
, der eine POSIX-Emulationsschicht für das Dateisystem enthält , damit er ordnungsgemäß funktioniert.
Dies gibt es in zwei Varianten:
MSYS
Dies versucht, die POSIX-Übersetzung auf Dateipfade zu beschränken, und kann daher unangenehme Fallstricke verursachen, wenn externe Tools ausgeführt werden, die nicht speziell dafür entwickelt wurden.
cygwin
Dies bietet eine vollständige POSIX-Emulation. Die resultierenden Programme neigen jedoch dazu, sich immer noch auf diese Emulationsschicht zu verlassen.
Aus diesem Grund ist das Standard-Build-Tool unter Windows make
überhaupt nicht vorhanden, sondern MSBuild
im Prinzip eher ein XML-basiertes Tool ant
.
Im Gegensatz dazu ant
ist es in Java erstellt, kann überall ausgeführt werden und enthält interne Tools, sogenannte "Tasks", mit denen Dateien bearbeitet und Befehle plattformunabhängig ausgeführt werden können. Es ist so vielseitig, dass es für Sie tatsächlich einfacher ist, ein C-Programm unter Windows zu erstellen ant
als mit make
.
Und noch eine letzte Kleinigkeit:
Selbst C-Programme verwenden make nicht nativ
Möglicherweise bemerken Sie dies zunächst nicht, aber C-Programme werden im Allgemeinen nicht mit a ausgeliefert Makefile
. Sie werden mit einem CMakeLists.txt
oder einem bash
Konfigurationsskript geliefert, das das tatsächliche generiert Makefile
. Im Gegensatz dazu wird die Quelle eines Java-Programms, das mit erstellt wurde ant
, mit einem ant
vorgefertigten Skript ausgeliefert. A Makefile
ist ein Produkt anderer Tools - So viel make
ist ungeeignet, um ein eigenständiges Build-Tool zu sein. ant
ist eigenständig und behandelt alles, was Sie für Ihren Java-Erstellungsprozess benötigen, ohne zusätzliche Anforderungen oder Abhängigkeiten.
Wenn Sie ant
auf einer beliebigen Plattform ausgeführt werden, funktioniert dies nur (tm). Das kann man nicht bekommen make
. Es ist unglaublich plattform- und konfigurationsabhängig.
make
. Und ein Makefile zu haben, das nur auf einem System funktioniert, ist für eine plattformübergreifende Sprache nicht sehr schön.