############################################################################### # Find boost # To change the path for boost, you will need to set: # BOOST_ROOT: path to install prefix for boost # Boost_NO_SYSTEM_PATHS: set to true to keep the find script from ignoring BOOST_ROOT if(MSVC) set(Boost_USE_STATIC_LIBS ON) if(NOT Boost_USE_STATIC_LIBS) list_append_cache(GTSAM_COMPILE_DEFINITIONS_PUBLIC BOOST_ALL_NO_LIB BOOST_ALL_DYN_LINK) endif() if(MSVC_VERSION LESS 1910) list_append_cache(GTSAM_COMPILE_OPTIONS_PRIVATE -Zm295) endif() endif() # ---- 关键修改:强制使用 FindBoost 模块模式,而不是 CONFIG 模式 ---- set(Boost_NO_BOOST_CMAKE ON CACHE BOOL "Use FindBoost module mode" FORCE) # 允许多线程库(照旧) set(Boost_USE_MULTITHREADED ON) # 最低版本 set(BOOST_FIND_MINIMUM_VERSION 1.65) # ---- 关键修改:按版本决定是否需要 system 组件 ---- set(BOOST_FIND_MINIMUM_COMPONENTS serialization filesystem thread program_options date_time timer chrono regex ) # 只有旧版 Boost (< 1.69) 需要 system;>=1.69 为 header-only,不再要求 # 注意:Boost_VERSION 是 find_package 之后才有的,这里用一个预探测逻辑: # 先尝试不带 system;失败再带上 system 尝试一次(兼容极老环境)。 # 也可以用工具链变量提前注入 Boost_VERSION,这里采用两段式最稳妥。 # 第一次尝试:不含 system(适配 Boost>=1.69) message(STATUS "Trying Boost without 'system' component first (>=1.69 header-only)...") set(_boost_try_components ${BOOST_FIND_MINIMUM_COMPONENTS}) set(_boost_found FALSE) find_package(Boost ${BOOST_FIND_MINIMUM_VERSION} COMPONENTS ${_boost_try_components} QUIET) if(Boost_FOUND) set(_boost_found TRUE) else() # 第二次尝试:加入 system(兼容 Boost<1.69) message(STATUS "Retrying Boost with 'system' component for older Boost (<1.69)...") list(APPEND _boost_try_components system) find_package(Boost ${BOOST_FIND_MINIMUM_VERSION} COMPONENTS ${_boost_try_components} REQUIRED) endif() # 记录最终组件集合 set(BOOST_FIND_MINIMUM_COMPONENTS ${_boost_try_components}) # ---- 必要组件检查(按最终集合判断),不要无条件检查 Boost_SYSTEM_LIBRARY ---- set(_missing_required FALSE) foreach(_comp IN LISTS BOOST_FIND_MINIMUM_COMPONENTS) string(TOUPPER "${_comp}" _COMP_UP) if(NOT DEFINED "Boost_${_COMP_UP}_LIBRARY" AND NOT TARGET "Boost::${_comp}") # 某些组件(如 header-only)可能没有 *_LIBRARY 变量,但会有导入目标或仅头文件 # 对 header-only 的 system(>=1.69)这里不会要求 message(STATUS "Note: Boost component '${_comp}' has no explicit *_LIBRARY var; relying on imported target or headers.") endif() endforeach() # ---- 计时接口选择,与原逻辑一致 ---- option(GTSAM_DISABLE_NEW_TIMERS "Disables using Boost.chrono for timing" OFF) # ---- 链接库列表(不再无条件包含 Boost::system)---- set(GTSAM_BOOST_LIBRARIES Boost::serialization Boost::filesystem Boost::thread Boost::date_time Boost::regex ) # 如果最终组件包含 chrono/timer,则追加 if(TARGET Boost::chrono) list(APPEND GTSAM_BOOST_LIBRARIES Boost::chrono) endif() if(TARGET Boost::timer) list(APPEND GTSAM_BOOST_LIBRARIES Boost::timer) endif() # 仅当真的找了 system(即老版本 Boost)时才链接 Boost::system if("system" IN_LIST BOOST_FIND_MINIMUM_COMPONENTS AND TARGET Boost::system) list(APPEND GTSAM_BOOST_LIBRARIES Boost::system) endif() if (GTSAM_DISABLE_NEW_TIMERS) message("WARNING: GTSAM timing instrumentation manually disabled") list_append_cache(GTSAM_COMPILE_DEFINITIONS_PUBLIC DGTSAM_DISABLE_NEW_TIMERS) endif()