Mitunter soll eine Menge von Dateien, die man erstellt und bearbeitet,
systematisch in etwas anderes, z.B. ein anderes Format, konvertiert
werden. Die Konvertierung lässt sich mit dem Utilty make
organisieren, so dass überflüssige Konvertierungen vermieden werden.
Wie sieht ein GNU Makefile für diese Aufgabe aus?
Das folgende (fiktive) Beispiel geht davon aus, dass wir .in-Dateien
in .out-Dateien konvertieren wollen. Die Konvertierung übernimmt das
(fiktive) Programm in2out.
1 |
OUTFILES = $(patsubst %.in,%.out,$(wildcard *.in)) |
2 |
|
3 |
%.out: %.in |
4 |
in2out $< $*.out |
5 |
|
6 |
all: $(OUTFILES) |
7 |
|
8 |
clean: |
9 |
rm -f *.out |
- Zeile 1
-
Definition der Liste der Targets, also der Dateien, die zu
generieren sind. Das sind .out-Dateien. Diese Liste könnten wir per
Hand pflegen, was aber mühselig wäre. Stattdessen nutzen wir die
Möglichkeiten von GNU make und generieren die Liste mittels der
Funktionen wildcard und patsub aus den im aktuellen
Verzeichnis befindlichen .in-Quell-Dateien.
- Zeile 3-4
-
Pattern Rule, welche definiert, welche Kommandofolge aus einer
.in-Quelldatei eine .out-Zieldatei erzeugt. Hier ist es ein einzelnes
Kommando, der Aufruf von in2out [infile] [outfile].
Die make-Variable $< enthält den Namen der .in-Quelldatei,
die Variable $* den Grundnamen der Quelldatei, aus dem
durch Anhängen von ".out" der Name der Zieldatei wird.
- Zeile 6
-
Regel, die bei Aufruf von
oder
zu erfüllen versucht wird. Diese (PHONY-)regel besagt, dass
als Vorbedingung alle $(OUTFILES) zu generieren sind.
- Zeile 8-9
-
Regel ohne Vorbedingung, die aufräumt, also alle .out-Dateien löscht, z.B.
um sie insgesamt neu zu generieren. Aufruf: