Во-первых, обратите внимание, что здесь нет веских оснований использовать цели PHONY, поскольку эти правила, по-видимому, создают файлы, имена которых известны заранее. Цели, такие как f1/f1.pdf
, были бы намного лучше.
К сожалению, мы не можем использовать правило шаблона, когда основа (например, f1
) повторяется в предварительном условии. Но «консервированный рецепт» может сделать свое дело:
define pdf_template
$(1): $(1)/$(1).md
cd $$@ && pandoc $$(notdir $$^) -o $$(patsubst %.md,%.pdf,$$(notdir $$^))
endef
$(eval $(call pdf_template,f1))
$(eval $(call pdf_template,f2))
$(eval $(call pdf_template,f3))
(Обратите внимание, как вы должны избегать знаков $
в шаблоне.)
Если эти $(eval...)
строки выглядят слишком повторяющимися, вы можете заменить их на oop:
$(foreach folder,$(FOLDERS),$(eval $(call pdf_template,$(folder))))
РЕДАКТИРОВАТЬ: Если подумать, есть другой способ. Вы не можете создать шаблонное правило, которое использует ствол более одного раза:
$(FOLDERS): %: %/%.md
cd $@ && ... this won't work
И вы не можете использовать automati c переменных в списке предварительных требований, потому что они еще не определены, когда они необходимы:
$(FOLDERS): $@/$@.md
cd $@ && ... this won't work either
Но вы можете использовать их там, если вы используете Вторичное расширение , что заставляет Make расширять prereq список во второй раз:
.SECONDEXPANSION:
$(FOLDERS): $$@/$$@.md
cd $@ && ... this works
Снова обратите внимание на экранированные символы $
.