Присвоение переменной в Makefile - PullRequest
0 голосов
/ 01 декабря 2018

При создании следующего базового make-файла поведение, которое я вижу, заставляет меня думать, что я упускаю что-то фундаментальное:

define foo
    var := $1
    $(info var_value: [$(var)] vs value: [$1])
endef

all:
    $(eval $(call foo,FIRST))
    $(eval $(call foo,SECOND))

Вывод этого make-файла следующий:

var_value: [] vs value: [FIRST]
var_value: [FIRST] vs value: [SECOND]
make: `all' is up to date.

Насколько я понимаю, var := $1 означает, что любое значение в $ 1 немедленно раскрывается и устанавливается в var.Поэтому я бы (наивно) ожидал, что содержание var и фактическое значение всегда будут равны, но это не так.Может кто-нибудь дать мне подсказку?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

eval расширяет свои параметры и make расширяет результат перед передачей его в оболочку.$$ экранирует первое расширение:

define foo
    var := $1
    $$(info var_value: [$$(var)] vs value: [$1])
endef
$(foreach n,FIRST SECOND,$(eval $(call foo,$(n))))

all:;

Демонстрация:

$ make all
var_value: [FIRST] vs value: [FIRST]
var_value: [SECOND] vs value: [SECOND]
make: 'all' is up to date.
0 голосов
/ 01 декабря 2018

Вопрос в том, когда что-то оценивается.Сначала переменная var пуста, поэтому при первом вызове foo расширяется до:

var := FIRST
$(info var_value: [] vs value: [FIRST])

Make оценивает это и дает var значение "FIRST".И поскольку var имеет значение "ПЕРВЫЙ", второй вызов foo расширяется до:

var := SECOND
$(info var_value: [FIRST] vs value: [SECOND])
...