W przypadku przypisania zmiennych w programie Make widzę: = i = operator. Jaka jest między nimi różnica?
makefile
gnu-make
colon-equals
prosseek
źródło
źródło
Odpowiedzi:
Jest to opisane w dokumentacji GNU Make, w sekcji zatytułowanej 6.2 Dwa rodzaje zmiennych .
Krótko mówiąc, zmienne zdefiniowane za pomocą
:=
są rozwijane raz, ale zmienne zdefiniowane za pomocą=
są rozwijane za każdym razem, gdy są używane.źródło
make
główne zadanie) ma znacznie większy narzut niż takie wewnętrzne rozwiązywanie zmiennych.Proste zadanie
:=
Proste wyrażenie przypisania jest oceniane tylko raz, przy pierwszym wystąpieniu. Na przykład, jeśli
CC :=${GCC} ${FLAGS}
podczas pierwszego spotkania zostanie oszacowane,gcc -W
to za każdym razem${CC}
zostanie zastąpione przezgcc -W
.Przypisanie rekurencyjne
=
Wyrażenie przypisania rekurencyjnego jest oceniane za każdym razem, gdy zmienna zostanie napotkana w kodzie. Na przykład instrukcja podobna
CC = ${GCC} {FLAGS}
zostanie oceniona tylko wtedy, gdy${CC} file.c
zostanie wykonana akcja podobna . Jeśli jednak zmiennaGCC
zostanie ponownie przypisana, tj.GCC=c++
Wtedy${CC}
zostanie przekonwertowana nac++ -W
po ponownym przypisaniu.Przypisanie warunkowe
?=
Przypisanie warunkowe przypisuje wartość do zmiennej tylko wtedy, gdy nie ma ona wartości
Dołączanie
+=
Załóżmy, że
CC = gcc
wtedy operator dołączania jest używany tak, jakCC += -w
wtedy
CC
ma wartośćgcc -W
Więcej informacji znajdziesz w tych samouczkach
źródło
Z http://www.gnu.org/software/make/manual/make.html#Flavors :
=
definiuje zmienną rozszerzaną rekurencyjnie.:=
definiuje zmienną po prostu rozszerzoną.źródło