Make ist ein Tool zum Automatisieren von Build-Prozessen.
Funktionsweise
Syntax
make [options] [targets]-n- Nur Ausgabe, keine Ausführung-f- Falls das Makefile anders heißt
Makefile
Make braucht ein Konfigurationsfile, das sog. Makefile. Hier ein Beispiel:
CXX = g++
CXXFLAGS = -g -O
LDFLAGS =
all: hello
clean:
rm -f hello *.o
hello: hello.o
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
.PHONY: all cleantargets- Ein oder mehrere target-Bezeichner, durch Leerzeichen getrennt- Make wird immer nur die commands ausführen, um targets zu bauen, die out-of-date sind
- Die meisten targets gehören zu einem File mit dem gleichen Namen, d.h. das bauen des targets erzeugt dieses
- Eine Ausnahme sind phony-targets, die kein File erzeugen
- Um ein target ausdrücklich als phony-target zu vereinbaren, wird es zum
prerequisitedes speziellen targets.PHONYerklärt - Beim Aufruf eines phony-target werden immer die zugehörigen
commandsausgeführt
- Um ein target ausdrücklich als phony-target zu vereinbaren, wird es zum
prerequisites- Files, die nötig sind um das target zu bauen- Make checkt ob ein bereits gebautes file wiederverwendet werden kann
- Ist ein gebautes file neuer als target, muss neu gebaut werden
commands- Abfolge der einzelnen Aktionen, die nötig sind, um das target aus den prerequisites zu bauen (=recipe)- Kommentare - Das
#-Zeichen markiert den Rest der Zeile als Kommentar - Variablen - Können per Zuweisung vereinbart werden
- Einige Variablen sind vordefiniert:
CXX- C++ compiler commandCXXFLAGS- C++ compiler optionsLDFLAGS- Linker options
- Um eine Variable aufzulösen wird das
$-Zeichen , gefolgt vom Variablenbezeichner in runden Klammern verwendet - Weitere Symbole können innerhalb von rules verwendet werden:
$@- target$<- Name of first prerequisite$^- Names of all of prerequisites separated by spaces
- Einige Variablen sind vordefiniert:
Makefile per configure-Skript automatisch generieren
Problem: Ablageorte, Dateibezeichner, Versionsnummern und verwendete Werkzeuge unterscheiden sich auf den Plattformen. Ein Makefile mit festgelegten Optionen ist nicht portabel
Lösung: Das Makefile wird von einem configure-Skript aus dem Template Makefile.in erzeugt.
Das automake Programm generiert das Template Makefile.in aus der Datei makefile.am
Auch das configure-Skript wird automatisch konfiguriert
- Im
configure.ackann man einstellen, wie übersetzt werden soll - Im
Makefile.amwerden nur die Optionen vereinbart, die plattformübergreifend gültig sind
Alternativen sind z.B. meson