2010-02-16 18 views

risposta

22

Makefiles simile a questa:

all: mybinary 

mybinary: files.o it.o depends.o on.o 
[tab]$(CC) $(CFLAGS) files.o it.o depends.o on.o -o mybinary 

files.o: files.c files.h 
[tab]$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o [email protected] 

... 

Questo significa che, quando si digita make all (la stenografia è solo per digitare make), si farà in modo che l'obiettivo mybinary o il file è aggiornato. Per fare ciò, è necessario assicurarsi che mybinary sia più nuovo di tutti i file. Da questo.o dipende.o e on.o. In caso contrario, utilizza i comandi della shell specificati nella riga successiva per creare mybinary. Ma prima di farlo, prima si assicura che i file.o e così via siano aggiornati. Ciò significa che devono essere più recenti di files.c e files.h. In caso contrario, utilizza i comandi della shell specificati nella riga successiva per creare file.o. Una volta aggiornati tutti i file * .o, è possibile creare mybinary. Una volta che mybinary è stato creato, tutto il target è soddisfatto.

Gli obiettivi sono in genere solo file. Il formato di un blocco è:

target: list of dependency files 
[tab]shell commands to build target if it's older than any of its dependencies 
[tab]more shell commands 
[tab]still more 

obiettivi possono anche essere specificati usando i caratteri jolly, per esempio %.c cosa significa nella shell si chiamerebbe *.c.

Alcuni obiettivi sono obiettivi "fasulli" che indicano che non corrispondono a nessun file reale. L'obiettivo "tutto" è di questo tipo. Lo stesso vale per l'obiettivo "pulito" (make clean). E così via. Non hai davvero bisogno o vuoi creare un file chiamato "tutto" o "pulito". Ci sono vari modi per specificare che un bersaglio è fasullo.

Il primo obiettivo visualizzato nel Makefile è quello che verrà richiamato se si digita semplicemente make. Una convenzione è denominare questo obiettivo "tutto". Quindi lo make sarà lo stesso di make all.

+0

Con riferimento a "* è necessario assicurarsi che mybinary sia più recente di tutti i file.o it.so depends.o e on.o *" ...; Come è fatto? Questo è fatto confrontando il tempo dell'ultimo file modificato? – Pacerier

+0

Sì, confrontando il file con gli ultimi tempi modificati. Di fatto, ciò ha portato alla creazione dell'utilità 'touch' UNIX il cui scopo è aggiornare semplicemente la data di modifica di un file, in modo da innescare una build. –

2

A makefile di solito include il codice per rendere il programma, installare il programma, pulire in seguito e altre cose.

così la parola target potrebbero essere diverse parole chiave, come ad esempio all, install, clean, ecc

E 'un modo di dire rendere qualcosa. make all fa fa tutto

+3

Strettamente, ovviamente, il comando ''make all'' implica solo (stati)" eseguire il lavoro necessario per garantire che 'all' sia aggiornato ". Normalmente, le persone scrivono il makefile in modo tale da fare la maggior parte di ciò che si desidera (ma non l'installazione automatica, ad esempio). Ma questa è solo una convenzione. –

5

Un "make target" è fondamentalmente un file che si desidera ricostruire.

Make non può divinare ciò che si vuole costruire, quindi devi dirlo, implicitamente o esplicitamente, che cosa dovrebbe costruire. Spesso, il primo obiettivo nel file è un nome come "all" e se si esegue "make" senza alcun target esplicito, verrà creato il primo target elencato nel makefile. Tuttavia, alcuni makefile non specificano alcun obiettivo; quindi è necessario specificarne uno sulla riga di comando. Oppure, se non si desidera creare il target predefinito, è necessario specificare il target che si desidera creare.

Un obiettivo può anche essere "fasullo", in termini di marca GNU. Cioè, è un nome che non esiste, e le regole non lo creano, ma esso (l'obiettivo fasullo) dipende da un numero di altri file che hanno regole associate a loro. In effetti, il target "tutto" è solitamente un obiettivo fasullo - non c'è un file chiamato "tutto" nella maggior parte delle directory.

1

make è uno strumento di sviluppo comune che controlla le date dei file tra i file di codice sorgente e il codice oggetto prodotto da loro e compila quello in cui l'origine è più recente. Lo fa usando un file, chiamato makefile, che elenca i file che devono essere confrontati.

La sintassi standard è make /f makefile myprog.exe

che dice di costruire mioprog.exe utilizzando l'elenco dei file in makefile. Il makefile ha come valore predefinito makefile.mak, quindi se si utilizza quel nome, non è necessario specificarlo sulla riga di comando.

myprog.exe qui viene definito l'obiettivo. Un trucco è che potresti inserire nel makefile un elenco di istruzioni di compilazione per un file inesistente. Se poi dici di costruire quel bersaglio, eseguirà quei comandi. Spesso, vedrai qualcosa come make clean, che ha un file temporaneo cancellato.

+0

"standard" che significa? – Pacerier

+0

Significa che la maggior parte dei programmi 'make' accetterà la sintassi per fare ciò che ho descritto nel prossimo paragrafo. Ci sono molte varianti di 'make', quindi non posso parlare per tutti, ma la maggior parte accetterà quella sintassi. –

+0

Esistono effettivamente "standard" ufficiali raccomandati per il "make"? – Pacerier