makefile
GNU-mönsterregler
Sök…
Grundläggande mönsterregel
En mönsterregel indikeras av en enda %
-tecken i målet. %
Stämmer överens med en icke-tom sträng som heter stammen . Stammen ersätts sedan för varje %
som visas i förutsättningslistan.
Till exempel denna regel:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Kommer att matcha alla mål som slutar på .o
. Om målet var foo.o
, skulle stammen vara foo
och den skulle sammanställa foo.c
till foo.o
Mål och förutsättningar kan nås med automatiska variabler.
Mål som matchar flera mönsterregler
Om ett mål matchar flera mönsterregler, kommer märket att använda det vars förutsättningar finns eller kan byggas. Till exempel:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Kommer att sammanställa foo.c
till foo.o
eller montera foo.s
till foo.o
, beroende på vilken av foo.c
eller foo.s
finns.
Om flera regler har förutsättningar som finns eller kan byggas använder du regeln som matchar den kortaste stammen. Till exempel:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
Kommer att använda den andra regeln för att göra målet foo.bar
, ekar Stem is: o.ba
Om flera regler matchar den kortaste stammen, kommer att använda den första i Makefile.
Kataloger i mönsterregler
Om målmönstret inte innehåller snedstreck tar bort katalogdelen från det mål den försöker bygga innan du matchar. Katalogen kommer sedan att placeras framför stammen. När stammen används för att skapa målnamn och förutsättningar avlägsnas katalogdelen från den, stammen ersätts istället för %
och slutligen läggs katalogen framför strängen. Till exempel:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Kommer att matcha lib/foobar.o
, med:
- Stam (
$*
):lib/bar
- Målnamn (
$@
):lib/foobar.o
- Förutsättningar (
$<
,$^
):lib/foobar.c
I detta exempel skulle en lib/foo%.o
regel ha företräde framför foo%.o
regeln eftersom den matchar till en kortare stam.
Mönsterregler med flera mål
Mönsterregler kan ha flera mål, men till skillnad från normala regler är receptet ansvarigt för att göra alla mål. Till exempel:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Är en giltig regel, som kommer att bygga både felsökning och frisättning av objekt när ett av dem måste byggas. Om vi skrev något som:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Det skulle fungera när bara en av debug/*.o
eller release/*.o
är byggd, men det skulle bara bygga det första målet (och anser att det andra är uppdaterat) när båda måste byggas.