gtsam/cmake/HandleBoost.cmake

94 lines
3.7 KiB
CMake
Raw Permalink Normal View History

###############################################################################
# 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)
# 最低版本
2021-08-20 23:10:13 +08:00
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()