我将产生的许多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 手册的、以规则搜索的工作原理是这样的:

  1. 分t成一个目录的一部分,称为d,其余的,称为n.对于 例如,如果t src/foo.o', then d issrc/'和n`foo。o'。
  2. 列出的所有模式的规则之一,其目标相匹配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 有些标准的方式来处理目录,但要注意的问题在文章中提到的"递归确认为是有害的"

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top