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