Makefiles:如何正确使用$ wildcard递归下降?

问题描述 投票:0回答:1

我有一个markdown文件的文件夹,这些文件正在使用Makefile转换为HTML文件。为了弄清楚源和目标,我使用以下Makefile构造

TARGETS_TO_BUILD := $(patsubst src/%.md, out/%.html, $(wildcard src/*.md src/**/*.md))

如果回显$(TARGETS_TO_BUILD),则会得到路径./out/index.html ./out/folder1/somepage.html的列表,依此类推。工作良好。

但是,如果我开始将源文件放到越来越深的文件夹中,以致我得到一棵深树,那么事情就停止了。该通配符(src/**/*.md)不起作用。我必须开始做这样的事情:

TARGETS_TO_BUILD := $(patsubst src/%.md, out/%.html, $(wildcard src/*.md src/**/*.md src/**/**/*.md src/**/**/**/*.md))

我必须继续添加越来越多的这些。

该glob字符串无法正常工作。我以为他们会无限深入地工作。

makefile
1个回答
1
投票

您误会了。 docs for wildcard support的语法非常清楚,没有列出****是增强的通配符,POSIX glob(3)和fnmatch(3)函数(GNU用于实现glob的功能)不支持,并且POSIX sh不支持。实际上,bash中甚至没有语法(默认情况下),这是大多数GNU / Linux和MacOS系统中的标准外壳。

在标准的glob语法中,***之间没有区别。实际上,*******等与*的含义相同:一次,两次或100次匹配零个或多个字符之间没有区别。

如果要无限递归,最简单的方法是通过find函数的$(shell ...)命令:

TARGETS_TO_BUILD := $(patsubst src/%.md, out/%.html, $(shell find src -name '*.md' -print))
© www.soinside.com 2019 - 2024. All rights reserved.