Обнаружена проблема установки значения переменной внутри функции Makefile - PullRequest
0 голосов
/ 07 июня 2018

Структура каталогов (для запуска этого примера) выглядит следующим образом:

example
 |-- Makefile
 |-- foo
 |    |-- foo.h (empty file)
 |-- bar
 |    |-- bar.h (empty file)

Makefile выглядит следующим образом:

TARGETS=foo bar

define GEN_HEADER_RULE
$(1)_INCS = $(wildcard $(1)/*.h)
$(info $$($(1)_INCS) is [$($(1)_INCS)])
$(info $$(wildcard $$(1)/*) is: [$(wildcard $(1)/*)])
endef

$(foreach t,$(TARGETS),$(eval $(call GEN_HEADER_RULE,$t)))

all: 
    @echo "DONE"

Фактический вывод:

$(foo_INCS) is []
$(wildcard $(1)/*) is: [foo/foo.h]

$(bar_INCS) is []
$(wildcard $(1)/*) is: [bar/bar.h]

DONE

Ожидаемый результат:

$(foo_INCS) is [foo/foo.h]
$(bar_INCS) is [bar/bar.h]

Я не могу понять, почему значение переменной $ (1) _INCS не устанавливается как выходной символ подстановочной функции?Функция подстановки явно работает без проблем - как показывает команда $ info, выводящая вывод непосредственно из нее.

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

1 Ответ

0 голосов
/ 07 июня 2018

Вы забыли защитить переменные и функции от двойного расширения.Удвойте все $, кроме $(1), и вы увидите почти то, что хотите (за исключением второго $(info...), который произведет больше, чем вы ожидаете).

host> cat Makefile
TARGETS=foo bar

define GEN_HEADER_RULE
$(1)_INCS = $$(wildcard $(1)/*.h)
$$(info $$$$($(1)_INCS) is [$$($(1)_INCS)])
$$(info $$$$(wildcard $(1)/*) is: [$$(wildcard $(1)/*)])
endef

$(foreach t,$(TARGETS),$(eval $(call GEN_HEADER_RULE,$t)))

all: 
    @echo "DONE"

host> make
$(foo_INCS) is [foo/foo.h]
$(wildcard foo/*) is: [foo/foo.h]
$(bar_INCS) is [bar/bar.h]
$(wildcard bar/*) is: [bar/bar.h]
DONE

При использовании foreach-eval-callпомните, что есть первое расширение на eval-call и второе расширение на make, когда оно анализирует результат как синтаксис make.Вам часто нужно избегать первого расширения ($$) и даже иногда второго ($$$$).См. GNU make manual для подробного объяснения.

...