1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Programme bauen

Das Programm make erzeugt Programme (und andere Artefakte) anhand von Regeln, die in einem Makefile definiert sind. Es beginnt mit einer Liste von Direktiven, um zum Beispiel andere Dateien einzubinden und Variablen zu definieren. Darauf folgen die Regeln bestehend aus dem Ziel (entweder ein Dateiname oder ein sogenanntes phony target), einer Liste der Abhängigkeiten (benötigten Objekte), und den Kommandos, um das Ziel zu bauen.

Makefile
# Comment DirectiveVariable = Value Variable += Value Target: SourceKommandoArchive(Member): FileCommand

Direktiven

Direktive Parameter Beschreibung
include File Anderes Makefile einbinden
define Makro endef @todo

Funktionen

$(wildcard *.c) Globs für Dateien
$(patsubst %c, %o, $(LISTE)) Musterersetzung
OBJECTS=$(SOURCES: %c=%o)

Variablen

.DEFAULT_GOAL Standardziel
.VARIABLES Liste aller Variablen
.FEATURES Liste aller Fähigkeiten
.INCLUDE_DIRS Liste aller Includeverzeichnisse
MAKEFILE_LIST Liste eingebundener Dateien
VPATH Suchpfad für Dateien
vpath %.h include
vpath %.c src:lib

Regeln definieren

Eine Regel besteht aus Ziel, Abhängigkeiten und Kommandos. Das Ziel ist der Name des zu erzeugenden Artefakts, meistens ein Dateiname. Die Abhängigkeiten sind eine Liste von Dateien, die benötigt werden, um das Ziel zu erzeugen. Das Kommando ist ein Skript, welches aufgerufen wird. Dort stehen folgende Spezialvariablen zur Verfügung:

$@ Ziel (linke Seite)
$< Erste Abhängigkeit
$+ Alle Abhängigkeiten
$^ Alle Abhängigkeiten ohne Dubletten
$? Neuere Abhängigkeiten
$% @todo Mitglied
$| @todo
$* Stamm einer impliziten Regel, zum Beispiel foo bei foo.c für %.c

GNU Make definiert folgende implizite Regeln:

Ziel Quelle Kommando Sprache
%.o : %.c ; $(CC) -c $(CPPFLAGS) $(CFLAGS) $< C
%.o : %.cc ; $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< C++
%.o : %.p ; $(PC) -c $(PFLAGS) $< Pascal
%.o : %.f ; $(FC) -c $(FFLAGS) $< Fortran
%.o : %.F ; $(FC) -c $(FFLAGS) $(CPPFLAGS) $< "
%.o : %.r ; $(FC) -c $(FFLAGS) $(RFLAGS) $< "
%.sym : %.def ; $(M2C) $(M2FLAGS) $(DEFFLAGS)
%.o : %.mod ; $(M2C) $(M2FLAGS) $(MODFLAGS)
%.o : %.s ; $(AS) $(ASFLAGS)
%.c : %.y ; $(YACC) $(YFLAGS) Bison
%.c : %.l ; $(LEX) $(LFLAGS) Flex
%.r : %.l ; $(LEX) $(LFLAGS)
%.ln : %.c ; $(LINT) $(LINTFLAGS) $(CPPFLAGS) -i
%.dvi : %.tex ; $(TEX)
%.tex : %.web ; $(WEAVE)
%.tex : %.w ; $(CWEAVE)
%.p : %.web ; $(TANGLE)
%.c : %.w ; $(CTANGLE)

Spezialziele

.PHONY Ziele immer neu erzeugen
.SUFFIXES Dateiendungen für Suffixregeln (.c.o) festlegen
.DEFAULT
.PRECIOUS Ziele bei Abbruch nicht löschen
.INTERMEDIATE
.SECONDARY
.SECONDEXPANSION
.DELETE_ON_ERROR Abhängige Ziele auch bei Fehlern löschen
.IGNORE DEPRECATED: Fehler ignorieren
.LOW_RESOLUTION_TIME
.SILENT Auszuführende Kommandos nicht ausgeben
.EXPORT_ALL_VARIABLES Alle Variablen exportieren
.NOTPARALLEL Abhängige Ziele serialisieren

Rekursion

TARGET  =
SUBDIRS = foo bar blub

subdirs:: $(SUBDIRS)

$(SUBDIRS)::
	$(MAKE) -C $@ $(TARGET)

Der C Präprozessor kann Regeln anhand von Include-Direktiven erzeugen.

.depend:
	$(CC) $(CPPFLAGS) $(SOURCES) -MM -MF $@

-include .depend

Literatur