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