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

Ответы:

80

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

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

Грег Хьюгилл
источник
4
Итак, было бы правильно сказать, что: = более эффективно? Или эффективность файлов Makefile на самом деле не важна?
Ungeheuer
3
@Ungeheuer Это не проблема, потому что вызов процесса ( makeосновное задание) имеет гораздо большие накладные расходы, чем разрешение такой внутренней переменной.
Кирилл Булыгин
68

Простое задание :=

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

Для получения дополнительной информации ознакомьтесь с этими руководствами

Амджад
источник
«Простое выражение присваивания оценивается только один раз, при самом первом появлении»: чтобы было ясно, расширение / оценка выполняется, когда переменная определена, а не в первый раз, когда она используется.
Майкл Берр,