Для присвоения переменных в Make я вижу: = и = оператор. В чем разница между ними?
Для присвоения переменных в Make я вижу: = и = оператор. В чем разница между ними?
Ответы:
Это описано в документации 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 :
=
определяет рекурсивно расширяемую переменную. :=
определяет просто расширяемую переменную.