CMake如何使用单元测试安装测试文件

时间:2012-09-07 06:59:20

标签: unit-testing cmake

我正在使用CMake来构建我的系统和我的单元测试。

我也在进行源外构建。

我发现使用ADD_TEST()命令,您不需要安装测试可执行文件(只需在运行make install时运行,这很棒)。

但是,我的单元测试依赖于某些输入文件,这些文件需要复制到构建可执行文件的位置。

据我所知,我不能使用INSTALL()来复制那里的文件,因为我没有指定那里的位置 - 它取决于调用build命令的位置

有什么方法可以告诉CMake将我的测试文件复制到它构建可执行文件的相同位置?

5 个答案:

答案 0 :(得分:7)

您可以将 configure_file 与参数 COPYONLY 一起使用。并执行复制到您的构建目录:$ {CMAKE_CURRENT_BINARY_DIR}

答案 1 :(得分:3)

当然,您可以通过以下方式在配置步骤中执行此操作:

execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${fileFrom} ${fileTo})

如果您的输入文件依赖于构建产生的内容,您可以为其创建目标并将其添加到all目标:

add_custom_target(copy_my_files ALL
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${fileFrom} ${fileTo}
    DEPENDS ${fileFrom}
)

答案 2 :(得分:3)

这个问题很老了,但在我看来,除了复制${CMAKE_CURRENT_BINARY_DIR})所需的文件之外,还有一个更好的解决方案。 add_test命令具有WORKING_DIRECTORY选项,允许选择运行测试的目录。所以我建议采用以下解决方案:

add_executable(testA testA.cpp)
add_test(NAME ThisIsTestA COMMAND testA WORKING_DIRECTORY ${DIRECTORY_WITH_TEST_DATA})

这可以避免不必要地复制输入文件。

答案 3 :(得分:1)

这可能不是最佳解决方案,但目前我这样做:

file(COPY my_directory DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

似乎正在做这个伎俩。

答案 4 :(得分:0)

要在构建时复制整个目录(并且仅在构建成功时),您可以在添加目标(例如,单元测试可执行文件)之后执行以下操作:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
    ${CMAKE_CURRENT_SOURCE_DIR}/testDataDir $<TARGET_FILE_DIR:${PROJECT_NAME}>/testDataDir)