Использование =
приводит к тому, что переменной присваивается значение. Если переменная уже имела значение, она заменяется. Это значение будет расширено при использовании. Например:
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
будет расширяться.