使用 CMake 在构建时查找和移动具有扩展名的文件

Find and move files with extension at build time using CMake

我目前正在尝试使用 MinGW 在 Windows 上使用来自 CMake 的 Gcov 和 Gcovr。 使用正确的标志编译文件就像一个魅力。 但是,CLion 使用 Gcov 不理解的源外构建。

在 Linux 上,我使用以下命令将所有 *.gcda*.gcno 复制到 CMAKE_BINARY_DIR 子文件夹中的 CMAKE_SOURCE_DIR

set(GCOV_DATA_DIR  "${CMAKE_SOURCE_DIR}/gcov_data")
add_custom_target(prepare_coverage
    # Copy necessary files to CMAKE_SOURCE_DIR
    COMMAND ${CMAKE_COMMAND} -E make_directory ${GCOV_DATA_DIR}
    COMMAND find ${CMAKE_BINARY_DIR} -name \"*.gcda\" -o -name \"*.gcno\" | xargs -l -i cp {} "${GCOV_DATA_DIR}"
)

请注意,测试二进制文件在 CMAKE_BINARY_DIR 中执行。 这工作得很好,之后我可以用一些额外的标志调用 Gcovr 以获得一个不错的报告。

但是,在 Windows 上我没有 xargs(我已经很惊讶 find 确实有效)。 为了使这个 CMake 命令独立于平台,我正在寻找一种方法让 CMake 在构建期间查找和 copy/move 文件(类似于创建目录)。

谁能告诉我这是否可行以及我应该如何做? 当然,我总是可以安装额外的程序或脚本,但我宁愿在 CMake 中解决这个问题,而不必指示所有开发人员安装不同的工具。

如果你的项目中没有使用CMAKE_RUNTIME_OUTPUT_PATH,那么.gcda.gcno文件会在可执行目录中创建,所以你可以用[=计算这个目录13=] generator-expression.

因为您知道源文件的名称,所以您可以计算所有与 gcov 相关的文件的绝对路径,并在没有 find.

的情况下生成适当的复制命令

另一种方法是自己编写 xargs-like program/script,将其与项目一起发布,并在 COMMAND 中使用。所以

... but I'd rather solve this within CMake instead of having to instruct all the developers to install different tools.

不会有问题。