GNU与许多目标目录
-
06-09-2019 - |
题
我将产生的许多HTML文件在现有的 Makefile
.问题是,HTML文件需要驻留在许多不同的目录中。我的想法是编写一个隐含的规则,该规则将于源文件(*.圣)的相应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
手册的、以规则搜索的工作原理是这样的:
- 分t成一个目录的一部分,称为d,其余的,称为n.对于 例如,如果t
src/foo.o', then d is
src/'和n`foo。o'。- 列出的所有模式的规则之一,其目标相匹配t或正。如果目标包含一个图案 斜线,它是匹配t;否则,反对。
为什么是隐含的规则没有发现,这将是最优雅的解决方案,假定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)
解决方案
像玛丽亚Shalnova我喜欢递使(虽然我不同意"递归确认为有害"),在一般最好让这里的东西从一个来源,而不是相反。但如果你要,我建议一个微小的改善:有generateHtml仅产生的规则,而不是命令。
其他提示
最好的解决方案,我发现迄今为止是产生一个隐含的规则每个目标目录的通过 foreach-eval-呼叫, 解释的 GNU make
手册.我不知道这是如何扩展到几千目标的目录,但我们将会看到...
如果你有一个更好的解决方案,请它!
这里是代码:
rootdir = /home/user/project/doc
HPC = /usr/local/bin/hpc
html = $(rootdir)/build/doc/2009/06/01/some.html \
$(rootdir)/build/doc/2009/06/02/some.html
targetdirs = $(rootdir)/build/doc/2009/06/01 \
$(rootdir)/build/doc/2009/06/02
define generateHtml
$(1)/%.html: %.st
-mkdir -p $(1)
$(HPC) -o $$@ $$<
endef
$(foreach targetdir, $(targetdirs), $(eval $(call generateHtml, $(targetdir))))
.PHONY: all
all: $(html)
你的活动隐含的规则 $(rootdir)/build/doc/2009/06/01/some.html
取决于 $(rootdir)/build/doc/2009/06/01/some.st
.如果 $(rootdir)/build/doc/2009/06/01/some.st
不存在,则该规则不会被用/发现。
该评论说出规则 $(rootdir)/build/doc/2009/06/01/some.html
取决于 some.st
.
一种解决办法是让你来源的布局配合你的目的地/结果的布局。
另一种选择是建立的规则,因为需要与 eval
.但是,这将是相当复杂的:
define HTML_template
$(1) : $(basename $(1))
cp $< $@
endef
$(foreach htmlfile,$(html),$(eval $(call HTML_template,$(htmlfile))))
另一个可能性是有的突击队 make
呼叫本身递归的参数-C的每一个输出的目录。递归 make
有些标准的方式来处理目录,但要注意的问题在文章中提到的"递归确认为是有害的"