gtsam/cmake/HandleBoost.cmake

94 lines
3.7 KiB
CMake
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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