我在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
)
无论如何都会触发命令。我不太确定这是否是我需要的选项,所以:
谢谢。
编辑: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
)
谢谢!
答案 0 :(得分:0)
1。为什么这不起作用?
因为您正在混合来自add_custom_command
的两个不同签名的选项。 DEPENDS
来自用于生成文件的表单。 TARGET
和POST_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>
)