В чем разница между: = и = в Makefile? - PullRequest
72 голосов
/ 02 февраля 2011

Для назначения переменных в Make я вижу: = и = оператор. Какая разница между ними?

Ответы [ 3 ]

57 голосов
/ 02 февраля 2011

Это описано в документации GNU Make, в разделе, озаглавленном 6.2 Два вида переменных .

Короче говоря, переменные, определенные с :=, расширяются один раз, но переменные, определенные с =, расширяются всякий раз, когда они используются.

35 голосов
/ 22 ноября 2017

Простое назначение (: =)

Простое выражение присваивания вычисляется только один раз при самом первом появлении. Например, если CC :=${GCC} ${FLAGS} во время первой встречи оценивается как gcc -W, то каждый раз, когда происходит ${CC}, он будет заменен на gcc -W.

Рекурсивное присваивание (=)

Рекурсивное выражение присваивания вычисляется каждый раз, когда встречается переменная в коде. Например, оператор типа CC = ${GCC} {FLAGS} будет оцениваться только тогда, когда действие, подобное ${CC} file.c, выполняется. Однако, если переменная GCC переназначена, т.е. GCC=c++ тогда ${CC} будет преобразован в c++ -W после переназначения.

Условное присвоение (? =)

Условное присвоение присваивает значение переменной, только если оно не имеет значения

Добавление (+ =)

Предположим, что CC = gcc, тогда используется добавляющий оператор, например CC += -w
тогда CC теперь имеет значение gcc -W

Подробнее читайте в этих руководствах

11 голосов
/ 02 февраля 2011

С http://www.gnu.org/software/make/manual/make.html#Flavors:

= определяет рекурсивно расширенную переменную. := определяет просто расширенную переменную.

...