Benutzer-Werkzeuge

Webseiten-Werkzeuge


make

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
make [2011/06/29 10:47] – angelegt 130.75.57.43make [2023/06/03 08:40] (aktuell) – [rekursives Make] olli
Zeile 1: Zeile 1:
 ====== Make ====== ====== Make ======
  
 +===== rekursives Make =====
 +Soll make zum Bauen von Projekten mit mehreren Unterordner eingesetzt werden, kann das im Makefile so realisiert werden:
 +<code make>
 +SUBDIRS = foo bar baz
 +     
 +subdirs:
 +for dir in $(SUBDIRS); do \
 +        $(MAKE) -C $$dir; \
 +done
 +</code>
 +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:
 +
 +<code make>
 +SUBDIRS = foo bar baz
 +     
 +.PHONY: subdirs $(SUBDIRS)
 +     
 +subdirs: $(SUBDIRS)
 +     
 +$(SUBDIRS):
 +     $(MAKE) -C $@
 +     
 +foo: baz
 +</code>
 +Ein Clean-Target für ein Projekt mit mehreren Unterordnern lässt sich zum Beispiel so realiseren:
 +<code make>
 +SUBCLEAN = $(addsuffix .clean,$(SUBDIRS))
 +        
 +.PHONY: clean $(SUBCLEAN)
 +clean: $(SUBCLEAN)
 +        
 +$(SUBCLEAN): %.clean:
 +        $(MAKE) -C $* clean
 +</code>
 +
 +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:
 +<code make>
 +target:
 +ifeq (foo, bar)
 +    ...
 +endif
 +</code>
 +
 +===== Tipps und Tricks =====
 +==== Prüfen, ob Datei existiert ====
 +So lässt sich prüfen, ob eine Datei existiert:
 +<code make>
 +ifeq ($(wildcard $(FileName)),)
 +    # do something when the file doesn't exist
 +else
 +    # do something different when it does
 +endif
 +</code>
 ===== Links ===== ===== Links =====
 [[http://bashdb.sourceforge.net/remake/|gepachte Version von GNU make zum Debugging]] [[http://bashdb.sourceforge.net/remake/|gepachte Version von GNU make zum Debugging]]
  
make.1309337242.txt.gz · Zuletzt geändert: 2011/06/29 10:47 von 130.75.57.43