使用 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.
不会有问题。
我目前正在尝试使用 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.
不会有问题。