Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 使用make展平目录结构并更改目标的名称(或者如何将两个文件列表配对?)_Makefile - Fatal编程技术网

Makefile 使用make展平目录结构并更改目标的名称(或者如何将两个文件列表配对?)

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

X问题

假设我们在Mega langauge中有一个源代码树,如下所示:

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)))