Ленивый Набор
VARIABLE = value
Обычная установка переменной, но любые другие переменные, упомянутые с value
полем, рекурсивно раскрываются со своим значением в точке, в которой переменная используется, а не той, которая была при объявлении
Немедленный сет
VARIABLE := value
Установка переменной с простым расширением значений внутри - значения внутри нее раскрываются во время объявления.
Ленивый набор, если отсутствует
VARIABLE ?= value
Установка переменной, только если она не имеет значения. value
всегда оценивается при VARIABLE
обращении. Это эквивалентно
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Смотрите документацию для более подробной информации.
Append
VARIABLE += value
Присоединение предоставленного значения к существующему значению (или установка этого значения, если переменная не существует)
Использование
=
приводит к тому, что переменной присваивается значение. Если переменная уже имела значение, она заменяется. Это значение будет расширено при использовании. Например:Использование
:=
похоже на использование=
. Однако вместо значения, расширяемого при его использовании, оно расширяется во время присваивания. Например:Использование
?=
присваивает переменной значение, если переменная ранее не была назначена. Если переменной ранее было присвоено пустое значение (VAR=
), она все еще считается установленной, я думаю . В остальном функционирует точно так же=
.Использование
+=
аналогично использованию=
, но вместо замены значения значение добавляется к текущему с пробелом между ними. Если переменная была ранее установлена с помощью:=
, я думаю , она будет расширена . Результирующее значение расширяется при использовании, я думаю . Например:Если бы что-то подобное
HELLO_WORLD = $(HELLO_WORLD) world!
использовалось, получилась бы рекурсия, которая, скорее всего, закончила бы выполнение вашего Makefile. Если быA := $(A) $(B)
они использовались, результат не был бы точно таким же, как при использовании,+=
потому чтоB
расширяется,:=
тогда как+=
неB
будет расширяться.источник
VARIABLE = literal
иVARIABLE := literal
всегда эквивалентны. Я правильно понял?Я предлагаю вам провести несколько экспериментов, используя «make». Вот простая демонстрация, показывающая разницу между
=
и:=
.make test
печатает:Проверьте более подробное объяснение здесь
источник
@
перед каждым рецептом, чтобы избежать этого запутанного повторения результатов./* ... */
блокировку комментариевКогда вы используете
VARIABLE = value
, еслиvalue
фактически является ссылкой на другую переменную, то значение определяется только тогда, когдаVARIABLE
используется. Это лучше всего иллюстрируется на примере:Когда вы используете
VARIABLE := value
, вы получаете значение,value
как сейчас . Например:Использование
VARIABLE ?= val
означает, что вы устанавливаете только значениеVARIABLE
if,VARIABLE
которое еще не установлено. Если он еще не установлен, установка значения будет отложена доVARIABLE
использования (как в примере 1).VARIABLE += value
просто добавляетvalue
кVARIABLE
. Фактическое значениеvalue
определяется так, как оно было, когда оно было первоначально установлено, используя либо=
или:=
.источник
В ответах выше важно понять, что подразумевается под «значениями раскрываются во время объявления / использования». Предоставление значения, подобного
*.c
которому, не влечет за собой никакого расширения. Только когда эта строка используется командой, она, возможно, вызовет некоторое сглаживание. Точно так же значение как$(wildcard *.c)
или$(shell ls *.c)
не влечет за собой никакого расширения и полностью оценивается во время определения, даже если мы использовали:=
в определении переменной.Попробуйте следующий Makefile в каталоге, где у вас есть несколько файлов C:
Запуск
make
вызовет правило, которое создает дополнительный (пустой) файл C, вызываемый,foo.c
но ни одна из 6 переменных не имеетfoo.c
своего значения.источник