Эта строка:
$(TARGETS): %.html: $(call source,%.html)
не может работать, потому что вы расширяете макрос source
аргументом литеральной строки %.html
. Вы не можете использовать шаблоны или автоматические c переменные в макросах в списках обязательных требований: макросы раскрываются сначала перед анализом или расширением шаблонов.
Однако мне кажется, что вы: Мы делаем этот путь более сложным, чем нужно. Если большинство ваших целей построено одним способом, а некоторые - другим, тогда просто создайте шаблонное правило для «большинства» и напишите явные правила для «некоторых»:
%.html: ../doc/%.md
some list of commands $< $@
index.html : ../README.md
commands to build index.html
Если набор команд идентичен, и вы не хотите их повторять, поместите их в переменную:
create_html = some list of commands $< $@
%.html: ../doc/%.md
$(create_html)
index.html : ../README.md
$(create_html)
(обязательно создайте переменную с =
не :=
, если вы хотите включить $<
и $@
в скрипте).
ETA Вы спросили, почему кажется, что все работает: когда make расширяет это, она заменяет буквальную строку %.html
. Вы можете доказать это себе, добавив вызов $(info...)
, например:
source = $(info 1=$(1)) $(if $(findstring index.html,$(1)), \
../README.md, \
$(patsubst %.html,../doc/%.md,$(1)) \
)
, и вы увидите, что он будет печатать (только один раз, потому что правило раскрывается только один раз) 1=%.html
.
Что будет дальше? Это означает, что ваш макрос расширяется до этого:
$(if $(findstring index.html,%.html), ../README.md, $(patsubst %.html,../doc/%.md,%.html))
(опять же, с использованием буквальной строки %.html
). findstring
всегда возвращает пустое значение, потому что index.html
не может быть найдено в строке %.html
, поэтому вы расширяете предложение else:
$(patsubst %.html,../doc/%.md,%.html)
Очевидно, что %.html
соответствует %.html
с основа %
, поэтому замена выполняется и возвращает ../doc/%.md
. Итак, после всего этого ваше правило выглядит так:
$(TARGETS): %.html: ../doc/%.md
@echo some list of commands $< $@
Это точно то же самое, что и у вас раньше с вашим простым шаблоном.