【问题标题】:Find and move files with extension at build time using CMake使用 CMake 在构建时查找和移动带有扩展名的文件
【发布时间】:2016-09-24 03:15:17
【问题描述】:

我目前正在尝试使用 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 在构建期间查找并复制/移动文件(类似于制作目录)。

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

【问题讨论】:

  • 关于find和cmake,请看here。您可以像这样使用find 的事实让我认为您安装了msys 之类的东西。
  • 正如我提到的,我正在使用 MinGW。我还安装了 MSYS 软件包。
  • 正如您在我对已接受答案的评论中看到的那样,我现在有一个涉及标准 Windows 工具的解决方案。
  • 问题已经回答了。 “随你的项目一起交付”是我使用的解决方案。
  • 也许这个问题可以用更干净的方式解决。有一个guide on cmake website,还有这个very similar question。

标签: windows cmake gcov gcovr


【解决方案1】:

如果你在你的项目中没有使用CMAKE_RUNTIME_OUTPUT_PATH,那么.gcda和.gcno文件会在可执行的目录中创建,所以你可以用$<TARGET_FILE_DIR:tgt>generator-expression计算这个目录。

因为你知道源文件的名称,你可以计算所有gcov相关文件的绝对路径,并在没有find的情况下生成适当的复制命令。

另一种方法是自己编写类似 xargs 的程序/脚本,将其与您的项目一起提供,然后在 COMMAND 中使用它。所以

...但我宁愿在 CMake 中解决这个问题,而不必指示所有开发人员安装不同的工具。

不会有问题的。

【讨论】:

  • 最终使用了在构建期间调用的批处理文件和 bash 文件(根据主机操作系统选择)。批量完成我想要的行为并不太难,bash文件基本上包含我在问题中提到的内容。
猜你喜欢
  • 2017-11-28
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2018-08-31
  • 2023-04-08
  • 1970-01-01
  • 2013-03-30
相关资源
最近更新 更多