29

我希望每次成功构建我的项目时启动我的测试。如果某些测试被破坏,我希望我的构建也被破坏。默认情况下,我需要通过运行ctest命令手动运行测试。CTest 实际上可以构建项目,但我使用调用make来构建源的 IDE。并且make不运行测试。

我将此命令添加到我的根 CMakeLists.txt 文件中,但它不起作用。

add_custom_command(OUTPUT tests.txt 
                   POST_BUILD
                   COMMAND ctest --output-on-failure)

CMake 不返回任何错误,一切正常,但我的自定义命令没有调用。每次在 CMake 中成功构建后,如何运行某些东西?

更新:

我的最终解决方案是创建这个宏:

macro(add_unit_test target target_test)
    set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE)
    add_test(target ${CMAKE_CURRENT_BINARY_DIR}/${target_test})
endmacro(add_unit_test)

它调用add_test并记住列表中的测试目标。此宏添加的项目中的每个测试。在根 CMakeLists.txt 我有这个代码:

add_custom_target( all_tests ALL
                   DEPENDS ${UNIT_TEST_TARGETS}
)
add_custom_command(TARGET all_tests
                   COMMENT "Run tests"
                   POST_BUILD COMMAND ctest ARGS --output-on-failure
                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

它创建依赖于项目中所有单元测试的自定义目标。自定义命令在all_tests构建目标后运行。

4

1 回答 1

29

只有当另一个 CMake 目标依赖于“tests.txt”时,这种形式add_custom_command才会执行。我假设没有其他目标将“tests.txt”作为输入文件,因此自定义命令永远不会运行。

我认为您可以使用第二种形式add_custom_command来实现您的目标;就像是:

add_custom_command(TARGET MainTest
                   POST_BUILD
                   COMMAND ctest -C $<CONFIGURATION> --output-on-failure)
于 2013-02-27T23:33:47.633 回答