Kurze Antwort: Weil makees nicht gut ist. Sogar an der C-Front tauchen viele Alternativen auf.
Lange Antwort: Es makegibt 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
makeerwartet 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. makeerfordert, dass eine makespezifische 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 makeFormat. antDie DependAufgabe 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, makekann 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 makeDateinamen als Zeichenfolgen behandelt werden. antbehandelt Pfade als spezielle Objekte.
Scannen von Dateien zum Erstellen
makeerfordert die explizite Einstellung, welche Dateien für jedes Ziel erstellt werden sollen. antErmö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 makesind im Wesentlichen kleine bashSkripte. Obwohl es einen Port von makeWindows 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.
cygwinDies 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 MSBuildim Prinzip eher ein XML-basiertes Tool ant.
Im Gegensatz dazu antist 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 antals 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.txtoder einem bashKonfigurationsskript geliefert, das das tatsächliche generiert Makefile. Im Gegensatz dazu wird die Quelle eines Java-Programms, das mit erstellt wurde ant, mit einem antvorgefertigten Skript ausgeliefert. A Makefileist ein Produkt anderer Tools - So viel makeist ungeeignet, um ein eigenständiges Build-Tool zu sein. antist eigenständig und behandelt alles, was Sie für Ihren Java-Erstellungsprozess benötigen, ohne zusätzliche Anforderungen oder Abhängigkeiten.
Wenn Sie antauf 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.