13

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

我也在做一个外源构建。

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

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

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

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

4

5 回答 5

8

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

于 2012-09-08T17:30:39.577 回答
7

这个问题很老了,但在我看来,有一个比复制你需要的文件更好的解决方案${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})

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

于 2018-01-12T16:12:35.990 回答
4

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

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}
)
于 2012-09-07T12:22:35.007 回答
2

这可能不是最好的解决方案,但目前我正在这样做:

file(COPY my_directory DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

这似乎在起作用。

于 2012-09-11T05:09:24.737 回答
1

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

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)
于 2020-07-27T14:50:16.680 回答