Структура каталогов (для запуска этого примера) выглядит следующим образом:
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, чтобы продемонстрировать ту же проблему, с которой я столкнулся в гораздо более крупной системе сборки.