Arbeiten Sie an komplexen Projekten mit mehreren Quelldateien, behält Make den Überblick für Sie. Programmierern, LaTeX-Anwendern oder Systemverwaltern greifen gerne auf dieses nützliche Werkzeug zurück.
Zu Befehl
Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder Gnome regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
Jeder, der schon einmal Programme aus den Quellen selbst übersetzt hat, kennt das Tool Make, das im Dreischritt configure, make, make install für das Kompilieren und Installieren der Software zuständig ist. Make leistet aber nicht nur in diesem Szenario gute Dienste: Auch bei anderen Aufgaben sorgt es für Arbeitserleichterung. So verwenden LaTeX-Anwender Make beispielsweise gerne bei größeren Projekten dazu, ein Postscript- oder PDF-Dokument automatisch neu zu kompilieren und zu erstellen, wenn Sie eine oder mehrere der Quelldateien verändert haben.
Darüber hinaus greift Make dem Systemadministrator unter die Arme und stößt bei Bedarf ein Backup-Skript an, wenn im System eine oder mehrere Dateien modifiziert wurden. Welche Arbeiten Make verrichtet, beschreiben Sie in einer Steuerdatei, dem so genannten Makefile. Anschließend reicht der Aufruf make – und der Rest läuft automatisch.
Das Programm Make gibt es für viele verschiedene Plattformen. Dieser Artikel behandelt GNU Make, welches unter Linux zum Einsatz kommt. Er zeigt, wie Makefiles aufgebaut sind und stellt die wichtigsten Optionen des Kommandos vor.
Ein Frage der Steuerung
Dreh- und Angelpunkt für die Arbeit mit Make ist das so genannte Makefile, das genaue Anweisungen enthält. Make versteht GNUmakefile, makefile oder Makefile und sucht in genau dieser Reihenfolge nach einer entsprechenden Steuerdatei im aktuellen Verzeichnis. Das Makefile enthält Regeln, die wie folgt beschrieben sind:
Ziel: Abhängigkeit(en)
Kommando
Kommando
…
Das Ziel (engl.: target) bezeichnet das Ergebnis, das durch die darauf folgenden Befehle zu erstellen ist. Hinter dem Doppelpunkt stehen eine oder mehrere Dateien, die das Ziel zum Erzeugen voraus setzt, also von denen das Ziel abhängt (engl.: dependency). Danach folgen die Kommandos, also die Aktionen, die Make im Fall erfüllter Abhängigkeiten ausgeführen soll.
Beim Erstellen von Makefiles sind folgende Syntaxregeln zu beachten:
- Kommentare stehen hinter einem Doppelkreuz (
#). - Die Abhängigkeiten stehen durch Leerzeichen voneinander abgetrennt hinter dem Doppelpunkt des Ziels.
- Alle Kommandos stehen normalerweise in einer eigenen Zeile und sind durch einen Tabulator eingerückt; stehen hier Leerzeichen, verweigert Make die Arbeit und Sie erhalten eine Meldung, wie beispielsweise
makefile:4: *** missing separator. Stop. - Möchten Sie die Kommandos hintereinander in eine Zeile schreiben, trennen Sie diese durch ein Semikolon voneinander. Auch hier ist der Tabulator zum Einrücken zwingend notwendig.
- Lange Zeilen dürfen Sie umbrechen, wenn am Zeilenende jeweils ein Backslash (
\) steht. Nach dem Backslash dürfen keine weiteren Zeichen stehen.
Starkes Team – Make und LaTeX
Was sich in der Theorie trocken anhört, ist in der Praxis schnell erklärt: Als praktisches Beispiel dient ein Makefile, das beim Erstellen eines Buchs mit LaTeX [1][2][3][4] hilft. Das Buch selbst liegt in mehreren Dokumenten vor, dass heißt, es gibt für jedes Kapitel eine eigene Tex-Datei. Aus diesen Einzelteilen fasst LaTeX wiederum die Datei buch.tex zusammen.
Der erste Schritt ist das Erstellen der DVI-Datei. Make soll das Kommando latex dann aufrufen, wenn sich eine der Quelldateien verändert hat.
buch.dvi: kap01.tex kap02.tex kap03.tex \
kap04.tex kap05.tex kap06.tex \
kap07.tex buch.tex
latex buch
Um automatisch eine Postscript-Datei zu erzeugen, kommt hier das Programm Dvips (mit verschiedenen Aufrufparametern) zum Einsatz. Auch das Tool hat nur dann etwas zu tun, wenn sich die DVI-Datei des ersten Ziels verändert hat:
buch.ps: buch.dvi
dvips -q -o buch.ps buch
Wer möchte, fügt noch schnell ein Ziel hinzu, dass aus der Postscript-Datei ein PDF-Dokument erstellt:
buch.pdf: buch.ps
ps2pdf buch.ps buch.pdf
Bei so viel Arbeit lohnt sich ein ordentliches Backup: Hier bietet es sich an, die Tex-Dateien, das Postscript und das PDF in ein mit Bzip2 [5] komprimiertes Tar-Archiv zu verpacken und das mit SCP auf einen entfernten Rechner zu transportieren – sicher ist sicher:
backup: kap01.tex kap02.tex ?
kap03.tex \
kap04.tex kap05.tex ?
kap06.tex \
kap07.tex buch.tex b?
uch.ps \
buch.pdf
tar cvfj backup.tar.bz2 ?
*.tex buch.ps buch.pdf
scp backup.tar.bz2 huhn@?
asteroid.huhnix.org:
Make bei der Arbeit
Für den Einsatz des so entwicklten Makefiles existieren nun verschiedene Möglichkeiten. Rufen Sie einfach nur make ohne weitere Parameter auf, arbeitet Make lediglich das erste Ziel ab, erstellt also eine DVI-Datei, falls Sie eine oder mehrere der Tex-Dateien verändert haben. Alternativ übergeben Sie Make beim Aufruf ein anderes Ziel, wie zum Beispiel make backup um lediglich die Sicherungskopie oder make buch.pdf um das PDF-Dokument zu erstellen.
Noch einmal zur Erinnerung: Make erstellt das PDF aus der Postscript-Datei mit dem Kommando ps2pdf, die Postscript-Datei wiederum aus dem DVI-File generiert und dieses ist das erste Ziel des Makefiles. Hat sich also auf dem Weg zur Postscript-Datei etwas verändert, arbeitet Make alle Ziele von oben nach unten ab (Abbildung 1). Gibt es nichts zu tun, informiert Sie Make auch darüber:
make: `buch.pdf' is up to date.
Eine Frage der Optionen
Make bringt noch einige weitere Aufrufparameter mit. Trägt die Steuerdatei beispielsweise einen Namen, den das Programm nicht als Makefile identifiziert, übergeben Sie die Datei mit den Arbeitsanweisungen über den Parameter -f:
make -f Steuerdatei
Ebenso ist es möglich, das Arbeitsverzeichnis explizit zu benennen. Halten Sie sich an einem anderen Ort im Dateisystem auf, geben Sie über den Parameter -C an, wo Make seinen Dienst verrichtet:
$ make -C ~/buch make: Entering directory `/home/? huhn/buch' latex buch … make: Leaving directory `/home/h? uhn/buch'
Hat sich an den Quelldateien nichts verändert und Sie wollen dennoch Make zur Zusammenarbeit überreden, “zwingen” Sie das Tool über die Option -B zur Arbeit:
$ make -B buch.pdf latex buch … Transcript written on buch.log. dvips -q -o buch.ps buch ps2pdf buch.ps buch.pdf
Möchten Sie gerne wissen, was hinter den Kulissen abläuft, weisen Sie Make über die Option -d (debug) an, sehr ausführlich zu berichten (Abbildung 2). Damit die Ausgabe nicht aus dem Terminalfenster herausscrollt, leiten Sie sie am besten an einen Pager, wie Less oder More weiter:
make -d | less

make -d aktivieren.” width=”300″ height=”189″ />
Abbildung 2: Äußerst informativ zeigt sich Make im Debug-Modus, den Sie übermake -d aktivieren.Sehr variabel
Das LaTeX-Beispiel arbeitet mit einer überschaubaren Menge an Tex-Dateien. Daher sieht das Makefile noch recht übersichtlich aus. Spätestens dann, wenn die Menge der Quelldateien wächst, nimmt aber die Verwirrung zu. Make bietet daher die Möglichkeit, Variablen zu definieren. Um die LaTeX-Dateien zum Beispiel der Variable TEXDATEIEN zuzuweisen, definieren Sie diese am Anfang des Makefiles:
TEXDATEIEN = kap01.tex kap02?
.tex kap03.tex \
kap04.tex kap05?
.tex kap06.tex \
kap07.tex buch.?
tex
Anschließend referenzieren Sie diese im weiteren Verlauf des Makefiles über $(VARIABLENNAME), also z. B.:
buch.dvi: $(TEXDATEIEN)
latex buch
Darüber hinaus bringt Make auch eigene Variablen mit. So steht $@ beispielsweise für das aktuelle Ziel und $? für die veränderten Abhängigkeiten, also die Dateien, die hinter dem Doppelpunkt stehen.
Glossar
-
Quellen
-
Die Quellen (engl.: Sourcen) enthalten den für Menschen lesbaren (in einer Programmiersprache geschriebenen) Text eines Computerprogramms.
-
Kompilieren
-
Damit ein Computer ein Programm ausführt, müssen Sie die Quelldateien mit Hilfe eines so genannten Compilers (von to compile) in eine für den Computer verständliche Maschinensprache umwandeln.
-
DVI
-
Das Ausgabeformat Device Independent (= geräteunabhängig) ist eine für das Textsatzsystem TeX entwickelte Ausgabedatei, die als Ergebnis aus dem Kommando
latex Datei.texensteht. Diese eignet sich für die Ausgabe am Bildschirm oder den Ausdruck.
Infos
[1] LaTeX-Workshop, Teil 1: Heike Jurzik, Hans-Georg Eßer “Gutenberg am Rechner”, LinuxUser 09/2002, S. 43 ff.
[2] LaTeX-Workshop, Teil 2: LaTeX-Workshop, Teil 2: Heike Jurzik, Hans-Georg Eßer “LaTeX im Umbruch, Teil II”, LinuxUser 11/2002, S. 46 ff.
[3] LaTeX-Workshop, Teil 3: Heike Jurzik, Hans-Georg Eßer “Alles in Ordnung”, LinuxUser 01/2003, S. 53 ff.
[4] LaTeX-Workshop, Teil 4: Heike Jurzik, Hans-Georg Eßer “TeXnische Spezialitäten”, LinuxUser 04/2003, S. 52 ff.
[5] Archivieren auf der Shell: Heike Jurzik, “Verpackungskünstler – Gzip, Bzip2 und Tar”, LinuxUser 10/2005, S. 93 ff., http://www.linux-user.de/ausgabe/2005/10/093-zubefehl/





