Fauler Satz
VARIABLE = value
Die normale Einstellung einer Variablen, aber alle anderen mit dem value
Feld erwähnten Variablen werden rekursiv mit ihrem Wert an dem Punkt erweitert, an dem die Variable verwendet wird, und nicht an dem Punkt, an dem sie deklariert wurde
Sofortiges Set
VARIABLE := value
Festlegen einer Variablen mit einfacher Erweiterung der darin enthaltenen Werte - Die darin enthaltenen Werte werden zur Deklarationszeit erweitert.
Fauler Satz, wenn nicht vorhanden
VARIABLE ?= value
Festlegen einer Variablen nur, wenn sie keinen Wert hat. value
wird immer ausgewertet, wenn darauf VARIABLE
zugegriffen wird. Es ist äquivalent zu
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Weitere Informationen finden Sie in der Dokumentation .
Anhängen
VARIABLE += value
Anhängen des angegebenen Werts an den vorhandenen Wert (oder Festlegen dieses Werts, wenn die Variable nicht vorhanden war)
Durch Verwenden
=
wird der Variablen ein Wert zugewiesen. Wenn die Variable bereits einen Wert hatte, wird sie ersetzt. Dieser Wert wird erweitert, wenn er verwendet wird. Zum Beispiel:Die Verwendung
:=
ähnelt der Verwendung=
. Anstatt den Wert zu erweitern, wenn er verwendet wird, wird er jedoch während der Zuweisung erweitert. Zum Beispiel:Mit
?=
weist der Variablen einen Wert zu, wenn die Variable zuvor nicht zugewiesen wurde. Wenn der Variablen zuvor ein leerer Wert (VAR=
) zugewiesen wurde , wird er meiner Meinung nach immer noch als gesetzt betrachtet . Ansonsten funktioniert genau so=
.Verwenden
+=
ist wie Verwenden=
, aber anstatt den Wert zu ersetzen, wird der Wert mit einem Leerzeichen dazwischen an den aktuellen Wert angehängt. Wenn die Variable zuvor mit gesetzt wurde:=
, wird sie meiner Meinung nach erweitert . Der resultierende Wert wird erweitert, wenn er verwendet wird, denke ich . Zum Beispiel:Wenn so etwas
HELLO_WORLD = $(HELLO_WORLD) world!
verwendet würde, würde sich eine Rekursion ergeben, die höchstwahrscheinlich die Ausführung Ihres Makefiles beenden würde. WennA := $(A) $(B)
verwendet würde, wäre das Ergebnis nicht genau das gleiche wie bei Verwendung,+=
daB
es mit erweitert wird,:=
während+=
es nichtB
zu einer Erweiterung führen würde.quelle
VARIABLE = literal
undVARIABLE := literal
sind immer gleichwertig. Habe ich das richtig verstanden?Ich schlage vor, Sie machen einige Experimente mit "make". Hier ist eine einfache Demo, die den Unterschied zwischen
=
und zeigt:=
.make test
Drucke:Weitere ausführliche Erklärungen finden Sie hier
quelle
@
vor jedem Rezept ein vorangestelltes Rezept zu verwenden, um diese verwirrende Wiederholung der Ergebnisse zu vermeiden./* ... */
Block KommentarWenn Sie verwenden
VARIABLE = value
, wennvalue
tatsächlich eine Referenz auf eine andere Variable ist, wird der Wert nur bestimmt, wenn erVARIABLE
verwendet wird. Dies lässt sich am besten anhand eines Beispiels veranschaulichen:Wenn Sie verwenden
VARIABLE := value
, erhalten Sie den Wert vonvalue
wie er jetzt ist . Zum Beispiel:Verwenden
VARIABLE ?= val
bedeutet, dass Sie nur den Wert vonVARIABLE
if festlegen, der nochVARIABLE
nicht festgelegt wurde. Wenn es noch nicht festgelegt ist, wird die Einstellung des Werts verschoben, bis erVARIABLE
verwendet wird (wie in Beispiel 1).VARIABLE += value
hängt einfachvalue
anVARIABLE
. Der tatsächliche Wert vonvalue
wird so bestimmt, wie er war, als er ursprünglich eingestellt wurde, entweder mit=
oder:=
.quelle
In den obigen Antworten ist es wichtig zu verstehen, was unter "Werte werden zum Zeitpunkt der Deklaration / Verwendung erweitert" zu verstehen ist. Einen Wert wie zu geben,
*.c
bedeutet keine Erweiterung. Nur wenn diese Zeichenfolge von einem Befehl verwendet wird, wird möglicherweise ein Globbing ausgelöst. In ähnlicher Weise beinhaltet ein Wert wie$(wildcard *.c)
oder$(shell ls *.c)
keine Erweiterung und wird zum Zeitpunkt der Definition vollständig ausgewertet, selbst wenn wir ihn:=
in der Variablendefinition verwendet haben.Versuchen Sie das folgende Makefile in einem Verzeichnis, in dem Sie einige C-Dateien haben:
Durch Ausführen
make
wird eine Regel ausgelöst, die eine zusätzliche (leere) C-Datei erstellt, die aufgerufen wird,foo.c
aber keine der 6 Variablen enthältfoo.c
.quelle