CMake - 强制find_package更新缓存变量

时间:2015-02-06 12:14:12

标签: cmake

在我的CMake项目中,我提供了一个可由用户编辑的Boost的默认路径。

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

之后,我尝试用以下方法找到lib:

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()

1 个答案:

答案 0 :(得分: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程序的细节,所以这可能对你的情况不起作用,但值得一试。