X问题
假设我们在Mega langauge中有一个源代码树,如下所示:
src/
foo.mega
utils/
bar.mega
现在,我们希望使用MegaDoc工具为每个文件生成文档,但前提是它已经更新,如下所示:
docs/
foo.html
utils.bar.html
也就是说,我们需要文档的平面文件夹结构。Mega语言的命名规则确保我们不会出现名称冲突,所以这一切都很好。
MegaDoc工具当时只能生成一个文档文件。
megadoc input.mega -of output.html
我们怎么能把这个放在一个制造文件里呢?
Y问题
我已经走了这么远:
MG_FILES = ${shell find src -name *.mega -type f}
HT_FILES = $(subst .mega,.html,$(MG_FILES))
HT_FILES := $(subst /,.,$(HT_FILES))
HT_FILES := $(addprefix docs/,$(HT_FILES))
MG_FILES := $(addprefix src/,$(MG_FILES))
所以一般来说,MG_FILES
是
src/foo.mega src/utils/bar.mega
而HT_FILES
是
docs/foo.html docs/utils.bar.html
看上去很有希望!但现在我被困住了。我尝试过一些让人尴尬的事情,我不会表现出来的,它不涉及所有类型的$@
,什么也不管用。
我如何理解这两个文件列表应该匹配并在每对文件上执行一系列命令,或者什么的?
(注意:实际上,源代码文件夹有几个层次。)
发布于 2014-04-21 11:18:04
您不能使用隐式规则来这样做:模式太复杂了。您需要使用两种方法中的一种:自动生成makefile,或者使用$(eval ...)
。我认为自动生成的makefile更容易理解。不幸的是,我不太清楚如何确定何时重建makefile,因此从这个意义上说,$(eval ...)
更简单。
使用$(eval ...)
看起来如下所示:
MG_FILES := ${shell find src -name *.mega -type f}
define MEGARULE
doc/$(subst /,.,$1).html: src/$1.mega
megadoc $$< -of $$@
endef
$(foreach M,$(patsubst src/%.mega,%,$(MG_FILES),$(eval $(call MEGARULE,$M)))
https://stackoverflow.com/questions/23194657
复制相似问题