Я пытаюсь создать макрос в Makefile, который я могу развернуть один раз, но все еще могу работать как макрос после раскрытия.Это полезно для меня, так как расширение первого уровня заполнит рекурсивные параметры, которые не будут длиться долго.Вот пример:
all: aperiod
TGT = hello
hello.TGT = world
world.TGT = period
define CREATE_TARGET
.SECONDARY: $(1)
$(3)$(1): $(4)$(2)
@echo $$$$(@)
$(foreach t,$($(1).TGT),$(call CREATE_TARGET,$(t),$(1),$$(1),$$(1)))
endef
define CREATE
$(call CREATE_TARGET,$(TGT),,$$(1),)
endef
CREATE_EXP := $(call CREATE)
TGT :=
$(eval $(call CREATE_EXP,a))
Ошибка при запуске make: make: *** Нет правила для создания цели aperiod', needed by
all '.Стоп.
TGT содержит изменяющийся набор значений.Я хочу, чтобы CREATE_EXP содержал полностью расширенный метод создания, который принимает параметр для назначения префиксов целевым объектам.
Таким образом, оптимально, я могу вызвать make aperiod
и получить hello world period, или вызвать make bperiod
после $(eval $(call CREATE_EXP,b))
и получите то же самое
Это очень сокращенный тестовый пример!
Значение CREATE_EXP правильное, но больше не будет работать для меня как макрос.
$(info $(value CREATE_EXP))
.SECONDARY: hello
$(1)hello:
@echo $$(@)
.SECONDARY: world
$(1)world: $(1)hello
@echo $$(@)
.SECONDARY: period
$(1)period: $(1)world
@echo $$(@)
Я хотел бы знать, почему Make ведет себя таким образом, а также есть ли лучший способ достичь общего смысла того, что я пытаюсь сделать.
РЕДАКТИРОВАТЬ: я нашел решение длясделать это, хотя мне все еще интересно, может ли вызов $ (call) создать макрос, который все еще нуждается в расширении.
define CREATE
define CREATE_EXP
$(call CREATE_TARGET,$(TGT),,$$(1),)
endef
endef
Использование $(eval $(call CREATE))
Первый раз через, make расширит переменные внутри.Это учитывает рекурсивное расширение, а также создание макроса функции.