cmake:如何单独编译生产代码和测试代码

时间:2017-01-19 08:53:13

标签: unit-testing cmake googletest

我读了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

但是如何在不进行所有单元测试的情况下将此项目编译为生产代码,即只编译组件testlibfoolibbar

我是否应该以某种方式使语句enable_testing()add_subdirectory(test)依赖于某些构建配置变量?或者最佳做法是什么?

2 个答案:

答案 0 :(得分:4)

仅在请求时构建测试,我这样做:

  1. 添加选项option(BUILD_TEST "Build the unit tests" ON)
  2. 仅在BUILD_TEST开启
  3. 的情况下包括测试子目录

    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)结束。然后,对于生产,您只需复制没有测试目录的常规目录。