====== 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]]