целевая переменная в Dynami c target - PullRequest
1 голос
/ 03 марта 2020

У меня есть немного более сложный Makefile с динамически сгенерированными целями, такими как:

COMPONENTS = foo bar lipsum

define TEST_template =
  .PHONY: test-$(1)
  test-$(1):
    @echo test
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))

Но теперь я бы хотел добавить к этой цели переменную c, определяемую целью. С нединамическими c целями это работает хорошо:

test: VAR_ONE=1
test:
    @echo "VAR_ONE=$(VAR_ONE)"

Но объединение этих двух не работает

COMPONENTS = foo bar lipsum

define TEST_template =
  .PHONY: test2-$(1)
  test2-$(1): VAR_ONE=1
  test2-$(1):
    @echo "test - VAR_ONE=$(VAR_ONE)"
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))

Теперь запущенный make test2-foo возвращает test - VAR_ONE=, так что кажется переменная не устанавливается.

Возможно ли это вообще? Я пытался достичь этого уже пару дней, но ничего не смог найти.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы должны экранировать любую ссылку на переменную внутри define, которую вы не хотите интерпретировать с помощью call. Итак, это:

define TEST_template =
  .PHONY: test2-$(1)
  test2-$(1): VAR_ONE=1
  test2-$(1):
        @echo "test - VAR_ONE=$$(VAR_ONE)"
endef

Хорошее эмпирическое правило (хотя, как и во всем, есть исключения), при определении переменной, которая будет использоваться с парой call / eval, аргументы На call (например, $1, $2 et c.) Следует ссылаться напрямую, а все остальные переменные следует экранировать.

1 голос
/ 03 марта 2020

Вы должны написать

    @echo "test - VAR_ONE=$$(VAR_ONE)"

(обратите внимание на двойной $$). См. info make

Важно понимать, что аргумент 'eval' расширен в два раза ; сначала с помощью функции 'eval', затем результаты этого раскрытия снова раскрываются, когда они анализируются как синтаксис make-файла. Это означает, что вам может потребоваться предоставить дополнительные уровни экранирования для "$"

...