安装 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 静态链接到 NATS C 库
ExternalProject_Add 使用 pybind11 进行 CMake 项目的智能方法
如何将环境变量传递给 ExternalProject_Add CONFIGURE_COMMAND?