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

questionAnswers(2)

yourAnswerToTheQuestion