如何在父CMakeLists.txt中排除子目录的单元测试执行
解决CMake子项目测试干扰父项目
make test的问题 下面是几种可行的解决方案,按优先级推荐:
1. 用标准变量BUILD_TESTING控制子项目测试构建
CMake内置了标准变量BUILD_TESTING,常用于开关测试模块。如果子项目支持该变量(或你能修改子项目的CMakeLists.txt),可在父项目中添加如下配置:
# 引入子项目前临时关闭测试构建 set(BUILD_TESTING OFF CACHE BOOL "Build tests" FORCE) add_subdirectory(subproject) # 若父项目自身需要测试,重新开启 set(BUILD_TESTING ON CACHE BOOL "Build tests" FORCE)
如果子项目原本未判断BUILD_TESTING,可修改子项目的CMakeLists.txt,将测试相关代码包裹:
if(BUILD_TESTING) add_executable(subproject_test ...) # 测试可执行文件构建命令 add_test(NAME sub-tests COMMAND subproject_test) endif()
2. 直接移除子项目添加的测试条目
若无法修改子项目代码,可在父项目add_subdirectory后,调用remove_test删除子项目添加的测试:
add_subdirectory(subproject) # 移除子项目的测试,NAME需与子项目add_test中的名称一致 remove_test(sub-tests)
此操作会将sub-tests从CTest的测试列表中移除,执行make test时不会尝试运行该测试,也就不会出现找不到可执行文件的错误。
3. 标记子项目测试目标为非默认构建
若仅不想编译测试可执行文件(但此方式下测试条目仍存在,执行make test仍会报错,仅作补充参考),可在父项目中设置测试目标的属性:
add_subdirectory(subproject) # 假设子项目测试可执行文件目标为subproject_test set_target_properties(subproject_test PROPERTIES EXCLUDE_FROM_ALL TRUE)
内容的提问来源于stack exchange,提问作者ratnesh zinzuwadia
相关产品推荐
相关产品推荐

