Definizione di regole in Makefile
Ora impareremo le regole per Makefile.
La sintassi generale di una regola di destinazione Makefile è:
target [target...] : [dependent ....]
[ command ...]
Nel codice precedente, gli argomenti tra parentesi sono facoltativi e i puntini di sospensione indicano uno o più. Qui, nota che è richiesta la scheda che precede ogni comando.
Di seguito viene fornito un semplice esempio in cui si definisce una regola per salutare il proprio target da altri tre file.
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
NOTE - In questo esempio, dovresti dare delle regole per creare tutti i file oggetto dai file sorgente.
La semantica è molto semplice. Quando dici "crea target", il filemaketrova la regola di destinazione che si applica; e, se qualcuno dei dipendenti è più recente del target,makeesegue i comandi uno alla volta (dopo la sostituzione della macro). Se è necessario creare delle dipendenze, ciò accade per primo (quindi hai una ricorsione).
Maketermina se qualsiasi comando restituisce uno stato di errore. In tal caso verrà mostrata la seguente regola:
clean:
-rm *.o *~ core paper
Makeignora lo stato restituito sulle righe di comando che iniziano con un trattino. Ad esempio, a chi importa se non esiste un file core?
Makefa eco i comandi, dopo la sostituzione della macro per mostrarti cosa sta succedendo. A volte potresti volerlo disattivare. Ad esempio:
install:
@echo You must be root to install
Le persone si aspettano determinati obiettivi nei Makefile. Dovresti sempre navigare prima. Tuttavia, è ragionevole aspettarsi che le destinazioni tutte (o solo create), installate e pulite vengano trovate.
make all - Compila tutto in modo da poter eseguire test locali prima di installare le applicazioni.
make install - Installa le applicazioni nei posti giusti.
make clean - Pulisce le applicazioni, elimina gli eseguibili, i file temporanei, i file oggetto, ecc.
Regole implicite del makefile
Il comando è uno che dovrebbe funzionare in tutti i casi in cui si crea un eseguibile x dal codice sorgente x.cpp. Questo può essere affermato come una regola implicita:
.cpp:
$(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]
Questa regola implicita dice come creare x da xc: eseguire cc su xc e chiamare l'output x. La regola è implicita perché non viene menzionato alcun obiettivo particolare. Può essere utilizzato in tutti i casi.
Un'altra regola implicita comune è per la costruzione di file .o (oggetto) da .cpp (file sorgente).
.cpp.o:
$(CC) $(CFLAGS) -c $<
alternatively
.cpp.o:
$(CC) $(CFLAGS) -c $*.cpp