Was bedeutet% Symbol in Makefile?

10

Ich spiele mit Makefiles herum und bin auf % .o oder % .c gestoßen . Soweit ich verstanden habe, werden alle c- oder o- Dateien angegeben. Aber warum diese Arbeit:

%.o: %.c
        $(CC) -c $^  -o $@  

und das funktioniert nicht

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Beide Ausdrücke geben alle Dateien an. Was macht % .o: Symbol in der Make-Datei?

Mero
quelle

Antworten:

9

Beide Ausdrücke geben alle Dateien an.

Nein, die erste Regel gibt an, makewie eine .oDatei mit der entsprechenden .cDatei abgerufen werden kann. Beachten Sie den Singular: eine einzelne Datei.

Die zweite Regel (behauptet zu behaupten), makewie man eine Reihe von .oDateien erhält, wenn eine andere Reihe von entsprechenden .cDateien gegeben ist. Beachten Sie den Plural: Alle .cDateien, die sich aus dem *.cGlobbing ergeben.

Nebenbei bemerkt, %.o: %cist eine GNU-Erweiterung.

makeAußerdem lernen Sie nicht, wie Sie StackOverflow verwenden. Sie sollten stattdessen ein Buch lesen.

Satō Katsura
quelle
10

Das Konstrukt:

%.o: %.c
        $(CC) -c $^  -o $@  

ist eine Musterregel , die eine Art implizite Regel ist. Es gibt ein Ziel und eine Abhängigkeit an und bewirkt einen Aufruf von $(CC)für jedes Ziel. Während dies:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

ist eine Standardregel, hat aber (möglicherweise) viele Ziele und viele Abhängigkeiten. Trotzdem wird es nur $(CC)einmal aufgerufen .

Stephen Rauch
quelle