====== 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 [[http://www.gnu.org/software/make/|''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 [[http://www.gnu.org/software/make/manual/|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:
:
rezept
...
'''' ist eine Datei und '''' 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 [[http://www.gnu.org/software/make/manual/make.html#One-Shell|beispielsweise auch Perl aufrufen]]. Der '''' 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.
.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.
[[adminstoriesartikel|Zurück zur Uebersicht]]