2015-10-05 19 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不是必需的,您的構建將始終如預期的那樣運行。第二個調用將是一個優化。