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

Avoid CMake subcommand after ExternalProject is already installed

我正在做的项目依赖于 Eigen3。以前,我只是让最终用户在配置步骤中手动指定 Eigen3 headers 的路径,但这变得很麻烦,我想从用户身上承担一些责任。我已经设置了一个 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 的唯一时间是初始构建?

一个明显的 if less-than-ideal 答案:运行 再次 CMake。第一次 运行 CMake 和构建时,将获取、配置和构建 Eigen3。 运行第二次使用 CMake 时,find_package 将定位 Eigen3,生成的 Makefile 将不需要配置和构建 Eigen3。这假设 ExternalProject_Add 将 Eigen3 放在 find_package 可以找到的位置,这可以通过将 Eigen3 前缀添加到 these guidelines.[=11= 之后的 CMAKE_PREFIX_PATH 来实现]

虽然我对 "run it again" 的回答感到畏缩,但在这种情况下还算不错。 运行 不需要第二次 cmake,您的构建将始终按预期在第一次运行。第二次调用将是优化。