Яка різниця між: = і = у Makefile?


101

Щодо призначення змінних у Make, я бачу: = та = оператор. Яка різниця між ними?


7
можливий дублікат присвоєння змінної Makefile
eldarerathis 02

Відповіді:


80

Це описано в документації GNU Make у розділі 6.2 Дві різновиди змінних .

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


4
Тож чи правильно було б сказати, що: = є більш ефективним? Або ефективність насправді не є чинником Makefiles?
Ungeheuer

3
@Ungeheuer Це не проблема, оскільки виклик процесу ( makeосновна робота) має набагато більші накладні витрати, ніж розпізнавання внутрішньої змінної.
Кирило Булигін

68

Просте призначення :=

Простий вираз присвоєння оцінюється лише один раз, при першій появі. Наприклад, якщо CC :=${GCC} ${FLAGS}під час першої зустрічі оцінюється до, gcc -Wто кожен раз, коли ${CC}це відбувається, вона буде замінена на gcc -W.

Рекурсивне призначення =

Вираз рекурсивного призначення обчислюється кожного разу, коли в коді зустрічається змінна. Наприклад, оператор like CC = ${GCC} {FLAGS}оцінюється лише тоді, коли ${CC} file.cвиконується дія like . Однак, якщо змінна GCCперепризначена, тобто GCC=c++тоді ${CC}буде перетворено на c++ -Wпісля перепризначення.

Умовне присвоєння ?=

Умовне присвоєння присвоює змінній значення, лише якщо вона не має значення

Додавання +=

Припустимо, що CC = gccтоді використовується оператор, що додається, як CC += -w
тоді, коли CCмає значенняgcc -W

Для отримання додаткової інформації перегляньте ці посібники


"Простий вираз присвоєння оцінюється лише один раз, при першій же появі": щоб бути зрозумілим, розширення / оцінка виконується, коли змінна визначена, а не вперше, коли вона використовується.
Майкл Берр,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.