GNU Make/Makefile:Windows下递归通配符rwildcard提速优化
Windows下GNU Make递归通配符执行缓慢的问题分析与优化
问题背景
使用了Stack Overflow上的递归通配符Make函数,代码如下:
ifeq ($(OS),Windows_NT) SHELL := cmd endif rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) INPUT_JavaFileStorageTest-AS = $(call rwildcard,src/java/android-filechooser-AS/app/src,*) $(call rwildcard,src/java/JavaFileStorage/app/src,*) $(call rwildcard,src/java/JavaFileStorageTest-AS/app/src,*.java)
实际运行中出现明显平台差异:
- Linux系统下执行速度极快,几乎无感知延迟;
- Windows系统下执行非常缓慢,耗时约10秒(Windows下指定
SHELL := cmd是因为用户路径中可能没有POSIX shell)
原因定位
经排查,问题根源并非递归通配符函数本身,而是GNU Make的内置后缀规则。当在Windows环境下使用cmd作为SHELL时,Make会针对递归通配符找到的每个文件,尝试匹配大量内置的后缀规则进行检查,这一过程产生了额外的性能开销,最终导致严重延迟。
兼容GNU Make 3.x与4.x的优化方案
以下三种方案均可消除Windows下的延迟,且完全兼容macOS默认的3.x版本及更高的4.x版本:
方案1:在Makefile中内置全局参数
在Makefile开头添加配置,全局禁用内置规则:
MAKEFLAGS += --no-builtin-rules
方案2:禁用所有后缀规则
在Makefile中添加空的.SUFFIXES目标,直接取消所有后缀规则匹配:
.SUFFIXES:
方案3:执行Make时手动指定参数
运行Make命令时,通过命令行参数禁用内置规则:
make --no-builtin-rules
内容的提问来源于stack exchange,提问作者usilo
相关产品推荐
相关产品推荐

