我正在处理的项目依赖于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,并且您的构建将始终按预期第一次运行。第二次调用将是优化。