使用CMake的FetchContent集成CMocka时,如何禁用其内部测试?
使用CMake的FetchContent集成CMocka时,如何禁用其内部测试?
问题分析
你遇到的核心问题是:尽管已经尝试通过set(CMOCKA_TESTS OFF)禁用CMocka的内部测试,但这些测试仍然被构建并注册到CTest中。这通常由两个原因导致:
- 你的缓存变量设置没有强制覆盖CMocka自身的默认配置(CMocka用
option()定义测试开关,只会在变量未存在时生效) - 主项目的
BUILD_TESTING状态(由enable_testing()开启)被CMocka的子项目继承,意外触发了内部测试的构建
解决方案
下面提供两种经过验证的可靠方案,任选其一即可解决问题:
方案1:增强缓存变量的强制覆盖
在配置CMocka之前,通过带FORCE关键字的set()命令,彻底禁用CMocka的测试和示例(部分示例也会生成测试),同时临时切换主项目的BUILD_TESTING状态:
# 下载CMocka include(FetchContent) FetchContent_Declare( cmocka GIT_REPOSITORY https://git.cryptomilk.org/projects/cmocka.git GIT_TAG cmocka-1.1.5 ) # 强制禁用CMocka的内部测试和示例,覆盖其默认配置 set(CMOCKA_TESTS OFF CACHE BOOL "禁用CMocka内部测试" FORCE) set(CMOCKA_EXAMPLES OFF CACHE BOOL "禁用CMocka示例(部分示例会生成测试)" FORCE) # 临时关闭BUILD_TESTING,避免CMocka继承主项目的测试状态 set(ORIGINAL_BUILD_TESTING ${BUILD_TESTING}) set(BUILD_TESTING OFF CACHE BOOL "" FORCE) # 初始化CMocka FetchContent_MakeAvailable(cmocka) add_library(cmocka::cmocka ALIAS cmocka) # 恢复主项目的测试状态,确保自己的测试正常工作 set(BUILD_TESTING ${ORIGINAL_BUILD_TESTING} CACHE BOOL "" FORCE)
方案2:手动控制FetchContent的初始化流程
如果你希望更精细地控制子项目的构建,可以跳过FetchContent_MakeAvailable,手动完成代码拉取和子目录添加,在这期间禁用CMocka的测试开关:
include(FetchContent) FetchContent_Declare( cmocka GIT_REPOSITORY https://git.cryptomilk.org/projects/cmocka.git GIT_TAG cmocka-1.1.5 ) # 检查CMocka是否已被拉取 FetchContent_GetProperties(cmocka) if(NOT cmocka_POPULATED) # 拉取CMocka代码 FetchContent_Populate(cmocka) # 在添加子目录前,强制禁用CMocka的测试和示例 set(CMOCKA_TESTS OFF CACHE BOOL "" FORCE) set(CMOCKA_EXAMPLES OFF CACHE BOOL "" FORCE) set(BUILD_TESTING OFF CACHE BOOL "" FORCE) # 添加CMocka子目录,用EXCLUDE_FROM_ALL避免默认构建无关目标 add_subdirectory(${cmocka_SOURCE_DIR} ${cmocka_BINARY_DIR} EXCLUDE_FROM_ALL) add_library(cmocka::cmocka ALIAS cmocka) # 恢复主项目的测试状态 set(BUILD_TESTING ON CACHE BOOL "" FORCE) endif()
关键细节说明
FORCE关键字的作用:CMocka用option(CMOCKA_TESTS "Build tests" ON)定义测试开关,这个命令只会在变量未存在时生效。带FORCE的set()会强制覆盖已有的变量值,确保CMocka的配置被你的设置覆盖。- 禁用
CMOCKA_EXAMPLES:部分CMocka的示例代码会被注册为测试,所以同时禁用它可以彻底避免额外测试。 - 临时切换
BUILD_TESTING:主项目的enable_testing()会将BUILD_TESTING设为ON,CMocka的子项目可能会继承这个状态,临时关闭它可以避免意外触发内部测试的构建,之后再恢复不影响自己的测试。
验证方法
修改配置后,重新执行构建和测试:
# 重新生成构建文件 cmake --build . --clean-first # 运行测试 ctest
此时CTest应该只会显示你自己的MyLibTests,CMocka的内部测试(如simple_test、assert_module_test等)会完全消失。
内容来源于stack exchange
相关产品推荐
相关产品推荐

