Risposta breve: Perché make
non va bene. Anche sul fronte C si vedono spuntare molte alternative.
Risposta lunga: make
presenta 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
make
si 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. make
richiede make
che 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 make
formato. ant
L' Depend
attività 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 make
questo 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é make
tratta i nomi dei file come stringhe. ant
tratta i percorsi come oggetti speciali.
Scansione dei file per build
make
richiede l'impostazione esplicita di quali file devono essere creati per ogni destinazione. ant
consente 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 make
sono essenzialmente piccoli bash
script. Anche se esiste una porta make
per 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.
cygwin
che 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 make
tutto, 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 ant
piuttosto 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 bash
script di configurazione, che genera l'effettivo Makefile
. Al contrario, l'origine di un programma Java creato usando ant
viene fornito con uno ant
script pre-costruito. A Makefile
è un prodotto di altri strumenti - Ecco quanto make
non è 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 ant
su 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.