Bei der Entwicklung eines Programmes, das aus mehr als einer Quelldatei besteht, steht man vor dem Problem herauszufinden, welche Dateien nach einer Modifikation neu übersetzt werden müssen. Das Werkzeug make wurde entworfen, um die Benutzerin bei diesem Problem zu unterstützen, indem es die Beschreibungen der entsprechenden Beziehungen zwischen den einzelnen Dateien übernimmt [1].
Beim Aufruf bringt make die Zieldatei auf den neuesten Stand, falls diese von Dateien abhängt, die seit der letzten Modifikation des Ziels verändert wurden.
Die Beschreibung der Abhängigkeiten wird im Makefile festgehalten. Dort werden zentrale Änderungen vorgenommen, die alle zu übersetzenden Dateien betreffen.
Ein Beispiel:
beispiel: main.o beispiel.o
cc -o beispiel main.o beispiel.o
Die Zieldatei beispiel hängt von den Dateien main.o und beispiel.o ab. Falls eine dieser Dateien jünger als beispiel ist, wird die Übersetzung in Gang gesetzt. Beispiele für wesentlich komplexere Makefiles werden in den Tutorien gezeigt.
Der Aufruf von make mit den entsprechenden Zielen wird einfach
$ make ziellauten. Da die Übersetzung eines Programmpaketes je nach Umfang und Größe des Quellcodes ziemlich lange dauern kann und die Bildschirmausgabe des Compilers vielleicht über mehrere Seiten hinwegläuft, ist eventuell später eine entsprechende Fehlermeldung nicht wiederzufinden. Deshalb wird meistens eine Umleitung der Standard-Ausgabe und der Standard-Fehler vorgenommen, so daß die Meldungen sowohl auf dem Bildschirm zu sehen sind als auch in einer Datei gespeichert werden:
$ make 2>&1 tee make.out
leitet stderr nach stdout um und dieses wiederum über die Pipe als stdin an den Befehl tee, der seine Eingabe in die Datei make.out schreibt (s. Anhang A.51).
Viele Programmpakete für Unix-Systeme sind so portabel programmiert, daß in den Makefiles lediglich die Pfade angepaßt und der Systemtyp angegeben werden müssen, um sie dann bequem ,,out of the box`` übersetzen zu können.