Make

  • Urspruenglicher Autor: Dirk Deimeke
  • Urspruengliches Datum: 17.06.2011

Ein meiner Meinung nach haeufig unterschaetztes und nahezu überall installiertes Werkzeug in der Systemadministration ist ''make''. Im Grossen und Ganzen ist make ein Werkzeug, das verschiedene Aktionen nur dann ausfuehrt, wenn sich eine oder mehrere Dateien aendern. Das ist stark vereinfacht ausgedrueckt, da make wesentlich mehr kann, aber das wuerde den Rahmen hier sprengen.

Die sehr ausfuehrliche Dokumentation ist lesenswert.

Dateien, die make als Input dienen, koennen entweder (in dieser Reihenfolge) GNUmakefile, makefile oder Makefile heissen. Empfohlen ist, es einfach Makefile zu nennen.

Makefiles sind in der Regel folgendermassen aufgebaut:

<ziel>: <vorbedingungen>
<tab>rezept
<tab>...

<ziel> ist eine Datei und <vorbedingungen> ist eine Liste von Dateien, kann aber auch nur eine Datei sein, rezept ist eine Reihe von (Shell-)Befehlen, die ausgeführt werden sollen, man koennte beispielsweise auch Perl aufrufen. Der <tab> ist wichtig. make vergleicht die Dateidaten des Ziels mit den Daten der Vorbedingungen. Wenn die Vorbedingungen aktueller sind als das Ziel, wird das Rezept ausgefuehrt. Ein einfaches Beispiel:

# Das Makefile
/home/dirk/copy.test:       copy.test
	cp copy.test /home/dirk

Und hier die Ausfuehrung:

$ make /home/dirk/copy.test
cp copy.test /home/dirk
$ make /home/dirk/copy.test
`/home/ddeimeke/copy.test' is up to date.
$ touch copy.test
$ make /home/dirk/copy.test
cp copy.test /home/dirk

Etwas komplizierter, aber enorm hilfreich ist es, die eigene ~/.ssh/config-Datei auf entfernten Systemen identisch zu haben. Da der Zeitvergleich nicht ohne Weiteres funktioniert, behelfe ich mir mit einer Hilfsdatei.

# Das Makefile
/home/dirk/.ssh/configdate: /home/dirk/.ssh/config
	scp /home/dirk/.ssh/config dirk@zielrechner:.ssh
	touch /home/dirk/.ssh/configdate

Aufruf mit make /home/dirk/.ssh/configdate. Wenn man in Makefiles keine Vorbedingungen angibt, dann wird das Kommando bei Aufruf immer ausgefuehrt. Allerdings sollte man in dem Fall make auch bekanntgeben, dass das Ziel keine Datei darstellt. Das kann man mit der Vokabel .PHONY erledigen.

# Das Makefile
.PHONY: clean
clean:
	find /home/dirk -name '*~' -delete

Das obige Beispiel löscht alle Sicherheitskopien vom Editor vim.

Das letzte Beispiel uebersetzt eine LaTeX-Datei, wenn sich eine der beteiligten Dateien geaendert hat und setzt das als Standard-Handlung.

<code>.PHONY: clean .DEFAULT_GOAL := buch.pdf clean:

find . \( -name '*.dvi' -o -name '*.aeb' -o -name '*.aux' -o -name '*.idx' \
-o -name '*.ilg' -o -name '*.ind' -o -name '*.ivz' -o -name '*.ivz.xml' \
-o -name '*.log' -o -name '*.pic.xml' -o -name '*.toc' \) -delete

buch.pdf: *.tex */*.tex */*/*.tex */*.eps */*/*.eps

latex buch
latex buch
latex buch
dvipdfm -o buch.pdf buch''

Das ist nur eine sehr kurze Einfuehrung. make kann eine Menge mehr.

Zurück zur Uebersicht