Como obter semântica “no máximo uma vez” em atribuições de variáveis?
Às vezes, os comandos do shell levam muito tempo para serem executados; portanto, você pode não querer fazerVAR = $(shell slow-cmd)
(com=
, o cmd lento será executado toda vez que a variável for referenciada). UsandoVAR := $(shell slow-cmd)
pode ser útil, mas se você estiver criando um destino que nunca precise da variável expandida, receberá mais uma chamada doslow-cmd
do que é necessário. No seguinte makefile (com gnu-make), você pode obter o comportamento desejado: o comando shell para definir um valor para V2 nunca é chamado mais de uma vez e para o destinofoo
não é invocado. Mas este é um argumento hediondo. Existe uma maneira mais razoável de garantir que uma variável seja definida apenas quando necessário, mas nunca seja avaliada mais de uma vez?
V1 = $(shell echo evaluating V1 > /dev/tty; echo V1 VALUE)
all: foo bar V2
@echo $(V1) $@
@echo $(V2) $@
foo:
@echo $(V1) $@
bar: V2
@echo $(V1) $@
@echo $(V2) $@
V2:
$(eval V2 := $(shell echo evaluating V2 > /dev/tty; echo V2 VALUE))
.PHONY: all foo bar