【发布时间】:2009-06-01 09:30:16
【问题描述】:
我必须在现有的Makefile 中集成许多 HTML 文件的生成。
问题是 HTML 文件需要驻留在许多不同的目录中。
我的想法是编写一个隐式规则,将源文件(*.st)转换为相应的html文件
%.html: %.st
$(HPC) -o $@ $<
以及一个依赖于所有 html 文件的规则
all: $(html)
如果 HTML 文件不在 builddir 中,make 找不到隐式规则:*** No rule to make target。
如果我像这样更改隐式规则
$(rootdir)/build/doc/2009/06/01/%.html: %.st
$(HPC) -o $@ $<
找到了,但是我必须对项目中的几乎每个文件都有一个隐式规则。
根据 GNU make 手册中的 Implicit Rule Search Algorithm,规则搜索的工作方式如下:
- 将整个目标名称 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)
【问题讨论】:
标签: makefile release-management gnu-make build-management