Qual é a diferença entre: = e = no Makefile?

Respostas:

76

Isso é descrito na documentação do GNU Make, na seção intitulada 6.2 Os Dois Sabores das Variáveis .

Resumindo, as variáveis ​​definidas com :=são expandidas uma vez, mas as variáveis ​​definidas com =são expandidas sempre que são usadas.

Greg Hewgill
fonte
4
Portanto, seria correto dizer que: = é mais eficiente? Ou a eficiência não é realmente um fator com Makefiles?
Ungeheuer
3
@Ungeheuer Isso não é um problema porque a chamada de processo (a maketarefa principal do) tem uma sobrecarga muito maior do que a resolução de variável interna.
Kirill Bulygin
62

Tarefa simples :=

Uma expressão de atribuição simples é avaliada apenas uma vez, na primeira ocorrência. Por exemplo, se CC :=${GCC} ${FLAGS}durante o primeiro encontro for avaliado, gcc -Wentão cada vez que ${CC}ocorrer, ele será substituído por gcc -W.

Atribuição recursiva =

Uma expressão de atribuição recursiva é avaliada sempre que a variável é encontrada no código. Por exemplo, uma instrução like CC = ${GCC} {FLAGS}será avaliada apenas quando uma ação like ${CC} file.cfor executada. No entanto, se a variável GCCfor reatribuída, ou seja GCC=c++, o ${CC}será convertido para c++ -Wapós a reatribuição.

Atribuição condicional ?=

A atribuição condicional atribui um valor a uma variável apenas se ela não tiver um valor

Anexando +=

Suponha que CC = gccentão o operador de acréscimo é usado como CC += -w
então CCagora tem o valorgcc -W

Para mais informações, confira estes tutoriais

Amjad
fonte
"Uma expressão de atribuição simples é avaliada apenas uma vez, na primeira ocorrência": para ser claro, a expansão / avaliação é feita quando a variável é definida, não na primeira vez que é usada.
Michael Burr