stefan's blag and stuff

Blog – 2014-02-19 – Heute doch kein Post

Eigentlich wollte ich heute einen Blogpost schreiben, aber da kam mir ein Programm meiner Homepage Toolchain in die Quere, nämlich GNU make.

Ich verwende make zur Abhängigskeitsverwaltung der einzelnen html-Seiten, sodass nicht alle neu generiert werden müssen, wenn nur eine Datei verändert wurde. Soweit so gut. Nun bin ich auf die Idee gekommen, etwas unnormale Zeichen, wie z.B. das Kaufmännische-und '&' oder den Doppelpunkt ':' in Dateinamen zu verwenden. Ein Makefile sieht vielleicht so aus

# Kommentar
outputfile.txt : inputfile.txt
	./do_something "$@" "$<"

Und jetzt nochmal mit Dateien, die Sonderzeichen im Namen haben:

# Kommentar
&:&.txt : &:&.txt
	./do_something "$@" "$<"

und dabei springt einem der Parser ins Gesicht, weil plötzlich zu viele Doppelpunkte in einer Zeile sind und er nicht mehr weiß, was das target und was die prerequisites seinen sollen. Doch alles kein Problem. Jede Programmiersprache und Auszeichnungssprache hat Wege hervorgebracht, um mit den Spezialzeichen, die in der Sprache eine besondere Bedeutung haben, normal umgehen zu können. Stichwort: Escaping. Jeder kennt wohl die Escape sequences wie z.B '\n', '\t' oder allgemeiner '\x0A', die man in fast jeder Progammiersprache für Strings verwenden kann. html hat seine html entites wie '&ouml;' und '&amp;' und auch in der bash kann man das Escape Zeichen '\' und Anführungszeichen verwenden.

Doch make kommt aus einer anderen Zeit. Viele Zeichen, die in Dateinamen erlaubt sind, kann man nicht in das Makefile schreiben, weil es kein Escaping dafür gibt. Leerzeichen und Rauten kann man noch mit '\ ' bzw. '\#' hinbekommen, doch wenn es um Doppelpunkt, Strichpunkt und Kaufmännisches-und geht, sieht es mau aus. *ARGH* Erwähnt sei, dass in einem POSIX Dateinamen alle Zeichen und Werte eines Bytes, außer dem Null-Byte '\0' und dem Frontslash '/', erlaubt sind. Viel Spielraum für die kreative Nutzung von Dateinamen und Kollision von Tools, die damit nicht umgehen können und make ist bei weitem nicht das einzige Programm, das Probleme macht.

References

  1. Stackoverflow: Escaping colons in filenames in a Makefile
  2. Mail: Re: make cannot handle prerequisites that contain a colon
  3. GNU Make Manual