如何仅用纯Make函数通配匹配指定目录下的文件?
仅用Make纯函数实现通配时只匹配文件的方案
问题背景
现有如下文件结构:
Makefile dir1/ file1 file2 dir2/ file3
需要在不硬编码文件/目录名称、仅使用纯Make内置函数的前提下,获取dir1/下的file1和file2,且已知目录深度固定。
直接使用wildcard函数会同时匹配文件和目录,比如:
FILES_DEPTH1 = $(wildcard *) FILES_DEPTH2 = $(wildcard */*) FILES_DEPTH3 = $(wildcard */*/*)
展开后结果不符合预期:
FILES_DEPTH1 = Makefile dir1 FILES_DEPTH2 = dir1/file1 dir1/file2 dir1/dir2 FILES_DEPTH3 = dir1/dir2/file3
纯Make函数解决方案
核心思路是先通过wildcard获取所有路径,再过滤掉其中的目录项:利用wildcard $(path)/判断路径是否为目录——如果是目录,该表达式会返回非空值;如果是文件则返回空。结合foreach和filter-out即可实现过滤。
针对深度2的文件匹配
# 获取所有深度2的路径(含文件和目录) ALL_DEPTH2 = $(wildcard */*) # 过滤掉目录项,仅保留文件 FILES_DEPTH2 = $(filter-out $(foreach item,$(ALL_DEPTH2),$(if $(wildcard $(item)/),$(item))),$(ALL_DEPTH2))
执行后FILES_DEPTH2会得到预期结果:dir1/file1 dir1/file2
通用化处理逻辑
对于任意已知深度的路径,都可以套用相同逻辑:
- 用
wildcard获取对应深度的所有路径; - 遍历路径列表,通过
wildcard $(item)/识别目录; - 用
filter-out移除目录项,仅保留文件。
比如处理深度1的文件:
ALL_DEPTH1 = $(wildcard *) FILES_DEPTH1 = $(filter-out $(foreach item,$(ALL_DEPTH1),$(if $(wildcard $(item)/),$(item))),$(ALL_DEPTH1))
执行后FILES_DEPTH1仅保留Makefile。
内容的提问来源于stack exchange,提问作者aahlback
相关产品推荐
相关产品推荐

