Inhaltsverzeichnis

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. Make-Doku und 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

gepachte Version von GNU make zum Debugging