Make ist das älteste und am weitesten verbreitete Build-Werkzeug der Unix-Welt. Stuart Feldman schrieb es 1976 bei den Bell Labs über ein Wochenende, weil ein Kollege einen Fehler ausgeliefert hatte, der durch eine vergessene Neuübersetzung entstanden war. Make baut nur das neu, was sich seit dem letzten Lauf geändert hat — Dateizeitstempel entscheiden, welche Regeln erneut laufen müssen.

Makefile: Regeln aus Target, Abhängigkeiten und Rezept

Eine Makefile-Datei beschreibt Regeln nach dem Muster target: abhängigkeiten gefolgt von einer eingerückten Rezeptzeile. Das Target ist meist eine Zieldatei wie programm, die Abhängigkeiten sind die Quelldateien, und das Rezept ist der Befehl, der daraus das Ziel erzeugt:

programm: main.o utils.o
	cc -o programm main.o utils.o
main.o: main.c
	cc -c main.c
utils.o: utils.c
	cc -c utils.c

Wichtige Grundbefehle sind make (erstes Target bauen), make -j4 (vier Jobs parallel), make clean (Zwischenprodukte löschen) und make install (Programm im System installieren). Mit make -n zeigt Make nur an, was es tun würde, ohne es auszuführen.

Phony-Targets und Variablen

Targets wie clean oder test entsprechen keiner Datei. Solche Phony-Targets werden über .PHONY: clean test markiert, damit Make sie immer ausführt und nicht mit einer gleichnamigen Datei verwechselt. Variablen wie CC=gcc oder CFLAGS=-O2 machen die Regeln wiederverwendbar und erlauben spätere Anpassung von der Kommandozeile.

Moderne Build-Systeme bauen auf Make auf oder lösen es ab: CMake-Befehle erzeugen Makefiles für große C/C++-Projekte, während Maven-Befehle und Gradle-Befehle den deklarativen Build im Java-Ökosystem geprägt haben.