@ G.M .: Безусловно, это работает только для целевых переменных.
ды оболочки иногда выполняются очень долго, поэтому вы можете их не выполнять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