gcc è un compilatore C: ci vuole una C file sorgente e crea codice macchina, sotto forma di file oggetto non collegato o come programma eseguibile effettivo, che è stato collegato a tutti i moduli e le librerie oggetto.
make è utile per controllare il processo di creazione di un progetto. Un tipico programma C è composto da diversi moduli (.c) e file di intestazione (.h). Sarebbe molto dispendioso in termini di tempo compilare sempre tutto dopo aver modificato qualsiasi cosa, quindi make è progettato per compilare solo le parti che devono essere ricompilate dopo una modifica.
Fa ciò seguendo le regole create dal programmatore. Ad esempio:
foo.o: foo.c foo.h
cc -c foo.c
Questa regola indica che il file foo.o dipende dai file foo.c e foo.h, e se uno di essi cambia, può essere creato eseguendo il comando sulla seconda riga. (Quanto sopra non è la sintassi attuale: make vuole i comandi rientrati da un carattere TAB, che non posso fare in questa modalità di modifica. Immagina che sia lì, però.)
legge le sue regole da un file che di solito è chiamato un Makefile. Poiché questi file sono (tradizionalmente) scritti a mano, make ha un sacco di magia per farti accorciare le regole. Ad esempio, sa che un foo.o può essere creato da un foo.c e sa quale sia il comando per farlo. Pertanto, la regola di cui sopra potrebbe essere ridotto a questo:
foo.o: foo.h
Un piccolo programma che consiste di tre moduli può avere un Makefile simili:
mycmd: main.o foo.o bar.o
$(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o
foo.o: foo.h bar.h
bar.o: bar.h
make può fare di più che compilare programmi. Un tipico Makefile avrà una regola per pulire i file indesiderati:
clean:
rm -f *.o core myapp
Un'altra regola potrebbe eseguire i test:
check: myapp
./myapp <test.input> test.output
diff -u test.correct test.output
un makefile potrebbe documentazione "costruire": eseguire uno strumento per convertire la documentazione da parte di alcuni marcatori lingua in HTML e PDF, per esempio.
Un Makefile può disporre di una regola di installazione per copiare il programma binario da esso compilato ovunque l'utente o l'amministratore di sistema lo desideri installato.
E così via. Poiché make è generico e potente, viene in genere utilizzato per automatizzare l'intero processo dalla decompressione di un tarball sorgente al punto in cui il software è pronto per essere utilizzato dall'utente.
C'è molto da imparare su make se vuoi impararlo appieno. La versione GNU di make ha una documentazione particolarmente buona: lo http://www.gnu.org/software/make/manual/ lo ha in varie forme.
Va notato che javac comprende una certa risoluzione di dipendenza rudimentale, vale a dire è anche una semplice marca. Cerca in modo ricorsivo (sorgenti di) classi utilizzate da altre classi e le compila quando necessario, anche se non sono menzionate come argomenti. I compilatori o i linker C non lo fanno, in parte perché la connessione tra la libreria di file oggetto resp e da un lato e le fonti non possono essere dedotte come in Java, dove i nomi dei file fisici e i percorsi corrispondono ai nomi e ai pacchetti di classi logiche. –