Befehl "make"
Zweck
Mit dem Befehl "make" können Sie Gruppen von Programmen verwalten, aktualisieren und neu generieren.
Syntax
Make [ -DVariable ] [ -d Option ] [ -e ] [ -i ] [ -j[Jobs]] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t. ] [ -f MakeFile ... ] [ Ziel ... ]
Beschreibung
Der Befehl make unterstützt Sie bei der Verwaltung einer Gruppe von Programmen. Die Eingabe für den Befehl make ist eine Liste von Dateiabhängigkeitsspezifikationen.
Es gibt vier Typen von Zeilen in einer Makefile: Dateiabhängigkeitsspezifikationen, Shellbefehle, Variablenzuweisungen und Kommentare. Im Allgemeinen können Zeilen in der nächsten Zeile fortgesetzt werden, indem sie mit einem Backslash (\) beendet werden. Das nachfolgende Zeilenvorschubzeichen und das anfängliche Leerzeichen in der folgenden Zeile werden zu einem einzigen Leerzeichen komprimiert.
Dateiabhängigkeitsspezifikationen
Abhängigkeitszeilen bestehen aus einem oder mehreren Zielen, einem Operator und null oder mehr Voraussetzungen (Quellen). Dadurch wird eine Beziehung erstellt, in der die Ziele von den Voraussetzungen abhängen und gewöhnlich aus ihnen erstellt werden. Die genaue Beziehung zwischen dem Ziel und der Voraussetzung wird durch den Operator bestimmt, der sie trennt. Die folgenden Operatoren sind verfügbar:
| Element | Beschreibung |
|---|---|
| : | Ein Ziel wird als veraltet angesehen, wenn seine Änderungszeit kleiner ist als die seiner Voraussetzungen. Die Voraussetzungen für ein Ziel werden in mehreren Abhängigkeitszeilen erfasst, wenn dieser Operator verwendet wird. Das Ziel wird entfernt, wenn der Befehl make unterbrochen wird, sofern das Ziel nicht das Attribut .PRECIOUS hat. |
| :: | Wenn keine Voraussetzungen angegeben sind, wird das Ziel immer neu erstellt. Andernfalls wird ein Ziel als veraltet betrachtet, wenn eine seiner Voraussetzungen später als das Ziel geändert wurde. Die Voraussetzungen für ein Ziel werden nicht in mehreren Abhängigkeitszeilen erfasst, wenn dieser Operator verwendet wird. Das Ziel wird nicht entfernt, wenn der Befehl make unterbrochen wird. |
Dateiabhängigkeitsspezifikationen haben zwei Typen von Regeln: Inferenzregeln und Zielregeln. Inferenzregeln legen fest, wie ein Ziel aktualisiert werden soll. Diese Regeln haben ein Ziel ohne Schrägstrich (/) und mindestens Eins. (Punkt). Zielregeln legen fest, wie das Ziel erstellt wird. Diese Regeln können mehr als ein Ziel haben.
Makefile-Ausführung
Der Befehl make führt die Befehle im der Makefile zeilenweise aus. Während der Ausführung der einzelnen Befehle schreibt make den Befehl in die Standardausgabe (sofern nicht anders angegeben, z. B. mit dem Flag -s). Eine Makefile muss einen Tabulator vor den Befehlen in jeder Zeile haben.
Kommentare: Kommentare beginnen mit einem Nummernzeichen (#) (Shellbefehlszeilen sind ausgeschlossen) und reichen bis zum Ende der Zeile.
Umgebung: Der Befehl make verwendet die Umgebungsvariable MAKEFLAGS, sofern vorhanden.
Zielregeln
Zielregeln haben folgendes Format:
target[target...] : [prerequisite...] [;command]
<Tab>commandSonderziele
Sonderziele können nicht zusammen mit anderen Zielen angegeben werden, d. h., sie müssen das einzige angegebene Ziel sein. Diese Ziele steuern die Ausführung des Befehls make. Diese Ziele sind im Folgenden aufgelistet:
| Element | Beschreibung |
|---|---|
| .STANDARD | Wird als Regel für jedes Ziel (das ausschließlich als Voraussetzung verwendet wurde) verwendet, für die der Befehl make nicht feststellen kann, wie es erstellt werden soll. Es wird nur das Shell-Script verwendet. Die Variable < (linke spitze Klammer) eines Ziels, das die .STANDARD-Befehle übernimmt, wird auf den eigenen Namen des Ziels gesetzt. |
| .IGNORIEREN | Die Voraussetzungen dieses Ziels sind selbst Ziele. Dies bewirkt, dass Fehler in Befehlen, die den Zielen zugeordnet sind, ignoriert werden. Wenn keine Voraussetzungen angegeben sind, entspricht dies der Angabe des Flags -i. |
| .POSIX | Bewirkt, dass der Befehl make eine andere Standardregeldatei verwendet. Die Datei /usr/ccs/lib/posix.mk enthält die Standardregeln, die im POSIX-Standard angegeben sind. |
| .KOSTBAR | Voraussetzungen dieses Ziels sind selbst Ziele. .PRECIOUS verhindert, dass das Ziel entfernt wird. Wenn keine Voraussetzungen angegeben sind, wird das Attribut .PRECIOUS auf jedes Ziel in der Datei angewendet. Wenn make unterbrochen wird (z. B. mit SIGHUP, SIGTERM, SIGINT oder SIGQUIT), werden normalerweise alle teilweise erstellten Ziele entfernt. Wenn make mit dem Flag -n, -p oder -q aufgerufen wurde, wird angenommen, dass das Ziel das Attribut .PRECIOUS hat. |
| .SCCS_GET | Dieses Sonderziel muss ohne Voraussetzungen angegeben werden. Wenn dieses Sonderziel in einer Makefile enthalten ist, werden die diesem Sonderziel zugeordneten Befehle verwendet, um alle SCCS-Dateien abzurufen, die nicht im aktuellen Verzeichnis gefunden werden. Die Standardbefehle, die zum Abrufen der Quellendateien von SCCS verwendet werden, werden durch die diesem Sonderziel zugeordneten Befehle ersetzt. Wenn Quellendateien in einer Abhängigkeitsliste benannt werden, behandelt make sie wie jedes andere Ziel. Wenn ein Ziel keine Abhängigkeiten hat, aber im Verzeichnis vorhanden ist, geht make davon aus, dass die Datei aktuell ist. Wenn jedoch eine SCCS-Datei mit dem Namen SCCS/s.source_file für ein Ziel source_filegefunden wird, überprüft make zusätzlich, ob das Ziel aktuell ist. Wenn das Ziel fehlt oder wenn die SCCS-Datei neuer ist, gibt make automatisch die für das spezielle Ziel .SCCS_GET angegebenen Befehle aus, um die neueste Version abzurufen. Wenn das Ziel jedoch von jemandem beschrieben werden kann, ruft make keine neue Version ab. |
| .SILENT | Die Voraussetzungen des Ziels sind selbst Ziele. Dies führt dazu, dass dem Ziel zugeordnete Befehle nicht in die Standardausgabe geschrieben werden, bevor sie ausgeführt werden. Wenn keine Voraussetzungen angegeben sind, wird das Attribut .SILENT auf jeden Befehl in der Datei angewendet. |
| .SUFFIXE | Verwenden Sie diesen Namen, um der Liste der Dateisuffixe, die von make erkannt werden, weitere Suffixes hinzuzufügen. Die Voraussetzungen des Ziels werden der Liste bekannter Suffixe hinzugefügt. Wenn keine Suffixe angegeben sind, werden alle zuvor angegebenen Suffixe gelöscht. Diese Suffixe werden von den Inferenzregeln verwendet. Um die Reihenfolge der Suffixe zu ändern, müssen Sie einen leeren .SUFFIXES-Eintrag und dann eine neue Liste von .SUFFIXES-Einträgen angeben. Eine Makefile darf .SUFFIXES keine Befehle zuordnen. |
Inferenzregeln
Der Befehl make verfügt über einen Standardsatz von Inferenzregeln, die Sie mit zusätzlichen Inferenzregeldefinitionen in der Makefile ergänzen oder überschreiben können. Die Standardregeln sind in der externen Datei /usr/ccs/lib/aix.mk gespeichert. Sie können diese Datei durch Ihre eigene Regeldatei ersetzen, indem Sie die Variable MAKERULES über die Befehlszeile auf den Namen Ihrer eigenen Datei setzen. In der folgenden Zeile wird gezeigt, wie Sie die Regeldatei über die Befehlszeile ändern können:
make MAKERULES=/pathname/filenameInferenzregeln bestehen aus Zielsuffixen und -befehlen. Anhand der Suffixe bestimmt der Befehl make die Voraussetzungen und anhand der Suffixe und den Voraussetzungen bestimmt der Befehl make, wie ein Ziel zu aktualisieren ist. Inferenzregeln haben folgendes Format:
rule:
<Tab>command
...Erläuterungen:rulehat eines der folgenden Formate:
| Element | Beschreibung |
|---|---|
| .s1 | Eine Inferenzregel mit einfachem Suffix, die beschreibt, wie ein Ziel mit einem der Suffixe erstellt wird. |
| .s1.s2 | Eine Inferenzregel mit doppeltem Suffix, das beschreibt, wie ein Ziel, dem .s2 angefügt wird, mit einer Voraussetzung, dem s.1 angefügt wird, erstellt wird. |
Die Suffixe .s1 und .s2 sind als Voraussetzungen für das Sonderziel .SUFFIXES definiert. Die Suffixe .s1 und .s2 müssen bekannte Suffixe sein, wenn die Inferenzregel in der Makefile angezeigt wird. Die Inferenzregeln verwenden die Suffixe in der Reihenfolge, in der sie in .SUFFIXES angegeben sind. Eine neue Inferenzregel wird gestartet, wenn eine neue Zeile nicht mit einem<Tab>oder #.
Wennruleist leer. Beispiel:
rule: ;In diesem Fall hat die Ausführung keine Auswirkung und der Befehl make erkennt, dass das Suffix vorhanden ist, führt aber keine Aktionen aus, wenn die Ziele veraltet sind.
Eine Tilde (~) in den vorherigen Regeln bezieht sich auf eine SCCS-Datei. Deshalb transformiert die Regel .c~.o eine SCCS-Datei mit Voraussetzungen für die Programmiersprache C in eine Objektdatei (.o). Wegen s. Die SCCS-Datei ist ein Präfix und nicht mit der Suffixansicht des Befehls Make kompatibel. Mit der Tilde (~) kann jede Dateireferenz in eine SCCS-Dateireferenz geändert werden.
Bibliotheken
Ein Ziel oder eine Voraussetzung kann auch ein Element einer Archivbibliothek sein und wird als solche behandelt, wenn der Name runde Klammern enthält. Beispielsweise gibt Bibliothek(Name) an, dass Name ein Element der Archivbibliothek Bibliothek ist. Wenn Sie ein Element einer Bibliothek aus einer bestimmten Datei aktualisieren möchten, können Sie das Format .s1.a verwenden, wobei eine Datei mit dem Suffix .s1 verwendet wird, um ein Element der Archivbibliothek zu aktualisieren. Das .a bezieht sich auf eine Archivbibliothek.
Makros verwenden
In Makefiles werden Makrodefinitionen im folgenden Format definiert:
variable=valueMakros können im gesamten Makefile wie folgt angezeigt werden:
- Wenn ein Makro in einer Ziellinie angezeigt wird, wird es ausgewertet, wenn die Ziellinie gelesen wird.
- Wenn ein Makro in einer Befehlszeile angezeigt wird, wird es ausgewertet, wenn der Befehl ausgeführt wird.
- Wenn ein Makro in einer Makrodefinitionszeile angezeigt wird, wird es ausgewertet, wenn das neue Makro in einer Regel oder einem Befehl angezeigt wird.
Wenn ein Makro keine Definition hat, wird standardmäßig NULL verwendet. Eine neue Makrodefinition überschreibt ein vorhandenes Makro mit demselben Namen. Makrozuweisungen können aus den folgenden Elementen in der angegebenen Reihenfolge stammen:
- Standardinferenzregeln
- Inhalt der Umgebung
- Makefiles
- BefehlszeilenHinweis: Das Flag -e bewirkt, dass Umgebungsvariablen die in der Makefile definierten überschreiben.
Shellbefehle
Jedem Ziel kann eine Reihe von Shellbefehlen zugeordnet werden, die gewöhnlich zum Erstellen des Ziels verwendet werden. Jedem der Befehle in diesem Script muss ein Tabulatorzeichen vorangestellt sein. Obwohl jedes Ziel in einer Abhängigkeitszeile angezeigt werden kann, kann nur für eine dieser Abhängigkeiten ein Erstellungsscript angegeben werden, sofern der Operator :: nicht verwendet wird.
Wenn die ersten oder ersten beiden Zeichen der Befehlszeile ein kommerzielles A (@), ein Bindestrich (-) oder ein Pluszeichen (+) sind, wird der Befehl wie folgt behandelt:
| Element | Beschreibung |
|---|---|
| @ | Bewirkt, dass der Befehl nicht zurückgegeben wird, bevor er ausgeführt wird. |
| - | Veranlasst, dass ein Exitstatus ungleich null in der Befehlszeile ignoriert wird. |
| + | Bewirkt, dass eine Befehlszeile ausgeführt wird, obwohl die Option -n, -q oder -t angegeben ist. |
Ein Befehl ohne Metazeichen wird vom Befehl make direkt ausgeführt. Der Befehl Make beispielsweise weist den ersten Befehl im nachfolgenden Beispiel der Shell zu, da er das Shellmetazeichen > (Größer-als-Zeichen) enthält. Der zweite Befehl im folgenden Beispiel enthält keine Shellmetazeichen und wird daher vom Befehl make direkt ausgeführt:
target: dependency
cat dependency > target
chmod a+x targetDurch die Umgehung der Shell wird Zeit eingespart, kann jedoch Probleme verursachen. Beispiel: Versuch, ein C-Shell-Script aus einer Makefile heraus auszuführen, indem das Makro SHELL auf/bin/cshfunktioniert nur, wenn die Befehlszeile mindestens ein Shell-Metazeichen enthält.
SHELL=/bin/csh
target: dependency
my_csh_scriptDiese Makefile schlägt fehl, da der Befehl make versucht,my_csh_scriptstatt sie an die C-Shell zu senden.
Variablenzuweisungen
Variablen im Befehl make gleichen Variablen in der Shell und bestehen nur aus Großbuchstaben. Der Operator = weist Variablen Werte zu. Jede vorherige Variable wird dann überschrieben. Jedes Leerzeichen vor dem zugewiesenen Wert wird entfernt.
macro += word ...
macro += macro1 Wenn der Operator += anstelle von = verwendet wird, wird der neue Wert mit einem einzelnen Leerzeichen zwischen dem vorherigen Inhalt der Variablen und dem angefügten Wert eingefügt.
Variablen werden angegeben, indem der Variablenname entweder in { } (geschweifte Klammern) oder ( ) (runde Klammern) eingeschlossen und indem dem Variablennamen ein $ (Dollarzeichen) vorangestellt wird. Wenn der Variablenname nur einen einzigen Buchstaben enthält, sind die einschließenden geschweiften Klammern oder runden Klammern nicht erforderlich. Diese kürzere Form wird nicht empfohlen.
Die Variablensubstitution erfolgt zu zwei unterschiedlichen Zeiten, je nachdem, wo die Variable verwendet wird. Variablen in Abhängigkeitszeilen werden beim Lesen der Zeile erweitert. Variablen in Shellbefehlen werden erweitert, wenn der Befehl shell ausgeführt wird.
Im Folgenden sind die vier Variablenklassen (in aufsteigender Reihenfolge ihrer Priorität) beschrieben:
| Element | Beschreibung |
|---|---|
| Umgebung | Variablen, die als Teil der Umgebung des Befehls make definiert sind. |
| Globale Variablen | Variablen, die in der Makefile oder in den enthaltenen Makefiles definiert sind. |
| Befehlszeilenvariablen | Variablen, die als Teil der Befehlszeile definiert sind. |
| Lokale Variablen | Variablen, die für ein bestimmtes Ziel definiert sind. Die lokalen Variablen sind im Folgenden beschrieben:
Sie können an diese lokalen Variablen auch ein D oder F anfügen:
Darüber hinaus definiert bzw. kennt der Befehl make die folgenden Variablen: |
| $ | Ein einzelnes $ (Dollarzeichen), d. h., $$ wird zu einem einzelnen Dollarzeichen erweitert. |
| LANG | Bestimmt die Ländereinstellung, die für die Ländereinstellungskategorien verwendet werden soll, wenn sowohl LC_ALL als auch die entsprechende Umgebungsvariable (beginnend mit LC_) keine Ländereinstellung angibt. |
| LC_ALL | Bestimmt die Ländereinstellung, die zum Überschreiben von Werten für Ländereinstellungskategorien verwendet wird, die mit der Einstellung von LANG oder anderen LC_-Umgebungsvariablen angegeben werden. |
| LC_CTYPE | Bestimmt die Ländereinstellung für die Interpretation von Bytefolgen von Textdaten als Zeichen, z. B. Einzel- versus Mehrbytezeichen in Argumenten. |
| LC_MESSAGES | Bestimmt, in welcher Sprache Nachrichten geschrieben werden. |
| MAKEFLAGS | Die Umgebungsvariable MAKEFLAGS kann alles enthalten, was in der Befehlszeile von make angegeben werden kann. Alles, was in der Befehlszeile von make angegeben wird, wird an die Variable MAKEFLAGS angefügt, die dann für alle von make ausgeführten Programme in die Umgebung eingegeben wird. Beachten Sie, dass die Operation der Flags -f und -p in der Variablen MAKEFLAGS nicht definiert ist. Befehlszeilenflags haben Vorrang vor den Flags -f und -p in dieser Variablen. |
| VPATH | Ermöglicht Ihnen, eine Liste von Verzeichnissen anzugeben, in denen nach Voraussetzungen gesucht werden sollen. Die Liste der Verzeichnisse funktioniert wie die Variable PATH in der SHELL. Die Variable VPATH kann mehrere durch Doppelpunkte getrennte Verzeichnisse angeben. Beispiel:Damit wird der Befehl make angewiesen, in der angegebenen Reihenfolge nach folgenden Verzeichnissen zu suchen:
|
Flags
| Element | Beschreibung |
|---|---|
| -D Variable | Setzt Variable auf den Wert 1. |
| Option -d | Zeigt detaillierte Informationen zu den Dateien und Zeiten an, die von make untersucht werden (Debugmodus). Die Option -d ohne Optionen oder mit der Option A zeigt alle verfügbaren Debuginformationen an. Im Folgenden sind individuell auswählbare Debugoptionen beschrieben:
|
| -E | Gibt an, dass Umgebungsvariablen Makrozuweisungen in Makefiles überschreiben. |
| -f MakeFile | Gibt eine Makefile an, das anstelle der Standard-Makefile gelesen werden soll. Wenn für MakeFile ein Minuszeichen (-) angegeben wird, wird die Standardeingabe gelesen. Sie können mehrere Makefiles angeben, die dann in der angegebenen Reihenfolge gelesen werden. |
| -i | Ignoriert Exitwerte ungleich null von shell-Befehlen in der Makefile. Entspricht der Angabe eines Minuszeichens (-) vor jeder Befehlszeile in der Makefile. |
| - j [Jobs ] | Gibt die Anzahl paralleler Jobs an, die make zum Erstellen der unabhängigen Ziele verwenden soll. Der Parameter Jobs akzeptiert jeden positiven Integralwert. Wenn Jobs nicht angegeben wird, beschränkt der Befehl make die Anzahl der parallelen Jobs für die Erstellung des Hauptziels nicht. |
| -k | Setzt die Verarbeitung nach Auftreten von Fehlern fort, aber nur für die Ziele, die nicht vom Ziel abhängen, dessen Erstellung den Fehler verursacht hat. |
| -N | Zeigt Befehle an, führt sie aber nicht aus. Zeilen, die mit einem + (Pluszeichen) beginnen, werden ausgeführt. |
| -p | Zeigt den vollständigen Satz von Makrodefinitionen und Zielbeschreibungen an, bevor Befehle ausgeführt werden. |
| -q | Gibt den Statuscode 0 zurück, wenn die Zieldatei aktuell ist, und den Statuscode 1, wenn die Zieldatei nicht aktuell ist. Ziele werden nicht aktualisiert, wenn diese Option angegeben ist. Eine Befehlszeile mit dem Präfix + (Pluszeichen) wird jedoch ausgeführt. |
| -r | Bewirkt, dass die Standardregeln nicht verwendet werden. |
| -S | Beendet den Befehl make, wenn ein Fehler auftritt. Dies ist der Standardwert und das Gegenteil von -k. |
| -s | Zeigt Befehle nicht an, während sie ausgeführt werden. |
| -T | Erstellt ein Ziel oder aktualisiert dessen Änderungszeit, um es auf den neuesten Stand zu bringen. Führt Befehlszeilen aus, die mit einem Pluszeichen (+) beginnen. |
| Ziel | Gibt einen Zielnamen im Format Ziel an oder legt den Wert von Variablen fest. |
Exitstatus
Wenn das Flag -q angegeben ist, gibt dieser Befehl die folgenden Exitwerte zurück:
| Element | Beschreibung |
|---|---|
| 0 | Erfolgreiche Ausführung. |
| 1 | Das Ziel war nicht auf dem neuesten Stand. |
| >1 | Es ist ein Fehler aufgetreten. |
Andernfalls gibt dieser Befehl die folgenden Exitwerte zurück:
| Element | Beschreibung |
|---|---|
| 0 | Erfolgreiche Ausführung. |
| >1 | Es ist ein Fehler aufgetreten. |
Beispiele
- Geben Sie Folgendes ein, um das erste Ziel in der Makefile gefundene Ziel zu erstellen:
make - Geben Sie Folgendes ein, um die Befehle, die der Befehl make zum erstellen einer Datei verwenden würde, anzuzeigen, aber nicht auszuführen:make -n search.oAuf diese Weise wird sichergestellt, dass eine neue Beschreibungsdatei korrekt ist, bevor sie verwendet wird.
- Geben Sie Folgendes ein, um eine Makefile zu erstellen, die angibt, dass pgm von zwei Dateien, a.o und b.o, abhängig ist und dass diese wiederum von ihren entsprechenden vorausgesetzten Dateien (a.c und b.c) und einer gemeinsamen Datei, incl.h, abhängig sind:
pgm: a.o b.o c89 a.o b.o -o pgm a.o: incl.h a.c c89 -c a.c b.o: incl.h b.c c89 -c b.c - Geben Sie Folgendes ein, um optimierte .o-Dateien aus .c-Dateien zu erstellen:
.c.o: c89 -c -o $*.c or: .c.o: c89 -c -o $< - Geben Sie Folgendes ein, um den Inhalt der integrierten Regeln anzuzeigen:
- Geben Sie Folgendes ein, um den Befehl make im Parallelmodus mit maximal 10 parallelen Jobs zum Erstellen des in der Makefile angegebenen Ziels zu verwenden:
make -j10
Dateien
| Element | Beschreibung |
|---|---|
| Makefile | Enthält eine Liste von Abhängigkeiten. |
| Makefile | Enthält eine Liste von Abhängigkeiten. |
| s.makefile | Enthält eine Liste von Abhängigkeiten. Es handelt sich um eine SCCS-Datei. |
| s.Makefile | Enthält eine Liste von Abhängigkeiten. Es handelt sich um eine SCCS-Datei. |
| /usr/ccs/lib/posix.mk | Enthält POSIX-Standardregeln für den Befehl make. |
| /usr/ccs/lib/aix.mk | Enthält Standardregeln für den Befehl make. |