我正在处理的项目依赖于Eigen3。以前,我只是让最终用户在配置步骤中手动指定Eigen3 header 的路径,但这变得很麻烦,我想让用户承担一些责任。我已经建立了一个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 总是运行Eigen3配置步骤。当然,对于最终用户(仅对开发人员)而言,这通常不是问题。我宁愿不必在每次重新编译时都等待此配置,有没有一种方法可以指定我应该尝试从HG Repo配置Eigen3的唯一时间是初始构建?

最佳答案

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

尽管我不愿回答“再次运行”,但在这种情况下还不错。不需要第二次运行cmake,并且您的构建将始终按预期第一次运行。第二次调用将是优化。

09-06 05:42