Мне нужно интегрировать создание многих файлов HTML в существующий файл Makefile
. Проблема в том, что файлы HTML должны находиться во многих разных каталогах. Моя идея состоит в том, чтобы написать неявное правило, которое преобразует исходный файл (*.st) в соответствующий html-файл.
%.html: %.st
$(HPC) -o $@ $<
и правило, зависящее от всех html файлов
all: $(html)
Если файл HTML отсутствует в каталоге сборки, make не находит неявное правило: *** No rule to make target
. Если я изменю неявное правило так
$(rootdir)/build/doc/2009/06/01/%.html: %.st
$(HPC) -o $@ $<
он найден, но тогда мне нужно иметь неявное правило почти для каждого файла в проекте. В соответствии с алгоритмом поиска неявных правил в GNU make
, поиск по правилам работает так:
- Разделите все имя цели t на часть каталога с именем d и оставшуюся часть с именем n. Например, если t равно
src/foo.o
, то d равноsrc/
, а n равноfoo.o
.- Составьте список всех шаблонных правил, одна из целей которых соответствует t или n. Если целевой шаблон содержит косую черту, он сопоставляется с t; в противном случае против n.
Почему неявное правило не найдено и какое решение было бы наиболее элегантным, если бы использовалась GNU make
?
Вот урезанная версия моего Makefile
:
rootdir = /home/user/project/doc
HPC = /usr/local/bin/hpc
html = $(rootdir)/build/doc/2009/06/01/some.html
%.html: %.st
$(HPC) -o $@ $<
#This works, but requires a rule for every output dir
#$(rootdir)/build/doc/2009/06/01/%.html: %.st
# $(HPC) -o $@ $<
.PHONY: all
all: $(html)