build: Find Boost in config mode

The `FindBoost` module has been removed by policy CMP0167.
This commit is contained in:
Hennadii Stepanov
2025-06-26 14:22:22 +01:00
parent 67ea4b9994
commit 14653b869b

View File

@ -29,17 +29,8 @@ function(add_boost_if_needed)
endif() endif()
endif() endif()
# We cannot rely on find_package(Boost ...) to work properly without find_package(Boost 1.73.0 REQUIRED CONFIG)
# Boost_NO_BOOST_CMAKE set until we require a more recent Boost because mark_as_advanced(Boost_INCLUDE_DIR boost_headers_DIR)
# upstream did not ship proper CMake files until 1.82.0.
# Until then, we rely on CMake's FindBoost module.
# See: https://cmake.org/cmake/help/latest/policy/CMP0167.html
if(POLICY CMP0167)
cmake_policy(SET CMP0167 OLD)
endif()
set(Boost_NO_BOOST_CMAKE ON)
find_package(Boost 1.73.0 REQUIRED)
mark_as_advanced(Boost_INCLUDE_DIR)
set_target_properties(Boost::headers PROPERTIES IMPORTED_GLOBAL TRUE) set_target_properties(Boost::headers PROPERTIES IMPORTED_GLOBAL TRUE)
target_compile_definitions(Boost::headers INTERFACE target_compile_definitions(Boost::headers INTERFACE
# We don't use multi_index serialization. # We don't use multi_index serialization.
@ -57,34 +48,24 @@ function(add_boost_if_needed)
# older than 1.80. # older than 1.80.
# See: https://github.com/boostorg/config/pull/430. # See: https://github.com/boostorg/config/pull/430.
set(CMAKE_REQUIRED_DEFINITIONS -DBOOST_NO_CXX98_FUNCTION_BASE) set(CMAKE_REQUIRED_DEFINITIONS -DBOOST_NO_CXX98_FUNCTION_BASE)
set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR}) get_target_property(CMAKE_REQUIRED_INCLUDES Boost::headers INTERFACE_INCLUDE_DIRECTORIES)
include(CMakePushCheckState)
cmake_push_check_state()
include(TryAppendCXXFlags)
set(CMAKE_REQUIRED_FLAGS ${working_compiler_werror_flag}) set(CMAKE_REQUIRED_FLAGS ${working_compiler_werror_flag})
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
include(CheckCXXSourceCompiles)
check_cxx_source_compiles(" check_cxx_source_compiles("
#include <boost/config.hpp> #include <boost/config.hpp>
" NO_DIAGNOSTICS_BOOST_NO_CXX98_FUNCTION_BASE " NO_DIAGNOSTICS_BOOST_NO_CXX98_FUNCTION_BASE
) )
cmake_pop_check_state()
if(NO_DIAGNOSTICS_BOOST_NO_CXX98_FUNCTION_BASE) if(NO_DIAGNOSTICS_BOOST_NO_CXX98_FUNCTION_BASE)
target_compile_definitions(Boost::headers INTERFACE target_compile_definitions(Boost::headers INTERFACE
BOOST_NO_CXX98_FUNCTION_BASE BOOST_NO_CXX98_FUNCTION_BASE
) )
else()
set(CMAKE_REQUIRED_DEFINITIONS)
endif() endif()
# Some package managers, such as vcpkg, vendor Boost.Test separately # Some package managers, such as vcpkg, vendor Boost.Test separately
# from the rest of the headers, so we have to check for it individually. # from the rest of the headers, so we have to check for it individually.
if(BUILD_TESTS AND DEFINED VCPKG_TARGET_TRIPLET) if(BUILD_TESTS AND DEFINED VCPKG_TARGET_TRIPLET)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DBOOST_TEST_NO_MAIN) find_package(boost_included_unit_test_framework ${Boost_VERSION} EXACT REQUIRED CONFIG)
include(CheckIncludeFileCXX)
check_include_file_cxx(boost/test/included/unit_test.hpp HAVE_BOOST_INCLUDED_UNIT_TEST_H)
if(NOT HAVE_BOOST_INCLUDED_UNIT_TEST_H)
message(FATAL_ERROR "Building test_bitcoin executable requested but boost/test/included/unit_test.hpp header not available.")
endif()
endif() endif()
endfunction() endfunction()