Softwarepraktikum: Einführung in Makefiles (Eingebettete Systeme und Robotik),, http://ai3.inf.uni-bayreuth.de /home/db_lehre/praktika/softwarepraktikum/vorbesprechung_und_einfuehrung/vortraege/makefile_tuto
Vorbereitung Verzeichnis im Arbeitsverzeichnis anlegen cd mkdir makefile-tutorium Dateien kopieren cd makefile-tutorium cp /tmp-netz/ai3_software_praktikum/vortraege/makefile-tutorium/*. ls datapp data.h iopp io.h mainpp makefile makefile2 makefile3 Seite 2
Problematisierung g++ *pp -o Gegeben Quelldateien <math.h> ; <math.h> ; mainpp data.h datapp io.h iopp Gesucht Effiziente Übersetzung in ein ausführbares Binary Einfache Lösung Alle Dateien immer mit g++ *pp -o übersetzen + + => datapp mainpp iopp => Langsam, da immer alles Übersetzt wird Seite 3
Objektmodule Schnelle Lösung Module für alle Dateien erstellen g++ -c xxxpp -o x g++ -c datapp -o data g++ -c iopp -o io g++ -c mainpp -o main g++ * -o => => => datapp data iopp io mainpp main Binary aus allen Modulen bauen g++ * -o + + => datapp mainpp iopp Ändert sich eine Datei, so übersetzen wir diese neu und erstellen ein neues Binary Achtung: Inkonsistenzen durch Abhängigkeiten der Module untereinander Seite 4
Abhängigkeiten der Quelldateien data.h io.h data main io <math.h> ; <math.h> ; datapp data.h mainpp io.h iopp Seite 5
Beschreibung von Abhängigkeiten Mögliche Abhängigkeiten Dateien Andere Abhängigkeiten (Achtung: Keinen Ring bilden) Format Name_1: Abhängigkeit_1 Abhängigkeit_2... Abhängigkeit_N Kommando für Name_1 Besonderheiten Vor dem Kommando ein Tab-Stop Bei einem Zeilenumbruch in dem Kommando oder Abhängigkeiten ans Zeilenende ein \ schreiben Ausgabe der Befehlszeile unterdrücken mit vorangestelltem @ Seite 6
Einfaches Makefile : data main io g++ data main io -o data: data data.h g++ -c datapp -o data main: data.h main io.h g++ -c mainpp -o main io: io io.h g++ -c iopp -o io data main io clean: rm * *~ ; ; <math.h> <math.h> datapp data.h mainpp io.h iopp make clean make Seite 7
Musterregeln (Static pattern rules) Anwendung Syntax Abkürzung immer wiederkehrender (Ziel: Abhängigkeit(en)) - Muster Namensmuster für Ziel und Abhängigkeit: %.suffix Für die Kommando-Beschreibung sind zwei vordefinierte Variablen(Makros) verwendbar: $< [Eingabeabhängigkeiten] $@ [Ziel] Makefile : data main io g++ data main io -o data: datapp data.h io: iopp io.h main: mainpp io.h data.h %: %pp g++ -c $< -o $@ clean: rm -f * *~ g++ -MM *pp make -f makefile2 make -f makefile2 clean Seite 8
Automatische Abhängigkeitserkennung Achtung: Eigene Includes: xxx.h Bibliothek Includes <yyy.h> Anmerkung: voran gestelltes - : Übersetzung wird nicht abgebrochen im Fehlerfall Abhängigkeitsliste Generieren: g++ -MM *pp > Makefile.dep In Makefile einden: -include Makefile.dep Makefile : data main io g++ data main io -o %: %pp g++ -c $< -o $@ clean: rm -f * *~ Makefile.dep core Makefile.dep: datapp iopp... g++ -MM *pp > Makefile.dep -include Makefile.dep g++ -MM *pp make -f makefile3 make -f makefile3 clean Seite 9
Makefile mit Variablen Variablen (auch Makros ) Definition: xx = aa bb cc Zugriff: $(xx) SRC HDR TARGET CFLAGS = $(wildcard *pp) = $(wildcard *.h) = = -g -O0 -WALL -pedantic Vordefinierte Variablen (Makros) $@: Name des Ziels (main) $<: Name der abhängigen Datei $(TARGET): $(patsubst %pp, %, $(SRC)) g++ $(LDFLAGS) -o $(TARGET) $^ %: %pp g++ $(CFLAGS) -c $< -o $@ clean: $^: Liste aller Abhängigkeiten $?: Alle geänderten Dateien, von denen das Zielobjekt abhängig ist rm -f * *~ Makefile.dep Makefile.dep: $(SRC) $(HDR) g++ -MM *pp > Makefile.dep -include Makefile.dep make -f makefile4 make -f makefile4 clean Seite 10
Literatur info make man make The GNU-Make-Tutorial http://www.gnurg/software/make/manual/make.html Make-Alternativen http://freshmeat.net/articles/view/1715/ Seite 11