【问题标题】:Avoid CMake subcommand after ExternalProject is already installed安装 ExternalProject 后避免使用 CMake 子命令
【发布时间】:2015-10-05 17:25:40
【问题描述】:

我正在处理的项目依赖于 Eigen3。以前,我只是让最终用户在配置步骤中手动指定 Eigen3 标头的路径,但这变得很麻烦,我想从用户身上承担一些责任。我已经建立了一个 CMake 外部项目来通过以下方式获取 HG 存储库:

message( STATUS "Looking for Eigen3 ")
find_package(Eigen3)
if(EIGEN3_FOUND)
  message( STATUS "Looking for Eigen3 - found!")
else()
  find_file(EIGEN3_IN_DEPS Eigen/Core ${PROJECT_BINARY_DIR}/deps/include/eigen3)
  if(NOT EIGEN3_IN_DEPS)
    message( STATUS "Looking for Eigen3 - not found!")
    ExternalProject_Add(eigen3
      PREFIX "${PROJECT_BINARY_DIR}/deps/eigen3"
      HG_REPOSITORY "https://bitbucket.org/eigen/eigen"
      CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/deps"
      "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
      "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
      UPDATE_DISCONNECTED 1)
  endif()
endif()

我遇到的问题是,现在我的 CMake 生成的 Makefile always 每次重新编译我的问题时都会运行 Eigen3 配置步骤。当然,这对于最终用户来说通常不是问题,只有开发人员。我宁愿每次重新编译时都不必等待这个配置,有没有办法指定我应该尝试从 HG Repo 配置 Eigen3 的唯一时间是初始构建?

【问题讨论】:

  • 会不会是你交换了 then 和 else 的情况?找到 eigen 后运行 external_project。
  • 抱歉,这只是因为我需要测试它是否会真正下载 Eigen3 Repo(我的系统上安装了 Eigen3,所以 Eigen3 布尔值始终为真)。我的问题仍然存在,在没有 Eigen3 的机器上关闭了该标志。我会编辑反映!
  • 测试结果总是被缓存。您是否清理缓存文件或删除构建目录?那么这种行为是预期的。
  • 我没有清理缓存文件或删除构建目录。我只是更改了一些源文件并尝试重新编译。

标签: c++ c++11 cmake eigen3


【解决方案1】:

一个明显的如果不太理想的答案:再次运行 CMake。第一次运行 CMake 并构建时,将获取、配置和构建 Eigen3。第二次运行 CMake 时,find_package 将定位 Eigen3,生成的 Makefile 不需要配置和构建 Eigen3。这假设 ExternalProject_Add 将 Eigen3 放在 find_package 可以找到的位置,这可以通过在 these guidelines 之后将 Eigen3 前缀添加到您的 CMAKE_PREFIX_PATH 来完成。

虽然我对“再次运行”的答案感到畏缩,但在这种情况下并没有那么糟糕。不需要第二次运行 cmake,您的构建将始终按预期在第一次运行。第二次调用将是优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2022-11-22
    • 2018-05-14
    • 2019-04-06
    • 2015-04-28
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多