我读了this brilliant tutorial关于如何将Google Test与CMake集成的信息。该项目的大纲如下所示:
+-- CMakeLists.txt
+-- main
| +-- CMakeLists
| +-- main.cpp
|
+-- test
| +-- CMakeLists.txt
| +-- testfoo
| +-- CMakeLists.txt
| +-- main.cpp
| +-- testfoo.h
| +-- testfoo.cpp
| +-- mockbar.h
|
+-- libfoo
| +-- CMakeLists.txt
| +-- foo.h
| +-- foo.cpp
|
+-- libbar
+-- CMakeLists.txt
+-- bar.h
+-- bar.cpp
(感兴趣的是,可以从here检查此示例项目的整个代码)
顶级CMakeLists.txt包含(以及其他)语句enable_testing()
和add_subdirectory(test)
。编译和运行测试用例与此设置完美配合,只需运行
mkdir build && cd build
cmake ..
make
make test
但是如何在不进行所有单元测试的情况下将此项目编译为生产代码,即只编译组件test
,libfoo
和libbar
?
我是否应该以某种方式使语句enable_testing()
和add_subdirectory(test)
依赖于某些构建配置变量?或者最佳做法是什么?
答案 0 :(得分:4)
仅在请求时构建测试,我这样做:
option(BUILD_TEST "Build the unit tests" ON)
if(BUILD_TEST)
add_subdirectory(test)
endif()
在您的情况下,您可以将其修改为testfoo。
当您要求生产时,您可以使用以下代码来仅构建调试模式:
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
add_subdirectory(test)
endif()
答案 1 :(得分:1)
我所做的是为单元测试创建一个自定义宏来执行此操作:
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)
然后您的测试将以特殊目录(test
)而不是常规目录(通常为bin
)结束。然后,对于生产,您只需复制没有测试目录的常规目录。