2015-02-06 70 views
8

在我的CMake項目中,我提供了一個用戶可以編輯的Boost默認路徑。CMake - 強制find_package更新緩存變量

set(PATH_BOOST_DEFAULT "/softs/boost/${BOOST_VER}/${ARCH}/gcc/${GCCVER}") 
set(PATH_BOOST "${PATH_BOOST_DEFAULT}" CACHE PATH "Default path to Boost") 

在那之後,我嘗試找到庫:

set(BOOST_ROOT "${PATH_BOOST}") 
set(Boost_USE_MULTITHREAD ON) 
set(Boost_USE_STATIC_LIBS ON) 
find_package(Boost 1.53.0 REQUIRED COMPONENTS thread system) 

這工作得很好,併產生了大量的緩存變量像Boost_INCLUDE_DIRBoost_LIBRARY_DIRSBoost_THREAD_LIBRARY_DEBUG

當我嘗試修改緩存變量PATH_BOOST時,我的問題出現了:由FindBoost.cmake生成的緩存變量未更新。似乎再次調用腳本FindBoost.cmake(它會打印有關找到的組件的消息)。我覺得不更新像Boost_INCLUDE_DIR的變量,因爲它們是在緩存中。

有沒有辦法說cmake「如果路徑被用戶修改,通過強制緩存變量來重新引用包?」?

此外,有沒有更好的方法來檢測緩存變量只是被修改比以下醜陋的想法? : -/

set(MY_VAR ${MY_VAR_DEFAULT} CACHE TYPE "") 
if(NOT DEFINED MY_VAR_copy) 
    set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "") 
    mark_as_advanced(FORCE MY_VAR_copy) 
endif() 
if(NOT "${MY_VAR}" STREQUAL "${MY_VAR_copy}") 
    # my_var is modified : do something 
    set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "") 
endif() 

回答

0

我想我和你有同樣的問題。我的設置試圖找到一個包的特定版本:

set (MYPACK_REQUIRED_VERSION 1.2.3) 
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT) 

包配置腳本設置緩存的變量MYPACK_LIBRARIES然後在以後的階段中。但是,當我更改MYPACK_REQUIRED_VERSION變量cmake仍然使用舊的MYPACK_LIBRARIES而不是試圖尋找新版本。

我想我已經通過取消該緩存變量現在解決了這個問題:

set (MYPACK_REQUIRED_VERSION 1.2.3) 
unset (MYPACK_LIBRARIES CACHE) 
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT) 

這似乎在我的情況再次觸發find_package程序。 find_package程序有一些細節我不完全理解,因此這可能不適用於您的情況,但可能值得一試。