CMake - 强制find_package更新缓存变量

Cad*_*hon 10 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")
Run Code Online (Sandbox Code Playgroud)

在那之后,我尝试找到libs:

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)
Run Code Online (Sandbox Code Playgroud)

这工作得很好,并有很多缓存变量的喜欢Boost_INCLUDE_DIR,Boost_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()
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 1

我想我和你有同样的问题。我的设置尝试查找包的特定版本:

set (MYPACK_REQUIRED_VERSION 1.2.3)
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT)
Run Code Online (Sandbox Code Playgroud)

包配置脚本设置缓存变量,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)
Run Code Online (Sandbox Code Playgroud)

在我的例子中,这似乎再次触发 find_package 过程。该过程的一些细节find_package我不完全理解,因此这可能不适用于您的情况,但可能值得一试。