makefile
Regole del modello GNU
Ricerca…
Regola di base del modello
Una regola di modello è indicata da un singolo carattere %
nella destinazione. Il %
corrisponde a una stringa non vuota chiamata stelo . La radice viene quindi sostituita per ogni %
che appare nell'elenco dei prerequisiti.
Ad esempio, questa regola:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Corrisponde a qualsiasi obiettivo che termina in .o
. Se l'obiettivo era foo.o
, lo stelo sarebbe foo
e sarebbe compilare foo.c
a foo.o
. È possibile accedere alle destinazioni e ai prerequisiti utilizzando le variabili automatiche.
Obiettivi corrispondenti a più regole del modello
Se un obiettivo corrisponde a più regole del modello, make utilizzerà quello i cui prerequisiti esistono o possono essere creati. Per esempio:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Compilerà foo.c
a foo.o
o assemblare foo.s
a foo.o
, a seconda di quale dei foo.c
o foo.s
esiste.
Se più regole hanno prerequisiti che esistono o possono essere costruiti, make utilizzerà la regola che corrisponde alla radice più corta. Per esempio:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
foo.bar
la seconda regola per rendere il target foo.bar
, foo.bar
Stem is: o.ba
Se più regole corrispondono alla radice più corta, make userà la prima nel Makefile.
Directories in Pattern Rules
Se il pattern di destinazione non contiene barre, make rimuoverà la parte della directory dal target che sta cercando di compilare prima della corrispondenza. La directory verrà quindi posizionata davanti allo stelo. Quando lo stelo viene utilizzato per creare il nome e i prerequisiti della destinazione, la parte della directory viene eliminata, la radice viene sostituita al posto della %
e infine la directory viene messa davanti alla stringa. Per esempio:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
lib/foobar.o
, con:
- Stem (
$*
):lib/bar
- Nome del target (
$@
):lib/foobar.o
- Prerequisiti (
$<
,$^
):lib/foobar.c
In questo esempio, una regola lib/foo%.o
precedenza sulla regola foo%.o
perché corrisponde a una radice più corta.
Regole del modello con bersagli multipli
Le regole del modello possono avere più bersagli ma, a differenza delle normali regole, la ricetta è responsabile della realizzazione di tutti gli obiettivi. Per esempio:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
È una regola valida, che costruirà sia gli oggetti di debug che di rilascio quando uno di essi deve essere compilato. Se scrivessimo qualcosa come:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Funzionerebbe quando viene debug/*.o
solo uno di debug/*.o
release/*.o
, ma creerebbe solo il primo target (e considererà il secondo aggiornato) quando entrambi devono essere compilati.