@ 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

Ответы на вопрос(1)

Ваш ответ на вопрос