【问题标题】:cmake: how to separately compile production code and test codecmake:如何分别编译生产代码和测试代码
【发布时间】:2017-01-19 08:53:12
【问题描述】:

我阅读了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) 以某种方式依赖于某些构建配置变量?或者这方面的最佳做法是什么?

【问题讨论】:

标签: unit-testing cmake googletest


【解决方案1】:

为了仅根据请求构建测试,我这样做:

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

if(BUILD_TEST) add_subdirectory(test) endif()

在您的情况下,您可以将其修改为 testfoo。

当您要求生产时,您可以使用以下代码仅在调试模式下构建:

if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") add_subdirectory(test) endif()

【讨论】:

    【解决方案2】:

    我所做的是为创建单元测试创​​建一个自定义宏:

    set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)
    

    然后您的测试将结束在一个特殊的目录 (test) 而不是常规目录(通常是 bin)。然后对于生产,您只需复制没有测试目录的常规目录。

    【讨论】:

    • 所以你说你通常总是同时构建生产和测试代码?好吧,我想得越多,我就越同意它(尽管在这种情况下构建测试代码有时可能有点繁重,因为它还下载和构建 googletest - 但有解决方案)。实际上已经完成了到不同输出目录的分离。我不太确定您发布的命令会带来什么好处。
    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多