Was ist der Unterschied zwischen: = und = in Makefile?

Antworten:

75

Dies wird in der Dokumentation zu GNU Make im Abschnitt 6.2 Die zwei Varianten von Variablen beschrieben .

Kurz gesagt, mit definierte Variablen :=werden einmal erweitert, aber mit definierte Variablen werden bei =jeder Verwendung erweitert.

Greg Hewgill
quelle
4
Wäre es also richtig zu sagen: = ist effizienter? Oder spielt Effizienz bei Makefiles keine Rolle?
Ungeheuer
3
@Ungeheuer Das ist kein Problem, da der Prozessaufruf (der Hauptjob des Prozesses make) einen viel größeren Overhead hat als das Auflösen solcher internen Variablen.
Kirill Bulygin
60

Einfache Zuordnung :=

Ein einfacher Zuweisungsausdruck wird beim ersten Auftreten nur einmal ausgewertet. Wenn beispielsweise CC :=${GCC} ${FLAGS}während der ersten Begegnung ausgewertet wird, gcc -Wwird sie jedes Mal ${CC}durch ersetzt gcc -W.

Rekursive Zuordnung =

Ein rekursiver Zuweisungsausdruck wird jedes Mal ausgewertet, wenn die Variable im Code gefunden wird. Beispielsweise wird eine Anweisung wie CC = ${GCC} {FLAGS}nur ausgewertet, wenn eine Aktion wie ${CC} file.causgeführt wird. Wenn jedoch die Variablen GCCzugewiesen werden , das heißt GCC=c++dann das ${CC}wird umgewandelt werden c++ -Wnach der Neuzuordnung.

Bedingte Zuordnung ?=

Die bedingte Zuweisung weist einer Variablen nur dann einen Wert zu, wenn sie keinen Wert hat

Anhängen +=

Angenommen, CC = gccdann wird der anhängende Operator so verwendet, als hätte CC += -w
er CCjetzt den Wertgcc -W

Weitere Informationen finden Sie in diesen Tutorials

Amjad
quelle
"Ein einfacher Zuweisungsausdruck wird beim ersten Auftreten nur einmal ausgewertet": Um klar zu sein, erfolgt die Erweiterung / Auswertung, wenn die Variable definiert ist, nicht bei der ersten Verwendung.
Michael Burr