Dateien

In den bisherigen Makefiles wurden Ziele frei benannt. Ein Makefile soll jedoch etwas erzeugen und so ist der Name eines Ziels auch gleich der Name einer Datei. (sofern es nicht mit .PHONY deklariert sind).

In den bisherigen Dataien wurde darauf überhaupt keine Rücksicht genommen. Zeit es besser zu machen. Nehmen wir uns unser vorheriges Skript vor:

CC = gcc
CFLAGS = -Wall
LDFLAGS = -lm
OUTPUT = myprogram
FILES = myprogram.c extention.c

program:
	@$(CC) $(CFLAGS) $(LDFLAGS) -o $(OUTPUT) $(FILES)

Wir haben jetzt zwei Dateien, aus denen wir Objektdateien erzeugen wollen, damit nicht immer alle Dateien neu kompilieren müssen. Die Objektfiles können anschließend wieder zum fertigen Programm gelinkt werden:

CC = gcc
CFLAGS = -Wall
LDFLAGS = -lm
OBJECTS = myprogram.o extention.o

all: myprogram

myprogram.o: myprogram.c myprogram.h
	@$(CC) $(CFLAGS) $(LDFLAGS) -o $myprogram.o myprogram.c
extention.o: extention.c extention.h myprogram.h
	@$(CC) $(CFLAGS) $(LDFLAGS) -o $extention.o extention.c

myprogram: $(OBJECTS)
	@$(CC) $(CFLAGS) $(LDFLAGS) -o myprogram $(OBJECTS)

Das Ziel myprogramm ist nun abhängig von seinen Objekten. Nun wird geprüft, ob die Datei „myprogram“ jünger ist, als die Abhängigkeiten. Wenn die Datei nicht existiert, wird sie erzeugt. Ist das Ziel „myprogram.o“ vorhanden, wird geschaut, ob „myprogram.o“ jünger ist als die Abhängigkeiten „myprogram.c“ und „myprogram.h“. Selbiges gilt für „extention.o“

Ändern wir nun zum Beispiel „myprogram.c“ und speichern die Datei, so ist die Datei „myprogram.c“ jünger als die zuvor kompilierte „myprogram.o“. Daher muss „myprogram.o“ neu kompiliert werden. Für „extention.o“ gilt dies nicht, da „extention.o“ nicht von „myprogram.c“ abhängig ist. Make weiß daher, dass „extention.o“ noch aktuell ist und damit nicht neu erzeugt werden muss.

Unterm Strich bedeutet das bei diesem Projekt, nur die Hälfte der Dateien kompiliert werden muss, am Schluss werden beide Objektdateien gelinkt. Im Normalfall wird zwischen den einzelnen Kompiliervorgängen nur wenige Dateien verändert. Besteht ein Projekt aus vielen, vielen Dateien, so werden eben nur die ein, zwei geänderten Dateien kompiliert und die unveränderten Dateien werden wiederverwendet.

Im Beispiel sind auch die Headerdateien aufgeführt. Die Datei „myprogram.h“ steht in den Abhängigkeiten von beiden Objektfiles. Findet hier eine Änderung statt, so müssen beide Objekte neu kompiliert werden.