An dieser Stelle wollen wir über das Makefile schreiben und dir die Regeln, die schon drin stehen, erklären; und auch den Rest.
TEXFILE = vXXX
Wir erstellen hier die Variable TEXFILE
um darin den Namen der
Haupt-.tex
-Datei zu speichern.
Wenn wir die Variable später nutzen wollen, schreiben wir $(TEXFILE)
.
Aus build/$(TEXFILE).pdf
wird dann build/vXXX.pdf
.
all: build/$(TEXFILE).pdf
Es ist üblich, als erstes Ziel das all
Ziel zu setzen,
und in unserem Fall ist es das mit LaTeX erstellte PDF.
Auch wenn wir python
-Skripts im Makefile stehen haben,
sind die dort erzeugten Dateien nicht unser Endziel im Praktikum,
da wird ein Protokoll abgegeben und nicht nur einzelne Plots.
build/plot.pdf: plot.py ../matplotlibrc ../header-matplotlib.tex | build
TEXINPUTS=$$(pwd)/..: MATPLOTLIBRC=../matplotlibrc python plot.py
Nun schauen wir uns die erste Regel im Makefile an,
sämtliche Regeln folgen diesem Aufbau.
Zuerst steht die Zieldatei, dann getrennt durch einen Doppelpunkt :
,
die Dateien, die wir benötigen, um die Zieldatei zu erstellen,
und in der nächsten Zeile, eingerückt durch einen Tab,
der Befehl, der ausgeführt werden muss, um die Zieldatei zu erstellen.
Das recipe
wird immer ausgeführt, wenn eines der prerequisites
ein späteres Zugriffsdatum als das target
hat.
target: prerequisites
recipe
In dieser Regel wird build/plot.pdf
erstellt.
Benötigt dazu werden plot.py
, das python
-Skript, welches die Auswertung durchführt,
und die beiden Konfigurationsdateien matplotlibrc
und header-matplotlib.tex
.
Diese ermöglichen dir innerhalb der matplotlib
-Plots LaTeX zu verwenden,
beide liegen im Hauptordner des Repository und daher muss ../
vor ihnen stehen,
damit sie gefunden werden.
Weiteres zu LaTeX in matplotlib
findest du in den
Folien zu LaTeX
im Abschnitt TeX in matplotlib in TeX.
Zusätzlich solltest du hier auch deine Datendateien hinschreiben,
mit relativem Pfad zum Makefile, z.B. data/quader.txt
.
Als Letztes in dieser Zeile steht | build
, zum Abspeichern
benötigt python
den build
-Ordner, das Zugriffsdatum von diesem ist egal,
deswegen steht es hinter der Pipe |
, hier wird nur geprüft, ob der Ordner existiert.
Das recipe
setzt sich aus verschiedenen Komponenten zusammen.
Als Erstes wird python
der Pfad zu den Konfigurationsdateien mitgeteilt,
mit TEXINPUTS=$$(pwd)/..:
der zu header-matplotlib.tex
,
mit MATPLOTLIBRC=../matplotlibrc
zur matplotlibrc
.
Der Rest der Zeile ist der Aufruf python plot.py
.
build/$(TEXFILE).pdf: build/plot.pdf
Diese Zeile ist eine Möglichkeit,
einer Datei eine Abhängigkeit zuzuordnen,
ohne eine komplette Regel zu schreiben.
Innerhalb des Protokolls wird build/plot.pdf
eingefügt,
daher sollte die Datei existieren, bevor wir mit LaTeX
das Hauptdokument bauen.
python
-Skript hinzufügen,
kannst du folgende Zeilen in dein Makefile schreiben.
Die Namen der Dateien sind hier <fit>
,
ersetze diese fünf Zeichen mit deinen eigenen Dateinamen.
build/<fit>.pdf: <fit>.py data/<fit>.py ../matplotlibrc ../header-matplotlib.tex | build
TEXINPUTS=$$(pwd)/..: MATPLOTLIBRC=../matplotlibrc python <fit>.py
Die Zeile build/$(TEXFILE).pdf: build/plot.pdf
kannst du dann entsprechend erweitern,
mit dem Backslash \
können wir die weitere Datei
in eine weitere Zeile schreiben
und mit noch mehr Dateien wird die Zeile noch länger
und auch unübersichtlicher.
build/$(TEXFILE).pdf: build/plot.pdf \
build/<fit>.pdf
build/$(TEXFILE).pdf: FORCE | build
TEXINPUTS=..: \
BIBINPUTS=..: \
max_print_line=1048576 \
latexmk \
--lualatex \
--output-directory=build \
--interaction=nonstopmode \
--halt-on-error \
$(TEXFILE).tex
Dies ist die lange LaTeX-Regel.
Sie enthält alles, was in den
make
-Folien
besprochen wird.
Die prerequisites
sind hier anders als für die python
-Regeln.
| build
haben wir bei der python
-Regel besprochen,
neu ist FORCE
.
Das ist eine niemals erfüllte Abhängigkeit,
weiter unten im Makefile sehen wir auch eine Zeile,
die nur FORCE:
beinhaltet.
Dadurch wird immer das recipe
ausgeführt,
das ist hier extra so geschrieben,
da wir latexmk
aufrufen und nicht lualatex
.
Du siehst auch, dass wir nirgendwo angegeben haben,
welche .tex
-Dateien zu dieser Regel gehören.
Das müssen wir nicht, da latexmk
das selbstständig macht,
wenn es liest, welches die Hauptdatei ist.
Gehen wir einmal die einzelnen Zeilen des recipe
durch:
TEXINPUTS=..: \
:
Im Hauptordner des Repository liegt die header.tex
,
die wir nutzen, damit latexmk
sie findet,
erweitern wir den Standardsuchpfad (:
),
der den aktuellen und alle Unterordner beinhaltet,
um den Hauptordner.
Mit den \
können wir die Zeile visuell in mehrere
einzelne aufteilen, ausgeführt wird von TEXINPUTS
bis
$(TEXFILE).tex
alles als eine Zeile.BIBINPUTS=..: \
:
Auch den Suchpfad für Literaturverzeichnisdateien
erweitern wir, da jetzt schon lit.bib
und programme.bib
in dem Hauptordner liegen.
Denn latexmk
erkennt auch, wenn du biber
nutzt und
führt alles in der richtigen Reihenfolge aus.max_print_line=1048576 \
:
Mit dieser Zeile erweitern wir die Anzahl an Zeichen,
diebeim Ausführen von LaTeX in eine Zeile geschrieben
werden dürfen.
Das macht die Ausgabe schöner und nicht so sehr abgehackt.latexmk \
startet latexmk
mit den Argumenten
--lualatex
: Es wird lualatex
als TeX-Engine verwendet.--output-directory=build \
:
Alle Dateien, die erstellt werden,
werden in den build
-Ordner gespeichert.--interaction=nonstopmode \
: Falls Fehler auftreten,
wird die interaktive Lösungsstrategie von lualatex
deaktiviert.--halt-on-error \
:Falls Fehler auftreten,
stoppt der Prozess.$(TEXFILE).tex
: Die Datei, die wir bauen wollen.build:
mkdir -p build
In den Regeln haben wir den build
-Ordner schon besprochen,
hier wird er erstellt.
Er hat keine Abhängigkeiten,
daher endet die erste Zeile nach dem Doppelpunkt :
.
Die Flag -p
sorgt dafür, dass keine Fehlermeldung
ausgegeben wird, wenn der Ordner schon existiert
und dass, wenn wir eine Kette von Ordnern erstellen wollen,
z.B. build/figures
, alle Ordner in der Kette erstellt werden.
clean:
rm -rf build
Es ist gute Praxis, einen Befehl zu haben, der das Projekt
in den Zustand vor der Ausführung von make
versetzt.
Da alles, was erzeugt wird, im build
-Ordner gespeichert wird,
müssen wir nur diesen löschen.
Die Doppel-Flag -rf
setzen wir,
da wir einen Ordner löschen (-r
)
und keine Fehlermeldung ausgegeben haben wollen,
falls das zu löschende Objekt nicht existiert (-f
).
FORCE:
Wie in der LaTeX-Regel beschrieben ist dies ein
immer aktuelles target
.
.PHONY: all clean
Dies ist die letzte Regel und wird gesetzt,
damit make
weiß, dass die gelisteten targets
keine Dateien erzeugen und falls es doch Dateien gibt,
die so heißen, immer noch die Regeln ausgeführt werden.
Wenn du dein Makefile
nutzen möchtest, hast du mehrere Möglichkeiten.
make
: Dieser Befehl sorgt dafür, dass alles ausgeführt wird,
damit die aktuellste Version der im all
target
genannten prerequisites
am Ende vorliegt.make clean
: So räumst du deinen Versuchsordner wieder auf.make build/plot.pdf
: Du arbeitest gerade am Plot oder an einem anderen
python
-Skript und möchtest dir die Ergebnisse ansehen?
Dann kannst du als Argument hinter make
das entsprechende target
schreiben.