You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:10:25