Conjunto preguiçoso
VARIABLE = value
Configuração normal de uma variável, mas quaisquer outras variáveis mencionadas com o value
campo são recursivamente expandidas com seu valor no ponto em que a variável é usada, não a que tinha quando foi declarada
Conjunto imediato
VARIABLE := value
Configuração de uma variável com expansão simples dos valores internos - os valores dentro dela são expandidos no momento da declaração.
Conjunto preguiçoso se ausente
VARIABLE ?= value
Configuração de uma variável apenas se ela não tiver um valor. value
é sempre avaliado quando VARIABLE
é acessado. É equivalente a
ifeq ($(origin FOO), undefined)
FOO = bar
endif
Veja a documentação para mais detalhes.
Acrescentar
VARIABLE += value
Anexando o valor fornecido ao valor existente (ou definindo esse valor se a variável não existir)
O uso
=
faz com que seja atribuído um valor à variável. Se a variável já tiver um valor, ela será substituída. Este valor será expandido quando usado. Por exemplo:Usar
:=
é semelhante a usar=
. No entanto, em vez de o valor ser expandido quando usado, ele é expandido durante a atribuição. Por exemplo:O uso
?=
atribui à variável um valor se a variável não foi atribuída anteriormente. Se a variável tiver sido atribuída anteriormente a um valor em branco (VAR=
), ainda será considerado definido, eu acho . Caso contrário, funciona exatamente como=
.Usar
+=
é como usar=
, mas, em vez de substituir o valor, ele é anexado ao atual, com um espaço no meio. Se a variável foi definida anteriormente:=
, é expandida, eu acho . O valor resultante é expandido quando usado, eu acho . Por exemplo:Se algo como
HELLO_WORLD = $(HELLO_WORLD) world!
fosse usado, resultaria em recursão, o que provavelmente terminaria a execução do seu Makefile. SeA := $(A) $(B)
fosse usado, o resultado não seria exatamente o mesmo que usar,+=
porqueB
é expandido com:=
enquanto+=
não causariaB
expansão.fonte
VARIABLE = literal
eVARIABLE := literal
sempre é equivalente. Eu entendi direito?Eu sugiro que você faça alguns experimentos usando "make". Aqui está uma demonstração simples, mostrando a diferença entre
=
e:=
.make test
impressões:Verifique aqui uma explicação mais elaborada
fonte
@
na frente de cada receita para evitar essa repetição confusa de resultados./* ... */
bloco de comentárioQuando você usa
VARIABLE = value
, sevalue
é realmente uma referência a outra variável, o valor é determinado apenas quandoVARIABLE
é usado. Isso é melhor ilustrado com um exemplo:Quando você usa
VARIABLE := value
, obtém o valorvalue
como é agora . Por exemplo:Usar
VARIABLE ?= val
significa que você define apenas o valor deVARIABLE
seVARIABLE
ainda não estiver definido. Se ainda não estiver definido, a configuração do valor será adiada até queVARIABLE
seja usada (como no exemplo 1).VARIABLE += value
apenas anexavalue
aVARIABLE
. O valor real devalue
é determinado como era quando foi definido inicialmente, usando=
ou:=
.fonte
Nas respostas acima, é importante entender o que se entende por "valores expandidos no momento da declaração / uso". Dar um valor semelhante
*.c
não implica nenhuma expansão. Somente quando essa string é usada por um comando é que talvez acione alguns globbing. Da mesma forma, um valor como$(wildcard *.c)
ou$(shell ls *.c)
não implica em nenhuma expansão e é completamente avaliado no momento da definição, mesmo que tenhamos usado:=
na definição da variável.Experimente o seguinte Makefile no diretório em que você tem alguns arquivos C:
A execução
make
acionará uma regra que cria um arquivo C extra (vazio), chamado,foo.c
mas nenhuma das 6 variáveis possuifoo.c
seu valor.fonte