adminstoriesmake

no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


adminstoriesmake [20120823 10:02] (aktuell) – angelegt Dirk Deimeke
Zeile 1: Zeile 1:
 +====== 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:
 +
 +<code><ziel>: <vorbedingungen>
 +<tab>rezept
 +<tab>...</code>
 +
 +''<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 [[http://www.gnu.org/software/make/manual/make.html#One-Shell|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:
 +
 +<code># Das Makefile
 +/home/dirk/copy.test:       copy.test
 + cp copy.test /home/dirk</code>
 +
 +Und hier die Ausfuehrung:
 +
 +<code>$ 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</code>
 +
 +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.
 +
 +<code># Das Makefile
 +/home/dirk/.ssh/configdate: /home/dirk/.ssh/config
 + scp /home/dirk/.ssh/config dirk@zielrechner:.ssh
 + touch /home/dirk/.ssh/configdate</code>
 +
 +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.
 +
 +<code># Das Makefile
 +.PHONY: clean
 +clean:
 + find /home/dirk -name '*~' -delete</code>
 +
 +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.
 +
 +[[adminstoriesartikel|Zurück zur Uebersicht]]
  • adminstoriesmake.txt
  • Zuletzt geändert: 20120823 10:02
  • von Dirk Deimeke