MAKE(1)

BEZEICHNUNG
make - GNU-Make-Dienstprogramm zur Verwaltung von Programmgruppen

ÜBERSICHT
make [OPTION] … [ZIEL] …

BESCHREIBUNG

Das Dienstprogramm make bestimmt automatisch, welche Teile eines großen Programms neu kompiliert werden müssen und gibt die Befehle zur Neukompilierung aus. Das Handbuch beschreibt die GNU-Implementierung von make, die von Richard Stallman und Roland McGrath geschrieben wurde und gegenwärtig von Paul Smith betreut wird. Unsere Beispiele zeigen C-Programme, da diese sehr verbreitet sind, aber Sie können make mit jeder Programmiersprache verwenden, deren Compiler mit einem Shell-Befehl aufgerufen werden kann. Tatsächlich ist make nicht auf Programme beschränkt. Sie können damit jede Aufgabe beschreiben, in der einige Dateien automatisch aus anderen aktualisiert werden müssen, wann immer sich wiederum andere ändern.

Um die Verwendung von make vorzubereiten, müssen Sie eine Datei namens makefile (eine Make-Steuerdatei) schreiben, welche die Beziehungen zwischen den Dateien in Ihrem Programm beschreibt und die Befehle zur Aktualisierung jeder der Dateien angibt. In einem Programm wird die ausführbare Datei typischerweise aus Objektdateien aktualisiert, die im Gegenzug durch Kompilieren von Quelldateien erzeugt werden.

Sobald eine geeignetes Makefile existiert, können Sie nach jeder Änderung an den Quelldateien mit dem einfachen Shell-Befehl

    make

alle erforderlichen Neukompilierungen durchführen. Das Programm make entscheidet anhand der Beschreibung im Makefile und der Zeitstempel der letzten Änderungen an den Dateien, welche Dateien aktualisiert werden müssen. Für jede dieser Dateien führt es die im Makefile angegebenen Befehle aus.

make führt die im makefile angegebenen Befehle aus, um ein oder mehrere Ziele zu aktualisieren, wobei ein Ziel typischerweise ein Programm ist. Falls die Option -f nicht angegeben ist, schaut make nach den Dateien GNUmakefile, makefile und Makefile, in dieser Reihenfolge.

Normalerweise sollten Sie Ihr Makefile entweder makefile oder Makefile nennen. Wir empfehlen Makefile, da es so an exponierter Stelle nahe des Anfangs einer Verzeichnisauflistung erscheint, auch nahe zu anderen wichtigen Dateien wie README. Der Name GNUmakefile, nach dem zuerst gesucht wird, ist für die meisten Makefiles nicht zu empfehlen. Sie sollten diesen Namen nur verwenden, wenn Ihr Makefile speziell für GNU make geschrieben ist und von anderen Versionen von make nicht verstanden wird. Falls »-« als makefile angegeben ist, wird aus der Standardeingabe gelesen.

make aktualisiert ein Ziel, falls dieses von anderen Dateien abhängt, die seit der letzten Aktualisierung des Ziels verändert wurden, oder falls das Ziel nicht existiert.

OPTIONEN

-b, -m
    Diese Optionen werden ignoriert und sind nur zwecks Kompatibilität zu anderen Versionen von make vorhanden.

-B, --always-make
    erstellt bedingungslos alle Ziele.

-C Verzeichnis, --directory=Verzeichnis
    wechselt in das angegebene Verzeichnis, bevor die Makefiles gelesen werden oder irgendetwas anderes getan wird. Falls Sie die Option -C mehrmals angeben, wird jede davon relativ zur vorherigen interpretiert: -C / -C etc ist gleichbedeutend mit -C /etc. Dies ist bei rekursiven Aufrufen von make typisch.

-d  gibt zusätzlich Debugging-Meldungen zu den normalen Verarbeitungsmeldungen aus. Die Debugging-Informationen sagen, welche Dateien zum Neuerstellen infrage kommen, welche Zeitstempel verglichen werden und mit welchen Ergebnissen, welche Dateien tatsächlich neu erstellt werden müssen, welche impliziten Regeln dabei berücksichtigt und welche angewendet werden – einfach alles von Interesse, wie und warum make entscheidet, was zu tun ist.

--debug[=SCHALTER]
    gibt zusätzlich Debugging-Meldungen zu den normalen Verarbeitungsmeldungen aus. Falls die SCHALTETR weggelassen werden, dann ist das Verhalten so, als wäre -d angegeben worden. SCHALTER kann entweder a für alle Debug-Ausgaben (gleichbedeutend mit -d), b für grundlegende Debug-Ausgaben, v für ausführlichere grundlegende Debug-Ausgaben, i für die Anzeige der impliziten Regeln, j für Details zu den Befehlsaufrufen und m für Debugging während der Neuerstellung der Makefiles sein. Mit n können Sie alle vorherigen Debugging-Schalter deaktivieren.

-e, --environment-overrides
    bevorzugt Umgebungsvariablen gegenüber den Variablen in Makefiles.

-f Datei, --file=Datei, --makefile=DATEI
    verwendet die angegebene Datei als Makefile.

-i, --ignore-errors
    ignoriert alle von den Befehlen zur Neuerstellung von Dateien ausgegebenen Fehlermeldungen.

-I Verzeichnis, --include-dir=Verzeichnis
    gibt ein Verzeichnis an, in dem nach darin enthaltenen Makefiles gesucht werden soll. Falls die Option -I mehrmals mit verschiedenen Verzeichnissen angegeben ist, werden die Verzeichnisse in genau der angegebenen Reihenfolge durchsucht. Im Gegensatz zu den Argumenten anderer Schalter für make dürfen Sie Verzeichnisse direkt nach dem Schalter angeben: -IVerzeichnis ist ebenso zulässig wie -I Verzeichnis. Diese Syntax dient der Kompatibilität zum Schalter -I des C-Präprozessors.

-j [Aufträge], --jobs[=Aufträge]
    gibt die Anzahl der Aufträge (Befehle) an, die gleichzeitig ausgeführt werden sollen. Wird die Option -j mehrmals angegeben, ist die zuletzt angegebene wirksam. Wird die Option -j ohne Argument angegeben, begrenzt make die Anzahl der gleichzeitig ausführbaren Aufträge nicht. Wenn make ein untergeordnetes make aufruft, werden alle Instanzen von make untereinander koordiniert, um die angegebene Anzahl der Aufträge gleichzeitig auszuführen. Im Abschnitt PARALLELES MAKE UND DER AUFTRAGSSERVER finden Sie weitere Details.

--jobserver-fds [R,W]
    wird von make intern verwendet, um die gelesenen und geschriebenen Dateideskriptornummern an untergeordnete makes zu übergeben. Im Abschnitt PARALLELES MAKE UND DER AUFTRAGSSERVER finden Sie Details hierzu.

-k, --keep-going
    setzt nach einer Fehlermeldung so weit wie möglich fort. Während zwar das fehlgeschlagene Ziel und die davon abhängigen Ziele nicht neu erstellt werden können, ist es dennoch möglich, andere Abhängigkeiten dieser Ziele zu verarbeiten.

-l [Last], --load-average[=Last]
    gibt an, dass keine neuen Aufträge (Befehle) gestartet werden sollen, wenn bereits andere Aufträge ausgeführt werden und die gemittelte Last mindestens der angegebenen Last entspricht (eine Fließkommazahl). Ohne Argument wird die vorherige Lastbegrenzung aufgehoben.

-L, --check-symlink-times
    verwendet die letzte »mtime« (Veränderungszeit) zwischen Symlinks und Zielen.

-n, --just-print, --dry-run, --recon
    gibt die Befehle aus, die ausgeführt werden würden, aber führt sie nicht wirklich aus (außer unter bestimmten Umständen).

-o Datei, --old-file=Datei, --assume-old=Datei
    erstellt die angegebene Datei nicht neu, selbst wenn sie älter als ihre Abhängigkeiten ist, und erneuert nichts aufgrund von Änderungen in der angegebenen Datei. Im Wesentlichen wird die Datei als uralt betrachtet und deren Regeln werden ignoriert.

-O[Typ], --output-sync[=Typ]
    stellt beim parallelen Ausführen mehrerer Aufträge mit -j sicher, dass die Ausgabe jedes Auftrags zusammengeführt wird, statt sich mit den Ausgaben anderer Aufträge zu überschneiden. Falls kein Typ angegeben wird oder target ist, wird die Ausgabe des gesamten Rezepts für jedes Ziel zusammengefasst. Falls line als Typ angegeben ist, wird die Ausgabe jeder Befehlszeile innerhalb eines Rezepts zusammengefasst. Falls recurse als Typ angegeben ist, wird die Ausgabe eines gesamten Make-Aufrufs rekursiv zusammengefasst. Falls none als Typ angegeben ist, ist die Synchronisierung der Ausgabe deaktiviert.

-p, --print-data-base
    gibt die Datenbasis (Regeln und Variablenwerte) aus, die sich aus der Auswertung der Makefiles ergibt. Dann wird wie üblich oder anderweitig angegeben fortgesetzt. Damit werden auch Versionsinformationen angezeigt, die mit dem Schalter -v ausgegeben werden (siehe nachfolgend). Um die Datenbasis auszugeben, ohne zu versuchen, irgendwelche Dateien neu zu erstellen, verwenden Sie make -p -f/dev/null.

-q, --question
    aktiviert den »Fragemodus«. Es werden keine Befehle ausgeführt oder etwas ausgegeben. Es wird lediglich ein Exit-Status ausgegeben, der 0 ist, sofern die angegebenen Ziele bereits aktuell sind, oder anderenfalls 1.

-r, --no-builtin-rules
    deaktiviert die Berücksichtigung der eingebauten impliziten Regeln. Außerdem wird die Standardliste der Suffixe für die Suffix-Regeln geleert.

-R, --no-builtin-variables
    definiert keine der eingebauten Variablen.

-s, --silent, --quiet
    aktiviert den stillen Modus, in dem die ausgeführten Befehle nicht ausgegeben werden.

-S, --no-keep-going, --stop
    setzt die Wirkung der Option -k außer Kraft. Dies ist nur bei einem rekursiven make erforderlich, wobei -k von einem make höherer Ebene durch MAKEFLAGS geerbt werden kann, oder falls Sie -k in MAKEFLAGS in Ihrer Umgebung gesetzt haben.

-t, --touch
    greift auf Dateien zu (markiert sie als aktuell, ohne sie wirklich zu verändern), anstelle deren Befehle auszuführen. Dadurch wird vorgegaukelt, dass die Befehle bereits ausgeführt wurden, um zukünftige Aufrufe von make zu täuschen.

--trace
    gibt Informationen zur Verwendung jedes Ziels aus, also warum das Ziel zur Neuerstellung vorgesehen ist und welche Befehle zur Neuerstellung ausgeführt werden.

-v, --version
    gibt die Version von make sowie einen Urheberrechtshinweis, eine Liste der Autoren und einen Hinweis zum Haftungsausschluss aus.

-w, --print-directory
    gibt eine Meldung aus, welche das Arbeitsverzeichnis vor und nach der weiteren Verarbeitung angibt. Dies ist hilfreich, um Fehler einzugrenzen, die in komplizierten Verschachtelungen rekursiver make-Aufrufe entstehen.

--no-print-directory
    deaktiviert -w selbst dann, wenn es implizit aktiviert wurde.

-W Datei, --what-if=Datei, --new-file=Datei, --assume-new=Datei
    täuscht vor, dass die angegebene Ziel-Datei gerade geändert wurde. Wenn dies zusammen mit dem Schalter -n verwendet wird, zeigt es Ihnen, was geschehen würde, wenn Sie die Datei verändern würden. Ohne -n ist es fast das Gleiche wie die Ausführung eines touch-Befehls mit der angegebenen Datei vor der Ausführung von make, aber mit dem Unterschied, dass der Änderungszeitpunkt nur in der Fantasie von make geändert wurde.

--warn-undefined-variables
    warnt, wenn eine nicht definierte Variable referenziert wird.

EXIT-STATUS
GNU make beendet sich mit dem Status 0, wenn alle Makefiles erfolgreich ausgewertet wurden und für keines der Ziele die Erstellung fehlgeschlagen ist. Der Status 1 wird zurückgeliefert, wenn der Schalter -q angegeben wurde und make ermittelt hat, dass ein Ziel neu erstellt werden muss. Der Status 2 wird zurückgeliefert, falls irgendwelche Fehler aufgetreten sind.

SIEHE AUCH
Die vollständige Dokumentation für make wird als ein Texinfo-Handbuch gepflegt. Wenn die Programme info(1) und make auf Ihrem Rechner ordnungsgemäß installiert sind, können Sie mit dem Befehl

    info make

auf das vollständige Handbuch zugreifen. Zusätzlich ist das Handbuch online auf https://www.gnu.org/software/make/manual/html_node/index.html verfügbar.

PARALLELES MAKE UND DER AUFTRAGSSERVER
Mit der Option -j können Sie make anweisen, Prozesse parallel auszuführen. Mit einem numerischen Argument für -j können Sie eine Obergrenze für die Anzahl parallel auszuführender Prozesse angeben.

Wenn in einer Bauumgebung ein make der obersten Ebene sub-makes aufruft (zum Beispiel in einem Stil, in dem jedes Unterverzeichnis sein eigenes Makefile enthält), weiß keine der individuellen Instanzen von make, wie viele Prozesse parallel laufen. Daher wäre es unmöglich, ohne Kommunikation zwischen allen laufenden make-Instanzen die Anzahl der Prozesse unter der Obergrenze zu halten. Zwar sind Lösungen möglich, bei denen ein make der obersten Ebene als zentrale Steuerung fungiert, oder andere Synchronisationsmechanismen wie gemeinsamer Speicher oder Sockets erstellt werden können, benutzt die aktuelle Implementierung einfach eine gemeinsame Pipe.

Diese Pipe wird vom make-Prozess der obersten Ebene angelegt und an alle untergeordneten makes übergeben. Der make-Prozess der obersten Ebene schreibt N-1 Ein-Byte-Tokens in die Pipe (wobei angenommen wird, dass das make der obersten Ebene einen Token für sich selbst reserviert). Wann immer einer der make-Prozesse (einschließlich des make der obersten Ebene) eine neue Aufgabe ausführen muss, liest er ein Byte aus der gemeinsamen Pipe. Falls keine Tokens mehr übrig sind, muss er warten, bis ein Token in die Pipe zurückgeschrieben wird. Sobald die Ausführung des Prozesses abgeschlossen ist, schreibt der make-Prozess einen Token in die Pipe zurück (und hebt, falls die Tokens ausgeschöpft waren, die Blockierung des ersten make-Prozesses auf, der auf einen Token wartet). Da nur N-1 Tokens in die Pipe geschrieben wurden, können zu jeder Zeit nicht mehr als N Prozesse ausgeführt werden.

Falls der auszuführende Auftrag kein untergeordnetes make ist, wird make die Dateideskriptoren der Auftragsserver-Pipe schließen, bevor die Befehle aufgerufen werden, so dass sich der Befehl nicht mit dem Auftragsserver überschneidet und der Befehl keine ungewöhnlichen Dateideskriptoren vorfindet.

FEHLER
Siehe das Kapitel »Problems and Bugs« in The GNU Make Manual.

AUTOR
Diese Handbuchseite wurde von Dennis Morse von der Stanford University geschrieben. Spätere Aktualisierungen stammen von Mike Frysinger. Sie wurde von Roland McGrath überarbeitet und wird derzeit von Paul Smith betreut.

COPYRIGHT
Copyright © 1992-1993, 1996-2016 Free Software Foundation, Inc. Diese Datei ist Teil von GNU make.

GNU Make ist freie Software; Sie können es weitergeben und/oder verändern, solange Sie sich an die Regeln der »GNU General Public License« halten, so wie sie von der Free Software Foundation festgelegt wurden; entweder in Version 3 der Lizenz oder (nach Ihrem Ermessen) in jeder neueren Version.

GNU Make wurde mit dem Ziel veröffentlicht, dass Sie es nützlich finden, jedoch OHNE JEGLICHE GARANTIE, sogar ohne eine implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN SPEZIELLEN ZWECK. Schauen Sie für weitere Informationen bitte in der »GNU General Public License« (GNU GPL) nach.

Zusammen mit diesem Programm sollten Sie außerdem eine Kopie der »GNU General Public License« erhalten haben. Wenn dem nicht so ist, siehe http://www.gnu.org/licenses/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer (debian-l10n-german@lists.debian.org).