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 clean
  • targets - 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 prerequisite des speziellen targets .PHONY erklärt
      • Beim Aufruf eines phony-target werden immer die zugehörigen commands ausgeführt
  • 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 command
      • CXXFLAGS - C++ compiler options
      • LDFLAGS - 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

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.ac kann man einstellen, wie übersetzt werden soll
  • Im Makefile.am werden nur die Optionen vereinbart, die plattformübergreifend gültig sind

Alternativen sind z.B. meson