mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-19 01:42:58 +01:00
a7a4e11db8
This check was added for vcpkg, given how it packages Boost. However, we don't need to run the check for other platforms, and it's quite slow. So, scope it to VCPKG. On my machine, this reduces the time to run `cmake -B build` from ~12 seconds, to ~6 seconds. Fixes: #30787
79 lines
3.1 KiB
CMake
79 lines
3.1 KiB
CMake
# Copyright (c) 2023-present The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or https://opensource.org/license/mit/.
|
|
|
|
function(add_boost_if_needed)
|
|
#[=[
|
|
TODO: Not all targets, which will be added in the future, require
|
|
Boost. Therefore, a proper check will be appropriate here.
|
|
|
|
Implementation notes:
|
|
Although only Boost headers are used to build Bitcoin Core,
|
|
we still leverage a standard CMake's approach to handle
|
|
dependencies, i.e., the Boost::headers "library".
|
|
A command target_link_libraries(target PRIVATE Boost::headers)
|
|
will propagate Boost::headers usage requirements to the target.
|
|
For Boost::headers such usage requirements is an include
|
|
directory and other added INTERFACE properties.
|
|
]=]
|
|
|
|
# We cannot rely on find_package(Boost ...) to work properly without
|
|
# Boost_NO_BOOST_CMAKE set until we require a more recent Boost because
|
|
# 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)
|
|
target_compile_definitions(Boost::headers INTERFACE
|
|
# We don't use multi_index serialization.
|
|
BOOST_MULTI_INDEX_DISABLE_SERIALIZATION
|
|
)
|
|
if(DEFINED VCPKG_TARGET_TRIPLET)
|
|
# Workaround for https://github.com/microsoft/vcpkg/issues/36955.
|
|
target_compile_definitions(Boost::headers INTERFACE
|
|
BOOST_NO_USER_CONFIG
|
|
)
|
|
endif()
|
|
|
|
# Prevent use of std::unary_function, which was removed in C++17,
|
|
# and will generate warnings with newer compilers for Boost
|
|
# older than 1.80.
|
|
# See: https://github.com/boostorg/config/pull/430.
|
|
set(CMAKE_REQUIRED_DEFINITIONS -DBOOST_NO_CXX98_FUNCTION_BASE)
|
|
set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR})
|
|
include(CMakePushCheckState)
|
|
cmake_push_check_state()
|
|
include(TryAppendCXXFlags)
|
|
set(CMAKE_REQUIRED_FLAGS ${working_compiler_werror_flag})
|
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
check_cxx_source_compiles("
|
|
#include <boost/config.hpp>
|
|
" NO_DIAGNOSTICS_BOOST_NO_CXX98_FUNCTION_BASE
|
|
)
|
|
cmake_pop_check_state()
|
|
if(NO_DIAGNOSTICS_BOOST_NO_CXX98_FUNCTION_BASE)
|
|
target_compile_definitions(Boost::headers INTERFACE
|
|
BOOST_NO_CXX98_FUNCTION_BASE
|
|
)
|
|
else()
|
|
set(CMAKE_REQUIRED_DEFINITIONS)
|
|
endif()
|
|
|
|
# Some package managers, such as vcpkg, vendor Boost.Test separately
|
|
# from the rest of the headers, so we have to check for it individually.
|
|
if(BUILD_TESTS AND DEFINED VCPKG_TARGET_TRIPLET)
|
|
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DBOOST_TEST_NO_MAIN)
|
|
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()
|
|
|
|
endfunction()
|