В чем разница между:= и = в Makefile?
для присвоения переменной в Make (или Microsoft nmake), я вижу := и = оператор. Какая между ними разница?
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:
=определяет рекурсивно расширенную переменную.:=определяет просто расширенную переменную.