CMake add_custom_command(' POST_BUILD')' DEPENDS'选项被忽略

时间:2018-06-18 16:00:01

标签: cmake

我在CMake上有一个和一个测试项目,我使用这个目录结构和两个(项目)CMakeLists.txt:

/
|- CMakeLists.txt
|- include/libName
|- src/...
|
|- test/
       |- CMakeLists.txt
       |- src/...

外部项目列表定义了库,如:

add_library(libName ${SRC} ${INCLUDE})

并添加' test' as子目录:

add_subdirectory(test)

测试项目列表定义了可执行文件和测试,如:

add_executable(NameTest ${SRC})
target_link_libraries(NameTest libName)
add_test(NAME NameTest COMMAND NameTest)

问题

我在构建库时尝试构建并执行测试程序。如果任何测试失败,我希望库的构建也失败。

这就是我所拥有的(在外部列表文件中):

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND CTEST_OUTPUT_ON_FAILURE=1 ctest
    DEPENDS NameTest # <- This is driving me crazy!
)

如果目标&#39; NameTest&#39;该命令完全忽略如果有一个具有该名称的文件,或者如果没有,则构建。如果整个&#39; DEPENDS&#39;我不能注意到任何差异。选项已删除。

我甚至修改过:

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Bip! Bip! Bip!"
    DEPENDS this_is_not_an_existent_file_nor_target
)

无论如何都会触发命令。我不太确定这是否是我需要的选项,所以:

  1. 为什么这不起作用?
  2. 我如何实现自己的真正目的?
  3. 谢谢。

    编辑:ctest将执行每个测试(add_test),但必须在调用之前构建NameTest可执行文件(尚未列出)!现在将在之后建立库,但之前&#39; POST_BUILD&#39;自定义命令。当然,它失败了。

    我希望CMake意识到运行该自定义命令需要NameTest。

    编辑:我发现Angew的答案很有用,所以我接受了他的回答并对其进行了一些改进:

    add_custom_command(
        TARGET libName
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target NameTest --config $<CONFIG>
        COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIG> --output-on-failure
    )
    

    谢谢!

1 个答案:

答案 0 :(得分:0)

  

1。为什么这不起作用?

因为您正在混合来自add_custom_command的两个不同签名的选项。 DEPENDS来自用于生成文件的表单。 TARGETPOST_BUILD来自向现有目标添加前/后构建命令的表单。

有关这两种用途的更多详细信息,请参阅documentation of add_custom_command

  

2。我怎样才能达到我的真正目的?

我相信以下内容应该符合您的要求:

add_custom_command(
    TARGET libName
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target NameTest --config $<CONFIG>
    COMMAND CTEST_OUTPUT_ON_FAILURE=1 ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test --config $<CONFIG>
)