makefile
GNU-patroonregels
Zoeken…
Basispatroonregel
Een patroonregel wordt aangegeven met een %
-teken in het doel. Het %
overeen met een niet-lege string die de stam wordt genoemd . De stam wordt dan vervangen door elk %
dat in de vereiste lijst voorkomt.
Deze regel is bijvoorbeeld:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Komt overeen met elk doel dat eindigt op .o
. Als het doel foo.o
, zou de stam foo
en zou het foo.c
compileren naar foo.o
Via automatische variabelen kunnen doelen en voorwaarden worden bereikt.
Doelen die overeenkomen met meerdere patroonregels
Als een doel overeenkomt met meerdere patroonregels, zal make degene gebruiken waarvan de vereisten bestaan of kunnen worden gebouwd. Bijvoorbeeld:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Zal compileren foo.c
om foo.o
of assembleren foo.s
om foo.o
, afhankelijk van welke van foo.c
of foo.s
bestaat.
Als er meerdere regels zijn die bestaan of kunnen worden gebouwd, maakt make de regel die overeenkomt met de kortste stam. Bijvoorbeeld:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
Zal de tweede regel gebruiken om het doel foo.bar
, echo van Stem is: o.ba
Als meerdere regels overeenkomen met de kortste stam, maakt make de eerste in de Makefile.
Mappen in patroonregels
Als het doelpatroon geen schuine strepen bevat, verwijdert make het directorygedeelte van het doel dat het probeert te bouwen voordat het overeenkomt. De map wordt dan voor de stengel geplaatst. Wanneer de stam wordt gebruikt om de doelnaam en vereisten samen te stellen, wordt het directorygedeelte ervan verwijderd, wordt de stam vervangen in plaats van de %
en ten slotte wordt de map voor de tekenreeks geplaatst. Bijvoorbeeld:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Komt overeen met lib/foobar.o
, met:
- Stam (
$*
):lib/bar
-
lib/foobar.o
($@
):lib/foobar.o
- Vereisten (
$<
,$^
):lib/foobar.c
In dit voorbeeld heeft een lib/foo%.o
regel voorrang op de foo%.o
regel omdat deze overeenkomt met een kortere stam.
Patroonregels met meerdere doelen
Patroonregels kunnen meerdere doelen hebben, maar in tegenstelling tot normale regels is het recept verantwoordelijk voor het maken van alle doelen. Bijvoorbeeld:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Is een geldige regel, die zowel debug- als release-objecten bouwt wanneer een van deze moet worden gebouwd. Als we zoiets schreven als:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Het zou werken wanneer slechts een van debug/*.o
of release/*.o
is gebouwd, maar het zou alleen het eerste doel bouwen (en het tweede als up-to-date beschouwen) wanneer beide moeten worden gebouwd.