CMake:如何分别编译生产代码和测试代码

4

我阅读了这篇关于如何将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

(如有兴趣,可以从此处检出示例项目的全部代码)
顶级CMakeLists.txt包含(在其他内容中)enable_testing()add_subdirectory(test)语句。使用此设置编译和运行测试用例非常完美,只需运行
mkdir build && cd build
cmake ..
make
make test

但是我该如何将这个项目编译成生产代码,即只包含组件testlibfoolibbar,而不包含所有单元测试呢?

我应该让语句enable_testing()add_subdirectory(test)依赖于某些构建配置变量吗?还是有什么更好的做法?


在单配置make环境中,您可以使CMake命令调用仅依赖于构建配置。我想知道您是否了解EXCLUDE_FROM_DEFAULT_BUILD_<CONFIG>目标属性? - Florian
2个回答

4

为了只在需要时构建测试,我按照以下方法操作:

  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()


1
我做的是为单元测试创建制定的宏,其作用是:
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)

然后你的测试将被放置在一个特殊的目录中(test), 而不是通常的目录(通常是bin). 然后在生产环境中,你只需复制不带测试目录的常规目录即可。

所以你说你通常总是构建生产和测试代码?好的,我越想越同意它(尽管在这种情况下,构建测试代码有时可能会有点繁重,因为它还要下载和构建googletest - 但是有解决方案)。实际上,将其分离到不同的输出目录已经完成。我不太确定您发布的命令会带来什么优势。 - Georg P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接