【问题标题】:CMake - Force find_package to update cache variablesCMake - 强制 find_package 更新缓存变量
【发布时间】:2015-04-06 14:02:33
【问题描述】:

在我的 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")

之后,我尝试通过以下方式查找库:

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    我想我和你有同样的问题。我的设置试图找到一个特定版本的包:

    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 程序有一些更详细的信息我不完全理解,所以这可能不适用于您的情况,但可能值得一试。

    【讨论】:

    • 谢谢,@Paul 帮助我解决了类似的问题:我需要将两个库分别链接到不同版本的 libpython。但不幸的是,这种取消设置某些变量的方法在不同的 Find.cmake 模块中似乎并不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多