如何用CMake为多组测试设置不同的预编译宏定义
在Zephyr中用CMake实现CppUTest多宏值测试方案
核心思路
通过创建多个独立的测试目标,每个目标对应不同的Flash页大小宏定义,实现同一套测试代码在不同宏值下的编译与运行。目标级别的编译定义优先级高于全局选项,能有效覆盖Zephyr设备树生成的宏。
具体实现
1. 用CMake函数批量生成测试目标
编写可复用的CMake函数,自动创建对应不同页大小的测试目标,避免重复代码:
# 定义函数:生成指定页大小的Flash测试目标 # 参数1:基础测试名称;参数2:Flash页大小(2048/4096) function(add_flash_page_test BASE_TEST_NAME PAGE_SIZE) # 创建CppUTest测试目标 add_cpputest(${BASE_TEST_NAME}_${PAGE_SIZE} SOURCES test_flash_buffer.cpp # 你的测试源文件 # 可添加其他依赖源文件,比如被测试的业务代码文件 # SOURCES ../src/flash_buffer.c ) # 强制设置目标的编译宏,覆盖设备树生成的宏 target_compile_definitions(${BASE_TEST_NAME}_${PAGE_SIZE} PRIVATE DT_N_NODELABEL_flashexternal_P_user_bytes_per_page=${PAGE_SIZE} ) # 若测试依赖Zephyr核心库,需链接对应接口(根据实际情况调整) target_link_libraries(${BASE_TEST_NAME}_${PAGE_SIZE} PRIVATE zephyr::zephyr zephyr::ztest # 如果用Zephyr的ztest框架,可添加此依赖 ) endfunction() # 生成两个测试目标,分别对应2048和4096字节的页大小 add_flash_page_test(flash_buffer_test 2048) add_flash_page_test(flash_buffer_test 4096)
2. 验证测试代码的宏引用
确保测试代码或被测试的业务代码直接使用目标宏:
// 业务代码或测试代码中引用宏定义缓冲区大小 #define BUFFER_LENGTH DT_N_NODELABEL_flashexternal_P_user_bytes_per_page uint8_t buffer[BUFFER_LENGTH];
3. 编译与运行测试
- 编译所有测试目标:
west build - 运行单个测试目标(以2048页大小为例):
west build -t run flash_buffer_test_2048 - 若为主机端单元测试(非嵌入式目标),直接运行生成的可执行文件:
./build/zephyr/flash_buffer_test_2048
为什么之前的方法没生效?
- 修改
CMAKE_CXX_FLAGS属于全局设置,Zephyr构建系统可能会追加或覆盖这些选项,优先级低于目标级别的target_compile_definitions。 TEST_INCLUDE_FILES主要用于添加头文件路径,无法直接覆盖预编译宏;add_compile_options同样是全局生效,容易被目标级配置覆盖。
内容的提问来源于stack exchange,提问作者Joris
相关产品推荐
相关产品推荐

