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


101

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


7
возможный дубликат присвоения переменной Makefile
eldarerathis

Ответы:


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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.