Вы почти правы, единственное, что нужно исправить - это последнее правило шаблона, просто удалите лишний символ процента:
$(WWW_OUT_DIR)/%: $(WWW_SRC_DIR)/%
cp $< $@
Также имейте в виду, что с GNU Make 3.82 алгоритм поиска шаблона был измененнемного (из журнала изменений):
Переменные, характерные для шаблона, и правила шаблона теперь применяются в порядке наименьшего стебля, а не в порядке определения (все еще применяются переменные и правила с одинаковой длиной стебля).в порядке определения).Это приводит к обычно желаемому поведению, когда предпочтительны более конкретные шаблоны.
Это именно то, что вам нужно в случае, если вы используете самую последнюю версию Make.Чтобы ваш Makefile был совместим с другими версиями GNU Make (включая версии более ранние, чем 3.82), правило должно быть определено после других (как в исходном вопросе).
UPD.
Хороший пример из здесь :
До версии 3.82, когда gmake находит несколько совпадений во время поиска шаблона, он предпочитает шаблоны, объявленные ранее в make-файле, шаблонам, объявленным позже.Начиная с 3.82, gmake вместо этого предпочитает шаблон, который приводит к самому короткому стеблю.Это звучит немного запутанно благодаря жаргону, но я думаю, что это на самом деле заставит gmake лучше придерживаться принципа наименьшего удивления.Вот пример:
all: sub/foo.x
%.x:
@echo "Prefer first match (stem is $*)."
sub/%.x:
@echo "Prefer most specific match (stem is $*)."
Сравните вывод из gmake 3.81 и 3.82:
gmake 3.82 предпочитает второй шаблон, потому что это более конкретное совпадение, чем первый.Обратите внимание, что это значительная обратная несовместимость по сравнению с предыдущими версиями gmake!