Makefile 使用make展平目录结构并更改目标的名称(或者如何将两个文件列表配对?)
X问题 假设我们在Mega langauge中有一个源代码树,如下所示:Makefile 使用make展平目录结构并更改目标的名称(或者如何将两个文件列表配对?),makefile,Makefile,X问题 假设我们在Mega langauge中有一个源代码树,如下所示: src/ foo.mega utils/ bar.mega 我们现在希望使用MegaDoc工具为每个文件生成文档,但前提是该文件已更新,如下所示: docs/ foo.html utils.bar.html 也就是说,我们希望文档有一个扁平的文件夹结构。Mega语言的命名规则确保我们不会出现名称冲突,所以这很好 MegaDoc工具一次只能生成一个文件 megadoc input.m
src/
foo.mega
utils/
bar.mega
我们现在希望使用MegaDoc工具为每个文件生成文档,但前提是该文件已更新,如下所示:
docs/
foo.html
utils.bar.html
也就是说,我们希望文档有一个扁平的文件夹结构。Mega语言的命名规则确保我们不会出现名称冲突,所以这很好
MegaDoc工具一次只能生成一个文件
megadoc input.mega -of output.html
我们究竟如何在Makefile中设置它
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_文件
src/foo.mega src/utils/bar.mega
docs/foo.html docs/utils.bar.html
而HT\u文件
src/foo.mega src/utils/bar.mega
docs/foo.html docs/utils.bar.html
看起来很有希望!但现在我被卡住了。我尝试过一些尴尬的事情,我不会展示,但在涉及所有类型的$@
以及其他方面时都不起作用
如何让make理解这两个文件列表应该匹配并在每对文件上执行一系列命令,或者其他什么
(注意:实际上,源代码文件夹有好几层。)您不能使用隐式规则来实现这一点:模式太复杂了。您需要使用两种方法之一:要么自动生成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)))
MG_文件:=${shell find src-name*.mega-type f}
定义超级规则
doc/$(subst/,,,$1).html:src/$1.mega
megadoc$$<-共$$@
恩德夫
$(foreach M,$(patsubst src/%.mega,%,$(MG_文件),$(eval$(call MEGARULE,$M)))