2017-02-28 2 views
0

Googling hilft nicht viel zu verstehen, wie die % Variable in dem Makefile-Ausschnitt unten verwendet wird.Was ist die Semantik von '%' in Makefile?

_OBJ = a.o b.o c.o 
OBJ = $(patsubst %,$(OBJDIR)/%,$(_OBJ)) 

$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INC) 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

Kann mir bitte jemand helfen? Bedeutet es, dass, wenn es fünf .c Dateien unter $(SRCDIR) gibt, dass viele *.o Regeln hinter der Szene bevölkert werden?

Antwort

1

Das ist ein "implicit rule". Die % macht das Wort $(OBJDIR)/%.o ein Muster. Es sagt make, wenn es versucht, ein Ziel zu erstellen und der Name des Ziels mit diesem Muster übereinstimmt (wobei % ein oder mehrere Zeichen ersetzen kann - beliebige Zeichen) UND dass eine Datei mit dem Muster $(SRCDIR)/%.c übereinstimmt (wobei %10) hat hier den gleichen Wert wie im Ziel) entweder existiert bereits oder kann erstellt werden, dann kann make dieses Rezept verwenden, um dieses Ziel zu erstellen.

Also, wenn make will eine Datei foo/bar.o und die Variable OBJDIR den Wert foo, dann ist dieses Muster bauen foo/%.o wird diese Datei Übereinstimmen mit dem %bar passend (dies ist die Stamm in dem GNU macht Dokumentation genannt) .

Dann, wenn SRCDIR den Wert blah und kann (oder erstellen), um eine Datei mit dem Namen blah/bar.c, dann ist diese implizite Regel verwendet wird, finden macht das Ziel foo/bar.o, indem Sie dieses Rezept ($(CC) -c -o [email protected] $< $(CFLAGS)) zu bauen.

+0

Perfekt, macht Sinn mit dem Beispiel gekoppelt. –

Verwandte Themen