makefile
Variablen
Suche…
Eine Variable referenzieren
Um den in einer Variablen gespeicherten Wert zu verwenden, verwenden Sie das Dollarzeichen gefolgt von dem in Klammern oder geschweiften Klammern eingeschlossenen Variablennamen.
x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same
Wenn der Name einer Variablen nur ein Zeichen lang ist, können die Klammern / Klammern weggelassen werden (z. B. $x
). Diese Vorgehensweise wird für automatische Variablen verwendet (siehe unten), wird jedoch nicht für allgemeine Variablen empfohlen.
Einfach erweiterte Variablen
Einfach erweiterte Variablen verhalten sich wie Variablen herkömmlicher Programmiersprachen. Der Ausdruck auf der rechten Seite wird ausgewertet und das Ergebnis in der Variablen gespeichert. Wenn die rechte Seite eine Variablenreferenz enthält, wird diese Variable erweitert, bevor die Zuweisung erfolgt.
x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"
Eine alternative Form ist die Verwendung der Doppelpunktzuordnung:
x ::= hello
Einzel- und Doppelpunktzuordnung sind gleichwertig. Der POSIX-Standard make erwähnt nur das ::=
-Formular, sodass Implementierungen mit strengen Normenkonformität die Single-Colon-Version nicht unterstützen.
Rekursiv erweiterte Variablen
Bei der Definition einer rekursiv expandierten Variablen wird der Inhalt der rechten Seite unverändert gespeichert. Wenn eine Variablenreferenz vorhanden ist, wird die Referenz selbst gespeichert (nicht der Wert der Variablen). Warten Sie, bis die Variablenreferenzen erweitert werden, bis die Variable tatsächlich verwendet wird.
x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"
In diesem Beispiel ist die Definition von y
rekursiv. Der Verweis auf $(x)
wird erst erweitert, wenn $(y)
erweitert wird. Das heißt, wenn sich der Wert von x
ändert, ändert sich auch der Wert von y
.
Rekursiv erweiterte Variablen sind ein mächtiges, aber leicht missverstandenes Werkzeug. Sie können verwendet werden, um Konstrukte zu erstellen, die Vorlagen oder Funktionen ähneln, oder um sogar Teile eines Makefiles automatisch zu generieren. Sie können auch die Quelle von Problemen sein, die schwer zu debuggen sind. Verwenden Sie nur bei Bedarf rekursiv expandierte Variablen.
Automatische Variablen
Im Kontext einer einzelnen Regel definiert Make automatisch eine Reihe spezieller Variablen. Diese Variablen können für jede Regel in einem Makefile einen anderen Wert haben und sollen das Schreiben von Regeln vereinfachen. Diese Variablen können nur im Rezeptabschnitt einer Regel verwendet werden.
Variable | Beschreibung |
---|---|
$@ | Dateiname des Regelziels |
$% | Der Name des Zielmitglieds, wenn das Ziel der Regel ein Archiv ist |
$< | Dateiname der ersten Voraussetzung |
$^ | Liste aller Voraussetzungen |
$? | Liste aller Voraussetzungen, die neuer als das Ziel sind |
$* | Der "Stamm" einer impliziten oder Musterregel |
Im folgenden Beispiel werden automatische Variablen zum Generieren einer generischen Regel verwendet. Hier erfahren Sie, wie Sie eine .o-Datei aus einer .c-Datei mit demselben Namen erstellen. Da wir den Namen der betroffenen Dateien nicht kennen, verwenden wir $@
als Platzhalter für den Namen der Ausgabedatei und $^
als Platzhalter für die Voraussetzungsliste (in diesem Fall die Liste der Eingabedateien).
%.o: %.c
cc -Wall $^ -c $@
Bedingte Variablenzuweisung
Der Operator ?=
Ist eine Erweiterung, die sich wie =
verhält, mit der Ausnahme, dass die Zuweisung nur erfolgt, wenn die Variable nicht bereits festgelegt ist.
x = hello
x ?= world
# $(x) will yield "hello"
Anhängen von Text an eine vorhandene Variable
Der Operator +=
ist eine allgemeine Erweiterung, die den angegebenen Inhalt durch ein Leerzeichen getrennt am Ende der Variablen hinzufügt.
x = hello
x += world
Variablenreferenzen auf der rechten Seite werden nur dann erweitert, wenn die ursprüngliche Variable als einfach expandierte Variable definiert wurde.