Использование =
приводит к тому, что переменной присваивается значение. Если переменная уже имела значение, она заменяется. Это значение будет расширено при использовании. Например:
HELLO = world
HELLO_WORLD = $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# This echoes "hello world!"
echo $(HELLO_WORLD)
Использование :=
аналогично использованию =
. Однако вместо значения, расширяемого при его использовании, оно расширяется во время присваивания. Например:
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)
Использование ?=
присваивает переменной значение если переменная ранее не была назначена. Если переменной ранее было присвоено пустое значение (VAR=
), она все еще считается установленной Я думаю . В противном случае функционирует точно так же, как =
.
Использование +=
похоже на использование =
, но вместо замены значения оно добавляется к текущему с пробелом между ними. Если переменная была ранее установлена с :=
, она расширяется Я думаю . Результирующее значение расширяется при использовании Я думаю . Например:
HELLO_WORLD = hello
HELLO_WORLD += world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
Если использовать что-то вроде HELLO_WORLD = $(HELLO_WORLD) world!
, произойдет рекурсия, которая, скорее всего, завершит выполнение вашего Makefile. Если бы использовалось A := $(A) $(B)
, результат не был бы таким же, как при использовании +=
, поскольку B
расширяется с помощью :=
, тогда как +=
не приведет к расширению B
.