makefile
Reguły wzorców GNU
Szukaj…
Podstawowa reguła wzoru
Reguła wzorca jest wskazywana przez pojedynczy znak %
w celu. %
Pasuje do niepustego łańcucha zwanego rdzeniem . Trzpień jest następnie zamieniany na każdy %
który pojawia się na liście wymagań wstępnych.
Na przykład ta reguła:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Dopasuje dowolny cel kończący się na .o
. Gdyby celem był foo.o
, rdzeń byłby foo
i skompilowałby foo.c
do foo.o
Dostęp do celów i wymagań wstępnych można uzyskać za pomocą zmiennych automatycznych.
Cele pasujące do wielu reguł wzorców
Jeśli cel pasuje do wielu reguł wzorców, make użyje tego, którego warunki wstępne istnieją lub mogą zostać zbudowane. Na przykład:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Skompiluje foo.c
do foo.o
lub zmontować foo.s
do foo.o
, w zależności od których jeden foo.c
lub foo.s
istnieje.
Jeśli wiele reguł ma wymagania wstępne, które istnieją lub można je zbudować, make użyje reguły, która pasuje do najkrótszego pnia. Na przykład:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
Stem is: o.ba
drugiej reguły, aby Stem is: o.ba
docelowy foo.bar
, echo Stem is: o.ba
Jeśli wiele reguł pasuje do najkrótszego pnia, make użyje pierwszej z pliku Makefile.
Katalogi w regułach wzorców
Jeśli wzorzec docelowy nie zawiera ukośników, make usunie część katalogu z celu, który próbuje zbudować przed dopasowaniem. Katalog zostanie następnie umieszczony przed trzonem. Gdy trzpień jest używany do budowania nazwy docelowej i wymagań wstępnych, część katalogu jest z niej usuwana, rdzeń jest zastępowany w miejsce %
a na końcu katalog jest umieszczany przed ciągiem. Na przykład:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
lib/foobar.o
, z:
- Pytanie (
$*
):lib/bar
- Nazwa docelowa (
$@
):lib/foobar.o
- Wymagania wstępne (
$<
,$^
):lib/foobar.c
W tym przykładzie reguła lib/foo%.o
ma pierwszeństwo przed regułą foo%.o
ponieważ pasuje do krótszego rdzenia.
Reguły wzorców z wieloma celami
Reguły wzorców mogą mieć wiele celów, ale w przeciwieństwie do normalnych reguł, przepis jest odpowiedzialny za wykonanie wszystkich celów. Na przykład:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Jest prawidłową regułą, która zbuduje zarówno obiekty debugowania, jak i zwalniania, gdy jeden z nich będzie musiał zostać zbudowany. Gdybyśmy napisali coś takiego:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Działa, gdy zbudowana jest tylko jedna z wersji debug/*.o
lub release/*.o
, ale buduje tylko pierwszy cel (i uważa drugi za aktualny), gdy oba muszą być zbudowane.