CMake项目中如何仅在nlohmann/json更新时执行测试?
解决nlohmann/json每次编译都跑测试的问题
要搞定这个问题,你只需要调整CMake里ExternalProject的配置,把测试触发逻辑限制在源码更新或首次下载的时候,具体方案如下:
核心配置思路
- 先禁用nlohmann/json自带的测试构建,避免每次本地编译都浪费时间编译测试代码
- 自定义测试触发规则,让测试只在源码更新完成后执行一次,不会干扰日常编译
具体CMake代码示例
include(ExternalProject) ExternalProject_Add( nlohmann_json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.2 # 换成你实际用的版本号 GIT_SHALLOW ON # 浅克隆加速下载 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DBUILD_TESTING=OFF # 关键:关掉nlohmann/json自带的测试构建 -DJSON_BuildTests=OFF # 部分旧版本用这个参数,双保险 UPDATE_DISCONNECTED OFF # 允许检测源码更新(比如切换tag) # 自定义测试逻辑:只在更新/首次下载后跑测试,且测试通过才安装 TEST_COMMAND ${CMAKE_CTEST_COMMAND} --test-dir <BINARY_DIR> -C Release TEST_BEFORE_INSTALL ON TEST_EXCLUDE_FROM_MAIN ON # 不让测试绑定到主构建目标,避免每次编译都触发 ) # 把你的项目目标和nlohmann_json关联,确保依赖生效 add_dependencies(your_project_target nlohmann_json)
关键参数说明
BUILD_TESTING=OFF/JSON_BuildTests=OFF:彻底禁用nlohmann/json的测试代码编译,砍掉不必要的构建环节TEST_EXCLUDE_FROM_MAIN ON:告诉CMake,测试不属于日常构建流程的一部分,不会在你跑make或cmake --build时自动触发TEST_BEFORE_INSTALL ON:保证只有测试通过的版本才会被安装到你的项目里,避免引入有问题的依赖- 如果你想手动触发测试,直接跑
cmake --build . --target nlohmann_json_test就行;当你切换nlohmann/json的版本tag或者拉取新源码时,测试会自动执行一次
进阶自定义(可选)
如果需要更精细的控制,比如自己判断源码是否更新再跑测试,可以自定义更新命令:
ExternalProject_Add( nlohmann_json # 保留前面的GIT、CMAKE_ARGS等配置 UPDATE_COMMAND "" # 禁用默认更新逻辑 CUSTOM_COMMAND COMMAND git pull origin ${GIT_TAG} COMMAND ${CMAKE_CTEST_COMMAND} --test-dir <BINARY_DIR> -C Release WORKING_DIRECTORY <SOURCE_DIR> COMMENT "更新nlohmann_json并运行验证测试" )
这种方式适合对更新流程有特殊需求的场景,但日常用前面的基础配置就足够了。
内容的提问来源于stack exchange,提问作者user18190011
相关产品推荐
相关产品推荐

