安装 ExternalProject 后避免使用 CMake 子命令

Posted

技术标签:

【中文标题】安装 ExternalProject 后避免使用 CMake 子命令【英文标题】:Avoid CMake subcommand after ExternalProject is already installed 【发布时间】: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 的机器上关闭了该标志。我会编辑反映! 测试结果总是被缓存。您是否清理缓存文件或删除构建目录?那么这种行为是预期的。 我没有清理缓存文件或删除构建目录。我只是更改了一些源文件并尝试重新编译。 【参考方案1】:

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

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

【讨论】:

以上是关于安装 ExternalProject 后避免使用 CMake 子命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ExternalProject_Add指定目标?

如何使用 ExternalProject_Add 静态链接到 NATS C 库

ExternalProject_Add 使用 pybind11 进行 CMake 项目的智能方法

如何将环境变量传递给 ExternalProject_Add CONFIGURE_COMMAND?

CMake ExternalProject_Add() 和 FindPackage()

cmake:ExternalProject_Add() 不应用 cmake 参数