Windows下Make递归查找所有子目录的实现方案
跨平台递归获取顶层目录下全部子目录的Make方案
原有UNIX环境下的find实现依赖系统自带的find命令,Windows默认cmd/PowerShell环境没有该命令,会直接执行失败。以下提供两种可正常运行的方案:
方案1:纯GNU Make内置实现(全平台兼容,推荐)
完全不依赖系统外部命令,仅用Make内置函数实现递归遍历,在Windows原生Make、Linux、macOS环境下均可正常运行,和原find命令返回结果完全一致。
# 定义递归遍历通配符函数 rwildcard = $(foreach entry,$(wildcard $(1:=/*)),$(call rwildcard,$(entry),$2) $(filter $(subst *,%,$2),$entry)) # 调用函数获取TOP_DIR下所有递归子目录 SUBDIRS := $(call rwildcard,$(TOP_DIR),*) # 如果你需要把顶层目录本身也加入列表,追加下面一行即可 # SUBDIRS += $(TOP_DIR)
实现逻辑说明:
- 逐层遍历指定路径下的所有条目,递归进入每一个子目录继续遍历
- 最终筛选返回所有遍历到的目录路径,不需要调用任何shell外部命令,没有跨平台兼容问题
方案2:按系统分支调用对应系统命令
如果你更倾向于调用系统原生命令,可以通过Make内置的OS变量判断运行环境,分别适配不同系统的目录遍历命令:
ifeq ($(OS),Windows_NT) # Windows环境:用dir命令递归枚举所有目录 SUBDIRS := $(shell dir /s /b /ad $(TOP_DIR)) else # 类UNIX环境:沿用原有find命令实现 SUBDIRS := $(shell find $(TOP_DIR) -type d) endif
注意事项:
- Windows下
dir命令参数:/s开启递归遍历,/b仅输出完整路径,/ad筛选类型为目录的条目 - 该方案存在小概率兼容问题:如果Windows环境优先加载了MSYS2、Git Bash等类UNIX工具的shell,可能会出现命令参数不匹配的错误,稳定性弱于纯内置函数方案
内容的提问来源于stack exchange,提问作者Garnagar
相关产品推荐
相关产品推荐

