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.