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.
|
|