94 lines
3.7 KiB
CMake
94 lines
3.7 KiB
CMake
###############################################################################
|
||
# 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()
|