在Makefile中,将patsubst和通配符与子文件夹和子文件夹替换一起使用

时间:2018-10-20 17:29:05

标签: makefile

我正在尝试使用Makefile将某些markdown文件转换为html文件。我正在尝试以几行代码完成以前需要很长的python脚本才能完成的工作。

在下面的简单示例中,我想看这段代码:

build: $(patsubst src/pages/%.md, output/%.html, $(wildcard src/pages/*.md))

%.html: %.md
    @echo $< to $@

和此输出

src/pages/index.md to output/index.html
src/pages/about.md to output/about.html
src/pages/contact.md to output/contact.html
src/page/foo/bar.md to output/foo/bar.html

相反,它说:

$ make build
make: *** No rule to make target 'output/index.html', needed by 'build'.  Stop.

我在这里缺少一些非常基本的东西。

1 个答案:

答案 0 :(得分:0)

考虑目标output/index.html。依赖...

%.html: %.md

将有效地扩展到...

output/index.html: output/index.md

,其中$*等于output/index。因此make寻找output/index.md但找不到它-因此出现错误消息。

要获取正确的模式词干($* == index),您需要将基本目录添加到模式规则中...

output/%.html: src/pages/%.md
    @echo $< to $@

编辑1:

如果您担心重复的硬编码字符串(例如outputsrc/pages),则可以始终将它们分配给参数...

OUTPUT_DIR := output
SOURCE_DIR := src/pages

build: $(patsubst $(SOURCE_DIR)/%.md, $(OUTPUT_DIR)/%.html, $(wildcard $(SOURCE_DIR)/*.md))


$(OUTPUT_DIR)/%.html: $(SOURCE_DIR)/%.md
    @echo $< to $@

(假设这就是您的评论中“优化”的意思。)