如何编写Makefile实现项目各模块的批量自动化测试
实现模块化测试的Makefile方案
首先先明确你的项目结构:
/project | |____/bin | |____/obj | |____/include | |____aaa.h | |____bbb.h | |____ccc.h | |____/src | |____aaa.c | |____bbb.c | |____ccc.c | |____/test | |____aaa_test.c | |____bbb_test.c | |____ccc_test.c | |____Makefile
下面是满足你需求的Makefile,它会自动遍历test目录的测试文件,对应编译src中同名(去掉_test后缀)的模块,并生成独立的可执行文件:
# 基础配置:指定编译器、编译选项和各个目录 CC := gcc CFLAGS := -Wall -Wextra -Iinclude OBJ_DIR := obj BIN_DIR := bin SRC_DIR := src TEST_DIR := test # 自动获取所有测试文件,并转换为对应的可执行文件名 TEST_SRCS := $(wildcard $(TEST_DIR)/*.c) TEST_TARGETS := $(patsubst $(TEST_DIR)/%_test.c,$(BIN_DIR)/%,$(TEST_SRCS)) # 默认目标:编译所有测试可执行文件 all: $(TEST_TARGETS) # 生成单个测试可执行文件的规则:匹配对应测试文件和模块目标文件,链接生成可执行文件 $(BIN_DIR)/%: $(TEST_DIR)/%_test.c $(OBJ_DIR)/%.o @mkdir -p $(BIN_DIR) # 确保bin目录存在,@避免打印命令 $(CC) $(CFLAGS) $^ -o $@ # 编译src目录下的模块为目标文件:把src里的.c文件编译到obj目录 $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(OBJ_DIR) # 确保obj目录存在 $(CC) $(CFLAGS) -c $< -o $@ # 清理所有生成的文件 clean: rm -rf $(OBJ_DIR) $(BIN_DIR) # 声明伪目标,避免和同名文件冲突 .PHONY: all clean
关键逻辑拆解
1. 自动遍历与目标生成
- 用**
$(wildcard $(TEST_DIR)/*.c)**自动抓取test目录下所有.c测试文件,不用手动逐个添加 - 用**
$(patsubst)**函数做字符串替换:把test/aaa_test.c这种格式转换成bin/aaa,自动生成所有要编译的可执行文件目标
2. 模块化编译规则
- 每个测试可执行文件(比如
bin/aaa)依赖对应的测试源文件(test/aaa_test.c)和模块目标文件(obj/aaa.o),确保只编译需要的模块 - 模块目标文件会先被编译到
obj目录,避免源文件目录混乱,也方便后续增量编译(只修改了某个模块时,不用重新编译所有文件)
3. 实用辅助功能
- 自动创建
bin和obj目录,不用手动提前创建 clean目标一键清除所有生成文件,方便重新编译.PHONY声明确保all和clean不会被同名文件干扰
使用方法
- 执行
make:一次性编译所有测试模块,可执行文件都会放在bin目录下 - 执行
make bin/aaa:单独编译aaa模块的测试,节省时间 - 执行
make clean:清理所有编译生成的目标文件和可执行文件
内容的提问来源于stack exchange,提问作者giusepped
相关产品推荐
相关产品推荐

