make - GNU-Make-Dienstprogramm zur Verwaltung von
Programmgruppen
ÜBERSICHT
make [OPTION] … [ZIEL] …
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.
- -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.
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.
Die vollständige Dokumentation für make wird
als ein Texinfo-Handbuch gepflegt. Wenn die Programme info 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.
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.
Siehe das Kapitel »Problems and Bugs« in The GNU
Make Manual.
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 © 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> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU General
Public License Version 3 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.