makefile
GNU-Pattern-Regeln
Suche…
Grundmusterregel
Eine Musterregel wird durch ein einzelnes %
-Zeichen im Ziel angezeigt. %
Stimmt mit einer nicht leeren Zeichenfolge überein, die als Stamm bezeichnet wird . Der Stamm wird dann für jeden %
, der in der Voraussetzungsliste angezeigt wird.
Zum Beispiel diese Regel:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Wird mit jedem Ziel übereinstimmen, das auf .o
endet. Wenn das Ziel foo.o
, würde der Stamm foo
und foo.c
zu foo.o
kompilieren. Auf Ziele und Voraussetzungen kann mit automatischen Variablen zugegriffen werden.
Ziele, die mit mehreren Musterregeln übereinstimmen
Wenn ein Ziel mehreren Musterregeln entspricht, verwendet make die Regel, deren Voraussetzungen vorhanden sind oder erstellt werden können. Zum Beispiel:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Kompiliert foo.c
zu foo.o
oder foo.s
zu foo.o
, je nachdem, was foo.c
oder foo.s
existiert.
Wenn für mehrere Regeln Voraussetzungen bestehen oder erstellt werden können, verwendet make die Regel, die dem kürzesten Stamm entspricht. Zum Beispiel:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
Verwendet die zweite Regel, um das Ziel foo.bar
, wobei Stem is: o.ba
Wenn mehrere Regeln mit dem kürzesten Stamm übereinstimmen, verwendet make die erste Regel im Makefile.
Verzeichnisse in Musterregeln
Wenn das Zielmuster keine Schrägstriche enthält, entfernt make den Verzeichnisabschnitt aus dem Ziel, das er zu erstellen versucht, bevor er abgeglichen wird. Das Verzeichnis wird dann vor den Stamm gestellt. Wenn der Stamm zum Erstellen des Zielnamens und der Voraussetzungen verwendet wird, wird der Verzeichnisbestandteil davon entfernt, der Stamm wird anstelle von %
und schließlich wird das Verzeichnis vor der Zeichenfolge platziert. Zum Beispiel:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Wird mit lib/foobar.o
, mit:
- Stamm (
$*
):lib/bar
-
lib/foobar.o
($@
):lib/foobar.o
- Voraussetzungen (
$<
,$^
):lib/foobar.c
In diesem Beispiel hat eine lib/foo%.o
Regel Vorrang vor der foo%.o
Regel, da sie einem kürzeren Stamm entspricht.
Musterregeln mit mehreren Zielen
Musterregeln können mehrere Ziele haben, aber im Gegensatz zu normalen Regeln ist das Rezept für das Erstellen aller Ziele verantwortlich. Zum Beispiel:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Ist eine gültige Regel, die sowohl Debug- als auch Release-Objekte erstellt, wenn eines von ihnen erstellt werden muss. Wenn wir so etwas geschrieben haben:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Es würde funktionieren, wenn nur eines von debug/*.o
oder release/*.o
wird, aber es würde nur das erste Ziel erstellen (und das zweite als aktuell betrachten), wenn beide erstellt werden müssen.