An dieser Stelle wollen wir über das Makefile schreiben und dir die Regeln, die schon drin stehen, erklären; und auch den Rest.
TEXFILE = vXXXWir erstellen hier die Variable
TEXFILEum darin den Namen der Haupt-.tex-Datei zu speichern. Wenn wir die Variable später nutzen wollen, schreiben wir$(TEXFILE). Ausbuild/$(TEXFILE).pdfwird dannbuild/vXXX.pdf.all: build/$(TEXFILE).pdfEs ist üblich, als erstes Ziel das
allZiel zu setzen, und in unserem Fall ist es das mit LaTeX erstellte PDF. Auch wenn wirpython-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.pyNun 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. Dasrecipewird immer ausgeführt, wenn eines derprerequisitesein späteres Zugriffsdatum als dastargethat.target: prerequisites recipeIn dieser Regel wird
build/plot.pdferstellt. Benötigt dazu werdenplot.py, daspython-Skript, welches die Auswertung durchführt, und die beiden Konfigurationsdateienmatplotlibrcundheader-matplotlib.tex. Diese ermöglichen dir innerhalb dermatplotlib-Plots LaTeX zu verwenden, beide liegen im Hauptordner des Repository und daher muss../vor ihnen stehen, damit sie gefunden werden. Weiteres zu LaTeX inmatplotlibfindest 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ötigtpythondenbuild-Ordner, das Zugriffsdatum von diesem ist egal, deswegen steht es hinter der Pipe|, hier wird nur geprüft, ob der Ordner existiert.Das
recipesetzt sich aus verschiedenen Komponenten zusammen. Als Erstes wirdpythonder Pfad zu den Konfigurationsdateien mitgeteilt, mitTEXINPUTS=$$(pwd)/..:der zuheader-matplotlib.tex, mitMATPLOTLIBRC=../matplotlibrczurmatplotlibrc. Der Rest der Zeile ist der Aufrufpython plot.py.build/$(TEXFILE).pdf: build/plot.pdfDiese Zeile ist eine Möglichkeit, einer Datei eine Abhängigkeit zuzuordnen, ohne eine komplette Regel zu schreiben. Innerhalb des Protokolls wird
build/plot.pdfeingefügt, daher sollte die Datei existieren, bevor wir mit LaTeX das Hauptdokument bauen.Möchtest du ein weiteres
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>.pyDie Zeile
build/$(TEXFILE).pdf: build/plot.pdfkannst 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>.pdfbuild/$(TEXFILE).pdf: FORCE | build TEXINPUTS=..: \ BIBINPUTS=..: \ max_print_line=1048576 \ latexmk \ --lualatex \ --output-directory=build \ --interaction=nonstopmode \ --halt-on-error \ $(TEXFILE).texDies ist die lange LaTeX-Regel. Sie enthält alles, was in den
make-Folien besprochen wird. Dieprerequisitessind hier anders als für diepython-Regeln.| buildhaben wir bei derpython-Regel besprochen, neu istFORCE. Das ist eine niemals erfüllte Abhängigkeit, weiter unten im Makefile sehen wir auch eine Zeile, die nurFORCE:beinhaltet. Dadurch wird immer dasrecipeausgeführt, das ist hier extra so geschrieben, da wirlatexmkaufrufen und nichtlualatex. Du siehst auch, dass wir nirgendwo angegeben haben, welche.tex-Dateien zu dieser Regel gehören. Das müssen wir nicht, dalatexmkdas selbstständig macht, wenn es liest, welches die Hauptdatei ist. Gehen wir einmal die einzelnen Zeilen desrecipedurch:TEXINPUTS=..: \: Im Hauptordner des Repository liegt dieheader.tex, die wir nutzen, damitlatexmksie 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 vonTEXINPUTSbis$(TEXFILE).texalles als eine Zeile.BIBINPUTS=..: \: Auch den Suchpfad für Literaturverzeichnisdateien erweitern wir, da jetzt schonlit.bibundprogramme.bibin dem Hauptordner liegen. Dennlatexmkerkennt auch, wenn dubibernutzt 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 \startetlatexmkmit den Argumenten--lualatex: Es wirdlualatexals TeX-Engine verwendet.--output-directory=build \: Alle Dateien, die erstellt werden, werden in denbuild-Ordner gespeichert.--interaction=nonstopmode \: Falls Fehler auftreten, wird die interaktive Lösungsstrategie vonlualatexdeaktiviert.--halt-on-error \:Falls Fehler auftreten, stoppt der Prozess.$(TEXFILE).tex: Die Datei, die wir bauen wollen.
build: mkdir -p buildIn 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-psorgt 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 buildEs ist gute Praxis, einen Befehl zu haben, der das Projekt in den Zustand vor der Ausführung von
makeversetzt. Da alles, was erzeugt wird, imbuild-Ordner gespeichert wird, müssen wir nur diesen löschen. Die Doppel-Flag-rfsetzen 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 cleanDies ist die letzte Regel und wird gesetzt, damit
makeweiß, dass die gelistetentargetskeine Dateien erzeugen und falls es doch Dateien gibt, die so heißen, immer noch die Regeln ausgeführt werden.
Das Makfile ausführen¶
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 imalltargetgenanntenprerequisitesam Ende vorliegt.make clean: So räumst du deinen Versuchsordner wieder auf.make build/plot.pdf: Du arbeitest gerade am Plot oder an einem anderenpython-Skript und möchtest dir die Ergebnisse ansehen? Dann kannst du als Argument hintermakedas entsprechendetargetschreiben.