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