L'uso =fa sì che alla variabile venga assegnato un valore. Se la variabile aveva già un valore, viene sostituita. Questo valore verrà espanso quando viene utilizzato. Per esempio:
HELLO = world
HELLO_WORLD = $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# This echoes "hello world!"
echo $(HELLO_WORLD)
L'uso :=è simile all'utilizzo =. Tuttavia, invece di espandere il valore quando viene utilizzato, viene espanso durante l'assegnazione. Per esempio:
HELLO = world
HELLO_WORLD := $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# Still echoes "world world!"
echo $(HELLO_WORLD)
HELLO_WORLD := $(HELLO) world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
Utilizzando ?=assegna alla variabile un valore se la variabile non è stata precedentemente assegnata. Se alla variabile era stato precedentemente assegnato un valore vuoto ( VAR=), è comunque considerato impostato penso . Altrimenti, funziona esattamente come =.
Usare +=è come usare =, ma invece di sostituire il valore, il valore viene aggiunto a quello corrente, con uno spazio in mezzo. Se la variabile è stata precedentemente impostata con :=, penso che sia espansa . Il valore risultante viene espanso quando viene utilizzato, credo . Per esempio:
HELLO_WORLD = hello
HELLO_WORLD += world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
Se HELLO_WORLD = $(HELLO_WORLD) world!venisse usato qualcosa di simile , si verificherebbe la ricorsione, che molto probabilmente finirebbe l'esecuzione del tuo Makefile. Se A := $(A) $(B)fossero usati, il risultato non sarebbe lo stesso dell'uso +=perché Bè espanso con :=mentre +=non causerebbe Bl'espansione.