Risposta breve: Perché make non va bene. Anche sul fronte C si vedono spuntare molte alternative.
Risposta lunga: makepresenta diversi difetti che la rendono a malapena adatta per la compilazione di C e non adatta per la compilazione di Java. Puoi forzarlo a compilare Java, se lo desideri, ma ti aspetti di incorrere in problemi, alcuni dei quali non dispongono di una soluzione o soluzione alternativa adatta. Eccone alcuni:
Risoluzione delle dipendenze
makesi aspetta intrinsecamente che i file abbiano una dipendenza simile ad un albero, in cui un file è l'output di crearne altri. Questo già si ritorce contro in C quando si tratta di file header. makerichiede makeche venga generato un file di inclusione specifico per rappresentare la dipendenza di un file C dai suoi file di intestazione, quindi una modifica a quest'ultimo causerebbe la ricostruzione del precedente. Tuttavia, poiché il file C stesso non viene ricreato (semplicemente ricostruito), make spesso richiede di specificare il target come .PHONY. Fortunatamente, GCC supporta la generazione automatica di questi file.
In Java, la dipendenza può essere circolare e non esiste uno strumento per la generazione automatica delle dipendenze di classe in makeformato. antL' Dependattività può invece leggere direttamente il file di classe, determinare quali classi importa ed eliminare il file di classe se uno di essi non è aggiornato. Senza questo, qualsiasi dipendenza non banale potrebbe comportare la costrizione all'uso di build pulite ripetute, eliminando qualsiasi vantaggio derivante dall'uso di uno strumento di build.
Spazi nei nomi dei file
Mentre né Java né C incoraggiano l'uso di spazi nei nomi dei file del codice sorgente, in makequesto può essere un problema anche se gli spazi si trovano nel percorso del file. Considera, ad esempio, se il tuo codice sorgente esiste in C:\My Documents\My Code\program\src. Questo sarebbe abbastanza per rompersi make. Questo perché maketratta i nomi dei file come stringhe. anttratta i percorsi come oggetti speciali.
Scansione dei file per build
makerichiede l'impostazione esplicita di quali file devono essere creati per ogni destinazione. antconsente di specificare una cartella che deve essere scansionata automaticamente per i file di origine. Può sembrare una comodità minore, ma considera che in Java ogni nuova classe richiede un nuovo file. L'aggiunta di file al progetto può diventare una vera seccatura.
E il problema più grande con make:
make dipende da POSIX
Il motto di Java è "compilare una volta eseguito ovunque". Ma limitare tale compilazione ai sistemi basati su POSIX, in cui il supporto Java è in realtà il peggiore, non è l'intenzione.
Le regole di compilazione makesono essenzialmente piccoli bashscript. Anche se esiste una porta makeper Windows, affinché funzioni correttamente, deve essere abbinato a una porta di bash, che include un livello di emulazione POSIX per il file system.
Questo è disponibile in due varietà:
MSYS che tenta di limitare la traduzione POSIX ai percorsi dei file e può quindi avere spiacevoli problemi quando si eseguono strumenti esterni non creati appositamente per esso.
cygwinche fornisce un'emulazione POSIX completa. I programmi risultanti, tuttavia, tendono ancora a fare affidamento su quello strato di emulazione.
Per questo motivo, su Windows, lo strumento di compilazione standard non è nemmeno del maketutto, ma piuttosto MSBuild, che è anche uno strumento basato su XML, più vicino in linea di principio a ant.
Al contrario, antè costruito in Java, può essere eseguito ovunque e contiene strumenti interni, chiamati "task", per manipolare file ed eseguire comandi in modo indipendente dalla piattaforma. È sufficientemente versatile che puoi effettivamente divertirti a costruire un programma C in Windows usando antpiuttosto che usando make.
E un ultimo minore:
Anche i programmi C non usano make nativamente
Inizialmente potresti non accorgertene, ma i programmi C generalmente non vengono spediti con a Makefile. Sono spediti con un CMakeLists.txt, o uno bashscript di configurazione, che genera l'effettivo Makefile. Al contrario, l'origine di un programma Java creato usando antviene fornito con uno antscript pre-costruito. A Makefileè un prodotto di altri strumenti - Ecco quanto makenon è adatto per essere uno strumento di costruzione da solo. antè autonomo e si occupa di tutto il necessario per il processo di compilazione Java, senza ulteriori requisiti o dipendenze.
Quando si esegue antsu qualsiasi piattaforma, funziona (tm). Non puoi ottenerlo make. È incredibilmente dipendente dalla piattaforma e dalla configurazione.
make. E avere un makefile che funziona solo su un sistema non è molto bello per un linguaggio multipiattaforma.