2015-10-05 68 views
0

我正在处理的项目依赖于Eigen3。以前,我只是让最终用户在配置步骤中手动指定Eigen3头文件的路径,但这已变得非常麻烦,我想将这些责任从用户身上拿走。我已经建立了一个外部的CMake项目抢到通过HG库:在已安装ExternalProject后避免CMake子命令

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的唯一时间是初始构建?

+0

难道是你交换了then和else的情况吗?当找到特征时您运行external_project。 – Finn

+0

对不起,这只是因为我需要测试它实际上会下载Eigen3 Repo(我的Eigen3安装在我的系统上,所以Eigen3布尔值始终为真)。我没有在没有Eigen3的机器上关闭该标志。我会编辑反映! –

+0

测试结果总是被缓存。你是否清理缓存文件或删除你的构建目录?那么这种行为是可以预料的 – usr1234567

回答

1

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

尽管我对一个“再次运行”的回答感到不满,但在这种情况下并不是那么糟糕。第二次运行cmake不是必需的,您的构建将始终如预期的那样运行。第二个调用将是一个优化。