Команды оболочки иногда выполняются очень долго, поэтому вы можете не захотеть делать VAR = $(shell slow-cmd)
(с =
, slow-cmd будет запускаться каждый раз, когда ссылается на переменную).Использование VAR := $(shell slow-cmd)
может быть полезным, но если вы создаете цель, которой переменная не требуется, вы получите еще один вызов slow-cmd
, чем необходимо.В следующем make-файле (с gnu-make) вы можете получить желаемое поведение: команда оболочки для определения значения для V2 никогда не вызывается более одного раза, а для цели foo
она вообще не вызывается.Но это отвратительный клудж.Есть ли более разумный способ гарантировать, что переменная определяется только при необходимости, но никогда не оценивается более одного раза?
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