Вы хотите использовать несколько очень похожих правил, и дисперсия слишком сложна для правила шаблона. Это похоже на работу для «консервированного рецепта» .
Мы пишем шаблон:
define data-rule
outdir/$(1)/outdata_$(1).file: script.R datadir/$(1)/indata_$(1).file
$(EXEC) $$< $(1)
endef
(точный синтаксис зависит от версии Make, поэтому вам может понадобиться '=' в конце строки "define".)
Теперь мы можем сгенерировать текст правила location1
с помощью call
:
$(call data-rule,location1)
и Make должен интерпретировать этот текст как фактический код makefile с помощью eval
:
$(eval $(call data-rule,location1))
Как только мы убедимся, что это работает, мы можем сгенерировать правила по одному один:
$(eval $(call data-rule,location1))
$(eval $(call data-rule,location2))
$(eval $(call data-rule,location3))
или используйте foreach
:
LOCATIONS := location1 location2 location3
$(foreach loc,$(LOCATIONS),$(eval $(call data-rule,$(loc))))
Наконец, вы можете захотеть цель, которая создает все эти файлы:
all-locations: outdir/location1/outdata_location1.file outdir/location2/outdata_location2.file outdir/location3/outdata_location3.file
Вы также можете автоматизировать эту конструкцию:
$(foreach loc,$(LOCATIONS),$(eval all-locations: outdir/$(loc)/outdata_$(loc).file))