CMake:如何为每个测试重用相同的test_main.cpp

时间:2018-03-16 02:15:38

标签: c++ cmake catch-unit-test

我想在monorepo中使用测试框架Catch2,其中将有许多组件,每个组件都有自己的测试。我想使用CMake来定义所有构建目标。

Catch2 provides a simple means生成一个公共main()函数,该函数将运行链接到应用程序的所有测试。源文件(我称之为test_main.cpp)只是这两行:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

我想在源代码树中只有test_main.cpp的一个副本,并从每个具有测试的组件目录(最终将是数百个目录的顺序)中引用它。 / p>

如果我复制了test_main.cpp,我可以看到如何设置CMake工作,以便每个目录中都有一个冗余副本进行测试,但我还没弄明白如何只有一个副本。是否有一个我忽略的简单技巧?

1 个答案:

答案 0 :(得分:1)

尝试以下列方式将Catch2集成为CMake interface library

将单个标题文件catch.hpptest_main.cpp添加到他们自己的目录(例如Catch2)以及以下CMakeLists.txt

add_library(catch INTERFACE)
target_include_directories(catch INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_sources(catch INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/test_main.cpp")

最外面的CMakeLists.txt包含带有add_subdirectory的Catch2:

add_subdirectory(Catch2)

然后,您可以通过以下方式在项目中的任何位置设置测试可执行文件:

add_executable(
    project_tests EXCLUDE_FROM_ALL
    test_case1.cpp
    test_case2.cpp
    ...
)

target_link_libraries(project_tests catch)

由于test_main.cpp已作为接口源文件添加到catch,因此它将作为测试可执行文件的一部分进行编译。