====== Make ====== ===== rekursives Make ===== Soll make zum Bauen von Projekten mit mehreren Unterordner eingesetzt werden, kann das im Makefile so realisiert werden: SUBDIRS = foo bar baz subdirs: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir; \ done Diese Vorgehen ist aber nicht nicht empfehlenswert, da alle anderen Unterordner abgearbeitet werden, auch wenn ein Fehler in einem Unterordner aufgetreten ist. So lässt sich auch der make-Prozess nur schlecht parallelisieren. (vgl. [[http://www.gnu.org/software/make/manual/make.html#Phony-Targets|Make-Doku]] und [[https://grosskurth.ca/bib/1997/miller.pdf|Recursive Make Considered Harmful]]) Besser ist ein Vorgehen, bei dem jeden Unterverzeichnis ein extra Target ist: SUBDIRS = foo bar baz .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ foo: baz Ein Clean-Target für ein Projekt mit mehreren Unterordnern lässt sich zum Beispiel so realiseren: SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) .PHONY: clean $(SUBCLEAN) clean: $(SUBCLEAN) $(SUBCLEAN): %.clean: $(MAKE) -C $* clean Das Hinzufügen des Suffix .clean ist notwendig, da das clean-Target für ein Unterverzeichnis anders heißen muss, als das Target zum Bauen. Es wird durch die Abhängigkeit %.clean und das $* wieder entfernt. ===== Häufige Fehler ===== ==== makefile:10: *** missing separator. Stop. ==== Die angegebene Zeile beginnt nicht mit eine Tab. ==== /bin/sh: -c: line 0: syntax error near unexpected token `foo,bar' ==== Der make-Befehl ifeq muss am Anfang der Zeile stehen und darf nicht durch Tabs oder Leerzeichen eingerückt sein: target: ifeq (foo, bar) ... endif ===== Tipps und Tricks ===== ==== Prüfen, ob Datei existiert ==== So lässt sich prüfen, ob eine Datei existiert: ifeq ($(wildcard $(FileName)),) # do something when the file doesn't exist else # do something different when it does endif ===== Links ===== [[http://bashdb.sourceforge.net/remake/|gepachte Version von GNU make zum Debugging]]