Makefile如何在编译前统计本次构建需重新编译的.c文件数量
实现方案
Make本身没有直接提供内置的统计接口,但可以通过两种成熟方案在编译执行前拿到待更新的.c文件数量:
方案1:无侵入式临时统计(无需修改Makefile)
利用Make的--dry-run(简写-n)模拟执行特性,该参数只会打印本次构建要执行的命令,不会真实触发编译:
- 执行如下命令即可直接统计数量:
make -n | grep -E '(\$<|\.c)\s*$' | wc -l
- 原理:过滤模拟输出里所有编译
.c文件的命令,匹配到的条目数就是待编译的文件总数。如果你的编译规则有自定义前缀,调整grep的匹配规则即可适配。
方案2:内置到Makefile的稳定统计
如果需要把统计逻辑固定集成到构建流程,可以直接在Makefile里通过内置函数计算:
- 先定义源文件、目标文件变量:
# 示例变量,可替换为你项目里已有的对应定义 SRCS := $(wildcard *.c) OBJS := $(SRCS:.c=.o) NAME := your_target_name
- 新增统计目标:
.PHONY: count-outdated count-outdated: $(eval OUTDATED_OBJS := $(foreach o,$(OBJS),$(if $(or $(not $(wildcard $o)),$(newer $(o:.o=.c),$o)),$o,))) $(eval OUTDATED_SRCS := $(OUTDATED_OBJS:.o=.c)) @echo "待重新编译的.c文件总数:$(words $(OUTDATED_SRCS))" # 若需要打印具体文件列表,取消下面一行的注释 # @echo "文件列表:$(OUTDATED_SRCS)"
- 如果需要每次构建前自动统计,把统计目标加到主目标的依赖首位即可:
$(NAME): count-outdated $(OBJS) # 你的原有链接规则 $(CC) $(OBJS) -o $@
两种方案都不会触发实际的编译动作,能在构建执行前拿到准确的统计结果。
内容的提问来源于stack exchange,提问作者jsiller
相关产品推荐
相关产品推荐

