Для присвоения переменных в Make я вижу: = и = оператор. В чем разница между ними?
makefile
gnu-make
colon-equals
просек
источник
источник
Ответы:
Это описано в документации GNU Make, в разделе 6.2. Две разновидности переменных .
Короче говоря, переменные, определенные с помощью
:=
, раскрываются один раз, но переменные, определенные с помощью=
, расширяются всякий раз, когда они используются.источник
make
основное задание) имеет гораздо большие накладные расходы, чем разрешение такой внутренней переменной.Простое задание
:=
Простое выражение присваивания оценивается только один раз, при самом первом появлении. Например, если
CC :=${GCC} ${FLAGS}
во время первого столкновения оценивается значение,gcc -W
то каждый раз, когда${CC}
оно происходит, оно будет заменяться наgcc -W
.Рекурсивное присваивание
=
Выражение рекурсивного присваивания вычисляется каждый раз, когда переменная встречается в коде. Например, выражение like
CC = ${GCC} {FLAGS}
будет оцениваться только при выполнении действия like${CC} file.c
. Однако, если переменнаяGCC
переназначена, то естьGCC=c++
после переназначения она${CC}
будет преобразованаc++ -W
в.Условное присвоение
?=
Условное присвоение присваивает значение переменной, только если она не имеет значения
Добавление
+=
Предположим, что
CC = gcc
тогда используется оператор добавления, какCC += -w
тогда,
CC
теперь он имеет значениеgcc -W
Для получения дополнительной информации ознакомьтесь с этими руководствами
источник
Из http://www.gnu.org/software/make/manual/make.html#Flavors :
=
определяет рекурсивно расширяемую переменную.:=
определяет просто расширяемую переменную.источник