Wenn Sie eine Datei mit der Endung .c sehen, wissen Sie, dass es
sich um eine C-Datei handelt. Vermutlich wissen Sie auch, dass Sie
einen C-Compiler aufrufen müssen, um daraus eine Objekt-Datei mit der
Endung .o zu generieren.
Über die Suffix-Regeln kann man make dieses Wissen, wie es aus einer
.c-Datei eine .o-Datei machen soll, beibringen:
#
# Suffix-Regeln fuer C-Programme
#
.SUFFIXES : .c .o .i
.c.o :
$(CC) -c $<
.c.i :
$(CC) -E $< > $@
|
Mit der Zeile .SUFFIXES gibt man dem make-Kommando bekannt, welche
Endungen es kennen soll. Sollen außer den drei angegebenen Endungen
.c, .o und .i die bereits bekannten Endungen weiter gelten, kann
man $(SUFFIXES) noch auf der rechten Seite ergänzen.
Nach der Bekanntgabe der Endungen folgen die Suffix-Regeln: Die Regel
.c.o gibt an, wie make aus einer .c-Datei eine .o-Datei machen
soll, und die Regel .c.i besagt, wie das Ergebnis des Präprozessors in
einer Datei mit der Endung .i landet.
Beispiel:
user@linux $
make love.i
gcc -E love.c > love.i
|
Null-Suffix-Regeln sind daran erkennbar, dass die zweite Endung
fehlt:
# Null-Suffix-Regel
.c:
$(CC) $< -o $@
|
Null-Suffix-Regeln kommen dann zum Einsatz, wenn direkt aus einer
Quell-Datei ein ausführbares Programm ohne Datei-Endung erzeugt
werden soll.
Beispiel:
user@linux $
make love
gcc love.c -o love
|
|
Viele Regeln hat make schon eingebaut, nicht nur für C und C++. Die
Regeln und Makros können über
user@linux $
make -p -f /dev/null
|
ausgegeben werden. Wie man dabei sieht, gibt es auch für andere
Sprachen bereits vordefinierte Regeln.
Endung
|
Bedeutung
|
.c
|
C-Source
|
.cc, .C, .cpp
|
C++-Source
|
.f
|
Fortran
|
.gz
|
komprimierte Datei (gzip)
|
.h
|
Header-Datei (C, C++)
|
.i
|
Dateien nach dem Präprozessor-Lauf
|
.l
|
lex-Dateien
|
.o
|
Objekt-Dateien
|
.p
|
Pascal-Dateien
|
.s
|
Assembler-Dateien
|
.y
|
yacc-Dateien
|
.Z
|
komprimierte Dateien (compress)
|
|
Betrachten wir ein Makefile, das nur aus folgender Regel besteht:
children : mummy.o daddy.o
|
Dummerweise sind mehrere Suffix-Regeln definiert, wie eine .o-Datei
erzeugt werden kann, zum Beispiel aus einer .c-Datei oder aus einer .cpp-Datei
oder Datei mit anderer Endung. Wenn nur eine entsprechende .c-Datei
da ist, ist alles klar. Aber was, wenn nicht? Dann wird die
Such-Reihenfolge durch die SUFFIXES-Liste bestimmt:
Es wird zuerst nach einer .c-Regel gesucht (.o nach .o macht keinen
Sinn), dann nach einer .cc-Regel und so fort.
|
Eigene Suffix-Regeln wird man dann einführen, wenn
-
die eingebauten Regeln nicht ausreichen,
-
man mit den eingebauten Regeln nicht einverstanden ist.
|
|