Programmiertool make |
Das Projekt meinprog besteht aus den Sourcedateien haupt.c, test.c und tools.c. Jede dieser Dateien hat eine Headerdatei (haupt.h, test.h und tools.h), die es jeweils selbst einbindet. Dazu bindet haupt.c jede andere Headerdatei ein und jedes Modul bindet die globalen Definitionen aus haupt.h ein.
Eine Datei Makefile wird angelegt und darin wird der Weg der Compilierung beschrieben. Das Programm meinprog hängt von den Dateien test.o, haupt.o und tools.o ab:
meinprog: test.o haupt.o tools.o |
Die darauf folgenden Zeilen beschreiben, wie die Zieldatei hergestellt werden kann. Die Datei meinprog wird generiert, indem man den Compiler aufruft und die Objektdateien als Parameter angibt. Der Compiler merkt von sich aus, dass er hier nur linken soll, da keine echten Quellcodedateien vorhanden sind. Solche Aktionszeilen müssen mit einem Tabulator beginnen. Es dürfen keine Leerzeichen verwendet werden.
meinprog: test.o haupt.o tools.o
cc -o meinprog test.o haupt.o tools.o
|
Wer nun einfach make aufruft, erhält überraschenderweise bereits ein komplett übersetztes Programm. Auf dem Bildschirm erscheinen folgende Zeilen:
gaston> make cc -c -o test.o test.c cc -c -o haupt.o haupt.c cc -c -o tools.o tools.c cc -o meinprog test.o haupt.o tools.o gaston> |
Tatsächlich "weiß" make, wie man aus c-Dateien o-Dateien macht und da er mit den Regeln des Makefiles die o-Dateien nicht erzeugen kann, sieht make im aktuellen Verzeichnis nach, ob es Dateien gibt, aus denen er o-Dateien machen kann.
Ändert man die Datei test.c, so wird nur test.c übersetzt und meinprog neu gebunden. Ändert man allerdings test.h, passiert nichts. make kennt die Abhängigkeiten der Header nicht. Damit make auch Änderungen der Headerdateien überwacht, ist folgende Änderung im Makefile notwendig.
test.o : test.c test.h haupt.h tools.o : tools.c tools.h haupt.h haupt.o : haupt.c haupt.h test.h tools.h |
Eine Aktionszeile müsste hier eigentlich etwa so lauten:
test.o : test.c test.h haupt.h
cc -c -o test.o test.c
|
Da aber make die erforderliche Aktion bereits kennt, braucht man sie nicht zu erwähnen.
Ein Makefile hat Einträge der folgenden Grundstruktur:
Ziel : Abhängigkeiten
Generierungskommando
|
try :
cd .. ; pwd
pwd
|
Die Ergebnisse der beiden Aufrufe von pwd sind nicht gleich. Der Wechsel mit cd .. gilt nur für die aktuelle Zeile. In der nächsten Zeile wird wieder aus dem bisherigen Verzeichnis gearbeitet.
cd .. ; pwd /home/arnold/my/src/unix pwd /home/arnold/my/src/unix/make |
Hängen also Kommandos so zusammen, dass sie in einer gemeinsamen Shell bearbeitet werden müssen, sollten sie in dieselbe Zeile geschrieben werden und mit Semikola getrennt werden. Bei langen Zeilen kann mit einem Backslash die Zeile in der nächsten Zeile fortgesetzt werden.
Als Kommentarzeichen gilt das # in der ersten Spalte.
Im Beispiel werden die Objektdateien zusammen behandelt und zweimal aufgezählt, einmal in der Abhängigkeitsbeschreibung von meinprog und dann im Compileaufruf.
meinprog: test.o haupt.o tools.o
cc -o meinprog test.o haupt.o tools.o
|
Hier kann man eine Variable OBJS definieren, die die Objekte bezeichnet. Durch Einsetzen von OBJ ergibt sich die folgende Makedatei.
OBJS = test.o haupt.o tools.o
meinprog: $(OBJS)
cc -o meinprog $(OBJS)
|
| Makro | Bedeutung |
|---|---|
| $@ | Dateiname des Ziels (haupt.o) |
| $* | Basisnamen des Ziels (haupt) |
.quell.ziel: |
Der typischste Übergang ist sicher der von C-Sourcen zu Objekten. Die Sourcen enden auf c und die Objektdateien auf o. Die entsprechende Suffixregel lautet dann:
.c.o:
cc -c $<
|
Das interne Makro $< darf nur bei Suffixregeln verwendet werden und bezeichnet das aktuelle Ziel.
all: client server
client: $(SENDHEADER) $(COMMONOBJS) $(CLTOBJS)
...
server: $(SENDHEADER) $(COMMONOBJS) $(SRVOBJS)
...
|
make install |
|
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Wie werde ich UNIX-Guru Verlagsrechte bei galileo computing |
| Homepage |
(C) Copyright 2002 Arnold Willemer
|