В чем разница между:= и = в Makefile?


для присвоения переменной в Make (или Microsoft nmake), я вижу := и = оператор. Какая между ними разница?

3 63

3 ответа:

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

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

простое присваивание (:=)

простое выражение присваивания вычисляется только один раз, при первом наступлении. Например, если 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

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

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