Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

adminstoriesmake [20120823 10:02] (aktuell)
Dirk Deimeke angelegt
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]]