From 2fc912d54d051fb2acc10a67ec8dc13f2490d2fe Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 14 Aug 2025 11:59:57 +0900 Subject: [PATCH 1/6] Make release build use conan deps where possible and hbb 4.0.1 (#516) Co-authored-by: Denis Angell Co-authored-by: Niq Dudfield --- .github/workflows/build-in-docker.yml | 12 +- .gitignore | 5 + Builds/CMake/RippledCore.cmake | 5 + Builds/CMake/RippledNIH.cmake | 33 - Builds/CMake/conan/Boost.cmake | 52 - Builds/CMake/conan/Protobuf.cmake | 22 - Builds/CMake/conan/gRPC.cmake | 62 - Builds/CMake/deps/Boost.cmake | 56 +- Builds/CMake/deps/Ed25519-donna.cmake | 28 - Builds/CMake/deps/FindBoost.cmake | 2200 --------------------- Builds/CMake/deps/Findjemalloc.cmake | 47 - Builds/CMake/deps/Findlibarchive_pc.cmake | 22 - Builds/CMake/deps/Findlz4.cmake | 24 - Builds/CMake/deps/Findsecp256k1.cmake | 24 - Builds/CMake/deps/Findsnappy.cmake | 24 - Builds/CMake/deps/Findsoci.cmake | 19 - Builds/CMake/deps/Findsqlite.cmake | 24 - Builds/CMake/deps/Libarchive.cmake | 163 -- Builds/CMake/deps/Lz4.cmake | 79 - Builds/CMake/deps/Nudb.cmake | 31 - Builds/CMake/deps/OpenSSL.cmake | 48 - Builds/CMake/deps/Postgres.cmake | 70 - Builds/CMake/deps/Protobuf.cmake | 167 +- Builds/CMake/deps/Rocksdb.cmake | 177 -- Builds/CMake/deps/Secp256k1.cmake | 58 - Builds/CMake/deps/Snappy.cmake | 77 - Builds/CMake/deps/Soci.cmake | 165 -- Builds/CMake/deps/Sqlite.cmake | 93 - Builds/CMake/deps/WasmEdge.cmake | 85 +- Builds/CMake/deps/cassandra.cmake | 167 -- Builds/CMake/deps/date.cmake | 18 - Builds/CMake/deps/gRPC.cmake | 349 +--- CMakeLists.txt | 137 +- build-core.sh | 34 +- build-full.sh | 98 +- docker-unit-tests.sh | 2 +- external/snappy/conanfile.py | 11 +- external/soci/conanfile.py | 2 +- release-builder.sh | 150 +- 39 files changed, 292 insertions(+), 4548 deletions(-) delete mode 100644 Builds/CMake/RippledNIH.cmake delete mode 100644 Builds/CMake/conan/Boost.cmake delete mode 100644 Builds/CMake/conan/Protobuf.cmake delete mode 100644 Builds/CMake/conan/gRPC.cmake delete mode 100644 Builds/CMake/deps/Ed25519-donna.cmake delete mode 100644 Builds/CMake/deps/FindBoost.cmake delete mode 100644 Builds/CMake/deps/Findjemalloc.cmake delete mode 100644 Builds/CMake/deps/Findlibarchive_pc.cmake delete mode 100644 Builds/CMake/deps/Findlz4.cmake delete mode 100644 Builds/CMake/deps/Findsecp256k1.cmake delete mode 100644 Builds/CMake/deps/Findsnappy.cmake delete mode 100644 Builds/CMake/deps/Findsoci.cmake delete mode 100644 Builds/CMake/deps/Findsqlite.cmake delete mode 100644 Builds/CMake/deps/Libarchive.cmake delete mode 100644 Builds/CMake/deps/Lz4.cmake delete mode 100644 Builds/CMake/deps/Nudb.cmake delete mode 100644 Builds/CMake/deps/OpenSSL.cmake delete mode 100644 Builds/CMake/deps/Postgres.cmake delete mode 100644 Builds/CMake/deps/Rocksdb.cmake delete mode 100644 Builds/CMake/deps/Secp256k1.cmake delete mode 100644 Builds/CMake/deps/Snappy.cmake delete mode 100644 Builds/CMake/deps/Soci.cmake delete mode 100644 Builds/CMake/deps/Sqlite.cmake delete mode 100644 Builds/CMake/deps/cassandra.cmake delete mode 100644 Builds/CMake/deps/date.cmake diff --git a/.github/workflows/build-in-docker.yml b/.github/workflows/build-in-docker.yml index 9d959bbc9..e57dda8b4 100644 --- a/.github/workflows/build-in-docker.yml +++ b/.github/workflows/build-in-docker.yml @@ -32,19 +32,9 @@ jobs: clean: true fetch-depth: 2 # Only get the last 2 commits, to avoid fetching all history - checkpatterns: - runs-on: [self-hosted, vanity] - needs: checkout - defaults: - run: - working-directory: ${{ needs.checkout.outputs.checkout_path }} - steps: - - name: Check for suspicious patterns - run: /bin/bash suspicious_patterns.sh - build: runs-on: [self-hosted, vanity] - needs: [checkpatterns, checkout] + needs: [checkout] defaults: run: working-directory: ${{ needs.checkout.outputs.checkout_path }} diff --git a/.gitignore b/.gitignore index e372019ed..5f55306f4 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,11 @@ bin/project-cache.jam build/docker +# Ignore release builder files +.env +release-build +cmake-*.tar.gz + # Ignore object files. *.o build diff --git a/Builds/CMake/RippledCore.cmake b/Builds/CMake/RippledCore.cmake index 232787a57..6fc33cdee 100644 --- a/Builds/CMake/RippledCore.cmake +++ b/Builds/CMake/RippledCore.cmake @@ -1068,6 +1068,11 @@ target_link_libraries (rippled Ripple::opts Ripple::libs Ripple::xrpl_core + # Workaround for a Conan 1.x bug that prevents static linking of libstdc++ + # when a dependency (snappy) modifies system_libs. See the comment in + # external/snappy/conanfile.py for a full explanation. + # This is likely not strictly necessary, but listed explicitly as a good practice. + m ) exclude_if_included (rippled) # define a macro for tests that might need to diff --git a/Builds/CMake/RippledNIH.cmake b/Builds/CMake/RippledNIH.cmake deleted file mode 100644 index 60ab3e4bf..000000000 --- a/Builds/CMake/RippledNIH.cmake +++ /dev/null @@ -1,33 +0,0 @@ -#[===================================================================[ - NIH prefix path..this is where we will download - and build any ExternalProjects, and they will hopefully - survive across build directory deletion (manual cleans) -#]===================================================================] - -string (REGEX REPLACE "[ \\/%]+" "_" gen_for_path ${CMAKE_GENERATOR}) -string (TOLOWER ${gen_for_path} gen_for_path) -# HACK: trying to shorten paths for windows CI (which hits 260 MAXPATH easily) -# @see: https://issues.jenkins-ci.org/browse/JENKINS-38706?focusedCommentId=339847 -string (REPLACE "visual_studio" "vs" gen_for_path ${gen_for_path}) -if (NOT DEFINED NIH_CACHE_ROOT) - if (DEFINED ENV{NIH_CACHE_ROOT}) - set (NIH_CACHE_ROOT $ENV{NIH_CACHE_ROOT}) - else () - set (NIH_CACHE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/.nih_c") - endif () -endif () -set (nih_cache_path - "${NIH_CACHE_ROOT}/${gen_for_path}/${CMAKE_CXX_COMPILER_ID}_${CMAKE_CXX_COMPILER_VERSION}") -if (NOT is_multiconfig) - set (nih_cache_path "${nih_cache_path}/${CMAKE_BUILD_TYPE}") -endif () -file(TO_CMAKE_PATH "${nih_cache_path}" nih_cache_path) -message (STATUS "NIH-EP cache path: ${nih_cache_path}") -## two convenience variables: -set (ep_lib_prefix ${CMAKE_STATIC_LIBRARY_PREFIX}) -set (ep_lib_suffix ${CMAKE_STATIC_LIBRARY_SUFFIX}) - -# this is a setting for FetchContent and needs to be -# a cache variable -# https://cmake.org/cmake/help/latest/module/FetchContent.html#populating-the-content -set (FETCHCONTENT_BASE_DIR ${nih_cache_path} CACHE STRING "" FORCE) diff --git a/Builds/CMake/conan/Boost.cmake b/Builds/CMake/conan/Boost.cmake deleted file mode 100644 index 309fb5243..000000000 --- a/Builds/CMake/conan/Boost.cmake +++ /dev/null @@ -1,52 +0,0 @@ -find_package(Boost 1.83 REQUIRED - COMPONENTS - chrono - container - context - coroutine - date_time - filesystem - program_options - regex - system - thread -) - -add_library(ripple_boost INTERFACE) -add_library(Ripple::boost ALIAS ripple_boost) -if(XCODE) - target_include_directories(ripple_boost BEFORE INTERFACE ${Boost_INCLUDE_DIRS}) - target_compile_options(ripple_boost INTERFACE --system-header-prefix="boost/") -else() - target_include_directories(ripple_boost SYSTEM BEFORE INTERFACE ${Boost_INCLUDE_DIRS}) -endif() - -target_link_libraries(ripple_boost - INTERFACE - Boost::boost - Boost::chrono - Boost::container - Boost::coroutine - Boost::date_time - Boost::filesystem - Boost::program_options - Boost::regex - Boost::system - Boost::iostreams - Boost::thread) -if(Boost_COMPILER) - target_link_libraries(ripple_boost INTERFACE Boost::disable_autolinking) -endif() -if(san AND is_clang) - # TODO: gcc does not support -fsanitize-blacklist...can we do something else - # for gcc ? - if(NOT Boost_INCLUDE_DIRS AND TARGET Boost::headers) - get_target_property(Boost_INCLUDE_DIRS Boost::headers INTERFACE_INCLUDE_DIRECTORIES) - endif() - message(STATUS "Adding [${Boost_INCLUDE_DIRS}] to sanitizer blacklist") - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/san_bl.txt "src:${Boost_INCLUDE_DIRS}/*") - target_compile_options(opts - INTERFACE - # ignore boost headers for sanitizing - -fsanitize-blacklist=${CMAKE_CURRENT_BINARY_DIR}/san_bl.txt) -endif() \ No newline at end of file diff --git a/Builds/CMake/conan/Protobuf.cmake b/Builds/CMake/conan/Protobuf.cmake deleted file mode 100644 index 4d4016e49..000000000 --- a/Builds/CMake/conan/Protobuf.cmake +++ /dev/null @@ -1,22 +0,0 @@ -find_package(Protobuf 3.8) - -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/proto_gen) -set(ccbd ${CMAKE_CURRENT_BINARY_DIR}) -set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_BINARY_DIR}/proto_gen) -protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/ripple/proto/ripple.proto) -set(CMAKE_CURRENT_BINARY_DIR ${ccbd}) - -add_library(pbufs STATIC ${PROTO_SRCS} ${PROTO_HDRS}) -target_include_directories(pbufs SYSTEM PUBLIC - ${CMAKE_BINARY_DIR}/proto_gen - ${CMAKE_BINARY_DIR}/proto_gen/src/ripple/proto -) -target_link_libraries(pbufs protobuf::libprotobuf) -target_compile_options(pbufs - PUBLIC - $<$: - --system-header-prefix="google/protobuf" - -Wno-deprecated-dynamic-exception-spec - > -) -add_library(Ripple::pbufs ALIAS pbufs) \ No newline at end of file diff --git a/Builds/CMake/conan/gRPC.cmake b/Builds/CMake/conan/gRPC.cmake deleted file mode 100644 index 0930ba4dd..000000000 --- a/Builds/CMake/conan/gRPC.cmake +++ /dev/null @@ -1,62 +0,0 @@ -find_package(gRPC 1.23) - -#[=================================[ - generate protobuf sources for - grpc defs and bundle into a - static lib -#]=================================] -set(GRPC_GEN_DIR "${CMAKE_BINARY_DIR}/proto_gen_grpc") -file(MAKE_DIRECTORY ${GRPC_GEN_DIR}) -set(GRPC_PROTO_SRCS) -set(GRPC_PROTO_HDRS) -set(GRPC_PROTO_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/proto/org") -file(GLOB_RECURSE GRPC_DEFINITION_FILES LIST_DIRECTORIES false "${GRPC_PROTO_ROOT}/*.proto") -foreach(file ${GRPC_DEFINITION_FILES}) - get_filename_component(_abs_file ${file} ABSOLUTE) - get_filename_component(_abs_dir ${_abs_file} DIRECTORY) - get_filename_component(_basename ${file} NAME_WE) - get_filename_component(_proto_inc ${GRPC_PROTO_ROOT} DIRECTORY) # updir one level - file(RELATIVE_PATH _rel_root_file ${_proto_inc} ${_abs_file}) - get_filename_component(_rel_root_dir ${_rel_root_file} DIRECTORY) - file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_abs_dir}) - - set(src_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.cc") - set(src_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.cc") - set(hdr_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.h") - set(hdr_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.h") - add_custom_command( - OUTPUT ${src_1} ${src_2} ${hdr_1} ${hdr_2} - COMMAND protobuf::protoc - ARGS --grpc_out=${GRPC_GEN_DIR} - --cpp_out=${GRPC_GEN_DIR} - --plugin=protoc-gen-grpc=$ - -I ${_proto_inc} -I ${_rel_dir} - ${_abs_file} - DEPENDS ${_abs_file} protobuf::protoc gRPC::grpc_cpp_plugin - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Running gRPC C++ protocol buffer compiler on ${file}" - VERBATIM) - set_source_files_properties(${src_1} ${src_2} ${hdr_1} ${hdr_2} PROPERTIES GENERATED TRUE) - list(APPEND GRPC_PROTO_SRCS ${src_1} ${src_2}) - list(APPEND GRPC_PROTO_HDRS ${hdr_1} ${hdr_2}) -endforeach() - -add_library(grpc_pbufs STATIC ${GRPC_PROTO_SRCS} ${GRPC_PROTO_HDRS}) -#target_include_directories(grpc_pbufs PRIVATE src) -target_include_directories(grpc_pbufs SYSTEM PUBLIC ${GRPC_GEN_DIR}) -target_link_libraries(grpc_pbufs - "gRPC::grpc++" - # libgrpc is missing references. - absl::random_random -) -target_compile_options(grpc_pbufs - PRIVATE - $<$:-wd4065> - $<$>:-Wno-deprecated-declarations> - PUBLIC - $<$:-wd4996> - $<$: - --system-header-prefix="google/protobuf" - -Wno-deprecated-dynamic-exception-spec - >) -add_library(Ripple::grpc_pbufs ALIAS grpc_pbufs) \ No newline at end of file diff --git a/Builds/CMake/deps/Boost.cmake b/Builds/CMake/deps/Boost.cmake index 6469ba15d..40d3b7667 100644 --- a/Builds/CMake/deps/Boost.cmake +++ b/Builds/CMake/deps/Boost.cmake @@ -1,51 +1,3 @@ -#[===================================================================[ - NIH dep: boost -#]===================================================================] -if((NOT DEFINED BOOST_ROOT) AND(DEFINED ENV{BOOST_ROOT})) - set(BOOST_ROOT $ENV{BOOST_ROOT}) -endif() -if((NOT DEFINED BOOST_LIBRARYDIR) AND(DEFINED ENV{BOOST_LIBRARYDIR})) - set(BOOST_LIBRARYDIR $ENV{BOOST_LIBRARYDIR}) -endif() -file(TO_CMAKE_PATH "${BOOST_ROOT}" BOOST_ROOT) -if(WIN32 OR CYGWIN) - # Workaround for MSVC having two boost versions - x86 and x64 on same PC in stage folders - if((NOT DEFINED BOOST_LIBRARYDIR) AND (DEFINED BOOST_ROOT)) - if(IS_DIRECTORY ${BOOST_ROOT}/stage64/lib) - set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage64/lib) - elseif(IS_DIRECTORY ${BOOST_ROOT}/stage/lib) - set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib) - elseif(IS_DIRECTORY ${BOOST_ROOT}/lib) - set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) - else() - message(WARNING "Did not find expected boost library dir. " - "Defaulting to ${BOOST_ROOT}") - set(BOOST_LIBRARYDIR ${BOOST_ROOT}) - endif() - endif() -endif() -message(STATUS "BOOST_ROOT: ${BOOST_ROOT}") -message(STATUS "BOOST_LIBRARYDIR: ${BOOST_LIBRARYDIR}") - -# uncomment the following as needed to debug FindBoost issues: -#set(Boost_DEBUG ON) - -#[=========================================================[ - boost dynamic libraries don't trivially support @rpath - linking right now (cmake's default), so just force - static linking for macos, or if requested on linux by flag -#]=========================================================] -if(static) - set(Boost_USE_STATIC_LIBS ON) -endif() -set(Boost_USE_MULTITHREADED ON) -if(static AND NOT APPLE) - set(Boost_USE_STATIC_RUNTIME ON) -else() - set(Boost_USE_STATIC_RUNTIME OFF) -endif() -# TBD: -# Boost_USE_DEBUG_RUNTIME: When ON, uses Boost libraries linked against the find_package(Boost 1.86 REQUIRED COMPONENTS chrono @@ -57,12 +9,12 @@ find_package(Boost 1.86 REQUIRED program_options regex system - iostreams - thread) + thread +) add_library(ripple_boost INTERFACE) add_library(Ripple::boost ALIAS ripple_boost) -if(is_xcode) +if(XCODE) target_include_directories(ripple_boost BEFORE INTERFACE ${Boost_INCLUDE_DIRS}) target_compile_options(ripple_boost INTERFACE --system-header-prefix="boost/") else() @@ -77,10 +29,10 @@ target_link_libraries(ripple_boost Boost::coroutine Boost::date_time Boost::filesystem - Boost::iostreams Boost::program_options Boost::regex Boost::system + Boost::iostreams Boost::thread) if(Boost_COMPILER) target_link_libraries(ripple_boost INTERFACE Boost::disable_autolinking) diff --git a/Builds/CMake/deps/Ed25519-donna.cmake b/Builds/CMake/deps/Ed25519-donna.cmake deleted file mode 100644 index 7f352423f..000000000 --- a/Builds/CMake/deps/Ed25519-donna.cmake +++ /dev/null @@ -1,28 +0,0 @@ -#[===================================================================[ - NIH dep: ed25519-donna -#]===================================================================] - -add_library (ed25519-donna STATIC - src/ed25519-donna/ed25519.c) -target_include_directories (ed25519-donna - PUBLIC - $ - $ - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src/ed25519-donna) -#[=========================================================[ - NOTE for macos: - https://github.com/floodyberry/ed25519-donna/issues/29 - our source for ed25519-donna-portable.h has been - patched to workaround this. -#]=========================================================] -target_link_libraries (ed25519-donna PUBLIC OpenSSL::SSL) -add_library (NIH::ed25519-donna ALIAS ed25519-donna) -target_link_libraries (ripple_libs INTERFACE NIH::ed25519-donna) -#[===========================[ - headers installation -#]===========================] -install ( - FILES - src/ed25519-donna/ed25519.h - DESTINATION include/ed25519-donna) diff --git a/Builds/CMake/deps/FindBoost.cmake b/Builds/CMake/deps/FindBoost.cmake deleted file mode 100644 index b55c78365..000000000 --- a/Builds/CMake/deps/FindBoost.cmake +++ /dev/null @@ -1,2200 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -#[=======================================================================[.rst: -FindBoost ---------- - -Find Boost include dirs and libraries - -Use this module by invoking find_package with the form:: - - find_package(Boost - [version] [EXACT] # Minimum or EXACT version e.g. 1.67.0 - [REQUIRED] # Fail with error if Boost is not found - [COMPONENTS ...] # Boost libraries by their canonical name - # e.g. "date_time" for "libboost_date_time" - [OPTIONAL_COMPONENTS ...] - # Optional Boost libraries by their canonical name) - ) # e.g. "date_time" for "libboost_date_time" - -This module finds headers and requested component libraries OR a CMake -package configuration file provided by a "Boost CMake" build. For the -latter case skip to the "Boost CMake" section below. For the former -case results are reported in variables:: - - Boost_FOUND - True if headers and requested libraries were found - Boost_INCLUDE_DIRS - Boost include directories - Boost_LIBRARY_DIRS - Link directories for Boost libraries - Boost_LIBRARIES - Boost component libraries to be linked - Boost__FOUND - True if component was found ( is upper-case) - Boost__LIBRARY - Libraries to link for component (may include - target_link_libraries debug/optimized keywords) - Boost_VERSION_MACRO - BOOST_VERSION value from boost/version.hpp - Boost_VERSION_STRING - Boost version number in x.y.z format - Boost_VERSION - if CMP0093 NEW => same as Boost_VERSION_STRING - if CMP0093 OLD or unset => same as Boost_VERSION_MACRO - Boost_LIB_VERSION - Version string appended to library filenames - Boost_VERSION_MAJOR - Boost major version number (X in X.y.z) - alias: Boost_MAJOR_VERSION - Boost_VERSION_MINOR - Boost minor version number (Y in x.Y.z) - alias: Boost_MINOR_VERSION - Boost_VERSION_PATCH - Boost subminor version number (Z in x.y.Z) - alias: Boost_SUBMINOR_VERSION - Boost_VERSION_COUNT - Amount of version components (3) - Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows) - - Pass to add_definitions() to have diagnostic - information about Boost's automatic linking - displayed during compilation - -Note that Boost Python components require a Python version suffix -(Boost 1.67 and later), e.g. ``python36`` or ``python27`` for the -versions built against Python 3.6 and 2.7, respectively. This also -applies to additional components using Python including -``mpi_python`` and ``numpy``. Earlier Boost releases may use -distribution-specific suffixes such as ``2``, ``3`` or ``2.7``. -These may also be used as suffixes, but note that they are not -portable. - -This module reads hints about search locations from variables:: - - BOOST_ROOT - Preferred installation prefix - (or BOOSTROOT) - BOOST_INCLUDEDIR - Preferred include directory e.g. /include - BOOST_LIBRARYDIR - Preferred library directory e.g. /lib - Boost_NO_SYSTEM_PATHS - Set to ON to disable searching in locations not - specified by these hint variables. Default is OFF. - Boost_ADDITIONAL_VERSIONS - - List of Boost versions not known to this module - (Boost install locations may contain the version) - -and saves search results persistently in CMake cache entries:: - - Boost_INCLUDE_DIR - Directory containing Boost headers - Boost_LIBRARY_DIR_RELEASE - Directory containing release Boost libraries - Boost_LIBRARY_DIR_DEBUG - Directory containing debug Boost libraries - Boost__LIBRARY_DEBUG - Component library debug variant - Boost__LIBRARY_RELEASE - Component library release variant - -The following :prop_tgt:`IMPORTED` targets are also defined:: - - Boost::headers - Target for header-only dependencies - (Boost include directory) - alias: Boost::boost - Boost:: - Target for specific component dependency - (shared or static library); is lower- - case - Boost::diagnostic_definitions - interface target to enable diagnostic - information about Boost's automatic linking - during compilation (adds BOOST_LIB_DIAGNOSTIC) - Boost::disable_autolinking - interface target to disable automatic - linking with MSVC (adds BOOST_ALL_NO_LIB) - Boost::dynamic_linking - interface target to enable dynamic linking - linking with MSVC (adds BOOST_ALL_DYN_LINK) - -Implicit dependencies such as ``Boost::filesystem`` requiring -``Boost::system`` will be automatically detected and satisfied, even -if system is not specified when using :command:`find_package` and if -``Boost::system`` is not added to :command:`target_link_libraries`. If using -``Boost::thread``, then ``Threads::Threads`` will also be added automatically. - -It is important to note that the imported targets behave differently -than variables created by this module: multiple calls to -:command:`find_package(Boost)` in the same directory or sub-directories with -different options (e.g. static or shared) will not override the -values of the targets created by the first call. - -Users may set these hints or results as ``CACHE`` entries. Projects -should not read these entries directly but instead use the above -result variables. Note that some hint names start in upper-case -"BOOST". One may specify these as environment variables if they are -not specified as CMake variables or cache entries. - -This module first searches for the ``Boost`` header files using the above -hint variables (excluding ``BOOST_LIBRARYDIR``) and saves the result in -``Boost_INCLUDE_DIR``. Then it searches for requested component libraries -using the above hints (excluding ``BOOST_INCLUDEDIR`` and -``Boost_ADDITIONAL_VERSIONS``), "lib" directories near ``Boost_INCLUDE_DIR``, -and the library name configuration settings below. It saves the -library directories in ``Boost_LIBRARY_DIR_DEBUG`` and -``Boost_LIBRARY_DIR_RELEASE`` and individual library -locations in ``Boost__LIBRARY_DEBUG`` and ``Boost__LIBRARY_RELEASE``. -When one changes settings used by previous searches in the same build -tree (excluding environment variables) this module discards previous -search results affected by the changes and searches again. - -Boost libraries come in many variants encoded in their file name. -Users or projects may tell this module which variant to find by -setting variables:: - - Boost_USE_DEBUG_LIBS - Set to ON or OFF to specify whether to search - and use the debug libraries. Default is ON. - Boost_USE_RELEASE_LIBS - Set to ON or OFF to specify whether to search - and use the release libraries. Default is ON. - Boost_USE_MULTITHREADED - Set to OFF to use the non-multithreaded - libraries ('mt' tag). Default is ON. - Boost_USE_STATIC_LIBS - Set to ON to force the use of the static - libraries. Default is OFF. - Boost_USE_STATIC_RUNTIME - Set to ON or OFF to specify whether to use - libraries linked statically to the C++ runtime - ('s' tag). Default is platform dependent. - Boost_USE_DEBUG_RUNTIME - Set to ON or OFF to specify whether to use - libraries linked to the MS debug C++ runtime - ('g' tag). Default is ON. - Boost_USE_DEBUG_PYTHON - Set to ON to use libraries compiled with a - debug Python build ('y' tag). Default is OFF. - Boost_USE_STLPORT - Set to ON to use libraries compiled with - STLPort ('p' tag). Default is OFF. - Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS - - Set to ON to use libraries compiled with - STLPort deprecated "native iostreams" - ('n' tag). Default is OFF. - Boost_COMPILER - Set to the compiler-specific library suffix - (e.g. "-gcc43"). Default is auto-computed - for the C++ compiler in use. A list may be - used if multiple compatible suffixes should - be tested for, in decreasing order of - preference. - Boost_ARCHITECTURE - Set to the architecture-specific library suffix - (e.g. "-x64"). Default is auto-computed for the - C++ compiler in use. - Boost_THREADAPI - Suffix for "thread" component library name, - such as "pthread" or "win32". Names with - and without this suffix will both be tried. - Boost_NAMESPACE - Alternate namespace used to build boost with - e.g. if set to "myboost", will search for - myboost_thread instead of boost_thread. - -Other variables one may set to control this module are:: - - Boost_DEBUG - Set to ON to enable debug output from FindBoost. - Please enable this before filing any bug report. - Boost_REALPATH - Set to ON to resolve symlinks for discovered - libraries to assist with packaging. For example, - the "system" component library may be resolved to - "/usr/lib/libboost_system.so.1.67.0" instead of - "/usr/lib/libboost_system.so". This does not - affect linking and should not be enabled unless - the user needs this information. - Boost_LIBRARY_DIR - Default value for Boost_LIBRARY_DIR_RELEASE and - Boost_LIBRARY_DIR_DEBUG. - -On Visual Studio and Borland compilers Boost headers request automatic -linking to corresponding libraries. This requires matching libraries -to be linked explicitly or available in the link library search path. -In this case setting ``Boost_USE_STATIC_LIBS`` to ``OFF`` may not achieve -dynamic linking. Boost automatic linking typically requests static -libraries with a few exceptions (such as ``Boost.Python``). Use:: - - add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) - -to ask Boost to report information about automatic linking requests. - -Example to find Boost headers only:: - - find_package(Boost 1.36.0) - if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) - add_executable(foo foo.cc) - endif() - -Example to find Boost libraries and use imported targets:: - - find_package(Boost 1.56 REQUIRED COMPONENTS - date_time filesystem iostreams) - add_executable(foo foo.cc) - target_link_libraries(foo Boost::date_time Boost::filesystem - Boost::iostreams) - -Example to find Boost Python 3.6 libraries and use imported targets:: - - find_package(Boost 1.67 REQUIRED COMPONENTS - python36 numpy36) - add_executable(foo foo.cc) - target_link_libraries(foo Boost::python36 Boost::numpy36) - -Example to find Boost headers and some *static* (release only) libraries:: - - set(Boost_USE_STATIC_LIBS ON) # only find static libs - set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and - set(Boost_USE_RELEASE_LIBS ON) # only find release libs - set(Boost_USE_MULTITHREADED ON) - set(Boost_USE_STATIC_RUNTIME OFF) - find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...) - if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) - add_executable(foo foo.cc) - target_link_libraries(foo ${Boost_LIBRARIES}) - endif() - -Boost CMake -^^^^^^^^^^^ - -If Boost was built using the boost-cmake project or from Boost 1.70.0 on -it provides a package configuration file for use with find_package's config mode. -This module looks for the package configuration file called -``BoostConfig.cmake`` or ``boost-config.cmake`` and stores the result in -``CACHE`` entry "Boost_DIR". If found, the package configuration file is loaded -and this module returns with no further action. See documentation of -the Boost CMake package configuration for details on what it provides. - -Set ``Boost_NO_BOOST_CMAKE`` to ``ON``, to disable the search for boost-cmake. -#]=======================================================================] - -# The FPHSA helper provides standard way of reporting final search results to -# the user including the version and component checks. -include(FindPackageHandleStandardArgs) - -# Save project's policies -cmake_policy(PUSH) -cmake_policy(SET CMP0057 NEW) # if IN_LIST -#cmake_policy(SET CMP0144 NEW) - -#------------------------------------------------------------------------------- -# Before we go searching, check whether a boost cmake package is available, unless -# the user specifically asked NOT to search for one. -# -# If Boost_DIR is set, this behaves as any find_package call would. If not, -# it looks at BOOST_ROOT and BOOSTROOT to find Boost. -# -if (NOT Boost_NO_BOOST_CMAKE) - # If Boost_DIR is not set, look for BOOSTROOT and BOOST_ROOT as alternatives, - # since these are more conventional for Boost. - if ("$ENV{Boost_DIR}" STREQUAL "") - if (NOT "$ENV{BOOST_ROOT}" STREQUAL "") - set(ENV{Boost_DIR} $ENV{BOOST_ROOT}) - elseif (NOT "$ENV{BOOSTROOT}" STREQUAL "") - set(ENV{Boost_DIR} $ENV{BOOSTROOT}) - endif() - endif() - - # Do the same find_package call but look specifically for the CMake version. - # Note that args are passed in the Boost_FIND_xxxxx variables, so there is no - # need to delegate them to this find_package call. - find_package(Boost QUIET NO_MODULE) - mark_as_advanced(Boost_DIR) - - # If we found a boost cmake package, then we're done. Print out what we found. - # Otherwise let the rest of the module try to find it. - if(Boost_FOUND) - # Neither the legacy boost-cmake nor the new builtin BoostConfig (as in 1.70) - # report the found components in the standard variables, so we need to convert - # them here - if(Boost_FIND_COMPONENTS) - foreach(_comp IN LISTS Boost_FIND_COMPONENTS) - string(TOUPPER ${_comp} _uppercomp) - if(DEFINED Boost${_comp}_FOUND) - set(Boost_${_comp}_FOUND ${Boost${_comp}_FOUND}) - elseif(DEFINED Boost_${_uppercomp}_FOUND) - set(Boost_${_comp}_FOUND ${Boost_${_uppercomp}_FOUND}) - endif() - endforeach() - endif() - - find_package_handle_standard_args(Boost HANDLE_COMPONENTS CONFIG_MODE) - - # Restore project's policies - cmake_policy(POP) - return() - endif() -endif() - - -#------------------------------------------------------------------------------- -# FindBoost functions & macros -# - -# -# Print debug text if Boost_DEBUG is set. -# Call example: -# _Boost_DEBUG_PRINT("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "debug message") -# -function(_Boost_DEBUG_PRINT file line text) - if(Boost_DEBUG) - message(STATUS "[ ${file}:${line} ] ${text}") - endif() -endfunction() - -# -# _Boost_DEBUG_PRINT_VAR(file line variable_name [ENVIRONMENT] -# [SOURCE "short explanation of origin of var value"]) -# -# ENVIRONMENT - look up environment variable instead of CMake variable -# -# Print variable name and its value if Boost_DEBUG is set. -# Call example: -# _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" BOOST_ROOT) -# -function(_Boost_DEBUG_PRINT_VAR file line name) - if(Boost_DEBUG) - cmake_parse_arguments(_args "ENVIRONMENT" "SOURCE" "" ${ARGN}) - - unset(source) - if(_args_SOURCE) - set(source " (${_args_SOURCE})") - endif() - - if(_args_ENVIRONMENT) - if(DEFINED ENV{${name}}) - set(value "\"$ENV{${name}}\"") - else() - set(value "") - endif() - set(_name "ENV{${name}}") - else() - if(DEFINED "${name}") - set(value "\"${${name}}\"") - else() - set(value "") - endif() - set(_name "${name}") - endif() - - _Boost_DEBUG_PRINT("${file}" "${line}" "${_name} = ${value}${source}") - endif() -endfunction() - -############################################ -# -# Check the existence of the libraries. -# -############################################ -# This macro was taken directly from the FindQt4.cmake file that is included -# with the CMake distribution. This is NOT my work. All work was done by the -# original authors of the FindQt4.cmake file. Only minor modifications were -# made to remove references to Qt and make this file more generally applicable -# And ELSE/ENDIF pairs were removed for readability. -######################################################################### - -macro(_Boost_ADJUST_LIB_VARS basename) - if(Boost_INCLUDE_DIR ) - if(Boost_${basename}_LIBRARY_DEBUG AND Boost_${basename}_LIBRARY_RELEASE) - # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for - # single-config generators, set optimized and debug libraries - get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) - if(_isMultiConfig OR CMAKE_BUILD_TYPE) - set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) - else() - # For single-config generators where CMAKE_BUILD_TYPE has no value, - # just use the release libraries - set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} ) - endif() - # FIXME: This probably should be set for both cases - set(Boost_${basename}_LIBRARIES optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) - endif() - - # if only the release version was found, set the debug variable also to the release version - if(Boost_${basename}_LIBRARY_RELEASE AND NOT Boost_${basename}_LIBRARY_DEBUG) - set(Boost_${basename}_LIBRARY_DEBUG ${Boost_${basename}_LIBRARY_RELEASE}) - set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE}) - set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE}) - endif() - - # if only the debug version was found, set the release variable also to the debug version - if(Boost_${basename}_LIBRARY_DEBUG AND NOT Boost_${basename}_LIBRARY_RELEASE) - set(Boost_${basename}_LIBRARY_RELEASE ${Boost_${basename}_LIBRARY_DEBUG}) - set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_DEBUG}) - set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_DEBUG}) - endif() - - # If the debug & release library ends up being the same, omit the keywords - if("${Boost_${basename}_LIBRARY_RELEASE}" STREQUAL "${Boost_${basename}_LIBRARY_DEBUG}") - set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} ) - set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE} ) - endif() - - if(Boost_${basename}_LIBRARY AND Boost_${basename}_HEADER) - set(Boost_${basename}_FOUND ON) - if("x${basename}" STREQUAL "xTHREAD" AND NOT TARGET Threads::Threads) - string(APPEND Boost_ERROR_REASON_THREAD " (missing dependency: Threads)") - set(Boost_THREAD_FOUND OFF) - endif() - endif() - - endif() - # Make variables changeable to the advanced user - mark_as_advanced( - Boost_${basename}_LIBRARY_RELEASE - Boost_${basename}_LIBRARY_DEBUG - ) -endmacro() - -# Detect changes in used variables. -# Compares the current variable value with the last one. -# In short form: -# v != v_LAST -> CHANGED = 1 -# v is defined, v_LAST not -> CHANGED = 1 -# v is not defined, but v_LAST is -> CHANGED = 1 -# otherwise -> CHANGED = 0 -# CHANGED is returned in variable named ${changed_var} -macro(_Boost_CHANGE_DETECT changed_var) - set(${changed_var} 0) - foreach(v ${ARGN}) - if(DEFINED _Boost_COMPONENTS_SEARCHED) - if(${v}) - if(_${v}_LAST) - string(COMPARE NOTEQUAL "${${v}}" "${_${v}_LAST}" _${v}_CHANGED) - else() - set(_${v}_CHANGED 1) - endif() - elseif(_${v}_LAST) - set(_${v}_CHANGED 1) - endif() - if(_${v}_CHANGED) - set(${changed_var} 1) - endif() - else() - set(_${v}_CHANGED 0) - endif() - endforeach() -endmacro() - -# -# Find the given library (var). -# Use 'build_type' to support different lib paths for RELEASE or DEBUG builds -# -macro(_Boost_FIND_LIBRARY var build_type) - - find_library(${var} ${ARGN}) - - if(${var}) - # If this is the first library found then save Boost_LIBRARY_DIR_[RELEASE,DEBUG]. - if(NOT Boost_LIBRARY_DIR_${build_type}) - get_filename_component(_dir "${${var}}" PATH) - set(Boost_LIBRARY_DIR_${build_type} "${_dir}" CACHE PATH "Boost library directory ${build_type}" FORCE) - endif() - elseif(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) - # Try component-specific hints but do not save Boost_LIBRARY_DIR_[RELEASE,DEBUG]. - find_library(${var} HINTS ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT} ${ARGN}) - endif() - - # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is known then search only there. - if(Boost_LIBRARY_DIR_${build_type}) - set(_boost_LIBRARY_SEARCH_DIRS_${build_type} ${Boost_LIBRARY_DIR_${build_type}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "Boost_LIBRARY_DIR_${build_type}") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "_boost_LIBRARY_SEARCH_DIRS_${build_type}") - endif() -endmacro() - -#------------------------------------------------------------------------------- - -# Convert CMAKE_CXX_COMPILER_VERSION to boost compiler suffix version. -function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION _OUTPUT_VERSION_MAJOR _OUTPUT_VERSION_MINOR) - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)(\\.[0-9]+)?" "\\1" - _boost_COMPILER_VERSION_MAJOR "${CMAKE_CXX_COMPILER_VERSION}") - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)(\\.[0-9]+)?" "\\2" - _boost_COMPILER_VERSION_MINOR "${CMAKE_CXX_COMPILER_VERSION}") - - set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}${_boost_COMPILER_VERSION_MINOR}") - - set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} PARENT_SCOPE) - set(${_OUTPUT_VERSION_MAJOR} ${_boost_COMPILER_VERSION_MAJOR} PARENT_SCOPE) - set(${_OUTPUT_VERSION_MINOR} ${_boost_COMPILER_VERSION_MINOR} PARENT_SCOPE) -endfunction() - -# -# Take a list of libraries with "thread" in it -# and prepend duplicates with "thread_${Boost_THREADAPI}" -# at the front of the list -# -function(_Boost_PREPEND_LIST_WITH_THREADAPI _output) - set(_orig_libnames ${ARGN}) - string(REPLACE "thread" "thread_${Boost_THREADAPI}" _threadapi_libnames "${_orig_libnames}") - set(${_output} ${_threadapi_libnames} ${_orig_libnames} PARENT_SCOPE) -endfunction() - -# -# If a library is found, replace its cache entry with its REALPATH -# -function(_Boost_SWAP_WITH_REALPATH _library _docstring) - if(${_library}) - get_filename_component(_boost_filepathreal ${${_library}} REALPATH) - unset(${_library} CACHE) - set(${_library} ${_boost_filepathreal} CACHE FILEPATH "${_docstring}") - endif() -endfunction() - -function(_Boost_CHECK_SPELLING _var) - if(${_var}) - string(TOUPPER ${_var} _var_UC) - message(FATAL_ERROR "ERROR: ${_var} is not the correct spelling. The proper spelling is ${_var_UC}.") - endif() -endfunction() - -# Guesses Boost's compiler prefix used in built library names -# Returns the guess by setting the variable pointed to by _ret -function(_Boost_GUESS_COMPILER_PREFIX _ret) - if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntel") - if(WIN32) - set (_boost_COMPILER "-iw") - else() - set (_boost_COMPILER "-il") - endif() - elseif (GHSMULTI) - set(_boost_COMPILER "-ghs") - elseif("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") - if(MSVC_TOOLSET_VERSION GREATER_EQUAL 150) - # Not yet known. - set(_boost_COMPILER "") - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 140) - # MSVC toolset 14.x versions are forward compatible. - set(_boost_COMPILER "") - foreach(v 9 8 7 6 5 4 3 2 1 0) - if(MSVC_TOOLSET_VERSION GREATER_EQUAL 14${v}) - list(APPEND _boost_COMPILER "-vc14${v}") - endif() - endforeach() - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80) - set(_boost_COMPILER "-vc${MSVC_TOOLSET_VERSION}") - elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.10) - set(_boost_COMPILER "-vc71") - elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13) # Good luck! - set(_boost_COMPILER "-vc7") # yes, this is correct - else() # VS 6.0 Good luck! - set(_boost_COMPILER "-vc6") # yes, this is correct - endif() - - if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang") - string(REPLACE "." ";" VERSION_LIST "${CMAKE_CXX_COMPILER_VERSION}") - list(GET VERSION_LIST 0 CLANG_VERSION_MAJOR) - set(_boost_COMPILER "-clangw${CLANG_VERSION_MAJOR};${_boost_COMPILER}") - endif() - elseif (BORLAND) - set(_boost_COMPILER "-bcb") - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") - set(_boost_COMPILER "-sw") - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "XL") - set(_boost_COMPILER "-xlc") - elseif (MINGW) - if(Boost_VERSION_STRING VERSION_LESS 1.34) - set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34 - else() - _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION _boost_COMPILER_VERSION_MAJOR _boost_COMPILER_VERSION_MINOR) - set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}") - endif() - elseif (UNIX) - _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION _boost_COMPILER_VERSION_MAJOR _boost_COMPILER_VERSION_MINOR) - if(NOT Boost_VERSION_STRING VERSION_LESS 1.69.0) - # From GCC 5 and clang 4, versioning changes and minor becomes patch. - # For those compilers, patch is exclude from compiler tag in Boost 1.69+ library naming. - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND _boost_COMPILER_VERSION_MAJOR VERSION_GREATER 4) - set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}") - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND _boost_COMPILER_VERSION_MAJOR VERSION_GREATER 3) - set(_boost_COMPILER_VERSION "${_boost_COMPILER_VERSION_MAJOR}") - endif() - endif() - - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if(Boost_VERSION_STRING VERSION_LESS 1.34) - set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 - else() - # Determine which version of GCC we have. - if(APPLE) - if(Boost_VERSION_STRING VERSION_LESS 1.36.0) - # In Boost <= 1.35.0, there is no mangled compiler name for - # the macOS/Darwin version of GCC. - set(_boost_COMPILER "") - else() - # In Boost 1.36.0 and newer, the mangled compiler name used - # on macOS/Darwin is "xgcc". - set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}") - endif() - else() - set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") - endif() - endif() - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - # TODO: Find out any Boost version constraints vs clang support. - set(_boost_COMPILER "-clang${_boost_COMPILER_VERSION}") - endif() - else() - set(_boost_COMPILER "") - endif() - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "_boost_COMPILER" SOURCE "guessed") - set(${_ret} ${_boost_COMPILER} PARENT_SCOPE) -endfunction() - -# -# Get component dependencies. Requires the dependencies to have been -# defined for the Boost release version. -# -# component - the component to check -# _ret - list of library dependencies -# -function(_Boost_COMPONENT_DEPENDENCIES component _ret) - # Note: to add a new Boost release, run - # - # % cmake -DBOOST_DIR=/path/to/boost/source -P Utilities/Scripts/BoostScanDeps.cmake - # - # The output may be added in a new block below. If it's the same as - # the previous release, simply update the version range of the block - # for the previous release. Also check if any new components have - # been added, and add any new components to - # _Boost_COMPONENT_HEADERS. - # - # This information was originally generated by running - # BoostScanDeps.cmake against every boost release to date supported - # by FindBoost: - # - # % for version in /path/to/boost/sources/* - # do - # cmake -DBOOST_DIR=$version -P Utilities/Scripts/BoostScanDeps.cmake - # done - # - # The output was then updated by search and replace with these regexes: - # - # - Strip message(STATUS) prefix dashes - # s;^-- ;; - # - Indent - # s;^set(; set(;; - # - Add conditionals - # s;Scanning /path/to/boost/sources/boost_\(.*\)_\(.*\)_\(.*); elseif(NOT Boost_VERSION_STRING VERSION_LESS \1\.\2\.\3 AND Boost_VERSION_STRING VERSION_LESS xxxx); - # - # This results in the logic seen below, but will require the xxxx - # replacing with the following Boost release version (or the next - # minor version to be released, e.g. 1.59 was the latest at the time - # of writing, making 1.60 the next. Identical consecutive releases - # were then merged together by updating the end range of the first - # block and removing the following redundant blocks. - # - # Running the script against all historical releases should be - # required only if the BoostScanDeps.cmake script logic is changed. - # The addition of a new release should only require it to be run - # against the new release. - - # Handle Python version suffixes - if(component MATCHES "^(python|mpi_python|numpy)([0-9][0-9]?|[0-9]\\.[0-9])\$") - set(component "${CMAKE_MATCH_1}") - set(component_python_version "${CMAKE_MATCH_2}") - endif() - - set(_Boost_IMPORTED_TARGETS TRUE) - if(Boost_VERSION_STRING AND Boost_VERSION_STRING VERSION_LESS 1.33.0) - message(WARNING "Imported targets and dependency information not available for Boost version ${Boost_VERSION_STRING} (all versions older than 1.33)") - set(_Boost_IMPORTED_TARGETS FALSE) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.33.0 AND Boost_VERSION_STRING VERSION_LESS 1.35.0) - set(_Boost_IOSTREAMS_DEPENDENCIES regex thread) - set(_Boost_REGEX_DEPENDENCIES thread) - set(_Boost_WAVE_DEPENDENCIES filesystem thread) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.35.0 AND Boost_VERSION_STRING VERSION_LESS 1.36.0) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_WAVE_DEPENDENCIES filesystem system thread) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.36.0 AND Boost_VERSION_STRING VERSION_LESS 1.38.0) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_WAVE_DEPENDENCIES filesystem system thread) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.38.0 AND Boost_VERSION_STRING VERSION_LESS 1.43.0) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES date_time) - set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.43.0 AND Boost_VERSION_STRING VERSION_LESS 1.44.0) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES date_time) - set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.44.0 AND Boost_VERSION_STRING VERSION_LESS 1.45.0) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random serialization) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES date_time) - set(_Boost_WAVE_DEPENDENCIES serialization filesystem system thread date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.45.0 AND Boost_VERSION_STRING VERSION_LESS 1.47.0) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES date_time) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.47.0 AND Boost_VERSION_STRING VERSION_LESS 1.48.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES date_time) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.48.0 AND Boost_VERSION_STRING VERSION_LESS 1.50.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES date_time) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.50.0 AND Boost_VERSION_STRING VERSION_LESS 1.53.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.53.0 AND Boost_VERSION_STRING VERSION_LESS 1.54.0) - set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.54.0 AND Boost_VERSION_STRING VERSION_LESS 1.55.0) - set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.55.0 AND Boost_VERSION_STRING VERSION_LESS 1.56.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.56.0 AND Boost_VERSION_STRING VERSION_LESS 1.59.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.59.0 AND Boost_VERSION_STRING VERSION_LESS 1.60.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.60.0 AND Boost_VERSION_STRING VERSION_LESS 1.61.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.61.0 AND Boost_VERSION_STRING VERSION_LESS 1.62.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.62.0 AND Boost_VERSION_STRING VERSION_LESS 1.63.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.63.0 AND Boost_VERSION_STRING VERSION_LESS 1.65.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_COROUTINE2_DEPENDENCIES context fiber thread chrono system date_time) - set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.65.0 AND Boost_VERSION_STRING VERSION_LESS 1.67.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.67.0 AND Boost_VERSION_STRING VERSION_LESS 1.68.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.68.0 AND Boost_VERSION_STRING VERSION_LESS 1.69.0) - set(_Boost_CHRONO_DEPENDENCIES system) - set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time) - set(_Boost_CONTRACT_DEPENDENCIES thread chrono system date_time) - set(_Boost_COROUTINE_DEPENDENCIES context system) - set(_Boost_FIBER_DEPENDENCIES context thread chrono system date_time) - set(_Boost_FILESYSTEM_DEPENDENCIES system) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) - set(_Boost_RANDOM_DEPENDENCIES system) - set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - elseif(NOT Boost_VERSION_STRING VERSION_LESS 1.69.0 AND Boost_VERSION_STRING VERSION_LESS 1.70.0) - set(_Boost_CONTRACT_DEPENDENCIES thread chrono date_time) - set(_Boost_COROUTINE_DEPENDENCIES context) - set(_Boost_FIBER_DEPENDENCIES context) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) - set(_Boost_THREAD_DEPENDENCIES chrono date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - else() - if(NOT Boost_VERSION_STRING VERSION_LESS 1.70.0) - set(_Boost_CONTRACT_DEPENDENCIES thread chrono date_time) - set(_Boost_COROUTINE_DEPENDENCIES context) - set(_Boost_FIBER_DEPENDENCIES context) - set(_Boost_IOSTREAMS_DEPENDENCIES regex) - set(_Boost_LOG_DEPENDENCIES date_time log_setup filesystem thread regex chrono atomic) - set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic) - set(_Boost_MPI_DEPENDENCIES serialization) - set(_Boost_MPI_PYTHON_DEPENDENCIES python${component_python_version} mpi serialization) - set(_Boost_NUMPY_DEPENDENCIES python${component_python_version}) - set(_Boost_THREAD_DEPENDENCIES chrono date_time atomic) - set(_Boost_TIMER_DEPENDENCIES chrono system) - set(_Boost_WAVE_DEPENDENCIES filesystem serialization thread chrono date_time atomic) - set(_Boost_WSERIALIZATION_DEPENDENCIES serialization) - endif() - - # Special handling for Boost 1.86.0 and higher - if(NOT Boost_VERSION_STRING VERSION_LESS 1.86.0) - # Explicitly set these for Boost 1.86 - set(_Boost_IOSTREAMS_DEPENDENCIES "") # No dependencies for iostreams in 1.86 - - # Debug output to help diagnose the issue - if(Boost_DEBUG) - message(STATUS "Using special dependency settings for Boost 1.86.0+") - message(STATUS "Component: ${component}, uppercomponent: ${uppercomponent}") - message(STATUS "Boost_VERSION_STRING: ${Boost_VERSION_STRING}") - message(STATUS "BOOST_ROOT: $ENV{BOOST_ROOT}") - message(STATUS "BOOST_LIBRARYDIR: $ENV{BOOST_LIBRARYDIR}") - endif() - endif() - - # Only show warning for versions beyond what we've defined - if(NOT Boost_VERSION_STRING VERSION_LESS 1.87.0) - message(WARNING "New Boost version may have incorrect or missing dependencies and imported targets") - endif() - endif() - - string(TOUPPER ${component} uppercomponent) - set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) - set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE) - - string(REGEX REPLACE ";" " " _boost_DEPS_STRING "${_Boost_${uppercomponent}_DEPENDENCIES}") - if (NOT _boost_DEPS_STRING) - set(_boost_DEPS_STRING "(none)") - endif() - # message(STATUS "Dependencies for Boost::${component}: ${_boost_DEPS_STRING}") -endfunction() - -# -# Get component headers. This is the primary header (or headers) for -# a given component, and is used to check that the headers are present -# as well as the library itself as an extra sanity check of the build -# environment. -# -# component - the component to check -# _hdrs -# -function(_Boost_COMPONENT_HEADERS component _hdrs) - # Handle Python version suffixes - if(component MATCHES "^(python|mpi_python|numpy)([0-9][0-9]?|[0-9]\\.[0-9])\$") - set(component "${CMAKE_MATCH_1}") - set(component_python_version "${CMAKE_MATCH_2}") - endif() - - # Note: new boost components will require adding here. The header - # must be present in all versions of Boost providing a library. - set(_Boost_ATOMIC_HEADERS "boost/atomic.hpp") - set(_Boost_CHRONO_HEADERS "boost/chrono.hpp") - set(_Boost_CONTAINER_HEADERS "boost/container/container_fwd.hpp") - set(_Boost_CONTRACT_HEADERS "boost/contract.hpp") - if(Boost_VERSION_STRING VERSION_LESS 1.61.0) - set(_Boost_CONTEXT_HEADERS "boost/context/all.hpp") - else() - set(_Boost_CONTEXT_HEADERS "boost/context/detail/fcontext.hpp") - endif() - set(_Boost_COROUTINE_HEADERS "boost/coroutine/all.hpp") - set(_Boost_DATE_TIME_HEADERS "boost/date_time/date.hpp") - set(_Boost_EXCEPTION_HEADERS "boost/exception/exception.hpp") - set(_Boost_FIBER_HEADERS "boost/fiber/all.hpp") - set(_Boost_FILESYSTEM_HEADERS "boost/filesystem/path.hpp") - set(_Boost_GRAPH_HEADERS "boost/graph/adjacency_list.hpp") - set(_Boost_GRAPH_PARALLEL_HEADERS "boost/graph/adjacency_list.hpp") - set(_Boost_IOSTREAMS_HEADERS "boost/iostreams/stream.hpp") - set(_Boost_LOCALE_HEADERS "boost/locale.hpp") - set(_Boost_LOG_HEADERS "boost/log/core.hpp") - set(_Boost_LOG_SETUP_HEADERS "boost/log/detail/setup_config.hpp") - set(_Boost_MATH_HEADERS "boost/math_fwd.hpp") - set(_Boost_MATH_C99_HEADERS "boost/math/tr1.hpp") - set(_Boost_MATH_C99F_HEADERS "boost/math/tr1.hpp") - set(_Boost_MATH_C99L_HEADERS "boost/math/tr1.hpp") - set(_Boost_MATH_TR1_HEADERS "boost/math/tr1.hpp") - set(_Boost_MATH_TR1F_HEADERS "boost/math/tr1.hpp") - set(_Boost_MATH_TR1L_HEADERS "boost/math/tr1.hpp") - set(_Boost_MPI_HEADERS "boost/mpi.hpp") - set(_Boost_MPI_PYTHON_HEADERS "boost/mpi/python/config.hpp") - set(_Boost_NUMPY_HEADERS "boost/python/numpy.hpp") - set(_Boost_PRG_EXEC_MONITOR_HEADERS "boost/test/prg_exec_monitor.hpp") - set(_Boost_PROGRAM_OPTIONS_HEADERS "boost/program_options.hpp") - set(_Boost_PYTHON_HEADERS "boost/python.hpp") - set(_Boost_RANDOM_HEADERS "boost/random.hpp") - set(_Boost_REGEX_HEADERS "boost/regex.hpp") - set(_Boost_SERIALIZATION_HEADERS "boost/serialization/serialization.hpp") - set(_Boost_SIGNALS_HEADERS "boost/signals.hpp") - set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp") - set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp") - set(_Boost_STACKTRACE_BASIC_HEADERS "boost/stacktrace.hpp") - set(_Boost_STACKTRACE_NOOP_HEADERS "boost/stacktrace.hpp") - set(_Boost_STACKTRACE_WINDBG_CACHED_HEADERS "boost/stacktrace.hpp") - set(_Boost_STACKTRACE_WINDBG_HEADERS "boost/stacktrace.hpp") - set(_Boost_SYSTEM_HEADERS "boost/system/config.hpp") - set(_Boost_TEST_EXEC_MONITOR_HEADERS "boost/test/test_exec_monitor.hpp") - set(_Boost_THREAD_HEADERS "boost/thread.hpp") - set(_Boost_TIMER_HEADERS "boost/timer.hpp") - set(_Boost_TYPE_ERASURE_HEADERS "boost/type_erasure/config.hpp") - set(_Boost_UNIT_TEST_FRAMEWORK_HEADERS "boost/test/framework.hpp") - set(_Boost_WAVE_HEADERS "boost/wave.hpp") - set(_Boost_WSERIALIZATION_HEADERS "boost/archive/text_wiarchive.hpp") - if(WIN32) - set(_Boost_BZIP2_HEADERS "boost/iostreams/filter/bzip2.hpp") - set(_Boost_ZLIB_HEADERS "boost/iostreams/filter/zlib.hpp") - endif() - - string(TOUPPER ${component} uppercomponent) - set(${_hdrs} ${_Boost_${uppercomponent}_HEADERS} PARENT_SCOPE) - - string(REGEX REPLACE ";" " " _boost_HDRS_STRING "${_Boost_${uppercomponent}_HEADERS}") - if (NOT _boost_HDRS_STRING) - set(_boost_HDRS_STRING "(none)") - endif() - # message(STATUS "Headers for Boost::${component}: ${_boost_HDRS_STRING}") -endfunction() - -# -# Determine if any missing dependencies require adding to the component list. -# -# Sets _Boost_${COMPONENT}_DEPENDENCIES for each required component, -# plus _Boost_IMPORTED_TARGETS (TRUE if imported targets should be -# defined; FALSE if dependency information is unavailable). -# -# componentvar - the component list variable name -# extravar - the indirect dependency list variable name -# -# -function(_Boost_MISSING_DEPENDENCIES componentvar extravar) - # _boost_unprocessed_components - list of components requiring processing - # _boost_processed_components - components already processed (or currently being processed) - # _boost_new_components - new components discovered for future processing - # - list(APPEND _boost_unprocessed_components ${${componentvar}}) - - while(_boost_unprocessed_components) - list(APPEND _boost_processed_components ${_boost_unprocessed_components}) - foreach(component ${_boost_unprocessed_components}) - string(TOUPPER ${component} uppercomponent) - set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) - _Boost_COMPONENT_DEPENDENCIES("${component}" _Boost_${uppercomponent}_DEPENDENCIES) - set(_Boost_${uppercomponent}_DEPENDENCIES ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE) - set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE) - foreach(componentdep ${_Boost_${uppercomponent}_DEPENDENCIES}) - if (NOT ("${componentdep}" IN_LIST _boost_processed_components OR "${componentdep}" IN_LIST _boost_new_components)) - list(APPEND _boost_new_components ${componentdep}) - endif() - endforeach() - endforeach() - set(_boost_unprocessed_components ${_boost_new_components}) - unset(_boost_new_components) - endwhile() - set(_boost_extra_components ${_boost_processed_components}) - if(_boost_extra_components AND ${componentvar}) - list(REMOVE_ITEM _boost_extra_components ${${componentvar}}) - endif() - set(${componentvar} ${_boost_processed_components} PARENT_SCOPE) - set(${extravar} ${_boost_extra_components} PARENT_SCOPE) -endfunction() - -# -# Some boost libraries may require particular set of compler features. -# The very first one was `boost::fiber` introduced in Boost 1.62. -# One can check required compiler features of it in -# - `${Boost_ROOT}/libs/fiber/build/Jamfile.v2`; -# - `${Boost_ROOT}/libs/context/build/Jamfile.v2`. -# -# TODO (Re)Check compiler features on (every?) release ??? -# One may use the following command to get the files to check: -# -# $ find . -name Jamfile.v2 | grep build | xargs grep -l cxx1 -# -function(_Boost_COMPILER_FEATURES component _ret) - # Boost >= 1.62 - if(NOT Boost_VERSION_STRING VERSION_LESS 1.62.0) - set(_Boost_FIBER_COMPILER_FEATURES - cxx_alias_templates - cxx_auto_type - cxx_constexpr - cxx_defaulted_functions - cxx_final - cxx_lambdas - cxx_noexcept - cxx_nullptr - cxx_rvalue_references - cxx_thread_local - cxx_variadic_templates - ) - # Compiler feature for `context` same as for `fiber`. - set(_Boost_CONTEXT_COMPILER_FEATURES ${_Boost_FIBER_COMPILER_FEATURES}) - endif() - - # Boost Contract library available in >= 1.67 - if(NOT Boost_VERSION_STRING VERSION_LESS 1.67.0) - # From `libs/contract/build/boost_contract_build.jam` - set(_Boost_CONTRACT_COMPILER_FEATURES - cxx_lambdas - cxx_variadic_templates - ) - endif() - - string(TOUPPER ${component} uppercomponent) - set(${_ret} ${_Boost_${uppercomponent}_COMPILER_FEATURES} PARENT_SCOPE) -endfunction() - -# -# Update library search directory hint variable with paths used by prebuilt boost binaries. -# -# Prebuilt windows binaries (https://sourceforge.net/projects/boost/files/boost-binaries/) -# have library directories named using MSVC compiler version and architecture. -# This function would append corresponding directories if MSVC is a current compiler, -# so having `BOOST_ROOT` would be enough to specify to find everything. -# -function(_Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS componentlibvar basedir) - if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_arch_suffix 64) - else() - set(_arch_suffix 32) - endif() - if(MSVC_TOOLSET_VERSION GREATER_EQUAL 150) - # Not yet known. - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 140) - # MSVC toolset 14.x versions are forward compatible. - foreach(v 9 8 7 6 5 4 3 2 1 0) - if(MSVC_TOOLSET_VERSION GREATER_EQUAL 14${v}) - list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-14.${v}) - endif() - endforeach() - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80) - math(EXPR _toolset_major_version "${MSVC_TOOLSET_VERSION} / 10") - list(APPEND ${componentlibvar} ${basedir}/lib${_arch_suffix}-msvc-${_toolset_major_version}.0) - endif() - set(${componentlibvar} ${${componentlibvar}} PARENT_SCOPE) - endif() -endfunction() - -# -# End functions/macros -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# main. -#------------------------------------------------------------------------------- - - -# If the user sets Boost_LIBRARY_DIR, use it as the default for both -# configurations. -if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR) - set(Boost_LIBRARY_DIR_RELEASE "${Boost_LIBRARY_DIR}") -endif() -if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR) - set(Boost_LIBRARY_DIR_DEBUG "${Boost_LIBRARY_DIR}") -endif() - -if(NOT DEFINED Boost_USE_DEBUG_LIBS) - set(Boost_USE_DEBUG_LIBS TRUE) -endif() -if(NOT DEFINED Boost_USE_RELEASE_LIBS) - set(Boost_USE_RELEASE_LIBS TRUE) -endif() -if(NOT DEFINED Boost_USE_MULTITHREADED) - set(Boost_USE_MULTITHREADED TRUE) -endif() -if(NOT DEFINED Boost_USE_DEBUG_RUNTIME) - set(Boost_USE_DEBUG_RUNTIME TRUE) -endif() - -# Check the version of Boost against the requested version. -if(Boost_FIND_VERSION AND NOT Boost_FIND_VERSION_MINOR) - message(SEND_ERROR "When requesting a specific version of Boost, you must provide at least the major and minor version numbers, e.g., 1.34") -endif() - -if(Boost_FIND_VERSION_EXACT) - # The version may appear in a directory with or without the patch - # level, even when the patch level is non-zero. - set(_boost_TEST_VERSIONS - "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}.${Boost_FIND_VERSION_PATCH}" - "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") -else() - # The user has not requested an exact version. Among known - # versions, find those that are acceptable to the user request. - # - # Note: When adding a new Boost release, also update the dependency - # information in _Boost_COMPONENT_DEPENDENCIES and - # _Boost_COMPONENT_HEADERS. See the instructions at the top of - # _Boost_COMPONENT_DEPENDENCIES. - set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} - "1.70.0" "1.70" "1.69.0" "1.69" - "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65" - "1.64.0" "1.64" "1.63.0" "1.63" "1.62.0" "1.62" "1.61.0" "1.61" "1.60.0" "1.60" - "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55" - "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51" - "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1" - "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42" - "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37" - "1.36.1" "1.36.0" "1.36" "1.35.1" "1.35.0" "1.35" "1.34.1" "1.34.0" - "1.34" "1.33.1" "1.33.0" "1.33") - - set(_boost_TEST_VERSIONS) - if(Boost_FIND_VERSION) - set(_Boost_FIND_VERSION_SHORT "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") - # Select acceptable versions. - foreach(version ${_Boost_KNOWN_VERSIONS}) - if(NOT "${version}" VERSION_LESS "${Boost_FIND_VERSION}") - # This version is high enough. - list(APPEND _boost_TEST_VERSIONS "${version}") - elseif("${version}.99" VERSION_EQUAL "${_Boost_FIND_VERSION_SHORT}.99") - # This version is a short-form for the requested version with - # the patch level dropped. - list(APPEND _boost_TEST_VERSIONS "${version}") - endif() - endforeach() - else() - # Any version is acceptable. - set(_boost_TEST_VERSIONS "${_Boost_KNOWN_VERSIONS}") - endif() -endif() - -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_TEST_VERSIONS") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_USE_MULTITHREADED") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_USE_STATIC_LIBS") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_USE_STATIC_RUNTIME") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_ADDITIONAL_VERSIONS") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_NO_SYSTEM_PATHS") - -# Supply Boost_LIB_DIAGNOSTIC_DEFINITIONS as a convenience target. It -# will only contain any interface definitions on WIN32, but is created -# on all platforms to keep end user code free from platform dependent -# code. Also provide convenience targets to disable autolinking and -# enable dynamic linking. -if(NOT TARGET Boost::diagnostic_definitions) - add_library(Boost::diagnostic_definitions INTERFACE IMPORTED) - add_library(Boost::disable_autolinking INTERFACE IMPORTED) - add_library(Boost::dynamic_linking INTERFACE IMPORTED) - set_target_properties(Boost::dynamic_linking PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_DYN_LINK") -endif() -if(WIN32) - # In windows, automatic linking is performed, so you do not have - # to specify the libraries. If you are linking to a dynamic - # runtime, then you can choose to link to either a static or a - # dynamic Boost library, the default is to do a static link. You - # can alter this for a specific library "whatever" by defining - # BOOST_WHATEVER_DYN_LINK to force Boost library "whatever" to be - # linked dynamically. Alternatively you can force all Boost - # libraries to dynamic link by defining BOOST_ALL_DYN_LINK. - - # This feature can be disabled for Boost library "whatever" by - # defining BOOST_WHATEVER_NO_LIB, or for all of Boost by defining - # BOOST_ALL_NO_LIB. - - # If you want to observe which libraries are being linked against - # then defining BOOST_LIB_DIAGNOSTIC will cause the auto-linking - # code to emit a #pragma message each time a library is selected - # for linking. - set(Boost_LIB_DIAGNOSTIC_DEFINITIONS "-DBOOST_LIB_DIAGNOSTIC") - set_target_properties(Boost::diagnostic_definitions PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "BOOST_LIB_DIAGNOSTIC") - set_target_properties(Boost::disable_autolinking PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_NO_LIB") -endif() - -if (POLICY CMP0074) - cmake_policy(GET CMP0074 _Boost_CMP0074) - if(NOT "x${_Boost_CMP0074}x" STREQUAL "xNEWx") - _Boost_CHECK_SPELLING(Boost_ROOT) - endif() - unset(_Boost_CMP0074) -endif () -_Boost_CHECK_SPELLING(Boost_LIBRARYDIR) -_Boost_CHECK_SPELLING(Boost_INCLUDEDIR) - -# Collect environment variable inputs as hints. Do not consider changes. -foreach(v BOOSTROOT BOOST_ROOT BOOST_INCLUDEDIR BOOST_LIBRARYDIR) - set(_env $ENV{${v}}) - if(_env) - file(TO_CMAKE_PATH "${_env}" _ENV_${v}) - else() - set(_ENV_${v} "") - endif() -endforeach() -if(NOT _ENV_BOOST_ROOT AND _ENV_BOOSTROOT) - set(_ENV_BOOST_ROOT "${_ENV_BOOSTROOT}") -endif() - -# Collect inputs and cached results. Detect changes since the last run. -if(NOT BOOST_ROOT AND BOOSTROOT) - set(BOOST_ROOT "${BOOSTROOT}") -endif() -set(_Boost_VARS_DIR - BOOST_ROOT - Boost_NO_SYSTEM_PATHS - ) - -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "BOOST_ROOT") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "BOOST_ROOT" ENVIRONMENT) -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "BOOST_INCLUDEDIR") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "BOOST_INCLUDEDIR" ENVIRONMENT) -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "BOOST_LIBRARYDIR") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "BOOST_LIBRARYDIR" ENVIRONMENT) - -# ------------------------------------------------------------------------ -# Search for Boost include DIR -# ------------------------------------------------------------------------ - -set(_Boost_VARS_INC BOOST_INCLUDEDIR Boost_INCLUDE_DIR Boost_ADDITIONAL_VERSIONS) -_Boost_CHANGE_DETECT(_Boost_CHANGE_INCDIR ${_Boost_VARS_DIR} ${_Boost_VARS_INC}) -# Clear Boost_INCLUDE_DIR if it did not change but other input affecting the -# location did. We will find a new one based on the new inputs. -if(_Boost_CHANGE_INCDIR AND NOT _Boost_INCLUDE_DIR_CHANGED) - unset(Boost_INCLUDE_DIR CACHE) -endif() - -if(NOT Boost_INCLUDE_DIR) - set(_boost_INCLUDE_SEARCH_DIRS "") - if(BOOST_INCLUDEDIR) - list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_INCLUDEDIR}) - elseif(_ENV_BOOST_INCLUDEDIR) - list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_INCLUDEDIR}) - endif() - - if( BOOST_ROOT ) - list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_ROOT}/include ${BOOST_ROOT}) - elseif( _ENV_BOOST_ROOT ) - list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_ROOT}/include ${_ENV_BOOST_ROOT}) - endif() - - if( Boost_NO_SYSTEM_PATHS) - list(APPEND _boost_INCLUDE_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH) - else() - if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") - foreach(ver ${_boost_TEST_VERSIONS}) - string(REPLACE "." "_" ver "${ver}") - list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS "C:/local/boost_${ver}") - endforeach() - endif() - list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS - C:/boost/include - C:/boost - /sw/local/include - ) - endif() - - # Try to find Boost by stepping backwards through the Boost versions - # we know about. - # Build a list of path suffixes for each version. - set(_boost_PATH_SUFFIXES) - foreach(_boost_VER ${_boost_TEST_VERSIONS}) - # Add in a path suffix, based on the required version, ideally - # we could read this from version.hpp, but for that to work we'd - # need to know the include dir already - set(_boost_BOOSTIFIED_VERSION) - - # Transform 1.35 => 1_35 and 1.36.0 => 1_36_0 - if(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+)") - set(_boost_BOOSTIFIED_VERSION - "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}_${CMAKE_MATCH_3}") - elseif(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)") - set(_boost_BOOSTIFIED_VERSION - "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}") - endif() - - list(APPEND _boost_PATH_SUFFIXES - "boost-${_boost_BOOSTIFIED_VERSION}" - "boost_${_boost_BOOSTIFIED_VERSION}" - "boost/boost-${_boost_BOOSTIFIED_VERSION}" - "boost/boost_${_boost_BOOSTIFIED_VERSION}" - ) - - endforeach() - - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_INCLUDE_SEARCH_DIRS") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_PATH_SUFFIXES") - - # Look for a standard boost header file. - find_path(Boost_INCLUDE_DIR - NAMES boost/config.hpp - HINTS ${_boost_INCLUDE_SEARCH_DIRS} - PATH_SUFFIXES ${_boost_PATH_SUFFIXES} - ) -endif() - -# ------------------------------------------------------------------------ -# Extract version information from version.hpp -# ------------------------------------------------------------------------ - -if(Boost_INCLUDE_DIR) - _Boost_DEBUG_PRINT("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp") - - # Extract Boost_VERSION_MACRO and Boost_LIB_VERSION from version.hpp - set(Boost_VERSION_MACRO 0) - set(Boost_LIB_VERSION "") - file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ") - if("${_boost_VERSION_HPP_CONTENTS}" MATCHES "#define BOOST_VERSION ([0-9]+)") - set(Boost_VERSION_MACRO "${CMAKE_MATCH_1}") - endif() - if("${_boost_VERSION_HPP_CONTENTS}" MATCHES "#define BOOST_LIB_VERSION \"([0-9_]+)\"") - set(Boost_LIB_VERSION "${CMAKE_MATCH_1}") - endif() - unset(_boost_VERSION_HPP_CONTENTS) - - # Calculate version components - math(EXPR Boost_VERSION_MAJOR "${Boost_VERSION_MACRO} / 100000") - math(EXPR Boost_VERSION_MINOR "${Boost_VERSION_MACRO} / 100 % 1000") - math(EXPR Boost_VERSION_PATCH "${Boost_VERSION_MACRO} % 100") - set(Boost_VERSION_COUNT 3) - - # Define alias variables for backwards compat. - set(Boost_MAJOR_VERSION ${Boost_VERSION_MAJOR}) - set(Boost_MINOR_VERSION ${Boost_VERSION_MINOR}) - set(Boost_SUBMINOR_VERSION ${Boost_VERSION_PATCH}) - - # Define Boost version in x.y.z format - set(Boost_VERSION_STRING "${Boost_VERSION_MAJOR}.${Boost_VERSION_MINOR}.${Boost_VERSION_PATCH}") - - if (POLICY CMP0093) - # Define final Boost_VERSION - cmake_policy(GET CMP0093 _Boost_CMP0093 - PARENT_SCOPE # undocumented, do not use outside of CMake - ) - if("x${_Boost_CMP0093}x" STREQUAL "xNEWx") - set(Boost_VERSION ${Boost_VERSION_STRING}) - endif() - unset(_Boost_CMP0093) - else() - set(Boost_VERSION ${Boost_VERSION_MACRO}) - endif() - - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION_STRING") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION_MACRO") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION_MAJOR") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION_MINOR") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION_PATCH") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_VERSION_COUNT") -endif() - -# ------------------------------------------------------------------------ -# Prefix initialization -# ------------------------------------------------------------------------ - -set(Boost_LIB_PREFIX "") -if ( (GHSMULTI AND Boost_USE_STATIC_LIBS) OR - (WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) ) - set(Boost_LIB_PREFIX "lib") -endif() - -if ( NOT Boost_NAMESPACE ) - set(Boost_NAMESPACE "boost") -endif() - -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_LIB_PREFIX") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "Boost_NAMESPACE") - -# ------------------------------------------------------------------------ -# Suffix initialization and compiler suffix detection. -# ------------------------------------------------------------------------ - -set(_Boost_VARS_NAME - Boost_NAMESPACE - Boost_COMPILER - Boost_THREADAPI - Boost_USE_DEBUG_PYTHON - Boost_USE_MULTITHREADED - Boost_USE_STATIC_LIBS - Boost_USE_STATIC_RUNTIME - Boost_USE_STLPORT - Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS - ) -_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBNAME ${_Boost_VARS_NAME}) - -# Setting some more suffixes for the library -if (Boost_COMPILER) - set(_boost_COMPILER ${Boost_COMPILER}) - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "_boost_COMPILER" SOURCE "user-specified via Boost_COMPILER") -else() - # Attempt to guess the compiler suffix - # NOTE: this is not perfect yet, if you experience any issues - # please report them and use the Boost_COMPILER variable - # to work around the problems. - _Boost_GUESS_COMPILER_PREFIX(_boost_COMPILER) -endif() - -set (_boost_MULTITHREADED "-mt") -if( NOT Boost_USE_MULTITHREADED ) - set (_boost_MULTITHREADED "") -endif() -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_MULTITHREADED") - -#====================== -# Systematically build up the Boost ABI tag for the 'tagged' and 'versioned' layouts -# http://boost.org/doc/libs/1_66_0/more/getting_started/windows.html#library-naming -# http://boost.org/doc/libs/1_66_0/boost/config/auto_link.hpp -# http://boost.org/doc/libs/1_66_0/tools/build/src/tools/common.jam -# http://boost.org/doc/libs/1_66_0/boostcpp.jam -set( _boost_RELEASE_ABI_TAG "-") -set( _boost_DEBUG_ABI_TAG "-") -# Key Use this library when: -# s linking statically to the C++ standard library and -# compiler runtime support libraries. -if(Boost_USE_STATIC_RUNTIME) - set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}s") - set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}s") -endif() -# g using debug versions of the standard and runtime -# support libraries -if(WIN32 AND Boost_USE_DEBUG_RUNTIME) - if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC" - OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang" - OR "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntel") - string(APPEND _boost_DEBUG_ABI_TAG "g") - endif() -endif() -# y using special debug build of python -if(Boost_USE_DEBUG_PYTHON) - string(APPEND _boost_DEBUG_ABI_TAG "y") -endif() -# d using a debug version of your code -string(APPEND _boost_DEBUG_ABI_TAG "d") -# p using the STLport standard library rather than the -# default one supplied with your compiler -if(Boost_USE_STLPORT) - string(APPEND _boost_RELEASE_ABI_TAG "p") - string(APPEND _boost_DEBUG_ABI_TAG "p") -endif() -# n using the STLport deprecated "native iostreams" feature -# removed from the documentation in 1.43.0 but still present in -# boost/config/auto_link.hpp -if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS) - string(APPEND _boost_RELEASE_ABI_TAG "n") - string(APPEND _boost_DEBUG_ABI_TAG "n") -endif() - -# -x86 Architecture and address model tag -# First character is the architecture, then word-size, either 32 or 64 -# Only used in 'versioned' layout, added in Boost 1.66.0 -if(DEFINED Boost_ARCHITECTURE) - set(_boost_ARCHITECTURE_TAG "${Boost_ARCHITECTURE}") - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "_boost_ARCHITECTURE_TAG" SOURCE "user-specified via Boost_ARCHITECTURE") -else() - set(_boost_ARCHITECTURE_TAG "") - # {CMAKE_CXX_COMPILER_ARCHITECTURE_ID} is not currently set for all compilers - if(NOT "x${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "x" AND NOT Boost_VERSION_STRING VERSION_LESS 1.66.0) - string(APPEND _boost_ARCHITECTURE_TAG "-") - # This needs to be kept in-sync with the section of CMakePlatformId.h.in - # inside 'defined(_WIN32) && defined(_MSC_VER)' - if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "IA64") - string(APPEND _boost_ARCHITECTURE_TAG "i") - elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "X86" - OR CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "x64") - string(APPEND _boost_ARCHITECTURE_TAG "x") - elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID MATCHES "^ARM") - string(APPEND _boost_ARCHITECTURE_TAG "a") - elseif(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "MIPS") - string(APPEND _boost_ARCHITECTURE_TAG "m") - endif() - - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - string(APPEND _boost_ARCHITECTURE_TAG "64") - else() - string(APPEND _boost_ARCHITECTURE_TAG "32") - endif() - endif() - _Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "_boost_ARCHITECTURE_TAG" SOURCE "detected") -endif() - -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_RELEASE_ABI_TAG") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_DEBUG_ABI_TAG") - -# ------------------------------------------------------------------------ -# Begin finding boost libraries -# ------------------------------------------------------------------------ - -set(_Boost_VARS_LIB "") -foreach(c DEBUG RELEASE) - set(_Boost_VARS_LIB_${c} BOOST_LIBRARYDIR Boost_LIBRARY_DIR_${c}) - list(APPEND _Boost_VARS_LIB ${_Boost_VARS_LIB_${c}}) - _Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR_${c} ${_Boost_VARS_DIR} ${_Boost_VARS_LIB_${c}} Boost_INCLUDE_DIR) - # Clear Boost_LIBRARY_DIR_${c} if it did not change but other input affecting the - # location did. We will find a new one based on the new inputs. - if(_Boost_CHANGE_LIBDIR_${c} AND NOT _Boost_LIBRARY_DIR_${c}_CHANGED) - unset(Boost_LIBRARY_DIR_${c} CACHE) - endif() - - # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is set, prefer its value. - if(Boost_LIBRARY_DIR_${c}) - set(_boost_LIBRARY_SEARCH_DIRS_${c} ${Boost_LIBRARY_DIR_${c}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) - else() - set(_boost_LIBRARY_SEARCH_DIRS_${c} "") - if(BOOST_LIBRARYDIR) - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_LIBRARYDIR}) - elseif(_ENV_BOOST_LIBRARYDIR) - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_LIBRARYDIR}) - endif() - - if(BOOST_ROOT) - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib) - _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${BOOST_ROOT}") - elseif(_ENV_BOOST_ROOT) - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib) - _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${_ENV_BOOST_ROOT}") - endif() - - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} - ${Boost_INCLUDE_DIR}/lib - ${Boost_INCLUDE_DIR}/../lib - ${Boost_INCLUDE_DIR}/stage/lib - ) - _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${Boost_INCLUDE_DIR}/..") - _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "${Boost_INCLUDE_DIR}") - if( Boost_NO_SYSTEM_PATHS ) - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH) - else() - foreach(ver ${_boost_TEST_VERSIONS}) - string(REPLACE "." "_" ver "${ver}") - _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "C:/local/boost_${ver}") - endforeach() - _Boost_UPDATE_WINDOWS_LIBRARY_SEARCH_DIRS_WITH_PREBUILT_PATHS(_boost_LIBRARY_SEARCH_DIRS_${c} "C:/boost") - list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} PATHS - C:/boost/lib - C:/boost - /sw/local/lib - ) - endif() - endif() -endforeach() - -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_LIBRARY_SEARCH_DIRS_RELEASE") -_Boost_DEBUG_PRINT_VAR("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" "_boost_LIBRARY_SEARCH_DIRS_DEBUG") - -# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES -if( Boost_USE_STATIC_LIBS ) - set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif() -endif() - -# We want to use the tag inline below without risking double dashes -if(_boost_RELEASE_ABI_TAG) - if(${_boost_RELEASE_ABI_TAG} STREQUAL "-") - set(_boost_RELEASE_ABI_TAG "") - endif() -endif() -if(_boost_DEBUG_ABI_TAG) - if(${_boost_DEBUG_ABI_TAG} STREQUAL "-") - set(_boost_DEBUG_ABI_TAG "") - endif() -endif() - -# The previous behavior of FindBoost when Boost_USE_STATIC_LIBS was enabled -# on WIN32 was to: -# 1. Search for static libs compiled against a SHARED C++ standard runtime library (use if found) -# 2. Search for static libs compiled against a STATIC C++ standard runtime library (use if found) -# We maintain this behavior since changing it could break people's builds. -# To disable the ambiguous behavior, the user need only -# set Boost_USE_STATIC_RUNTIME either ON or OFF. -set(_boost_STATIC_RUNTIME_WORKAROUND false) -if(WIN32 AND Boost_USE_STATIC_LIBS) - if(NOT DEFINED Boost_USE_STATIC_RUNTIME) - set(_boost_STATIC_RUNTIME_WORKAROUND TRUE) - endif() -endif() - -# On versions < 1.35, remove the System library from the considered list -# since it wasn't added until 1.35. -if(Boost_VERSION_STRING AND Boost_FIND_COMPONENTS) - if(Boost_VERSION_STRING VERSION_LESS 1.35.0) - list(REMOVE_ITEM Boost_FIND_COMPONENTS system) - endif() -endif() - -# Additional components may be required via component dependencies. -# Add any missing components to the list. -_Boost_MISSING_DEPENDENCIES(Boost_FIND_COMPONENTS _Boost_EXTRA_FIND_COMPONENTS) - -# If thread is required, get the thread libs as a dependency -if("thread" IN_LIST Boost_FIND_COMPONENTS) - if(Boost_FIND_QUIETLY) - set(_Boost_find_quiet QUIET) - else() - set(_Boost_find_quiet "") - endif() - find_package(Threads ${_Boost_find_quiet}) - unset(_Boost_find_quiet) -endif() - -# If the user changed any of our control inputs flush previous results. -if(_Boost_CHANGE_LIBDIR_DEBUG OR _Boost_CHANGE_LIBDIR_RELEASE OR _Boost_CHANGE_LIBNAME) - foreach(COMPONENT ${_Boost_COMPONENTS_SEARCHED}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - foreach(c DEBUG RELEASE) - set(_var Boost_${UPPERCOMPONENT}_LIBRARY_${c}) - unset(${_var} CACHE) - set(${_var} "${_var}-NOTFOUND") - endforeach() - endforeach() - set(_Boost_COMPONENTS_SEARCHED "") -endif() - -foreach(COMPONENT ${Boost_FIND_COMPONENTS}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - - set( _boost_docstring_release "Boost ${COMPONENT} library (release)") - set( _boost_docstring_debug "Boost ${COMPONENT} library (debug)") - - # Compute component-specific hints. - set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "") - if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR - ${COMPONENT} STREQUAL "graph_parallel") - foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES}) - if(IS_ABSOLUTE "${lib}") - get_filename_component(libdir "${lib}" PATH) - string(REPLACE "\\" "/" libdir "${libdir}") - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir}) - endif() - endforeach() - endif() - - # Handle Python version suffixes - unset(COMPONENT_PYTHON_VERSION_MAJOR) - unset(COMPONENT_PYTHON_VERSION_MINOR) - if(${COMPONENT} MATCHES "^(python|mpi_python|numpy)([0-9])\$") - set(COMPONENT_UNVERSIONED "${CMAKE_MATCH_1}") - set(COMPONENT_PYTHON_VERSION_MAJOR "${CMAKE_MATCH_2}") - elseif(${COMPONENT} MATCHES "^(python|mpi_python|numpy)([0-9])\\.?([0-9])\$") - set(COMPONENT_UNVERSIONED "${CMAKE_MATCH_1}") - set(COMPONENT_PYTHON_VERSION_MAJOR "${CMAKE_MATCH_2}") - set(COMPONENT_PYTHON_VERSION_MINOR "${CMAKE_MATCH_3}") - endif() - - unset(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) - if (COMPONENT_PYTHON_VERSION_MINOR) - # Boost >= 1.67 - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") - # Debian/Ubuntu (Some versions omit the 2 and/or 3 from the suffix) - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}-py${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-py${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") - # Gentoo - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-${COMPONENT_PYTHON_VERSION_MAJOR}.${COMPONENT_PYTHON_VERSION_MINOR}") - # RPMs - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}-${COMPONENT_PYTHON_VERSION_MAJOR}${COMPONENT_PYTHON_VERSION_MINOR}") - endif() - if (COMPONENT_PYTHON_VERSION_MAJOR AND NOT COMPONENT_PYTHON_VERSION_MINOR) - # Boost < 1.67 - list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME "${COMPONENT_UNVERSIONED}${COMPONENT_PYTHON_VERSION_MAJOR}") - endif() - - # Consolidate and report component-specific hints. - if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) - list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME) - _Boost_DEBUG_PRINT("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "Component-specific library search names for ${COMPONENT_NAME}: ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME}") - endif() - if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) - list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT) - _Boost_DEBUG_PRINT("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "Component-specific library search paths for ${COMPONENT}: ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT}") - endif() - - # - # Find headers - # - _Boost_COMPONENT_HEADERS("${COMPONENT}" Boost_${UPPERCOMPONENT}_HEADER_NAME) - # Look for a standard boost header file. - if(Boost_${UPPERCOMPONENT}_HEADER_NAME) - if(EXISTS "${Boost_INCLUDE_DIR}/${Boost_${UPPERCOMPONENT}_HEADER_NAME}") - set(Boost_${UPPERCOMPONENT}_HEADER ON) - else() - set(Boost_${UPPERCOMPONENT}_HEADER OFF) - endif() - else() - set(Boost_${UPPERCOMPONENT}_HEADER ON) - message(WARNING "No header defined for ${COMPONENT}; skipping header check") - endif() - - # - # Find RELEASE libraries - # - unset(_boost_RELEASE_NAMES) - foreach(component IN LISTS _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME COMPONENT) - foreach(compiler IN LISTS _boost_COMPILER) - list(APPEND _boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} ) - endforeach() - list(APPEND _boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component} ) - if(_boost_STATIC_RUNTIME_WORKAROUND) - set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") - foreach(compiler IN LISTS _boost_COMPILER) - list(APPEND _boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) - endforeach() - list(APPEND _boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) - endif() - endforeach() - if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") - _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES}) - endif() - _Boost_DEBUG_PRINT("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}") - - # if Boost_LIBRARY_DIR_RELEASE is not defined, - # but Boost_LIBRARY_DIR_DEBUG is, look there first for RELEASE libs - if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR_DEBUG) - list(INSERT _boost_LIBRARY_SEARCH_DIRS_RELEASE 0 ${Boost_LIBRARY_DIR_DEBUG}) - endif() - - if(NOT Boost_VERSION_STRING VERSION_LESS 1.86.0) - if(BOOST_LIBRARYDIR AND EXISTS "${BOOST_LIBRARYDIR}") - # Clear existing search paths and use only BOOST_LIBRARYDIR - set(_boost_LIBRARY_SEARCH_DIRS_RELEASE "${BOOST_LIBRARYDIR}" NO_DEFAULT_PATH) - set(_boost_LIBRARY_SEARCH_DIRS_DEBUG "${BOOST_LIBRARYDIR}" NO_DEFAULT_PATH) - - if(Boost_DEBUG) - message(STATUS "Boost 1.86: Setting library search dirs to BOOST_LIBRARYDIR: ${BOOST_LIBRARYDIR}") - endif() - endif() - endif() - - # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. - string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_RELEASE}") - - if(Boost_USE_RELEASE_LIBS) - _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE RELEASE - NAMES ${_boost_RELEASE_NAMES} - HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} - NAMES_PER_DIR - DOC "${_boost_docstring_release}" - ) - endif() - - # - # Find DEBUG libraries - # - unset(_boost_DEBUG_NAMES) - foreach(component IN LISTS _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT_NAME COMPONENT) - foreach(compiler IN LISTS _boost_COMPILER) - list(APPEND _boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} ) - endforeach() - list(APPEND _boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component} ) - if(_boost_STATIC_RUNTIME_WORKAROUND) - set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") - foreach(compiler IN LISTS _boost_COMPILER) - list(APPEND _boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) - endforeach() - list(APPEND _boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}${_boost_ARCHITECTURE_TAG} - ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) - endif() - endforeach() - if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") - _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES}) - endif() - _Boost_DEBUG_PRINT("${CMAKE_CURRENT_LIST_FILE}" "${CMAKE_CURRENT_LIST_LINE}" - "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}") - - # if Boost_LIBRARY_DIR_DEBUG is not defined, - # but Boost_LIBRARY_DIR_RELEASE is, look there first for DEBUG libs - if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR_RELEASE) - list(INSERT _boost_LIBRARY_SEARCH_DIRS_DEBUG 0 ${Boost_LIBRARY_DIR_RELEASE}) - endif() - - # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. - string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_DEBUG}") - - if(Boost_USE_DEBUG_LIBS) - _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG DEBUG - NAMES ${_boost_DEBUG_NAMES} - HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} - NAMES_PER_DIR - DOC "${_boost_docstring_debug}" - ) - endif () - - if(Boost_REALPATH) - _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE "${_boost_docstring_release}") - _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG "${_boost_docstring_debug}" ) - endif() - - _Boost_ADJUST_LIB_VARS(${UPPERCOMPONENT}) - - # Check if component requires some compiler features - _Boost_COMPILER_FEATURES(${COMPONENT} _Boost_${UPPERCOMPONENT}_COMPILER_FEATURES) - -endforeach() - -# Restore the original find library ordering -if( Boost_USE_STATIC_LIBS ) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) -endif() - -# ------------------------------------------------------------------------ -# End finding boost libraries -# ------------------------------------------------------------------------ - -set(Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIR}) -set(Boost_LIBRARY_DIRS) -if(Boost_LIBRARY_DIR_RELEASE) - list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_RELEASE}) -endif() -if(Boost_LIBRARY_DIR_DEBUG) - list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_DEBUG}) -endif() -if(Boost_LIBRARY_DIRS) - list(REMOVE_DUPLICATES Boost_LIBRARY_DIRS) -endif() - -# ------------------------------------------------------------------------ -# Call FPHSA helper, see https://cmake.org/cmake/help/latest/module/FindPackageHandleStandardArgs.html -# ------------------------------------------------------------------------ - -# Define aliases as needed by the component handler in the FPHSA helper below -foreach(_comp IN LISTS Boost_FIND_COMPONENTS) - string(TOUPPER ${_comp} _uppercomp) - if(DEFINED Boost_${_uppercomp}_FOUND) - set(Boost_${_comp}_FOUND ${Boost_${_uppercomp}_FOUND}) - endif() -endforeach() - -find_package_handle_standard_args(Boost - REQUIRED_VARS Boost_INCLUDE_DIR - VERSION_VAR Boost_VERSION_STRING - HANDLE_COMPONENTS) - -if(Boost_FOUND) - if( NOT Boost_LIBRARY_DIRS ) - # Compatibility Code for backwards compatibility with CMake - # 2.4's FindBoost module. - - # Look for the boost library path. - # Note that the user may not have installed any libraries - # so it is quite possible the Boost_LIBRARY_DIRS may not exist. - set(_boost_LIB_DIR ${Boost_INCLUDE_DIR}) - - if("${_boost_LIB_DIR}" MATCHES "boost-[0-9]+") - get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH) - endif() - - if("${_boost_LIB_DIR}" MATCHES "/include$") - # Strip off the trailing "/include" in the path. - get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH) - endif() - - if(EXISTS "${_boost_LIB_DIR}/lib") - string(APPEND _boost_LIB_DIR /lib) - elseif(EXISTS "${_boost_LIB_DIR}/stage/lib") - string(APPEND _boost_LIB_DIR "/stage/lib") - else() - set(_boost_LIB_DIR "") - endif() - - if(_boost_LIB_DIR AND EXISTS "${_boost_LIB_DIR}") - set(Boost_LIBRARY_DIRS ${_boost_LIB_DIR}) - endif() - - endif() -else() - # Boost headers were not found so no components were found. - foreach(COMPONENT ${Boost_FIND_COMPONENTS}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - set(Boost_${UPPERCOMPONENT}_FOUND 0) - endforeach() -endif() - -# ------------------------------------------------------------------------ -# Add imported targets -# ------------------------------------------------------------------------ - -if(Boost_FOUND) - # The builtin CMake package in Boost 1.70+ introduces a new name - # for the header-only lib, let's provide the same UI in module mode - if(NOT TARGET Boost::headers) - add_library(Boost::headers INTERFACE IMPORTED) - if(Boost_INCLUDE_DIRS) - set_target_properties(Boost::headers PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") - endif() - endif() - - # Define the old target name for header-only libraries for backwards - # compat. - if(NOT TARGET Boost::boost) - add_library(Boost::boost INTERFACE IMPORTED) - set_target_properties(Boost::boost - PROPERTIES INTERFACE_LINK_LIBRARIES Boost::headers) - endif() - - foreach(COMPONENT ${Boost_FIND_COMPONENTS}) - if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT}) - string(TOUPPER ${COMPONENT} UPPERCOMPONENT) - if(Boost_${UPPERCOMPONENT}_FOUND) - if(Boost_USE_STATIC_LIBS) - add_library(Boost::${COMPONENT} STATIC IMPORTED) - else() - # Even if Boost_USE_STATIC_LIBS is OFF, we might have static - # libraries as a result. - add_library(Boost::${COMPONENT} UNKNOWN IMPORTED) - endif() - if(Boost_INCLUDE_DIRS) - set_target_properties(Boost::${COMPONENT} PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") - endif() - if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY}") - set_target_properties(Boost::${COMPONENT} PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" - IMPORTED_LOCATION "${Boost_${UPPERCOMPONENT}_LIBRARY}") - endif() - if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}") - set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY - IMPORTED_CONFIGURATIONS RELEASE) - set_target_properties(Boost::${COMPONENT} PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" - IMPORTED_LOCATION_RELEASE "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}") - endif() - if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}") - set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY - IMPORTED_CONFIGURATIONS DEBUG) - set_target_properties(Boost::${COMPONENT} PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX" - IMPORTED_LOCATION_DEBUG "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}") - endif() - if(_Boost_${UPPERCOMPONENT}_DEPENDENCIES) - unset(_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES) - foreach(dep ${_Boost_${UPPERCOMPONENT}_DEPENDENCIES}) - list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Boost::${dep}) - endforeach() - if(COMPONENT STREQUAL "thread") - list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Threads::Threads) - endif() - set_target_properties(Boost::${COMPONENT} PROPERTIES - INTERFACE_LINK_LIBRARIES "${_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES}") - endif() - if(_Boost_${UPPERCOMPONENT}_COMPILER_FEATURES) - set_target_properties(Boost::${COMPONENT} PROPERTIES - INTERFACE_COMPILE_FEATURES "${_Boost_${UPPERCOMPONENT}_COMPILER_FEATURES}") - endif() - endif() - endif() - endforeach() -endif() - -# ------------------------------------------------------------------------ -# Finalize -# ------------------------------------------------------------------------ - -# Report Boost_LIBRARIES -set(Boost_LIBRARIES "") -foreach(_comp IN LISTS Boost_FIND_COMPONENTS) - string(TOUPPER ${_comp} _uppercomp) - if(Boost_${_uppercomp}_FOUND) - list(APPEND Boost_LIBRARIES ${Boost_${_uppercomp}_LIBRARY}) - if(_comp STREQUAL "thread") - list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) - endif() - endif() -endforeach() - -# Configure display of cache entries in GUI. -foreach(v BOOSTROOT BOOST_ROOT ${_Boost_VARS_INC} ${_Boost_VARS_LIB}) - get_property(_type CACHE ${v} PROPERTY TYPE) - if(_type) - set_property(CACHE ${v} PROPERTY ADVANCED 1) - if("x${_type}" STREQUAL "xUNINITIALIZED") - if("x${v}" STREQUAL "xBoost_ADDITIONAL_VERSIONS") - set_property(CACHE ${v} PROPERTY TYPE STRING) - else() - set_property(CACHE ${v} PROPERTY TYPE PATH) - endif() - endif() - endif() -endforeach() - -# Record last used values of input variables so we can -# detect on the next run if the user changed them. -foreach(v - ${_Boost_VARS_INC} ${_Boost_VARS_LIB} - ${_Boost_VARS_DIR} ${_Boost_VARS_NAME} - ) - if(DEFINED ${v}) - set(_${v}_LAST "${${v}}" CACHE INTERNAL "Last used ${v} value.") - else() - unset(_${v}_LAST CACHE) - endif() -endforeach() - -# Maintain a persistent list of components requested anywhere since -# the last flush. -set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}") -list(APPEND _Boost_COMPONENTS_SEARCHED ${Boost_FIND_COMPONENTS}) -list(REMOVE_DUPLICATES _Boost_COMPONENTS_SEARCHED) -list(SORT _Boost_COMPONENTS_SEARCHED) -set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}" - CACHE INTERNAL "Components requested for this build tree.") - -# Restore project's policies -cmake_policy(POP) diff --git a/Builds/CMake/deps/Findjemalloc.cmake b/Builds/CMake/deps/Findjemalloc.cmake deleted file mode 100644 index 820ceeed4..000000000 --- a/Builds/CMake/deps/Findjemalloc.cmake +++ /dev/null @@ -1,47 +0,0 @@ -# - Try to find jemalloc -# Once done this will define -# JEMALLOC_FOUND - System has jemalloc -# JEMALLOC_INCLUDE_DIRS - The jemalloc include directories -# JEMALLOC_LIBRARIES - The libraries needed to use jemalloc - -if(NOT USE_BUNDLED_JEMALLOC) - find_package(PkgConfig) - if (PKG_CONFIG_FOUND) - pkg_check_modules(PC_JEMALLOC QUIET jemalloc) - endif() -else() - set(PC_JEMALLOC_INCLUDEDIR) - set(PC_JEMALLOC_INCLUDE_DIRS) - set(PC_JEMALLOC_LIBDIR) - set(PC_JEMALLOC_LIBRARY_DIRS) - set(LIMIT_SEARCH NO_DEFAULT_PATH) -endif() - -set(JEMALLOC_DEFINITIONS ${PC_JEMALLOC_CFLAGS_OTHER}) - -find_path(JEMALLOC_INCLUDE_DIR jemalloc/jemalloc.h - PATHS ${PC_JEMALLOC_INCLUDEDIR} ${PC_JEMALLOC_INCLUDE_DIRS} - ${LIMIT_SEARCH}) - -# If we're asked to use static linkage, add libjemalloc.a as a preferred library name. -if(JEMALLOC_USE_STATIC) - list(APPEND JEMALLOC_NAMES - "${CMAKE_STATIC_LIBRARY_PREFIX}jemalloc${CMAKE_STATIC_LIBRARY_SUFFIX}") -endif() - -list(APPEND JEMALLOC_NAMES jemalloc) - -find_library(JEMALLOC_LIBRARY NAMES ${JEMALLOC_NAMES} - HINTS ${PC_JEMALLOC_LIBDIR} ${PC_JEMALLOC_LIBRARY_DIRS} - ${LIMIT_SEARCH}) - -set(JEMALLOC_LIBRARIES ${JEMALLOC_LIBRARY}) -set(JEMALLOC_INCLUDE_DIRS ${JEMALLOC_INCLUDE_DIR}) - -include(FindPackageHandleStandardArgs) -# handle the QUIETLY and REQUIRED arguments and set JEMALLOC_FOUND to TRUE -# if all listed variables are TRUE -find_package_handle_standard_args(JeMalloc DEFAULT_MSG - JEMALLOC_LIBRARY JEMALLOC_INCLUDE_DIR) - -mark_as_advanced(JEMALLOC_INCLUDE_DIR JEMALLOC_LIBRARY) diff --git a/Builds/CMake/deps/Findlibarchive_pc.cmake b/Builds/CMake/deps/Findlibarchive_pc.cmake deleted file mode 100644 index 8f248b287..000000000 --- a/Builds/CMake/deps/Findlibarchive_pc.cmake +++ /dev/null @@ -1,22 +0,0 @@ -find_package (PkgConfig REQUIRED) -pkg_search_module (libarchive_PC QUIET libarchive>=3.4.3) - -if(static) - set(LIBARCHIVE_LIB libarchive.a) -else() - set(LIBARCHIVE_LIB archive) -endif() - -find_library (archive - NAMES ${LIBARCHIVE_LIB} - HINTS - ${libarchive_PC_LIBDIR} - ${libarchive_PC_LIBRARY_DIRS} - NO_DEFAULT_PATH) - -find_path (LIBARCHIVE_INCLUDE_DIR - NAMES archive.h - HINTS - ${libarchive_PC_INCLUDEDIR} - ${libarchive_PC_INCLUDEDIRS} - NO_DEFAULT_PATH) diff --git a/Builds/CMake/deps/Findlz4.cmake b/Builds/CMake/deps/Findlz4.cmake deleted file mode 100644 index 835f5989d..000000000 --- a/Builds/CMake/deps/Findlz4.cmake +++ /dev/null @@ -1,24 +0,0 @@ -find_package (PkgConfig) -if (PKG_CONFIG_FOUND) - pkg_search_module (lz4_PC QUIET liblz4>=1.9) -endif () - -if(static) - set(LZ4_LIB liblz4.a) -else() - set(LZ4_LIB lz4.so) -endif() - -find_library (lz4 - NAMES ${LZ4_LIB} - HINTS - ${lz4_PC_LIBDIR} - ${lz4_PC_LIBRARY_DIRS} - NO_DEFAULT_PATH) - -find_path (LZ4_INCLUDE_DIR - NAMES lz4.h - HINTS - ${lz4_PC_INCLUDEDIR} - ${lz4_PC_INCLUDEDIRS} - NO_DEFAULT_PATH) diff --git a/Builds/CMake/deps/Findsecp256k1.cmake b/Builds/CMake/deps/Findsecp256k1.cmake deleted file mode 100644 index 7be3d0272..000000000 --- a/Builds/CMake/deps/Findsecp256k1.cmake +++ /dev/null @@ -1,24 +0,0 @@ -find_package (PkgConfig) -if (PKG_CONFIG_FOUND) - pkg_search_module (secp256k1_PC QUIET libsecp256k1) -endif () - -if(static) - set(SECP256K1_LIB libsecp256k1.a) -else() - set(SECP256K1_LIB secp256k1) -endif() - -find_library(secp256k1 - NAMES ${SECP256K1_LIB} - HINTS - ${secp256k1_PC_LIBDIR} - ${secp256k1_PC_LIBRARY_PATHS} - NO_DEFAULT_PATH) - -find_path (SECP256K1_INCLUDE_DIR - NAMES secp256k1.h - HINTS - ${secp256k1_PC_INCLUDEDIR} - ${secp256k1_PC_INCLUDEDIRS} - NO_DEFAULT_PATH) diff --git a/Builds/CMake/deps/Findsnappy.cmake b/Builds/CMake/deps/Findsnappy.cmake deleted file mode 100644 index ddf3cb280..000000000 --- a/Builds/CMake/deps/Findsnappy.cmake +++ /dev/null @@ -1,24 +0,0 @@ -find_package (PkgConfig) -if (PKG_CONFIG_FOUND) - pkg_search_module (snappy_PC QUIET snappy>=1.1.7) -endif () - -if(static) - set(SNAPPY_LIB libsnappy.a) -else() - set(SNAPPY_LIB libsnappy.so) -endif() - -find_library (snappy - NAMES ${SNAPPY_LIB} - HINTS - ${snappy_PC_LIBDIR} - ${snappy_PC_LIBRARY_DIRS} - NO_DEFAULT_PATH) - -find_path (SNAPPY_INCLUDE_DIR - NAMES snappy.h - HINTS - ${snappy_PC_INCLUDEDIR} - ${snappy_PC_INCLUDEDIRS} - NO_DEFAULT_PATH) diff --git a/Builds/CMake/deps/Findsoci.cmake b/Builds/CMake/deps/Findsoci.cmake deleted file mode 100644 index c3d910623..000000000 --- a/Builds/CMake/deps/Findsoci.cmake +++ /dev/null @@ -1,19 +0,0 @@ -find_package (PkgConfig) -if (PKG_CONFIG_FOUND) - # TBD - currently no soci pkgconfig - #pkg_search_module (soci_PC QUIET libsoci_core>=3.2) -endif () - -if(static) - set(SOCI_LIB libsoci.a) -else() - set(SOCI_LIB libsoci_core.so) -endif() - -find_library (soci - NAMES ${SOCI_LIB}) - -find_path (SOCI_INCLUDE_DIR - NAMES soci/soci.h) - -message("SOCI FOUND AT: ${SOCI_LIB}") diff --git a/Builds/CMake/deps/Findsqlite.cmake b/Builds/CMake/deps/Findsqlite.cmake deleted file mode 100644 index ef5c6befc..000000000 --- a/Builds/CMake/deps/Findsqlite.cmake +++ /dev/null @@ -1,24 +0,0 @@ -find_package (PkgConfig) -if (PKG_CONFIG_FOUND) - pkg_search_module (sqlite_PC QUIET sqlite3>=3.26.0) -endif () - -if(static) - set(SQLITE_LIB libsqlite3.a) -else() - set(SQLITE_LIB sqlite3.so) -endif() - -find_library (sqlite3 - NAMES ${SQLITE_LIB} - HINTS - ${sqlite_PC_LIBDIR} - ${sqlite_PC_LIBRARY_DIRS} - NO_DEFAULT_PATH) - -find_path (SQLITE_INCLUDE_DIR - NAMES sqlite3.h - HINTS - ${sqlite_PC_INCLUDEDIR} - ${sqlite_PC_INCLUDEDIRS} - NO_DEFAULT_PATH) diff --git a/Builds/CMake/deps/Libarchive.cmake b/Builds/CMake/deps/Libarchive.cmake deleted file mode 100644 index 57b8d2e39..000000000 --- a/Builds/CMake/deps/Libarchive.cmake +++ /dev/null @@ -1,163 +0,0 @@ -#[===================================================================[ - NIH dep: libarchive -#]===================================================================] - -option (local_libarchive "use local build of libarchive." OFF) -add_library (archive_lib UNKNOWN IMPORTED GLOBAL) - -if (NOT local_libarchive) - if (NOT WIN32) - find_package(libarchive_pc REQUIRED) - endif () - if (archive) - message (STATUS "Found libarchive using pkg-config. Using ${archive}.") - set_target_properties (archive_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${archive} - IMPORTED_LOCATION_RELEASE - ${archive} - INTERFACE_INCLUDE_DIRECTORIES - ${LIBARCHIVE_INCLUDE_DIR}) - # pkg-config can return extra info for static lib linking - # this is probably needed/useful generally, but apply - # to APPLE for now (mostly for homebrew) - if (APPLE AND static AND libarchive_PC_STATIC_LIBRARIES) - message(STATUS "NOTE: libarchive static libs: ${libarchive_PC_STATIC_LIBRARIES}") - # also, APPLE seems to need iconv...maybe linux does too (TBD) - target_link_libraries (archive_lib - INTERFACE iconv ${libarchive_PC_STATIC_LIBRARIES}) - endif () - else () - ## now try searching using the minimal find module that cmake provides - find_package(LibArchive 3.4.3 QUIET) - if (LibArchive_FOUND) - if (static) - # find module doesn't find static libs currently, so we re-search - get_filename_component(_loc ${LibArchive_LIBRARY} DIRECTORY) - find_library(_la_static - NAMES libarchive.a archive_static.lib archive.lib - PATHS ${_loc}) - if (_la_static) - set (_la_lib ${_la_static}) - else () - message (WARNING "unable to find libarchive static lib - switching to local build") - set (local_libarchive ON CACHE BOOL "" FORCE) - endif () - else () - set (_la_lib ${LibArchive_LIBRARY}) - endif () - if (NOT local_libarchive) - message (STATUS "Found libarchive using module/config. Using ${_la_lib}.") - set_target_properties (archive_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${_la_lib} - IMPORTED_LOCATION_RELEASE - ${_la_lib} - INTERFACE_INCLUDE_DIRECTORIES - ${LibArchive_INCLUDE_DIRS}) - endif () - else () - set (local_libarchive ON CACHE BOOL "" FORCE) - endif () - endif () -endif() - -if (local_libarchive) - set (lib_post "") - if (MSVC) - set (lib_post "_static") - endif () - ExternalProject_Add (libarchive - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/libarchive/libarchive.git - GIT_TAG v3.4.3 - CMAKE_ARGS - # passing the compiler seems to be needed for windows CI, sadly - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DENABLE_LZ4=ON - -ULZ4_* - -DLZ4_INCLUDE_DIR=$,::> - # because we are building a static lib, this lz4 library doesn't - # actually matter since you can't generally link static libs to other static - # libs. The include files are needed, but the library itself is not (until - # we link our application, at which point we use the lz4 we built above). - # nonetheless, we need to provide a library to libarchive else it will - # NOT include lz4 support when configuring - -DLZ4_LIBRARY=$,$,$> - -DENABLE_WERROR=OFF - -DENABLE_TAR=OFF - -DENABLE_TAR_SHARED=OFF - -DENABLE_INSTALL=ON - -DENABLE_NETTLE=OFF - -DENABLE_OPENSSL=OFF - -DENABLE_LZO=OFF - -DENABLE_LZMA=OFF - -DENABLE_ZLIB=OFF - -DENABLE_BZip2=OFF - -DENABLE_LIBXML2=OFF - -DENABLE_EXPAT=OFF - -DENABLE_PCREPOSIX=OFF - -DENABLE_LibGCC=OFF - -DENABLE_CNG=OFF - -DENABLE_CPIO=OFF - -DENABLE_CPIO_SHARED=OFF - -DENABLE_CAT=OFF - -DENABLE_CAT_SHARED=OFF - -DENABLE_XATTR=OFF - -DENABLE_ACL=OFF - -DENABLE_ICONV=OFF - -DENABLE_TEST=OFF - -DENABLE_COVERAGE=OFF - $<$: - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" - "-DCMAKE_C_FLAGS_DEBUG=-MTd" - "-DCMAKE_C_FLAGS_RELEASE=-MT" - > - LIST_SEPARATOR :: - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --target archive_static - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /libarchive/$/${ep_lib_prefix}archive${lib_post}$<$:_d>${ep_lib_suffix} - /libarchive - > - TEST_COMMAND "" - INSTALL_COMMAND "" - DEPENDS lz4_lib - BUILD_BYPRODUCTS - /libarchive/${ep_lib_prefix}archive${lib_post}${ep_lib_suffix} - /libarchive/${ep_lib_prefix}archive${lib_post}_d${ep_lib_suffix} - ) - ExternalProject_Get_Property (libarchive BINARY_DIR) - ExternalProject_Get_Property (libarchive SOURCE_DIR) - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (libarchive) - endif () - file (MAKE_DIRECTORY ${SOURCE_DIR}/libarchive) - set_target_properties (archive_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/libarchive/${ep_lib_prefix}archive${lib_post}_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/libarchive/${ep_lib_prefix}archive${lib_post}${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/libarchive - INTERFACE_COMPILE_DEFINITIONS - LIBARCHIVE_STATIC) -endif() - -add_dependencies (archive_lib libarchive) -target_link_libraries (archive_lib INTERFACE lz4_lib) -target_link_libraries (ripple_libs INTERFACE archive_lib) -exclude_if_included (libarchive) -exclude_if_included (archive_lib) diff --git a/Builds/CMake/deps/Lz4.cmake b/Builds/CMake/deps/Lz4.cmake deleted file mode 100644 index 15d890692..000000000 --- a/Builds/CMake/deps/Lz4.cmake +++ /dev/null @@ -1,79 +0,0 @@ -#[===================================================================[ - NIH dep: lz4 -#]===================================================================] - -add_library (lz4_lib STATIC IMPORTED GLOBAL) - -if (NOT WIN32) - find_package(lz4) -endif() - -if(lz4) - set_target_properties (lz4_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${lz4} - IMPORTED_LOCATION_RELEASE - ${lz4} - INTERFACE_INCLUDE_DIRECTORIES - ${LZ4_INCLUDE_DIR}) - -else() - ExternalProject_Add (lz4 - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/lz4/lz4.git - GIT_TAG v1.9.2 - SOURCE_SUBDIR contrib/cmake_unofficial - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DBUILD_STATIC_LIBS=ON - -DBUILD_SHARED_LIBS=OFF - $<$: - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" - "-DCMAKE_C_FLAGS_DEBUG=-MTd" - "-DCMAKE_C_FLAGS_RELEASE=-MT" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --target lz4_static - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /$/${ep_lib_prefix}lz4$<$:_d>${ep_lib_suffix} - - > - TEST_COMMAND "" - INSTALL_COMMAND "" - BUILD_BYPRODUCTS - /${ep_lib_prefix}lz4${ep_lib_suffix} - /${ep_lib_prefix}lz4_d${ep_lib_suffix} - ) - ExternalProject_Get_Property (lz4 BINARY_DIR) - ExternalProject_Get_Property (lz4 SOURCE_DIR) - - file (MAKE_DIRECTORY ${SOURCE_DIR}/lz4) - set_target_properties (lz4_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/${ep_lib_prefix}lz4_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/${ep_lib_prefix}lz4${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/lib) - - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (lz4) - endif () - add_dependencies (lz4_lib lz4) - target_link_libraries (ripple_libs INTERFACE lz4_lib) - exclude_if_included (lz4) -endif() - -exclude_if_included (lz4_lib) diff --git a/Builds/CMake/deps/Nudb.cmake b/Builds/CMake/deps/Nudb.cmake deleted file mode 100644 index 9698d3f06..000000000 --- a/Builds/CMake/deps/Nudb.cmake +++ /dev/null @@ -1,31 +0,0 @@ -#[===================================================================[ - NIH dep: nudb - - NuDB is header-only, thus is an INTERFACE lib in CMake. - TODO: move the library definition into NuDB repo and add - proper targets and export/install -#]===================================================================] - -if (is_root_project) # NuDB not needed in the case of xrpl_core inclusion build - add_library (nudb INTERFACE) - FetchContent_Declare( - nudb_src - GIT_REPOSITORY https://github.com/CPPAlliance/NuDB.git - GIT_TAG 2.0.5 - ) - FetchContent_GetProperties(nudb_src) - if(NOT nudb_src_POPULATED) - message (STATUS "Pausing to download NuDB...") - FetchContent_Populate(nudb_src) - endif() - - file(TO_CMAKE_PATH "${nudb_src_SOURCE_DIR}" nudb_src_SOURCE_DIR) - # specify as system includes so as to avoid warnings - target_include_directories (nudb SYSTEM INTERFACE ${nudb_src_SOURCE_DIR}/include) - target_link_libraries (nudb - INTERFACE - Boost::thread - Boost::system) - add_library (NIH::nudb ALIAS nudb) - target_link_libraries (ripple_libs INTERFACE NIH::nudb) -endif () diff --git a/Builds/CMake/deps/OpenSSL.cmake b/Builds/CMake/deps/OpenSSL.cmake deleted file mode 100644 index ad5117aac..000000000 --- a/Builds/CMake/deps/OpenSSL.cmake +++ /dev/null @@ -1,48 +0,0 @@ -#[===================================================================[ - NIH dep: openssl -#]===================================================================] - -#[===============================================[ - OPENSSL_ROOT_DIR is the only variable that - FindOpenSSL honors for locating, so convert any - OPENSSL_ROOT vars to this -#]===============================================] -if (NOT DEFINED OPENSSL_ROOT_DIR) - if (DEFINED ENV{OPENSSL_ROOT}) - set (OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT}) - elseif (HOMEBREW) - execute_process (COMMAND ${HOMEBREW} --prefix openssl - OUTPUT_VARIABLE OPENSSL_ROOT_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE) - endif () - file (TO_CMAKE_PATH "${OPENSSL_ROOT_DIR}" OPENSSL_ROOT_DIR) -endif () - -if (static) - set (OPENSSL_USE_STATIC_LIBS ON) -endif () -set (OPENSSL_MSVC_STATIC_RT ON) -find_package (OpenSSL 1.1.1 REQUIRED) -target_link_libraries (ripple_libs - INTERFACE - OpenSSL::SSL - OpenSSL::Crypto) -# disable SSLv2...this can also be done when building/configuring OpenSSL -set_target_properties(OpenSSL::SSL PROPERTIES - INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2) -#[=========================================================[ - https://gitlab.kitware.com/cmake/cmake/issues/16885 - depending on how openssl is built, it might depend - on zlib. In fact, the openssl find package should - figure this out for us, but it does not currently... - so let's add zlib ourselves to the lib list - TODO: investigate linking to static zlib for static - build option -#]=========================================================] -find_package (ZLIB) -set (has_zlib FALSE) -if (TARGET ZLIB::ZLIB) - set_target_properties(OpenSSL::Crypto PROPERTIES - INTERFACE_LINK_LIBRARIES ZLIB::ZLIB) - set (has_zlib TRUE) -endif () diff --git a/Builds/CMake/deps/Postgres.cmake b/Builds/CMake/deps/Postgres.cmake deleted file mode 100644 index bb94832a4..000000000 --- a/Builds/CMake/deps/Postgres.cmake +++ /dev/null @@ -1,70 +0,0 @@ -if(reporting) - find_package(PostgreSQL) - if(NOT PostgreSQL_FOUND) - message("find_package did not find postgres") - find_library(postgres NAMES pq libpq libpq-dev pq-dev postgresql-devel) - find_path(libpq-fe NAMES libpq-fe.h PATH_SUFFIXES postgresql pgsql include) - - if(NOT libpq-fe_FOUND OR NOT postgres_FOUND) - message("No system installed Postgres found. Will build") - add_library(postgres SHARED IMPORTED GLOBAL) - add_library(pgport SHARED IMPORTED GLOBAL) - add_library(pgcommon SHARED IMPORTED GLOBAL) - ExternalProject_Add(postgres_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/postgres/postgres.git - GIT_TAG REL_14_5 - CONFIGURE_COMMAND ./configure --without-readline > /dev/null - BUILD_COMMAND ${CMAKE_COMMAND} -E env --unset=MAKELEVEL make - UPDATE_COMMAND "" - BUILD_IN_SOURCE 1 - INSTALL_COMMAND "" - BUILD_BYPRODUCTS - /src/interfaces/libpq/${ep_lib_prefix}pq.a - /src/common/${ep_lib_prefix}pgcommon.a - /src/port/${ep_lib_prefix}pgport.a - LOG_BUILD TRUE - ) - ExternalProject_Get_Property (postgres_src SOURCE_DIR) - ExternalProject_Get_Property (postgres_src BINARY_DIR) - - set (postgres_src_SOURCE_DIR "${SOURCE_DIR}") - file (MAKE_DIRECTORY ${postgres_src_SOURCE_DIR}) - list(APPEND INCLUDE_DIRS - ${SOURCE_DIR}/src/include - ${SOURCE_DIR}/src/interfaces/libpq - ) - set_target_properties(postgres PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/src/interfaces/libpq/${ep_lib_prefix}pq.a - INTERFACE_INCLUDE_DIRECTORIES - "${INCLUDE_DIRS}" - ) - set_target_properties(pgcommon PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/src/common/${ep_lib_prefix}pgcommon.a - INTERFACE_INCLUDE_DIRECTORIES - "${INCLUDE_DIRS}" - ) - set_target_properties(pgport PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/src/port/${ep_lib_prefix}pgport.a - INTERFACE_INCLUDE_DIRECTORIES - "${INCLUDE_DIRS}" - ) - add_dependencies(postgres postgres_src) - add_dependencies(pgcommon postgres_src) - add_dependencies(pgport postgres_src) - file(TO_CMAKE_PATH "${postgres_src_SOURCE_DIR}" postgres_src_SOURCE_DIR) - target_link_libraries(ripple_libs INTERFACE postgres pgcommon pgport) - else() - message("Found system installed Postgres via find_libary") - target_include_directories(ripple_libs INTERFACE ${libpq-fe}) - target_link_libraries(ripple_libs INTERFACE ${postgres}) - endif() - else() - message("Found system installed Postgres via find_package") - target_include_directories(ripple_libs INTERFACE ${PostgreSQL_INCLUDE_DIRS}) - target_link_libraries(ripple_libs INTERFACE ${PostgreSQL_LIBRARIES}) - endif() -endif() diff --git a/Builds/CMake/deps/Protobuf.cmake b/Builds/CMake/deps/Protobuf.cmake index 35d5b9f0f..4d4016e49 100644 --- a/Builds/CMake/deps/Protobuf.cmake +++ b/Builds/CMake/deps/Protobuf.cmake @@ -1,155 +1,22 @@ -#[===================================================================[ - import protobuf (lib and compiler) and create a lib - from our proto message definitions. If the system protobuf - is not found, fallback on EP to download and build a version - from official source. -#]===================================================================] +find_package(Protobuf 3.8) -if (static) - set (Protobuf_USE_STATIC_LIBS ON) -endif () -find_package (Protobuf 3.8) -if (is_multiconfig) - set(protobuf_protoc_lib ${Protobuf_PROTOC_LIBRARIES}) -else () - string(TOUPPER ${CMAKE_BUILD_TYPE} upper_cmake_build_type) - set(protobuf_protoc_lib ${Protobuf_PROTOC_LIBRARY_${upper_cmake_build_type}}) -endif () -if (local_protobuf OR NOT (Protobuf_FOUND AND Protobuf_PROTOC_EXECUTABLE AND protobuf_protoc_lib)) - include (GNUInstallDirs) - message (STATUS "using local protobuf build.") - set(protobuf_reqs Protobuf_PROTOC_EXECUTABLE protobuf_protoc_lib) - foreach(lib ${protobuf_reqs}) - if(NOT ${lib}) - message(STATUS "Couldn't find ${lib}") - endif() - endforeach() - if (WIN32) - # protobuf prepends lib even on windows - set (pbuf_lib_pre "lib") - else () - set (pbuf_lib_pre ${ep_lib_prefix}) - endif () - # for the external project build of protobuf, we currently ignore the - # static option and always build static libs here. This is consistent - # with our other EP builds. Dynamic libs in an EP would add complexity - # because we'd need to get them into the runtime path, and probably - # install them. - ExternalProject_Add (protobuf_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git - GIT_TAG v3.8.0 - SOURCE_SUBDIR cmake - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_INSTALL_PREFIX=/_installed_ - -Dprotobuf_BUILD_TESTS=OFF - -Dprotobuf_BUILD_EXAMPLES=OFF - -Dprotobuf_BUILD_PROTOC_BINARIES=ON - -Dprotobuf_MSVC_STATIC_RUNTIME=ON - -DBUILD_SHARED_LIBS=OFF - -Dprotobuf_BUILD_SHARED_LIBS=OFF - -DCMAKE_DEBUG_POSTFIX=_d - -Dprotobuf_DEBUG_POSTFIX=_d - -Dprotobuf_WITH_ZLIB=$,ON,OFF> - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - $<$:-DCMAKE_UNITY_BUILD=ON}> - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - $<$: - "-DCMAKE_CXX_FLAGS=-GR -Gd -fp:precise -FS -EHa -MP" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - TEST_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --config $ --target install - BUILD_BYPRODUCTS - /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf${ep_lib_suffix} - /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf_d${ep_lib_suffix} - /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc${ep_lib_suffix} - /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc_d${ep_lib_suffix} - /_installed_/bin/protoc${CMAKE_EXECUTABLE_SUFFIX} - ) - ExternalProject_Get_Property (protobuf_src BINARY_DIR) - ExternalProject_Get_Property (protobuf_src SOURCE_DIR) - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (protobuf_src) - endif () - exclude_if_included (protobuf_src) +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/proto_gen) +set(ccbd ${CMAKE_CURRENT_BINARY_DIR}) +set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_BINARY_DIR}/proto_gen) +protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/ripple/proto/ripple.proto) +set(CMAKE_CURRENT_BINARY_DIR ${ccbd}) - if (NOT TARGET protobuf::libprotobuf) - add_library (protobuf::libprotobuf STATIC IMPORTED GLOBAL) - endif () - file (MAKE_DIRECTORY ${BINARY_DIR}/_installed_/include) - set_target_properties (protobuf::libprotobuf PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${BINARY_DIR}/_installed_/include) - add_dependencies (protobuf::libprotobuf protobuf_src) - exclude_if_included (protobuf::libprotobuf) - - if (NOT TARGET protobuf::libprotoc) - add_library (protobuf::libprotoc STATIC IMPORTED GLOBAL) - endif () - set_target_properties (protobuf::libprotoc PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${BINARY_DIR}/_installed_/include) - add_dependencies (protobuf::libprotoc protobuf_src) - exclude_if_included (protobuf::libprotoc) - - if (NOT TARGET protobuf::protoc) - add_executable (protobuf::protoc IMPORTED) - exclude_if_included (protobuf::protoc) - endif () - set_target_properties (protobuf::protoc PROPERTIES - IMPORTED_LOCATION "${BINARY_DIR}/_installed_/bin/protoc${CMAKE_EXECUTABLE_SUFFIX}") - add_dependencies (protobuf::protoc protobuf_src) -else () - if (NOT TARGET protobuf::protoc) - if (EXISTS "${Protobuf_PROTOC_EXECUTABLE}") - add_executable (protobuf::protoc IMPORTED) - set_target_properties (protobuf::protoc PROPERTIES - IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}") - else () - message (FATAL_ERROR "Protobuf import failed") - endif () - endif () -endif () - -file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/proto_gen) -set (save_CBD ${CMAKE_CURRENT_BINARY_DIR}) -set (CMAKE_CURRENT_BINARY_DIR ${CMAKE_BINARY_DIR}/proto_gen) -protobuf_generate_cpp ( - PROTO_SRCS - PROTO_HDRS - src/ripple/proto/ripple.proto) -set (CMAKE_CURRENT_BINARY_DIR ${save_CBD}) - -add_library (pbufs STATIC ${PROTO_SRCS} ${PROTO_HDRS}) - -target_include_directories (pbufs PRIVATE src) -target_include_directories (pbufs - SYSTEM PUBLIC ${CMAKE_BINARY_DIR}/proto_gen) -target_link_libraries (pbufs protobuf::libprotobuf) -target_compile_options (pbufs +add_library(pbufs STATIC ${PROTO_SRCS} ${PROTO_HDRS}) +target_include_directories(pbufs SYSTEM PUBLIC + ${CMAKE_BINARY_DIR}/proto_gen + ${CMAKE_BINARY_DIR}/proto_gen/src/ripple/proto +) +target_link_libraries(pbufs protobuf::libprotobuf) +target_compile_options(pbufs PUBLIC - $<$: + $<$: --system-header-prefix="google/protobuf" -Wno-deprecated-dynamic-exception-spec - >) -add_library (Ripple::pbufs ALIAS pbufs) -target_link_libraries (ripple_libs INTERFACE Ripple::pbufs) -exclude_if_included (pbufs) + > +) +add_library(Ripple::pbufs ALIAS pbufs) \ No newline at end of file diff --git a/Builds/CMake/deps/Rocksdb.cmake b/Builds/CMake/deps/Rocksdb.cmake deleted file mode 100644 index 2c832c593..000000000 --- a/Builds/CMake/deps/Rocksdb.cmake +++ /dev/null @@ -1,177 +0,0 @@ -#[===================================================================[ - NIH dep: rocksdb -#]===================================================================] - -add_library (rocksdb_lib UNKNOWN IMPORTED GLOBAL) -set_target_properties (rocksdb_lib - PROPERTIES INTERFACE_COMPILE_DEFINITIONS RIPPLE_ROCKSDB_AVAILABLE=1) - -option (local_rocksdb "use local build of rocksdb." OFF) -if (NOT local_rocksdb) - find_package (RocksDB 6.27 QUIET CONFIG) - if (TARGET RocksDB::rocksdb) - message (STATUS "Found RocksDB using config.") - get_target_property (_rockslib_l RocksDB::rocksdb IMPORTED_LOCATION_DEBUG) - if (_rockslib_l) - set_target_properties (rocksdb_lib PROPERTIES IMPORTED_LOCATION_DEBUG ${_rockslib_l}) - endif () - get_target_property (_rockslib_l RocksDB::rocksdb IMPORTED_LOCATION_RELEASE) - if (_rockslib_l) - set_target_properties (rocksdb_lib PROPERTIES IMPORTED_LOCATION_RELEASE ${_rockslib_l}) - endif () - get_target_property (_rockslib_l RocksDB::rocksdb IMPORTED_LOCATION) - if (_rockslib_l) - set_target_properties (rocksdb_lib PROPERTIES IMPORTED_LOCATION ${_rockslib_l}) - endif () - get_target_property (_rockslib_i RocksDB::rocksdb INTERFACE_INCLUDE_DIRECTORIES) - if (_rockslib_i) - set_target_properties (rocksdb_lib PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${_rockslib_i}) - endif () - target_link_libraries (ripple_libs INTERFACE RocksDB::rocksdb) - else () - # using a find module with rocksdb is difficult because - # you have no idea how it was configured (transitive dependencies). - # the code below will generally find rocksdb using the module, but - # will then result in linker errors for static linkage since the - # transitive dependencies are unknown. force local build here for now, but leave the code as - # a placeholder for future investigation. - if (static) - set (local_rocksdb ON CACHE BOOL "" FORCE) - # TBD if there is some way to extract transitive deps..then: - #set (RocksDB_USE_STATIC ON) - else () - find_package (RocksDB 6.27 MODULE) - if (ROCKSDB_FOUND) - if (RocksDB_LIBRARY_DEBUG) - set_target_properties (rocksdb_lib PROPERTIES IMPORTED_LOCATION_DEBUG ${RocksDB_LIBRARY_DEBUG}) - endif () - set_target_properties (rocksdb_lib PROPERTIES IMPORTED_LOCATION_RELEASE ${RocksDB_LIBRARIES}) - set_target_properties (rocksdb_lib PROPERTIES IMPORTED_LOCATION ${RocksDB_LIBRARIES}) - set_target_properties (rocksdb_lib PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${RocksDB_INCLUDE_DIRS}) - else () - set (local_rocksdb ON CACHE BOOL "" FORCE) - endif () - endif () - endif () -endif () - -if (local_rocksdb) - message (STATUS "Using local build of RocksDB.") - ExternalProject_Add (rocksdb - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/facebook/rocksdb.git - GIT_TAG v6.27.3 - PATCH_COMMAND - # only used by windows build - ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/rocks_thirdparty.inc - /thirdparty.inc - COMMAND - # fixup their build version file to keep the values - # from changing always - ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/rocksdb_build_version.cc.in - /util/build_version.cc.in - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - $<$:-DCMAKE_UNITY_BUILD=ON}> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DBUILD_SHARED_LIBS=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DWITH_JEMALLOC=$,ON,OFF> - -DWITH_SNAPPY=ON - -DWITH_LZ4=ON - -DWITH_ZLIB=OFF - -DUSE_RTTI=ON - -DWITH_ZSTD=OFF - -DWITH_GFLAGS=OFF - -DWITH_BZ2=OFF - -ULZ4_* - -Ulz4_* - -Dlz4_INCLUDE_DIRS=$,::> - -Dlz4_LIBRARIES=$,$,$> - -Dlz4_FOUND=ON - -USNAPPY_* - -Usnappy_* - -USnappy_* - -Dsnappy_INCLUDE_DIRS=$,::> - -Dsnappy_LIBRARIES=$,$,$> - -Dsnappy_FOUND=ON - -DSnappy_INCLUDE_DIRS=$,::> - -DSnappy_LIBRARIES=$,$,$> - -DSnappy_FOUND=ON - -DWITH_MD_LIBRARY=OFF - -DWITH_RUNTIME_DEBUG=$,ON,OFF> - -DFAIL_ON_WARNINGS=OFF - -DWITH_ASAN=OFF - -DWITH_TSAN=OFF - -DWITH_UBSAN=OFF - -DWITH_NUMA=OFF - -DWITH_TBB=OFF - -DWITH_WINDOWS_UTF8_FILENAMES=OFF - -DWITH_XPRESS=OFF - -DPORTABLE=ON - -DFORCE_SSE42=OFF - -DDISABLE_STALL_NOTIF=OFF - -DOPTDBG=ON - -DROCKSDB_LITE=OFF - -DWITH_FALLOCATE=ON - -DWITH_LIBRADOS=OFF - -DWITH_JNI=OFF - -DROCKSDB_INSTALL_ON_WINDOWS=OFF - -DWITH_TESTS=OFF - -DWITH_TOOLS=OFF - $<$: - "-DCMAKE_CXX_FLAGS=-GR -Gd -fp:precise -FS -MP /DNDEBUG" - > - $<$>: - "-DCMAKE_CXX_FLAGS=-DNDEBUG" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /$/${ep_lib_prefix}rocksdb$<$:_d>${ep_lib_suffix} - - > - LIST_SEPARATOR :: - TEST_COMMAND "" - INSTALL_COMMAND "" - DEPENDS snappy_lib lz4_lib - BUILD_BYPRODUCTS - /${ep_lib_prefix}rocksdb${ep_lib_suffix} - /${ep_lib_prefix}rocksdb_d${ep_lib_suffix} - ) - ExternalProject_Get_Property (rocksdb BINARY_DIR) - ExternalProject_Get_Property (rocksdb SOURCE_DIR) - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (rocksdb) - endif () - file (MAKE_DIRECTORY ${SOURCE_DIR}/include) - set_target_properties (rocksdb_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/${ep_lib_prefix}rocksdb_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/${ep_lib_prefix}rocksdb${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/include) - add_dependencies (rocksdb_lib rocksdb) - exclude_if_included (rocksdb) -endif () - -target_link_libraries (rocksdb_lib - INTERFACE - snappy_lib - lz4_lib - $<$:rpcrt4>) -exclude_if_included (rocksdb_lib) -target_link_libraries (ripple_libs INTERFACE rocksdb_lib) diff --git a/Builds/CMake/deps/Secp256k1.cmake b/Builds/CMake/deps/Secp256k1.cmake deleted file mode 100644 index 319731562..000000000 --- a/Builds/CMake/deps/Secp256k1.cmake +++ /dev/null @@ -1,58 +0,0 @@ -#[===================================================================[ - NIH dep: secp256k1 -#]===================================================================] - -add_library (secp256k1_lib STATIC IMPORTED GLOBAL) - -if (NOT WIN32) - find_package(secp256k1) -endif() - -if(secp256k1) - set_target_properties (secp256k1_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${secp256k1} - IMPORTED_LOCATION_RELEASE - ${secp256k1} - INTERFACE_INCLUDE_DIRECTORIES - ${SECP256K1_INCLUDE_DIR}) - - add_library (secp256k1 ALIAS secp256k1_lib) - add_library (NIH::secp256k1 ALIAS secp256k1_lib) - -else() - set(INSTALL_SECP256K1 true) - - add_library (secp256k1 STATIC - src/secp256k1/src/secp256k1.c) - target_compile_definitions (secp256k1 - PRIVATE - USE_NUM_NONE - USE_FIELD_10X26 - USE_FIELD_INV_BUILTIN - USE_SCALAR_8X32 - USE_SCALAR_INV_BUILTIN) - target_include_directories (secp256k1 - PUBLIC - $ - $ - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/secp256k1) - target_compile_options (secp256k1 - PRIVATE - $<$:-wd4319> - $<$>: - -Wno-deprecated-declarations - -Wno-unused-function - > - $<$:-Wno-nonnull-compare>) - target_link_libraries (ripple_libs INTERFACE NIH::secp256k1) -#[===========================[ - headers installation -#]===========================] - install ( - FILES - src/secp256k1/include/secp256k1.h - DESTINATION include/secp256k1/include) - - add_library (NIH::secp256k1 ALIAS secp256k1) -endif() diff --git a/Builds/CMake/deps/Snappy.cmake b/Builds/CMake/deps/Snappy.cmake deleted file mode 100644 index 331ac2fbe..000000000 --- a/Builds/CMake/deps/Snappy.cmake +++ /dev/null @@ -1,77 +0,0 @@ -#[===================================================================[ - NIH dep: snappy -#]===================================================================] - -add_library (snappy_lib STATIC IMPORTED GLOBAL) - -if (NOT WIN32) - find_package(snappy) -endif() - -if(snappy) - set_target_properties (snappy_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${snappy} - IMPORTED_LOCATION_RELEASE - ${snappy} - INTERFACE_INCLUDE_DIRECTORIES - ${SNAPPY_INCLUDE_DIR}) - -else() - ExternalProject_Add (snappy - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/google/snappy.git - GIT_TAG 1.1.7 - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DBUILD_SHARED_LIBS=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DSNAPPY_BUILD_TESTS=OFF - $<$: - "-DCMAKE_CXX_FLAGS=-GR -Gd -fp:precise -FS -EHa -MP" - "-DCMAKE_CXX_FLAGS_DEBUG=-MTd" - "-DCMAKE_CXX_FLAGS_RELEASE=-MT" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /$/${ep_lib_prefix}snappy$<$:_d>${ep_lib_suffix} - - > - TEST_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} -E copy_if_different /config.h /snappy-stubs-public.h - BUILD_BYPRODUCTS - /${ep_lib_prefix}snappy${ep_lib_suffix} - /${ep_lib_prefix}snappy_d${ep_lib_suffix} - ) - ExternalProject_Get_Property (snappy BINARY_DIR) - ExternalProject_Get_Property (snappy SOURCE_DIR) - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (snappy) - endif () - file (MAKE_DIRECTORY ${SOURCE_DIR}/snappy) - set_target_properties (snappy_lib PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/${ep_lib_prefix}snappy_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/${ep_lib_prefix}snappy${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}) -endif() - -add_dependencies (snappy_lib snappy) -target_link_libraries (ripple_libs INTERFACE snappy_lib) -exclude_if_included (snappy) -exclude_if_included (snappy_lib) diff --git a/Builds/CMake/deps/Soci.cmake b/Builds/CMake/deps/Soci.cmake deleted file mode 100644 index d165d6e1f..000000000 --- a/Builds/CMake/deps/Soci.cmake +++ /dev/null @@ -1,165 +0,0 @@ -#[===================================================================[ - NIH dep: soci -#]===================================================================] - -foreach (_comp core empty sqlite3) - add_library ("soci_${_comp}" STATIC IMPORTED GLOBAL) -endforeach () - -if (NOT WIN32) - find_package(soci) -endif() - -if (soci) - foreach (_comp core empty sqlite3) - set_target_properties ("soci_${_comp}" PROPERTIES - IMPORTED_LOCATION_DEBUG - ${soci} - IMPORTED_LOCATION_RELEASE - ${soci} - INTERFACE_INCLUDE_DIRECTORIES - ${SOCI_INCLUDE_DIR}) - endforeach () - -else() - set (soci_lib_pre ${ep_lib_prefix}) - set (soci_lib_post "") - if (WIN32) - # for some reason soci on windows still prepends lib (non-standard) - set (soci_lib_pre lib) - # this version in the name might change if/when we change versions of soci - set (soci_lib_post "_4_0") - endif () - get_target_property (_boost_incs Boost::date_time INTERFACE_INCLUDE_DIRECTORIES) - get_target_property (_boost_dt Boost::date_time IMPORTED_LOCATION) - if (NOT _boost_dt) - get_target_property (_boost_dt Boost::date_time IMPORTED_LOCATION_RELEASE) - endif () - if (NOT _boost_dt) - get_target_property (_boost_dt Boost::date_time IMPORTED_LOCATION_DEBUG) - endif () - - ExternalProject_Add (soci - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/SOCI/soci.git - GIT_TAG 04e1870294918d20761736743bb6136314c42dd5 - # We had an issue with soci integer range checking for boost::optional - # and needed to remove the exception that SOCI throws in this case. - # This is *probably* a bug in SOCI, but has never been investigated more - # nor reported to the maintainers. - # This cmake script comments out the lines in question. - # This patch process is likely fragile and should be reviewed carefully - # whenever we update the GIT_TAG above. - PATCH_COMMAND - ${CMAKE_COMMAND} -D RIPPLED_SOURCE=${CMAKE_CURRENT_SOURCE_DIR} - -P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/soci_patch.cmake - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - $<$:-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}> - $<$:-DVCPKG_TARGET_TRIPLET=${VCPKG_TARGET_TRIPLET}> - $<$:-DCMAKE_UNITY_BUILD=ON}> - -DCMAKE_PREFIX_PATH=${CMAKE_BINARY_DIR}/sqlite3 - -DCMAKE_MODULE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake - -DCMAKE_INCLUDE_PATH=$,::> - -DCMAKE_LIBRARY_PATH=${sqlite_BINARY_DIR} - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DSOCI_CXX_C11=ON - -DSOCI_STATIC=ON - -DSOCI_LIBDIR=lib - -DSOCI_SHARED=OFF - -DSOCI_TESTS=OFF - # hacks to workaround the fact that soci doesn't currently use - # boost imported targets in its cmake. If they switch to - # proper imported targets, this next line can be removed - # (as well as the get_property above that sets _boost_incs) - -DBoost_INCLUDE_DIRS=$ - -DBoost_INCLUDE_DIR=$ - -DBOOST_ROOT=${BOOST_ROOT} - -DWITH_BOOST=ON - -DBoost_FOUND=ON - -DBoost_NO_BOOST_CMAKE=ON - -DBoost_DATE_TIME_FOUND=ON - -DSOCI_HAVE_BOOST=ON - -DSOCI_HAVE_BOOST_DATE_TIME=ON - -DBoost_DATE_TIME_LIBRARY=${_boost_dt} - -DSOCI_DB2=OFF - -DSOCI_FIREBIRD=OFF - -DSOCI_MYSQL=OFF - -DSOCI_ODBC=OFF - -DSOCI_ORACLE=OFF - -DSOCI_POSTGRESQL=OFF - -DSOCI_SQLITE3=ON - -DSQLITE3_INCLUDE_DIR=$,::> - -DSQLITE3_LIBRARY=$,$,$> - $<$:-DCMAKE_FIND_FRAMEWORK=LAST> - $<$: - "-DCMAKE_CXX_FLAGS=-GR -Gd -fp:precise -FS -EHa -MP" - "-DCMAKE_CXX_FLAGS_DEBUG=-MTd" - "-DCMAKE_CXX_FLAGS_RELEASE=-MT" - > - $<$>: - "-DCMAKE_CXX_FLAGS=-Wno-deprecated-declarations" - > - # SEE: https://github.com/SOCI/soci/issues/640 - $<$,$>: - "-DCMAKE_CXX_FLAGS=-Wno-deprecated-declarations -Wno-error=format-overflow -Wno-format-overflow -Wno-error=format-truncation" - > - LIST_SEPARATOR :: - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /lib/$/${soci_lib_pre}soci_core${soci_lib_post}$<$:_d>${ep_lib_suffix} - /lib/$/${soci_lib_pre}soci_empty${soci_lib_post}$<$:_d>${ep_lib_suffix} - /lib/$/${soci_lib_pre}soci_sqlite3${soci_lib_post}$<$:_d>${ep_lib_suffix} - /lib - > - TEST_COMMAND "" - INSTALL_COMMAND "" - DEPENDS sqlite - BUILD_BYPRODUCTS - /lib/${soci_lib_pre}soci_core${soci_lib_post}${ep_lib_suffix} - /lib/${soci_lib_pre}soci_core${soci_lib_post}_d${ep_lib_suffix} - /lib/${soci_lib_pre}soci_empty${soci_lib_post}${ep_lib_suffix} - /lib/${soci_lib_pre}soci_empty${soci_lib_post}_d${ep_lib_suffix} - /lib/${soci_lib_pre}soci_sqlite3${soci_lib_post}${ep_lib_suffix} - /lib/${soci_lib_pre}soci_sqlite3${soci_lib_post}_d${ep_lib_suffix} - ) - ExternalProject_Get_Property (soci BINARY_DIR) - ExternalProject_Get_Property (soci SOURCE_DIR) - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (soci) - endif () - file (MAKE_DIRECTORY ${SOURCE_DIR}/include) - file (MAKE_DIRECTORY ${BINARY_DIR}/include) - foreach (_comp core empty sqlite3) - set_target_properties ("soci_${_comp}" PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/lib/${soci_lib_pre}soci_${_comp}${soci_lib_post}_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/lib/${soci_lib_pre}soci_${_comp}${soci_lib_post}${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - "${SOURCE_DIR}/include;${BINARY_DIR}/include") - add_dependencies ("soci_${_comp}" soci) # something has to depend on the ExternalProject to trigger it - target_link_libraries (ripple_libs INTERFACE "soci_${_comp}") - if (NOT _comp STREQUAL "core") - target_link_libraries ("soci_${_comp}" INTERFACE soci_core) - endif () - endforeach () -endif() - -foreach (_comp core empty sqlite3) - exclude_if_included ("soci_${_comp}") -endforeach () - - -exclude_if_included (soci) diff --git a/Builds/CMake/deps/Sqlite.cmake b/Builds/CMake/deps/Sqlite.cmake deleted file mode 100644 index 7b34c1121..000000000 --- a/Builds/CMake/deps/Sqlite.cmake +++ /dev/null @@ -1,93 +0,0 @@ -#[===================================================================[ - NIH dep: sqlite -#]===================================================================] - -add_library (sqlite STATIC IMPORTED GLOBAL) - -if (NOT WIN32) - find_package(sqlite) -endif() - - -if(sqlite3) - set_target_properties (sqlite PROPERTIES - IMPORTED_LOCATION_DEBUG - ${sqlite3} - IMPORTED_LOCATION_RELEASE - ${sqlite3} - INTERFACE_INCLUDE_DIRECTORIES - ${SQLITE_INCLUDE_DIR}) - -else() - ExternalProject_Add (sqlite3 - PREFIX ${nih_cache_path} - # sqlite doesn't use git, but it provides versioned tarballs - URL https://www.sqlite.org/2018/sqlite-amalgamation-3260000.zip - http://www.sqlite.org/2018/sqlite-amalgamation-3260000.zip - https://www2.sqlite.org/2018/sqlite-amalgamation-3260000.zip - http://www2.sqlite.org/2018/sqlite-amalgamation-3260000.zip - # ^^^ version is apparent in the URL: 3260000 => 3.26.0 - URL_HASH SHA256=de5dcab133aa339a4cf9e97c40aa6062570086d6085d8f9ad7bc6ddf8a52096e - # Don't need to worry about MITM attacks too much because the download - # is checked against a strong hash - TLS_VERIFY false - # we wrote a very simple CMake file to build sqlite - # so that's what we copy here so that we can build with - # CMake. sqlite doesn't generally provided a build system - # for the single amalgamation source file. - PATCH_COMMAND - ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/CMake_sqlite3.txt - /CMakeLists.txt - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - $<$: - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" - "-DCMAKE_C_FLAGS_DEBUG=-MTd" - "-DCMAKE_C_FLAGS_RELEASE=-MT" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /$/${ep_lib_prefix}sqlite3$<$:_d>${ep_lib_suffix} - - > - TEST_COMMAND "" - INSTALL_COMMAND "" - BUILD_BYPRODUCTS - /${ep_lib_prefix}sqlite3${ep_lib_suffix} - /${ep_lib_prefix}sqlite3_d${ep_lib_suffix} - ) - ExternalProject_Get_Property (sqlite3 BINARY_DIR) - ExternalProject_Get_Property (sqlite3 SOURCE_DIR) - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (sqlite3) - endif () - - set_target_properties (sqlite PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/${ep_lib_prefix}sqlite3_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/${ep_lib_prefix}sqlite3${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}) - - add_dependencies (sqlite sqlite3) - exclude_if_included (sqlite3) -endif() - -target_link_libraries (sqlite INTERFACE $<$>:dl>) -target_link_libraries (ripple_libs INTERFACE sqlite) -exclude_if_included (sqlite) -set(sqlite_BINARY_DIR ${BINARY_DIR}) diff --git a/Builds/CMake/deps/WasmEdge.cmake b/Builds/CMake/deps/WasmEdge.cmake index a66240576..4624cdbaa 100644 --- a/Builds/CMake/deps/WasmEdge.cmake +++ b/Builds/CMake/deps/WasmEdge.cmake @@ -1,84 +1 @@ -#[===================================================================[ - NIH dep: wasmedge: web assembly runtime for hooks. -#]===================================================================] - -find_package(Curses) -if(CURSES_FOUND) - include_directories(${CURSES_INCLUDE_DIR}) - target_link_libraries(ripple_libs INTERFACE ${CURSES_LIBRARY}) -else() - message(WARNING "CURSES library not found... (only important for mac builds)") -endif() - - -find_package(LLVM REQUIRED CONFIG) -message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") -message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") -ExternalProject_Add (wasmedge_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/WasmEdge/WasmEdge.git - GIT_TAG 0.11.2 - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=_d - -DWASMEDGE_BUILD_SHARED_LIB=OFF - -DWASMEDGE_BUILD_STATIC_LIB=ON - -DWASMEDGE_BUILD_AOT_RUNTIME=ON - -DWASMEDGE_FORCE_DISABLE_LTO=ON - -DWASMEDGE_LINK_LLVM_STATIC=ON - -DWASMEDGE_LINK_TOOLS_STATIC=ON - -DWASMEDGE_BUILD_PLUGINS=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DLLVM_DIR=${LLVM_DIR} - -DLLVM_LIBRARY_DIR=${LLVM_LIBRARY_DIR} - -DLLVM_ENABLE_TERMINFO=OFF - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - $<$: - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP -march=native" - "-DCMAKE_C_FLAGS_DEBUG=-MTd" - "-DCMAKE_C_FLAGS_RELEASE=-MT" - > - LOG_CONFIGURE ON - LOG_BUILD ON - LOG_CONFIGURE ON - COMMAND - pwd - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - $<$:--parallel ${ep_procs}> - TEST_COMMAND "" - INSTALL_COMMAND "" - BUILD_BYPRODUCTS - /lib/api/libwasmedge.a -) -add_library (wasmedge STATIC IMPORTED GLOBAL) -ExternalProject_Get_Property (wasmedge_src BINARY_DIR) -ExternalProject_Get_Property (wasmedge_src SOURCE_DIR) -set (wasmedge_src_BINARY_DIR "${BINARY_DIR}") -add_dependencies (wasmedge wasmedge_src) -execute_process( - COMMAND - mkdir -p "${wasmedge_src_BINARY_DIR}/include/api" -) -set_target_properties (wasmedge PROPERTIES - IMPORTED_LOCATION_DEBUG - "${wasmedge_src_BINARY_DIR}/lib/api/libwasmedge.a" - IMPORTED_LOCATION_RELEASE - "${wasmedge_src_BINARY_DIR}/lib/api/libwasmedge.a" - INTERFACE_INCLUDE_DIRECTORIES - "${wasmedge_src_BINARY_DIR}/include/api/" -) -target_link_libraries (ripple_libs INTERFACE wasmedge) -#RH NOTE: some compilers / versions of some libraries need these, most don't - -find_library(XAR_LIBRARY NAMES xar) -if(XAR_LIBRARY) - target_link_libraries(ripple_libs INTERFACE ${XAR_LIBRARY}) -else() - message(WARNING "xar library not found... (only important for mac builds)") -endif() -add_library (wasmedge::wasmedge ALIAS wasmedge) +find_package(wasmedge REQUIRED) diff --git a/Builds/CMake/deps/cassandra.cmake b/Builds/CMake/deps/cassandra.cmake deleted file mode 100644 index 4563a3413..000000000 --- a/Builds/CMake/deps/cassandra.cmake +++ /dev/null @@ -1,167 +0,0 @@ -if(reporting) - find_library(cassandra NAMES cassandra) - if(NOT cassandra) - - message("System installed Cassandra cpp driver not found. Will build") - - find_library(zlib NAMES zlib1g-dev zlib-devel zlib z) - if(NOT zlib) - message("zlib not found. will build") - add_library(zlib STATIC IMPORTED GLOBAL) - ExternalProject_Add(zlib_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/madler/zlib.git - GIT_TAG v1.2.12 - INSTALL_COMMAND "" - BUILD_BYPRODUCTS /${ep_lib_prefix}z.a - LOG_BUILD TRUE - LOG_CONFIGURE TRUE - ) - - - ExternalProject_Get_Property (zlib_src SOURCE_DIR) - ExternalProject_Get_Property (zlib_src BINARY_DIR) - set (zlib_src_SOURCE_DIR "${SOURCE_DIR}") - file (MAKE_DIRECTORY ${zlib_src_SOURCE_DIR}/include) - - set_target_properties (zlib PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/${ep_lib_prefix}z.a - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/include) - add_dependencies(zlib zlib_src) - - file(TO_CMAKE_PATH "${zlib_src_SOURCE_DIR}" zlib_src_SOURCE_DIR) - endif() - - - - - find_library(krb5 NAMES krb5-dev libkrb5-dev) - - if(NOT krb5) - message("krb5 not found. will build") - add_library(krb5 STATIC IMPORTED GLOBAL) - ExternalProject_Add(krb5_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/krb5/krb5.git - GIT_TAG krb5-1.20-final - UPDATE_COMMAND "" - CONFIGURE_COMMAND autoreconf src && CFLAGS=-fcommon ./src/configure --enable-static --disable-shared > /dev/null - BUILD_IN_SOURCE 1 - BUILD_COMMAND make - INSTALL_COMMAND "" - BUILD_BYPRODUCTS /lib/${ep_lib_prefix}krb5.a - LOG_BUILD TRUE - ) - - ExternalProject_Get_Property (krb5_src SOURCE_DIR) - ExternalProject_Get_Property (krb5_src BINARY_DIR) - set (krb5_src_SOURCE_DIR "${SOURCE_DIR}") - file (MAKE_DIRECTORY ${krb5_src_SOURCE_DIR}/include) - - set_target_properties (krb5 PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/lib/${ep_lib_prefix}krb5.a - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/include) - add_dependencies(krb5 krb5_src) - - file(TO_CMAKE_PATH "${krb5_src_SOURCE_DIR}" krb5_src_SOURCE_DIR) - endif() - - - find_library(libuv1 NAMES uv1 libuv1 liubuv1-dev libuv1:amd64) - - - if(NOT libuv1) - message("libuv1 not found, will build") - add_library(libuv1 STATIC IMPORTED GLOBAL) - ExternalProject_Add(libuv_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/libuv/libuv.git - GIT_TAG v1.44.2 - INSTALL_COMMAND "" - BUILD_BYPRODUCTS /${ep_lib_prefix}uv_a.a - LOG_BUILD TRUE - LOG_CONFIGURE TRUE - ) - - ExternalProject_Get_Property (libuv_src SOURCE_DIR) - ExternalProject_Get_Property (libuv_src BINARY_DIR) - set (libuv_src_SOURCE_DIR "${SOURCE_DIR}") - file (MAKE_DIRECTORY ${libuv_src_SOURCE_DIR}/include) - - set_target_properties (libuv1 PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/${ep_lib_prefix}uv_a.a - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/include) - add_dependencies(libuv1 libuv_src) - - file(TO_CMAKE_PATH "${libuv_src_SOURCE_DIR}" libuv_src_SOURCE_DIR) - endif() - - add_library (cassandra STATIC IMPORTED GLOBAL) - ExternalProject_Add(cassandra_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/datastax/cpp-driver.git - GIT_TAG 2.16.2 - CMAKE_ARGS - -DLIBUV_ROOT_DIR=${BINARY_DIR} - -DLIBUV_LIBARY=${BINARY_DIR}/libuv_a.a - -DLIBUV_INCLUDE_DIR=${SOURCE_DIR}/include - -DCASS_BUILD_STATIC=ON - -DCASS_BUILD_SHARED=OFF - -DOPENSSL_ROOT_DIR=/opt/local/openssl - INSTALL_COMMAND "" - BUILD_BYPRODUCTS /${ep_lib_prefix}cassandra_static.a - LOG_BUILD TRUE - LOG_CONFIGURE TRUE - ) - - ExternalProject_Get_Property (cassandra_src SOURCE_DIR) - ExternalProject_Get_Property (cassandra_src BINARY_DIR) - set (cassandra_src_SOURCE_DIR "${SOURCE_DIR}") - file (MAKE_DIRECTORY ${cassandra_src_SOURCE_DIR}/include) - - set_target_properties (cassandra PROPERTIES - IMPORTED_LOCATION - ${BINARY_DIR}/${ep_lib_prefix}cassandra_static.a - INTERFACE_INCLUDE_DIRECTORIES - ${SOURCE_DIR}/include) - add_dependencies(cassandra cassandra_src) - - if(NOT libuv1) - ExternalProject_Add_StepDependencies(cassandra_src build libuv1) - target_link_libraries(cassandra INTERFACE libuv1) - else() - target_link_libraries(cassandra INTERFACE ${libuv1}) - endif() - if(NOT krb5) - - ExternalProject_Add_StepDependencies(cassandra_src build krb5) - target_link_libraries(cassandra INTERFACE krb5) - else() - target_link_libraries(cassandra INTERFACE ${krb5}) - endif() - - if(NOT zlib) - ExternalProject_Add_StepDependencies(cassandra_src build zlib) - target_link_libraries(cassandra INTERFACE zlib) - else() - target_link_libraries(cassandra INTERFACE ${zlib}) - endif() - - file(TO_CMAKE_PATH "${cassandra_src_SOURCE_DIR}" cassandra_src_SOURCE_DIR) - target_link_libraries(ripple_libs INTERFACE cassandra) - else() - message("Found system installed cassandra cpp driver") - - find_path(cassandra_includes NAMES cassandra.h REQUIRED) - target_link_libraries (ripple_libs INTERFACE ${cassandra}) - target_include_directories(ripple_libs INTERFACE ${cassandra_includes}) - endif() - - exclude_if_included (cassandra) -endif() diff --git a/Builds/CMake/deps/date.cmake b/Builds/CMake/deps/date.cmake deleted file mode 100644 index b9155c264..000000000 --- a/Builds/CMake/deps/date.cmake +++ /dev/null @@ -1,18 +0,0 @@ -#[===================================================================[ - NIH dep: date - - the main library is header-only, thus is an INTERFACE lib in CMake. - - NOTE: this has been accepted into c++20 so can likely be replaced - when we update to that standard -#]===================================================================] - -find_package (date QUIET) -if (NOT TARGET date::date) - FetchContent_Declare( - hh_date_src - GIT_REPOSITORY https://github.com/HowardHinnant/date.git - GIT_TAG fc4cf092f9674f2670fb9177edcdee870399b829 - ) - FetchContent_MakeAvailable(hh_date_src) -endif () diff --git a/Builds/CMake/deps/gRPC.cmake b/Builds/CMake/deps/gRPC.cmake index e4beaf89d..0930ba4dd 100644 --- a/Builds/CMake/deps/gRPC.cmake +++ b/Builds/CMake/deps/gRPC.cmake @@ -1,324 +1,15 @@ - -# currently linking to unsecure versions...if we switch, we'll -# need to add ssl as a link dependency to the grpc targets -option (use_secure_grpc "use TLS version of grpc libs." OFF) -if (use_secure_grpc) - set (grpc_suffix "") -else () - set (grpc_suffix "_unsecure") -endif () - -find_package (gRPC 1.23 CONFIG QUIET) -if (TARGET gRPC::gpr AND NOT local_grpc) - get_target_property (_grpc_l gRPC::gpr IMPORTED_LOCATION_DEBUG) - if (NOT _grpc_l) - get_target_property (_grpc_l gRPC::gpr IMPORTED_LOCATION_RELEASE) - endif () - if (NOT _grpc_l) - get_target_property (_grpc_l gRPC::gpr IMPORTED_LOCATION) - endif () - message (STATUS "Found cmake config for gRPC. Using ${_grpc_l}.") -else () - find_package (PkgConfig QUIET) - if (PKG_CONFIG_FOUND) - pkg_check_modules (grpc QUIET "grpc${grpc_suffix}>=1.25" "grpc++${grpc_suffix}" gpr) - endif () - - if (grpc_FOUND) - message (STATUS "Found gRPC using pkg-config. Using ${grpc_gpr_PREFIX}.") - endif () - - add_executable (gRPC::grpc_cpp_plugin IMPORTED) - exclude_if_included (gRPC::grpc_cpp_plugin) - - if (grpc_FOUND AND NOT local_grpc) - # use installed grpc (via pkg-config) - macro (add_imported_grpc libname_) - if (static) - set (_search "${CMAKE_STATIC_LIBRARY_PREFIX}${libname_}${CMAKE_STATIC_LIBRARY_SUFFIX}") - else () - set (_search "${CMAKE_SHARED_LIBRARY_PREFIX}${libname_}${CMAKE_SHARED_LIBRARY_SUFFIX}") - endif() - find_library(_found_${libname_} - NAMES ${_search} - HINTS ${grpc_LIBRARY_DIRS}) - if (_found_${libname_}) - message (STATUS "importing ${libname_} as ${_found_${libname_}}") - else () - message (FATAL_ERROR "using pkg-config for grpc, can't find ${_search}") - endif () - add_library ("gRPC::${libname_}" STATIC IMPORTED GLOBAL) - set_target_properties ("gRPC::${libname_}" PROPERTIES IMPORTED_LOCATION ${_found_${libname_}}) - if (grpc_INCLUDE_DIRS) - set_target_properties ("gRPC::${libname_}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${grpc_INCLUDE_DIRS}) - endif () - target_link_libraries (ripple_libs INTERFACE "gRPC::${libname_}") - exclude_if_included ("gRPC::${libname_}") - endmacro () - - set_target_properties (gRPC::grpc_cpp_plugin PROPERTIES - IMPORTED_LOCATION "${grpc_gpr_PREFIX}/bin/grpc_cpp_plugin${CMAKE_EXECUTABLE_SUFFIX}") - - pkg_check_modules (cares QUIET libcares) - if (cares_FOUND) - if (static) - set (_search "${CMAKE_STATIC_LIBRARY_PREFIX}cares${CMAKE_STATIC_LIBRARY_SUFFIX}") - set (_prefix cares_STATIC) - set (_static STATIC) - else () - set (_search "${CMAKE_SHARED_LIBRARY_PREFIX}cares${CMAKE_SHARED_LIBRARY_SUFFIX}") - set (_prefix cares) - set (_static) - endif() - find_library(_location NAMES ${_search} HINTS ${cares_LIBRARY_DIRS}) - if (NOT _location) - message (FATAL_ERROR "using pkg-config for grpc, can't find c-ares") - endif () - if(${_location} MATCHES "\\.a$") - add_library(c-ares::cares STATIC IMPORTED GLOBAL) - else() - add_library(c-ares::cares SHARED IMPORTED GLOBAL) - endif() - set_target_properties (c-ares::cares PROPERTIES - IMPORTED_LOCATION ${_location} - INTERFACE_INCLUDE_DIRECTORIES "${${_prefix}_INCLUDE_DIRS}" - INTERFACE_LINK_OPTIONS "${${_prefix}_LDFLAGS}" - ) - exclude_if_included (c-ares::cares) - else () - message (FATAL_ERROR "using pkg-config for grpc, can't find c-ares") - endif () - else () - #[===========================[ - c-ares (grpc requires) - #]===========================] - ExternalProject_Add (c-ares_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/c-ares/c-ares.git - GIT_TAG cares-1_15_0 - CMAKE_ARGS - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DCMAKE_INSTALL_PREFIX=/_installed_ - -DCARES_SHARED=OFF - -DCARES_STATIC=ON - -DCARES_STATIC_PIC=ON - -DCARES_INSTALL=ON - -DCARES_MSVC_STATIC_RUNTIME=ON - $<$: - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - TEST_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --config $ --target install - BUILD_BYPRODUCTS - /_installed_/lib/${ep_lib_prefix}cares${ep_lib_suffix} - /_installed_/lib/${ep_lib_prefix}cares_d${ep_lib_suffix} - ) - exclude_if_included (c-ares_src) - ExternalProject_Get_Property (c-ares_src BINARY_DIR) - set (cares_binary_dir "${BINARY_DIR}") - - add_library (c-ares::cares STATIC IMPORTED GLOBAL) - file (MAKE_DIRECTORY ${BINARY_DIR}/_installed_/include) - set_target_properties (c-ares::cares PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/_installed_/lib/${ep_lib_prefix}cares_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/_installed_/lib/${ep_lib_prefix}cares${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${BINARY_DIR}/_installed_/include) - add_dependencies (c-ares::cares c-ares_src) - exclude_if_included (c-ares::cares) - - if (NOT has_zlib) - #[===========================[ - zlib (grpc requires) - #]===========================] - if (MSVC) - set (zlib_debug_postfix "d") # zlib cmake sets this internally for MSVC, so we really don't have a choice - set (zlib_base "zlibstatic") - else () - set (zlib_debug_postfix "_d") - set (zlib_base "z") - endif () - ExternalProject_Add (zlib_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/madler/zlib.git - GIT_TAG v1.2.11 - CMAKE_ARGS - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_DEBUG_POSTFIX=${zlib_debug_postfix} - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DCMAKE_INSTALL_PREFIX=/_installed_ - -DBUILD_SHARED_LIBS=OFF - $<$: - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" - "-DCMAKE_C_FLAGS_DEBUG=-MTd" - "-DCMAKE_C_FLAGS_RELEASE=-MT" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - TEST_COMMAND "" - INSTALL_COMMAND - ${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --config $ --target install - BUILD_BYPRODUCTS - /_installed_/lib/${ep_lib_prefix}${zlib_base}${ep_lib_suffix} - /_installed_/lib/${ep_lib_prefix}${zlib_base}${zlib_debug_postfix}${ep_lib_suffix} - ) - exclude_if_included (zlib_src) - ExternalProject_Get_Property (zlib_src BINARY_DIR) - set (zlib_binary_dir "${BINARY_DIR}") - - add_library (ZLIB::ZLIB STATIC IMPORTED GLOBAL) - file (MAKE_DIRECTORY ${BINARY_DIR}/_installed_/include) - set_target_properties (ZLIB::ZLIB PROPERTIES - IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/_installed_/lib/${ep_lib_prefix}${zlib_base}${zlib_debug_postfix}${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/_installed_/lib/${ep_lib_prefix}${zlib_base}${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${BINARY_DIR}/_installed_/include) - add_dependencies (ZLIB::ZLIB zlib_src) - exclude_if_included (ZLIB::ZLIB) - endif () - - #[===========================[ - grpc - #]===========================] - ExternalProject_Add (grpc_src - PREFIX ${nih_cache_path} - GIT_REPOSITORY https://github.com/grpc/grpc.git - GIT_TAG v1.25.0 - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_STANDARD=17 - $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - $<$:-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}> - $<$:-DVCPKG_TARGET_TRIPLET=${VCPKG_TARGET_TRIPLET}> - $<$:-DCMAKE_UNITY_BUILD=ON}> - -DCMAKE_DEBUG_POSTFIX=_d - $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> - -DgRPC_BUILD_TESTS=OFF - -DgRPC_BENCHMARK_PROVIDER="" - -DgRPC_BUILD_CSHARP_EXT=OFF - -DgRPC_MSVC_STATIC_RUNTIME=ON - -DgRPC_INSTALL=OFF - -DgRPC_CARES_PROVIDER=package - -Dc-ares_DIR=${cares_binary_dir}/_installed_/lib/cmake/c-ares - -DgRPC_SSL_PROVIDER=package - -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} - -DgRPC_PROTOBUF_PROVIDER=package - -DProtobuf_USE_STATIC_LIBS=$,$>>,OFF,ON> - -DProtobuf_INCLUDE_DIR=$,:_:> - -DProtobuf_LIBRARY=$,$,$> - -DProtobuf_PROTOC_LIBRARY=$,$,$> - -DProtobuf_PROTOC_EXECUTABLE=$ - -DgRPC_ZLIB_PROVIDER=package - $<$>:-DZLIB_ROOT=${zlib_binary_dir}/_installed_> - $<$: - "-DCMAKE_CXX_FLAGS=-GR -Gd -fp:precise -FS -EHa -MP" - "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" - > - LOG_BUILD ON - LOG_CONFIGURE ON - BUILD_COMMAND - ${CMAKE_COMMAND} - --build . - --config $ - --parallel ${ep_procs} - $<$: - COMMAND - ${CMAKE_COMMAND} -E copy - /$/${ep_lib_prefix}grpc${grpc_suffix}$<$:_d>${ep_lib_suffix} - /$/${ep_lib_prefix}grpc++${grpc_suffix}$<$:_d>${ep_lib_suffix} - /$/${ep_lib_prefix}address_sorting$<$:_d>${ep_lib_suffix} - /$/${ep_lib_prefix}gpr$<$:_d>${ep_lib_suffix} - /$/grpc_cpp_plugin${CMAKE_EXECUTABLE_SUFFIX} - - > - LIST_SEPARATOR :_: - TEST_COMMAND "" - INSTALL_COMMAND "" - DEPENDS c-ares_src - BUILD_BYPRODUCTS - /${ep_lib_prefix}grpc${grpc_suffix}${ep_lib_suffix} - /${ep_lib_prefix}grpc${grpc_suffix}_d${ep_lib_suffix} - /${ep_lib_prefix}grpc++${grpc_suffix}${ep_lib_suffix} - /${ep_lib_prefix}grpc++${grpc_suffix}_d${ep_lib_suffix} - /${ep_lib_prefix}address_sorting${ep_lib_suffix} - /${ep_lib_prefix}address_sorting_d${ep_lib_suffix} - /${ep_lib_prefix}gpr${ep_lib_suffix} - /${ep_lib_prefix}gpr_d${ep_lib_suffix} - /grpc_cpp_plugin${CMAKE_EXECUTABLE_SUFFIX} - ) - if (TARGET protobuf_src) - ExternalProject_Add_StepDependencies(grpc_src build protobuf_src) - endif () - exclude_if_included (grpc_src) - ExternalProject_Get_Property (grpc_src BINARY_DIR) - ExternalProject_Get_Property (grpc_src SOURCE_DIR) - set (grpc_binary_dir "${BINARY_DIR}") - set (grpc_source_dir "${SOURCE_DIR}") - if (CMAKE_VERBOSE_MAKEFILE) - print_ep_logs (grpc_src) - endif () - file (MAKE_DIRECTORY ${SOURCE_DIR}/include) - - macro (add_imported_grpc libname_) - add_library ("gRPC::${libname_}" STATIC IMPORTED GLOBAL) - set_target_properties ("gRPC::${libname_}" PROPERTIES - IMPORTED_LOCATION_DEBUG - ${grpc_binary_dir}/${ep_lib_prefix}${libname_}_d${ep_lib_suffix} - IMPORTED_LOCATION_RELEASE - ${grpc_binary_dir}/${ep_lib_prefix}${libname_}${ep_lib_suffix} - INTERFACE_INCLUDE_DIRECTORIES - ${grpc_source_dir}/include) - add_dependencies ("gRPC::${libname_}" grpc_src) - target_link_libraries (ripple_libs INTERFACE "gRPC::${libname_}") - exclude_if_included ("gRPC::${libname_}") - endmacro () - - set_target_properties (gRPC::grpc_cpp_plugin PROPERTIES - IMPORTED_LOCATION "${grpc_binary_dir}/grpc_cpp_plugin${CMAKE_EXECUTABLE_SUFFIX}") - add_dependencies (gRPC::grpc_cpp_plugin grpc_src) - endif () - - add_imported_grpc (gpr) - add_imported_grpc ("grpc${grpc_suffix}") - add_imported_grpc ("grpc++${grpc_suffix}") - add_imported_grpc (address_sorting) - - target_link_libraries ("gRPC::grpc${grpc_suffix}" INTERFACE c-ares::cares gRPC::gpr gRPC::address_sorting ZLIB::ZLIB) - target_link_libraries ("gRPC::grpc++${grpc_suffix}" INTERFACE "gRPC::grpc${grpc_suffix}" gRPC::gpr) -endif () +find_package(gRPC 1.23) #[=================================[ generate protobuf sources for grpc defs and bundle into a static lib #]=================================] -set (GRPC_GEN_DIR "${CMAKE_BINARY_DIR}/proto_gen_grpc") -file (MAKE_DIRECTORY ${GRPC_GEN_DIR}) -set (GRPC_PROTO_SRCS) -set (GRPC_PROTO_HDRS) -set (GRPC_PROTO_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/proto/org") +set(GRPC_GEN_DIR "${CMAKE_BINARY_DIR}/proto_gen_grpc") +file(MAKE_DIRECTORY ${GRPC_GEN_DIR}) +set(GRPC_PROTO_SRCS) +set(GRPC_PROTO_HDRS) +set(GRPC_PROTO_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/proto/org") file(GLOB_RECURSE GRPC_DEFINITION_FILES LIST_DIRECTORIES false "${GRPC_PROTO_ROOT}/*.proto") foreach(file ${GRPC_DEFINITION_FILES}) get_filename_component(_abs_file ${file} ABSOLUTE) @@ -329,10 +20,10 @@ foreach(file ${GRPC_DEFINITION_FILES}) get_filename_component(_rel_root_dir ${_rel_root_file} DIRECTORY) file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_abs_dir}) - set (src_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.cc") - set (src_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.cc") - set (hdr_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.h") - set (hdr_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.h") + set(src_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.cc") + set(src_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.cc") + set(hdr_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.h") + set(hdr_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.h") add_custom_command( OUTPUT ${src_1} ${src_2} ${hdr_1} ${hdr_2} COMMAND protobuf::protoc @@ -350,20 +41,22 @@ foreach(file ${GRPC_DEFINITION_FILES}) list(APPEND GRPC_PROTO_HDRS ${hdr_1} ${hdr_2}) endforeach() -add_library (grpc_pbufs STATIC ${GRPC_PROTO_SRCS} ${GRPC_PROTO_HDRS}) -#target_include_directories (grpc_pbufs PRIVATE src) -target_include_directories (grpc_pbufs SYSTEM PUBLIC ${GRPC_GEN_DIR}) -target_link_libraries (grpc_pbufs protobuf::libprotobuf "gRPC::grpc++${grpc_suffix}") -target_compile_options (grpc_pbufs +add_library(grpc_pbufs STATIC ${GRPC_PROTO_SRCS} ${GRPC_PROTO_HDRS}) +#target_include_directories(grpc_pbufs PRIVATE src) +target_include_directories(grpc_pbufs SYSTEM PUBLIC ${GRPC_GEN_DIR}) +target_link_libraries(grpc_pbufs + "gRPC::grpc++" + # libgrpc is missing references. + absl::random_random +) +target_compile_options(grpc_pbufs PRIVATE $<$:-wd4065> $<$>:-Wno-deprecated-declarations> PUBLIC $<$:-wd4996> - $<$: + $<$: --system-header-prefix="google/protobuf" -Wno-deprecated-dynamic-exception-spec >) -add_library (Ripple::grpc_pbufs ALIAS grpc_pbufs) -target_link_libraries (ripple_libs INTERFACE Ripple::grpc_pbufs) -exclude_if_included (grpc_pbufs) +add_library(Ripple::grpc_pbufs ALIAS grpc_pbufs) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 57fc86e2c..a50560cb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,11 +50,6 @@ if(CMAKE_TOOLCHAIN_FILE) endif() endif() -if (NOT USE_CONAN) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake") - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/deps") -endif() - include (CheckCXXCompilerFlag) include (FetchContent) include (ExternalProject) @@ -67,9 +62,7 @@ endif () include(RippledSanity) include(RippledVersion) include(RippledSettings) -if (NOT USE_CONAN) - include(RippledNIH) -endif() + # this check has to remain in the top-level cmake # because of the early return statement if (packages_only) @@ -81,86 +74,64 @@ endif () include(RippledCompiler) include(RippledInterface) -### -if (NOT USE_CONAN) - add_subdirectory(src/secp256k1) - add_subdirectory(src/ed25519-donna) - include(deps/Boost) - include(deps/OpenSSL) - # include(deps/Secp256k1) - # include(deps/Ed25519-donna) - include(deps/Lz4) - include(deps/Libarchive) - include(deps/Sqlite) - include(deps/Soci) - include(deps/Snappy) - include(deps/Rocksdb) - include(deps/Nudb) - include(deps/date) - include(deps/Protobuf) - include(deps/gRPC) - include(deps/cassandra) - include(deps/Postgres) - include(deps/WasmEdge) -else() - include(conan/Boost) - find_package(OpenSSL 1.1.1 REQUIRED) - set_target_properties(OpenSSL::SSL PROPERTIES - INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2 +include(deps/Boost) +find_package(OpenSSL 1.1.1 REQUIRED) +set_target_properties(OpenSSL::SSL PROPERTIES + INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2 +) +add_subdirectory(src/secp256k1) +add_subdirectory(src/ed25519-donna) +find_package(lz4 REQUIRED) +# Target names with :: are not allowed in a generator expression. +# We need to pull the include directories and imported location properties +# from separate targets. +find_package(LibArchive REQUIRED) +find_package(SOCI REQUIRED) +find_package(SQLite3 REQUIRED) +find_package(Snappy REQUIRED) +# find_package(wasmedge REQUIRED) +option(rocksdb "Enable RocksDB" ON) +if(rocksdb) + find_package(RocksDB REQUIRED) + set_target_properties(RocksDB::rocksdb PROPERTIES + INTERFACE_COMPILE_DEFINITIONS RIPPLE_ROCKSDB_AVAILABLE=1 ) - add_subdirectory(src/secp256k1) - add_subdirectory(src/ed25519-donna) - find_package(lz4 REQUIRED) - # Target names with :: are not allowed in a generator expression. - # We need to pull the include directories and imported location properties - # from separate targets. - find_package(LibArchive REQUIRED) - find_package(SOCI REQUIRED) - find_package(SQLite3 REQUIRED) - find_package(Snappy REQUIRED) - find_package(wasmedge REQUIRED) - option(rocksdb "Enable RocksDB" ON) - if(rocksdb) - find_package(RocksDB REQUIRED) - set_target_properties(RocksDB::rocksdb PROPERTIES - INTERFACE_COMPILE_DEFINITIONS RIPPLE_ROCKSDB_AVAILABLE=1 - ) - target_link_libraries(ripple_libs INTERFACE RocksDB::rocksdb) - endif() - find_package(nudb REQUIRED) - find_package(date REQUIRED) - include(conan/Protobuf) - include(conan/gRPC) - if(TARGET nudb::core) - set(nudb nudb::core) - elseif(TARGET NuDB::nudb) - set(nudb NuDB::nudb) - else() - message(FATAL_ERROR "unknown nudb target") - endif() - target_link_libraries(ripple_libs INTERFACE ${nudb}) + target_link_libraries(ripple_libs INTERFACE RocksDB::rocksdb) +endif() +find_package(nudb REQUIRED) +find_package(date REQUIRED) +include(deps/Protobuf) +include(deps/gRPC) +include(deps/WasmEdge) + if(TARGET nudb::core) + set(nudb nudb::core) +elseif(TARGET NuDB::nudb) + set(nudb NuDB::nudb) +else() + message(FATAL_ERROR "unknown nudb target") +endif() +target_link_libraries(ripple_libs INTERFACE ${nudb}) - if(reporting) - find_package(cassandra-cpp-driver REQUIRED) - find_package(PostgreSQL REQUIRED) - target_link_libraries(ripple_libs INTERFACE - cassandra-cpp-driver::cassandra-cpp-driver - PostgreSQL::PostgreSQL - ) - endif() +if(reporting) + find_package(cassandra-cpp-driver REQUIRED) + find_package(PostgreSQL REQUIRED) target_link_libraries(ripple_libs INTERFACE - ed25519::ed25519 - LibArchive::LibArchive - lz4::lz4 - OpenSSL::Crypto - OpenSSL::SSL - Ripple::grpc_pbufs - Ripple::pbufs - secp256k1::secp256k1 - soci::soci - SQLite::SQLite3 + cassandra-cpp-driver::cassandra-cpp-driver + PostgreSQL::PostgreSQL ) endif() +target_link_libraries(ripple_libs INTERFACE + ed25519::ed25519 + LibArchive::LibArchive + lz4::lz4 + OpenSSL::Crypto + OpenSSL::SSL + Ripple::grpc_pbufs + Ripple::pbufs + secp256k1::secp256k1 + soci::soci + SQLite::SQLite3 +) ### diff --git a/build-core.sh b/build-core.sh index 4345b4f74..7e1a03782 100755 --- a/build-core.sh +++ b/build-core.sh @@ -5,8 +5,6 @@ # debugging. set -ex -set -e - echo "START INSIDE CONTAINER - CORE" echo "-- BUILD CORES: $3" @@ -27,7 +25,8 @@ if [[ "$?" -ne "0" ]]; then exit 127 fi -perl -i -pe "s/^(\\s*)-DBUILD_SHARED_LIBS=OFF/\\1-DBUILD_SHARED_LIBS=OFF\\n\\1-DROCKSDB_BUILD_SHARED=OFF/g" Builds/CMake/deps/Rocksdb.cmake && +BUILD_TYPE=Release + mv Builds/CMake/deps/WasmEdge.cmake Builds/CMake/deps/WasmEdge.old && echo "find_package(LLVM REQUIRED CONFIG) message(STATUS \"Found LLVM \${LLVM_PACKAGE_VERSION}\") @@ -38,13 +37,30 @@ target_link_libraries (ripple_libs INTERFACE wasmedge) add_library (wasmedge::wasmedge ALIAS wasmedge) message(\"WasmEdge DONE\") " > Builds/CMake/deps/WasmEdge.cmake && + +export LDFLAGS="-static-libstdc++" + +git config --global --add safe.directory /io && git checkout src/ripple/protocol/impl/BuildInfo.cpp && -sed -i s/\"0.0.0\"/\"$(date +%Y).$(date +%-m).$(date +%-d)-$(git rev-parse --abbrev-ref HEAD)+$4\"/g src/ripple/protocol/impl/BuildInfo.cpp && +sed -i s/\"0.0.0\"/\"$(date +%Y).$(date +%-m).$(date +%-d)-$(git rev-parse --abbrev-ref HEAD)$(if [ -n "$4" ]; then echo "+$4"; fi)\"/g src/ripple/protocol/impl/BuildInfo.cpp && +conan export external/snappy snappy/1.1.10@ && +conan export external/soci soci/4.0.3@ && cd release-build && -cmake .. -DCMAKE_BUILD_TYPE=Release -DBoost_NO_BOOST_CMAKE=ON -DLLVM_DIR=/usr/lib64/llvm13/lib/cmake/llvm/ -DLLVM_LIBRARY_DIR=/usr/lib64/llvm13/lib/ -DWasmEdge_LIB=/usr/local/lib64/libwasmedge.a && -make -j$3 VERBOSE=1 && -strip -s rippled && +conan install .. --output-folder . --build missing --settings build_type=$BUILD_TYPE && +cmake .. -G Ninja \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ + -DCMAKE_EXE_LINKER_FLAGS="-static-libstdc++" \ + -DLLVM_DIR=$LLVM_DIR \ + -DWasmEdge_LIB=$WasmEdge_LIB \ + -Dxrpld=TRUE \ + -Dtests=TRUE && +ccache -z && +ninja -j $3 && +ccache -s && +strip -s rippled && mv rippled xahaud && +libcheck xahaud && echo "Build host: `hostname`" > release.info && echo "Build date: `date`" >> release.info && echo "Build md5: `md5sum xahaud`" >> release.info && @@ -69,8 +85,8 @@ fi cd ..; mv src/ripple/net/impl/RegisterSSLCerts.cpp.old src/ripple/net/impl/RegisterSSLCerts.cpp; -mv Builds/CMake/deps/Rocksdb.cmake.old Builds/CMake/deps/Rocksdb.cmake; mv Builds/CMake/deps/WasmEdge.old Builds/CMake/deps/WasmEdge.cmake; - +rm src/certs/certbundle.h; +git checkout src/ripple/protocol/impl/BuildInfo.cpp; echo "END INSIDE CONTAINER - CORE" diff --git a/build-full.sh b/build-full.sh index 643adfb13..9723da654 100644 --- a/build-full.sh +++ b/build-full.sh @@ -3,8 +3,6 @@ # processes launched or upon any unbound variable. # We use set -x to print commands before running them to help with # debugging. -set -ex - set -e echo "START INSIDE CONTAINER - FULL" @@ -16,13 +14,6 @@ echo "-- GITHUB_RUN_NUMBER: $4" umask 0000; -echo "Fixing CentOS 7 EOL" - -sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* -sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* -yum clean all -yum-config-manager --disable centos-sclo-sclo - #### cd /io; @@ -73,92 +64,15 @@ then #endif/g" src/ripple/net/impl/RegisterSSLCerts.cpp && sed -i "s/#include /\0\n#include /g" src/ripple/net/impl/RegisterSSLCerts.cpp fi -mkdir -p .nih_c; -mkdir -p .nih_toolchain; -cd .nih_toolchain && -yum install -y wget lz4 lz4-devel git llvm13-static.x86_64 llvm13-devel.x86_64 devtoolset-10-binutils zlib-static ncurses-static -y \ - devtoolset-7-gcc-c++ \ - devtoolset-9-gcc-c++ \ - devtoolset-10-gcc-c++ \ - snappy snappy-devel \ - zlib zlib-devel \ - lz4-devel \ - libasan && -export PATH=`echo $PATH | sed -E "s/devtoolset-9/devtoolset-7/g"` && -echo "-- Install ZStd 1.1.3 --" && -yum install epel-release -y && -ZSTD_VERSION="1.1.3" && -( wget -nc -q -O zstd-${ZSTD_VERSION}.tar.gz https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz; echo "" ) && -tar xzvf zstd-${ZSTD_VERSION}.tar.gz && -cd zstd-${ZSTD_VERSION} && -make -j$3 install && -cd .. && -echo "-- Install Cmake 3.23.1 --" && -pwd && -( wget -nc -q https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz; echo "" ) && -tar -xzf cmake-3.23.1-linux-x86_64.tar.gz -C /hbb/ && -echo "-- Install Boost 1.86.0 --" && -pwd && -( wget -nc -q https://archives.boost.io/release/1.86.0/source/boost_1_86_0.tar.gz; echo "" ) && -tar -xzf boost_1_86_0.tar.gz && -cd boost_1_86_0 && ./bootstrap.sh && ./b2 link=static -j$3 && ./b2 install && -cd ../ && -echo "-- Install Protobuf 3.20.0 --" && -pwd && -( wget -nc -q https://github.com/protocolbuffers/protobuf/releases/download/v3.20.0/protobuf-all-3.20.0.tar.gz; echo "" ) && -tar -xzf protobuf-all-3.20.0.tar.gz && -cd protobuf-3.20.0/ && -./autogen.sh && ./configure --prefix=/usr --disable-shared link=static && make -j$3 && make install && -cd .. && -echo "-- Build LLD --" && -pwd && -ln /usr/bin/llvm-config-13 /usr/bin/llvm-config && -mv /opt/rh/devtoolset-9/root/usr/bin/ar /opt/rh/devtoolset-9/root/usr/bin/ar-9 && -ln /opt/rh/devtoolset-10/root/usr/bin/ar /opt/rh/devtoolset-9/root/usr/bin/ar && -( wget -nc -q https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/lld-13.0.1.src.tar.xz; echo "" ) && -( wget -nc -q https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/libunwind-13.0.1.src.tar.xz; echo "" ) && -tar -xf lld-13.0.1.src.tar.xz && -tar -xf libunwind-13.0.1.src.tar.xz && -cp -r libunwind-13.0.1.src/include libunwind-13.0.1.src/src lld-13.0.1.src/ && -cd lld-13.0.1.src && -rm -rf build CMakeCache.txt && -mkdir -p build && -cd build && -cmake .. -DLLVM_LIBRARY_DIR=/usr/lib64/llvm13/lib/ -DCMAKE_INSTALL_PREFIX=/usr/lib64/llvm13/ -DCMAKE_BUILD_TYPE=Release && -make -j$3 install && -ln -s /usr/lib64/llvm13/lib/include/lld /usr/include/lld && -cp /usr/lib64/llvm13/lib/liblld*.a /usr/local/lib/ && -cd ../../ && -echo "-- Build WasmEdge --" && -( wget -nc -q https://github.com/WasmEdge/WasmEdge/archive/refs/tags/0.11.2.zip; unzip -o 0.11.2.zip; ) && -cd WasmEdge-0.11.2 && -( mkdir -p build; echo "" ) && -cd build && -export BOOST_ROOT="/usr/local/src/boost_1_86_0" && -export Boost_LIBRARY_DIRS="/usr/local/lib" && -export BOOST_INCLUDEDIR="/usr/local/src/boost_1_86_0" && -export PATH=`echo $PATH | sed -E "s/devtoolset-7/devtoolset-9/g"` && -cmake .. \ - -DCMAKE_BUILD_TYPE=Release \ - -DWASMEDGE_BUILD_SHARED_LIB=OFF \ - -DWASMEDGE_BUILD_STATIC_LIB=ON \ - -DWASMEDGE_BUILD_AOT_RUNTIME=ON \ - -DWASMEDGE_FORCE_DISABLE_LTO=ON \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DWASMEDGE_LINK_LLVM_STATIC=ON \ - -DWASMEDGE_BUILD_PLUGINS=OFF \ - -DWASMEDGE_LINK_TOOLS_STATIC=ON \ - -DBoost_NO_BOOST_CMAKE=ON -DLLVM_DIR=/usr/lib64/llvm13/lib/cmake/llvm/ -DLLVM_LIBRARY_DIR=/usr/lib64/llvm13/lib/ && -make -j$3 install && -export PATH=`echo $PATH | sed -E "s/devtoolset-9/devtoolset-10/g"` && -cp -r include/api/wasmedge /usr/include/ && -cd /io/ && +# Environment setup moved to Dockerfile in release-builder.sh +source /opt/rh/gcc-toolset-11/enable +export PATH=/usr/local/bin:$PATH +export CC='ccache gcc' && +export CXX='ccache g++' && echo "-- Build Rippled --" && pwd && -cp Builds/CMake/deps/Rocksdb.cmake Builds/CMake/deps/Rocksdb.cmake.old && -echo "MOVING TO [ build-core.sh ]" -cd /io; +echo "MOVING TO [ build-core.sh ]"; printenv > .env.temp; cat .env.temp | grep '=' | sed s/\\\(^[^=]\\+=\\\)/\\1\\\"/g|sed s/\$/\\\"/g > .env; diff --git a/docker-unit-tests.sh b/docker-unit-tests.sh index 8406ba86a..d4a924813 100755 --- a/docker-unit-tests.sh +++ b/docker-unit-tests.sh @@ -8,4 +8,4 @@ if [[ "$GITHUB_REPOSITORY" == "" ]]; then fi echo "Mounting $(pwd)/io in ubuntu and running unit tests" -docker run --rm -i -v $(pwd):/io -e BUILD_CORES=$BUILD_CORES ubuntu sh -c '/io/release-build/xahaud --unittest-jobs $BUILD_CORES -u' +docker run --rm -i -v $(pwd):/io --platform=linux/amd64 -e BUILD_CORES=$BUILD_CORES ubuntu sh -c '/io/release-build/xahaud --unittest-jobs $BUILD_CORES -u' diff --git a/external/snappy/conanfile.py b/external/snappy/conanfile.py index 23558639f..92bc02b8f 100644 --- a/external/snappy/conanfile.py +++ b/external/snappy/conanfile.py @@ -77,9 +77,14 @@ class SnappyConan(ConanFile): self.cpp_info.set_property("cmake_target_name", "Snappy::snappy") # TODO: back to global scope in conan v2 once cmake_find_package* generators removed self.cpp_info.components["snappylib"].libs = ["snappy"] - if not self.options.shared: - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["snappylib"].system_libs.append("m") + # The following block is commented out as a workaround for a bug in the + # Conan 1.x CMakeDeps generator. Including system_libs ("m") here + # incorrectly triggers a heuristic that adds a dynamic link to `stdc++` + # (-lstdc++), preventing a fully static build. + # This behavior is expected to be corrected in Conan 2. + # if not self.options.shared: + # if self.settings.os in ["Linux", "FreeBSD"]: + # self.cpp_info.components["snappylib"].system_libs.append("m") # TODO: to remove in conan v2 once cmake_find_package* generators removed self.cpp_info.names["cmake_find_package"] = "Snappy" diff --git a/external/soci/conanfile.py b/external/soci/conanfile.py index 67c572d5a..06497516a 100644 --- a/external/soci/conanfile.py +++ b/external/soci/conanfile.py @@ -154,7 +154,7 @@ class SociConan(ConanFile): self.cpp_info.components["soci_core"].set_property("cmake_target_name", "SOCI::soci_core{}".format(target_suffix)) self.cpp_info.components["soci_core"].libs = ["{}soci_core{}".format(lib_prefix, lib_suffix)] if self.options.with_boost: - self.cpp_info.components["soci_core"].requires.append("boost::boost") + self.cpp_info.components["soci_core"].requires.append("boost::headers") # soci_empty if self.options.empty: diff --git a/release-builder.sh b/release-builder.sh index ca93fe4fd..f2a64a673 100755 --- a/release-builder.sh +++ b/release-builder.sh @@ -1,9 +1,8 @@ -#!/bin/bash -u +#!/bin/bash # We use set -e and bash with -u to bail on first non zero exit code of any # processes launched or upon any unbound variable. # We use set -x to print commands before running them to help with # debugging. -set -ex echo "START BUILDING (HOST)" @@ -14,7 +13,7 @@ BUILD_CORES=$(echo "scale=0 ; `nproc` / 1.337" | bc) if [[ "$GITHUB_REPOSITORY" == "" ]]; then #Default - BUILD_CORES=8 + BUILD_CORES=${BUILD_CORES:-8} fi # Ensure still works outside of GH Actions by setting these to /dev/null @@ -46,29 +45,166 @@ fi STATIC_CONTAINER=$(docker ps -a | grep $CONTAINER_NAME |wc -l) +CACHE_VOLUME_NAME="xahau-release-builder-cache" + # if [[ "$STATIC_CONTAINER" -gt "0" && "$GITHUB_REPOSITORY" != "" ]]; then if false; then echo "Static container, execute in static container to have max. cache" docker start $CONTAINER_NAME - docker exec -i $CONTAINER_NAME /hbb_exe/activate-exec bash -x /io/build-core.sh "$GITHUB_REPOSITORY" "$GITHUB_SHA" "$BUILD_CORES" "$GITHUB_RUN_NUMBER" + docker exec -i $CONTAINER_NAME /hbb_exe/activate-exec bash -c "source /opt/rh/gcc-toolset-11/enable && bash -x /io/build-core.sh '$GITHUB_REPOSITORY' '$GITHUB_SHA' '$BUILD_CORES' '$GITHUB_RUN_NUMBER'" docker stop $CONTAINER_NAME else echo "No static container, build on temp container" rm -rf release-build; mkdir -p release-build; + docker volume create $CACHE_VOLUME_NAME + + # Create inline Dockerfile with environment setup for build-full.sh + DOCKERFILE_CONTENT=$(cat <<'DOCKERFILE_EOF' +FROM ghcr.io/phusion/holy-build-box:4.0.1-amd64 + +ARG BUILD_CORES=8 + +# Enable repositories and install dependencies +RUN /hbb_exe/activate-exec bash -c "dnf install -y epel-release && \ + dnf config-manager --set-enabled powertools || dnf config-manager --set-enabled crb && \ + dnf install -y --enablerepo=devel \ + wget git \ + gcc-toolset-11-gcc-c++ gcc-toolset-11-binutils gcc-toolset-11-libatomic-devel \ + lz4 lz4-devel \ + ncurses-static ncurses-devel \ + snappy snappy-devel \ + zlib zlib-devel zlib-static \ + libasan \ + python3 python3-pip \ + ccache \ + ninja-build \ + patch \ + glibc-devel glibc-static \ + libxml2-devel \ + autoconf \ + automake \ + texinfo \ + libtool \ + llvm14-static llvm14-devel && \ + dnf clean all" + +# Install Conan and CMake +RUN /hbb_exe/activate-exec pip3 install "conan==1.66.0" && \ + /hbb_exe/activate-exec wget -q https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz -O cmake.tar.gz && \ + mkdir cmake && \ + tar -xzf cmake.tar.gz --strip-components=1 -C cmake && \ + rm cmake.tar.gz + +# Install Boost 1.86.0 +RUN /hbb_exe/activate-exec bash -c "cd /tmp && \ + wget -q https://archives.boost.io/release/1.86.0/source/boost_1_86_0.tar.gz -O boost.tar.gz && \ + mkdir boost && \ + tar -xzf boost.tar.gz --strip-components=1 -C boost && \ + cd boost && \ + ./bootstrap.sh && \ + ./b2 link=static -j${BUILD_CORES} && \ + ./b2 install && \ + cd /tmp && \ + rm -rf boost boost.tar.gz" + +ENV BOOST_ROOT=/usr/local/src/boost_1_86_0 +ENV Boost_LIBRARY_DIRS=/usr/local/lib +ENV BOOST_INCLUDEDIR=/usr/local/src/boost_1_86_0 + +ENV CMAKE_EXE_LINKER_FLAGS="-static-libstdc++" + +ENV LLVM_DIR=/usr/lib64/llvm14/lib/cmake/llvm +ENV WasmEdge_LIB=/usr/local/lib64/libwasmedge.a + +ENV CC='ccache gcc' +ENV CXX='ccache g++' + +# Install LLD +RUN /hbb_exe/activate-exec bash -c "source /opt/rh/gcc-toolset-11/enable && \ + cd /tmp && \ + wget -q https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.3/lld-14.0.3.src.tar.xz && \ + wget -q https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.3/libunwind-14.0.3.src.tar.xz && \ + tar -xf lld-14.0.3.src.tar.xz && \ + tar -xf libunwind-14.0.3.src.tar.xz && \ + cp -r libunwind-14.0.3.src/include libunwind-14.0.3.src/src lld-14.0.3.src/ && \ + cd lld-14.0.3.src && \ + mkdir -p build && cd build && \ + cmake .. \ + -DLLVM_LIBRARY_DIR=/usr/lib64/llvm14/lib/ \ + -DCMAKE_INSTALL_PREFIX=/usr/lib64/llvm14/ \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_EXE_LINKER_FLAGS=\"\$CMAKE_EXE_LINKER_FLAGS\" && \ + make -j${BUILD_CORES} install && \ + ln -s /usr/lib64/llvm14/lib/include/lld /usr/include/lld && \ + cp /usr/lib64/llvm14/lib/liblld*.a /usr/local/lib/ && \ + cd /tmp && rm -rf lld-* libunwind-*" + +# Build and install WasmEdge (static version) +# Note: Conan only provides WasmEdge with shared library linking. +# For a fully static build, we need to manually install: +# * Boost: Static C++ libraries for filesystem and system operations (built from source above) +# * LLVM: Static LLVM libraries for WebAssembly compilation (installed via llvm14-static package) +# * LLD: Static linker to produce the final static binary (built from source above) +# These were installed above to enable WASMEDGE_LINK_LLVM_STATIC=ON +RUN cd /tmp && \ + ( wget -nc -q https://github.com/WasmEdge/WasmEdge/archive/refs/tags/0.11.2.zip; unzip -o 0.11.2.zip; ) && \ + cd WasmEdge-0.11.2 && \ + ( mkdir -p build; echo "" ) && \ + cd build && \ + /hbb_exe/activate-exec bash -c "source /opt/rh/gcc-toolset-11/enable && \ + ln -sf /opt/rh/gcc-toolset-11/root/usr/bin/ar /usr/bin/ar && \ + cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DWASMEDGE_BUILD_SHARED_LIB=OFF \ + -DWASMEDGE_BUILD_STATIC_LIB=ON \ + -DWASMEDGE_BUILD_AOT_RUNTIME=ON \ + -DWASMEDGE_FORCE_DISABLE_LTO=ON \ + -DWASMEDGE_LINK_LLVM_STATIC=ON \ + -DWASMEDGE_BUILD_PLUGINS=OFF \ + -DWASMEDGE_LINK_TOOLS_STATIC=ON \ + -DBoost_NO_BOOST_CMAKE=ON \ + -DCMAKE_EXE_LINKER_FLAGS=\"\$CMAKE_EXE_LINKER_FLAGS\" \ + && \ + make -j${BUILD_CORES} install" && \ + cp -r include/api/wasmedge /usr/include/ && \ + cd /tmp && rm -rf WasmEdge* 0.11.2.zip + +# Set environment variables +ENV PATH=/usr/local/bin:$PATH + +# Configure ccache and Conan +RUN /hbb_exe/activate-exec bash -c "ccache -M 10G && \ + ccache -o cache_dir=/cache/ccache && \ + ccache -o compiler_check=content && \ + conan config set storage.path=/cache/conan && \ + (conan profile new default --detect || true) && \ + conan profile update settings.compiler.libcxx=libstdc++11 default && \ + conan profile update settings.compiler.cppstd=20 default" + +DOCKERFILE_EOF +) + + # Build custom Docker image + IMAGE_NAME="xahaud-builder:latest" + echo "Building custom Docker image with dependencies..." + echo "$DOCKERFILE_CONTENT" | docker build --build-arg BUILD_CORES="$BUILD_CORES" -t "$IMAGE_NAME" - || exit 1 + if [[ "$GITHUB_REPOSITORY" == "" ]]; then # Non GH, local building echo "Non-GH runner, local building, temp container" - docker run -i --user 0:$(id -g) --rm -v /data/builds:/data/builds -v `pwd`:/io --network host ghcr.io/foobarwidget/holy-build-box-x64 /hbb_exe/activate-exec bash -x /io/build-full.sh "$GITHUB_REPOSITORY" "$GITHUB_SHA" "$BUILD_CORES" "$GITHUB_RUN_NUMBER" + docker run -i --user 0:$(id -g) --rm -v /data/builds:/data/builds -v `pwd`:/io -v "$CACHE_VOLUME_NAME":/cache --network host "$IMAGE_NAME" /hbb_exe/activate-exec bash -c "source /opt/rh/gcc-toolset-11/enable && bash -x /io/build-full.sh '$GITHUB_REPOSITORY' '$GITHUB_SHA' '$BUILD_CORES' '$GITHUB_RUN_NUMBER'" else # GH Action, runner echo "GH Action, runner, clean & re-create create persistent container" docker rm -f $CONTAINER_NAME echo "echo 'Stopping container: $CONTAINER_NAME'" >> "$JOB_CLEANUP_SCRIPT" echo "docker stop --time=15 \"$CONTAINER_NAME\" || echo 'Failed to stop container or container not running'" >> "$JOB_CLEANUP_SCRIPT" - docker run -di --user 0:$(id -g) --name $CONTAINER_NAME -v /data/builds:/data/builds -v `pwd`:/io --network host ghcr.io/foobarwidget/holy-build-box-x64 /hbb_exe/activate-exec bash - docker exec -i $CONTAINER_NAME /hbb_exe/activate-exec bash -x /io/build-full.sh "$GITHUB_REPOSITORY" "$GITHUB_SHA" "$BUILD_CORES" "$GITHUB_RUN_NUMBER" + docker run -di --user 0:$(id -g) --name $CONTAINER_NAME -v /data/builds:/data/builds -v `pwd`:/io -v "$CACHE_VOLUME_NAME":/cache --network host "$IMAGE_NAME" /hbb_exe/activate-exec bash + docker exec -i $CONTAINER_NAME /hbb_exe/activate-exec bash -c "source /opt/rh/gcc-toolset-11/enable && bash -x /io/build-full.sh '$GITHUB_REPOSITORY' '$GITHUB_SHA' '$BUILD_CORES' '$GITHUB_RUN_NUMBER'" docker stop $CONTAINER_NAME fi fi From 1a3d2db8ef67179550e746c3c6f0450515820400 Mon Sep 17 00:00:00 2001 From: Niq Dudfield Date: Thu, 14 Aug 2025 11:01:32 +0700 Subject: [PATCH 2/6] fix(ci): export correct snappy version (#546) --- .github/actions/xahau-ga-dependencies/action.yml | 6 +++--- BUILD.md | 4 ++-- build-core.sh | 4 ++-- conanfile.py | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/actions/xahau-ga-dependencies/action.yml b/.github/actions/xahau-ga-dependencies/action.yml index 0340e937e..ae038425c 100644 --- a/.github/actions/xahau-ga-dependencies/action.yml +++ b/.github/actions/xahau-ga-dependencies/action.yml @@ -59,8 +59,8 @@ runs: - name: Export custom recipes shell: bash run: | - conan export external/snappy snappy/1.1.9@ - conan export external/soci soci/4.0.3@ + conan export external/snappy snappy/1.1.10@xahaud/stable + conan export external/soci soci/4.0.3@xahaud/stable - name: Install dependencies shell: bash @@ -83,4 +83,4 @@ runs: path: | ~/.conan ~/.conan2 - key: ${{ steps.cache-restore-conan.outputs.cache-primary-key }} \ No newline at end of file + key: ${{ steps.cache-restore-conan.outputs.cache-primary-key }} diff --git a/BUILD.md b/BUILD.md index 0c62fb1ef..21f46bef5 100644 --- a/BUILD.md +++ b/BUILD.md @@ -117,14 +117,14 @@ can't build earlier Boost versions. which allows you to statically link it with GCC, if you want. ``` - conan export external/snappy snappy/1.1.9@ + conan export external/snappy snappy/1.1.10@xahaud/stable ``` 5. Export our [Conan recipe for SOCI](./external/soci). It patches their CMake to correctly import its dependencies. ``` - conan export external/soci soci/4.0.3@ + conan export external/soci soci/4.0.3@xahaud/stable ``` ### Build and Test diff --git a/build-core.sh b/build-core.sh index 7e1a03782..7b1eb78dc 100755 --- a/build-core.sh +++ b/build-core.sh @@ -43,8 +43,8 @@ export LDFLAGS="-static-libstdc++" git config --global --add safe.directory /io && git checkout src/ripple/protocol/impl/BuildInfo.cpp && sed -i s/\"0.0.0\"/\"$(date +%Y).$(date +%-m).$(date +%-d)-$(git rev-parse --abbrev-ref HEAD)$(if [ -n "$4" ]; then echo "+$4"; fi)\"/g src/ripple/protocol/impl/BuildInfo.cpp && -conan export external/snappy snappy/1.1.10@ && -conan export external/soci soci/4.0.3@ && +conan export external/snappy snappy/1.1.10@xahaud/stable && +conan export external/soci soci/4.0.3@xahaud/stable && cd release-build && conan install .. --output-folder . --build missing --settings build_type=$BUILD_TYPE && cmake .. -G Ninja \ diff --git a/conanfile.py b/conanfile.py index 9dea082ff..0a5bc0b4a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -32,8 +32,8 @@ class Xrpl(ConanFile): 'nudb/2.0.8', 'openssl/1.1.1u', 'protobuf/3.21.9', - 'snappy/1.1.10', - 'soci/4.0.3', + 'snappy/1.1.10@xahaud/stable', + 'soci/4.0.3@xahaud/stable', 'sqlite3/3.42.0', 'zlib/1.2.13', 'wasmedge/0.11.2', From 7a790246fbb9889a37822e438632550aafca4a91 Mon Sep 17 00:00:00 2001 From: Niq Dudfield Date: Thu, 14 Aug 2025 14:41:49 +0700 Subject: [PATCH 3/6] fix: upgrade CI to GCC 13 and fix compilation issues, fixes #557 (#559) --- .github/actions/xahau-ga-build/action.yml | 1 - .../actions/xahau-ga-dependencies/action.yml | 1 - .github/workflows/xahau-ga-nix.yml | 19 ++++++++----------- src/ripple/app/hook/Enum.h | 1 + src/test/app/SetHook_test.cpp | 2 +- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.github/actions/xahau-ga-build/action.yml b/.github/actions/xahau-ga-build/action.yml index 4b9a637d5..417190472 100644 --- a/.github/actions/xahau-ga-build/action.yml +++ b/.github/actions/xahau-ga-build/action.yml @@ -59,7 +59,6 @@ runs: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ inputs.main_branch }} ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}- ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- - ${{ runner.os }}-ccache-v${{ inputs.cache_version }}- - name: Configure project shell: bash diff --git a/.github/actions/xahau-ga-dependencies/action.yml b/.github/actions/xahau-ga-dependencies/action.yml index ae038425c..b57a9e69e 100644 --- a/.github/actions/xahau-ga-dependencies/action.yml +++ b/.github/actions/xahau-ga-dependencies/action.yml @@ -54,7 +54,6 @@ runs: restore-keys: | ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ hashFiles('**/conanfile.txt', '**/conanfile.py') }}- ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- - ${{ runner.os }}-conan-v${{ inputs.cache_version }}- - name: Export custom recipes shell: bash diff --git a/.github/workflows/xahau-ga-nix.yml b/.github/workflows/xahau-ga-nix.yml index 79a0f23ac..486518033 100644 --- a/.github/workflows/xahau-ga-nix.yml +++ b/.github/workflows/xahau-ga-nix.yml @@ -22,13 +22,14 @@ jobs: configuration: [Debug] include: - compiler: gcc - cc: gcc-11 - cxx: g++-11 - compiler_id: gcc-11 + cc: gcc-13 + cxx: g++-13 + compiler_id: gcc-13 + compiler_version: 13 env: build_dir: .build # Bump this number to invalidate all caches globally. - CACHE_VERSION: 1 + CACHE_VERSION: 2 MAIN_BRANCH_NAME: dev steps: - name: Checkout @@ -58,12 +59,8 @@ jobs: conan profile update env.CXX=/usr/bin/${{ matrix.cxx }} default conan profile update conf.tools.build:compiler_executables='{"c": "/usr/bin/${{ matrix.cc }}", "cpp": "/usr/bin/${{ matrix.cxx }}"}' default - # Set correct compiler version based on matrix.compiler - if [ "${{ matrix.compiler }}" = "gcc" ]; then - conan profile update settings.compiler.version=11 default - elif [ "${{ matrix.compiler }}" = "clang" ]; then - conan profile update settings.compiler.version=14 default - fi + # Set compiler version from matrix + conan profile update settings.compiler.version=${{ matrix.compiler_version }} default # Display profile for verification conan profile show default @@ -120,4 +117,4 @@ jobs: else echo "Error: rippled executable not found in ${{ env.build_dir }}" exit 1 - fi \ No newline at end of file + fi diff --git a/src/ripple/app/hook/Enum.h b/src/ripple/app/hook/Enum.h index 2acf37183..19209389e 100644 --- a/src/ripple/app/hook/Enum.h +++ b/src/ripple/app/hook/Enum.h @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 6b441287a..c3b336d05 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -321,7 +321,7 @@ public: HSFEE, ter(temMALFORMED)); - env(ripple::test::jtx::hook(alice, {{}}, 0), + env(ripple::test::jtx::hook(alice, std::vector{}, 0), M("Must have a non-empty hooks field"), HSFEE, ter(temMALFORMED)); From 3c4c9c87c5b12960a2b3f3ea9a9faa06cfbe0045 Mon Sep 17 00:00:00 2001 From: Niq Dudfield Date: Tue, 26 Aug 2025 11:00:58 +0700 Subject: [PATCH 4/6] Fix rwdb memory leak with online_delete and remove flatmap (#570) Co-authored-by: Denis Angell --- Builds/CMake/RippledCore.cmake | 6 +- Builds/levelization/results/ordering.txt | 4 + cfg/rippled-example.cfg | 31 +- src/ripple/app/rdb/backend/FlatmapDatabase.h | 851 ------------------ src/ripple/app/rdb/backend/RWDBDatabase.h | 197 ++-- .../app/rdb/impl/RelationalDatabase.cpp | 10 - src/ripple/core/Config.h | 4 +- src/ripple/core/impl/Config.cpp | 25 +- .../nodestore/backend/FlatmapFactory.cpp | 235 ----- src/test/app/SHAMapStore_test.cpp | 4 + src/test/core/Config_test.cpp | 92 ++ src/test/rdb/RelationalDatabase_test.cpp | 756 ++++++++++++++++ 12 files changed, 1018 insertions(+), 1197 deletions(-) delete mode 100644 src/ripple/app/rdb/backend/FlatmapDatabase.h delete mode 100644 src/ripple/nodestore/backend/FlatmapFactory.cpp create mode 100644 src/test/rdb/RelationalDatabase_test.cpp diff --git a/Builds/CMake/RippledCore.cmake b/Builds/CMake/RippledCore.cmake index 6fc33cdee..6b876997b 100644 --- a/Builds/CMake/RippledCore.cmake +++ b/Builds/CMake/RippledCore.cmake @@ -548,7 +548,6 @@ target_sources (rippled PRIVATE src/ripple/nodestore/backend/CassandraFactory.cpp src/ripple/nodestore/backend/RWDBFactory.cpp src/ripple/nodestore/backend/MemoryFactory.cpp - src/ripple/nodestore/backend/FlatmapFactory.cpp src/ripple/nodestore/backend/NuDBFactory.cpp src/ripple/nodestore/backend/NullFactory.cpp src/ripple/nodestore/backend/RocksDBFactory.cpp @@ -995,6 +994,11 @@ if (tests) subdir: resource #]===============================] src/test/resource/Logic_test.cpp + #[===============================[ + test sources: + subdir: rdb + #]===============================] + src/test/rdb/RelationalDatabase_test.cpp #[===============================[ test sources: subdir: rpc diff --git a/Builds/levelization/results/ordering.txt b/Builds/levelization/results/ordering.txt index 12df1a86e..e409855a7 100644 --- a/Builds/levelization/results/ordering.txt +++ b/Builds/levelization/results/ordering.txt @@ -186,6 +186,10 @@ test.protocol > ripple.crypto test.protocol > ripple.json test.protocol > ripple.protocol test.protocol > test.toplevel +test.rdb > ripple.app +test.rdb > ripple.core +test.rdb > test.jtx +test.rdb > test.toplevel test.resource > ripple.basics test.resource > ripple.beast test.resource > ripple.resource diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 41fe12158..80ec0a980 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1063,14 +1063,16 @@ # RWDB is recommended for Validator and Peer nodes that are not required to # store history. # -# RWDB maintains its high speed regardless of the amount of history -# stored. Online delete should NOT be used instead RWDB will use the -# ledger_history config value to determine how many ledgers to keep in memory. -# -# Required keys for NuDB, RWDB and RocksDB: +# Required keys for NuDB and RocksDB: # # path Location to store the database # +# Required keys for RWDB: +# +# online_delete Required. RWDB stores data in memory and will +# grow unbounded without online_delete. See the +# online_delete section below. +# # Required keys for Cassandra: # # contact_points IP of a node in the Cassandra cluster @@ -1110,7 +1112,17 @@ # if sufficient IOPS capacity is available. # Default 0. # -# Optional keys for NuDB or RocksDB: +# online_delete for RWDB, NuDB and RocksDB: +# +# online_delete Minimum value of 256. Enable automatic purging +# of older ledger information. Maintain at least this +# number of ledger records online. Must be greater +# than or equal to ledger_history. +# +# REQUIRED for RWDB to prevent out-of-memory errors. +# Optional for NuDB and RocksDB. +# +# Optional keys for NuDB and RocksDB: # # earliest_seq The default is 32570 to match the XRP ledger # network's earliest allowed sequence. Alternate @@ -1120,12 +1132,7 @@ # it must be defined with the same value in both # sections. # -# online_delete Minimum value of 256. Enable automatic purging -# of older ledger information. Maintain at least this -# number of ledger records online. Must be greater -# than or equal to ledger_history. If using RWDB -# this value is ignored. -# + # These keys modify the behavior of online_delete, and thus are only # relevant if online_delete is defined and non-zero: # diff --git a/src/ripple/app/rdb/backend/FlatmapDatabase.h b/src/ripple/app/rdb/backend/FlatmapDatabase.h deleted file mode 100644 index 00927b1d4..000000000 --- a/src/ripple/app/rdb/backend/FlatmapDatabase.h +++ /dev/null @@ -1,851 +0,0 @@ -#ifndef RIPPLE_APP_RDB_BACKEND_FLATMAPDATABASE_H_INCLUDED -#define RIPPLE_APP_RDB_BACKEND_FLATMAPDATABASE_H_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace ripple { - -struct base_uint_hasher -{ - using result_type = std::size_t; - - result_type - operator()(base_uint<256> const& value) const - { - return hardened_hash<>{}(value); - } - - result_type - operator()(AccountID const& value) const - { - return hardened_hash<>{}(value); - } -}; - -class FlatmapDatabase : public SQLiteDatabase -{ -private: - struct LedgerData - { - LedgerInfo info; - boost::unordered:: - concurrent_flat_map - transactions; - }; - - struct AccountTxData - { - boost::unordered:: - concurrent_flat_map, AccountTx> - transactions; - }; - - Application& app_; - - boost::unordered::concurrent_flat_map ledgers_; - boost::unordered:: - concurrent_flat_map - ledgerHashToSeq_; - boost::unordered::concurrent_flat_map - transactionMap_; - boost::unordered:: - concurrent_flat_map - accountTxMap_; - -public: - FlatmapDatabase(Application& app, Config const& config, JobQueue& jobQueue) - : app_(app) - { - } - - std::optional - getMinLedgerSeq() override - { - std::optional minSeq; - ledgers_.visit_all([&minSeq](auto const& pair) { - if (!minSeq || pair.first < *minSeq) - { - minSeq = pair.first; - } - }); - return minSeq; - } - - std::optional - getTransactionsMinLedgerSeq() override - { - std::optional minSeq; - transactionMap_.visit_all([&minSeq](auto const& pair) { - LedgerIndex seq = pair.second.second->getLgrSeq(); - if (!minSeq || seq < *minSeq) - { - minSeq = seq; - } - }); - return minSeq; - } - - std::optional - getAccountTransactionsMinLedgerSeq() override - { - std::optional minSeq; - accountTxMap_.visit_all([&minSeq](auto const& pair) { - pair.second.transactions.visit_all([&minSeq](auto const& tx) { - if (!minSeq || tx.first.first < *minSeq) - { - minSeq = tx.first.first; - } - }); - }); - return minSeq; - } - - std::optional - getMaxLedgerSeq() override - { - std::optional maxSeq; - ledgers_.visit_all([&maxSeq](auto const& pair) { - if (!maxSeq || pair.first > *maxSeq) - { - maxSeq = pair.first; - } - }); - return maxSeq; - } - void - deleteTransactionByLedgerSeq(LedgerIndex ledgerSeq) override - { - ledgers_.visit(ledgerSeq, [this](auto& item) { - item.second.transactions.visit_all([this](auto const& txPair) { - transactionMap_.erase(txPair.first); - }); - item.second.transactions.clear(); - }); - - accountTxMap_.visit_all([ledgerSeq](auto& item) { - item.second.transactions.erase_if([ledgerSeq](auto const& tx) { - return tx.first.first == ledgerSeq; - }); - }); - } - - void - deleteBeforeLedgerSeq(LedgerIndex ledgerSeq) override - { - ledgers_.erase_if([this, ledgerSeq](auto const& item) { - if (item.first < ledgerSeq) - { - item.second.transactions.visit_all([this](auto const& txPair) { - transactionMap_.erase(txPair.first); - }); - ledgerHashToSeq_.erase(item.second.info.hash); - return true; - } - return false; - }); - - accountTxMap_.visit_all([ledgerSeq](auto& item) { - item.second.transactions.erase_if([ledgerSeq](auto const& tx) { - return tx.first.first < ledgerSeq; - }); - }); - } - - void - deleteTransactionsBeforeLedgerSeq(LedgerIndex ledgerSeq) override - { - ledgers_.visit_all([this, ledgerSeq](auto& item) { - if (item.first < ledgerSeq) - { - item.second.transactions.visit_all([this](auto const& txPair) { - transactionMap_.erase(txPair.first); - }); - item.second.transactions.clear(); - } - }); - - accountTxMap_.visit_all([ledgerSeq](auto& item) { - item.second.transactions.erase_if([ledgerSeq](auto const& tx) { - return tx.first.first < ledgerSeq; - }); - }); - } - - void - deleteAccountTransactionsBeforeLedgerSeq(LedgerIndex ledgerSeq) override - { - accountTxMap_.visit_all([ledgerSeq](auto& item) { - item.second.transactions.erase_if([ledgerSeq](auto const& tx) { - return tx.first.first < ledgerSeq; - }); - }); - } - std::size_t - getTransactionCount() override - { - return transactionMap_.size(); - } - - std::size_t - getAccountTransactionCount() override - { - std::size_t count = 0; - accountTxMap_.visit_all([&count](auto const& item) { - count += item.second.transactions.size(); - }); - return count; - } - - CountMinMax - getLedgerCountMinMax() override - { - CountMinMax result{0, 0, 0}; - ledgers_.visit_all([&result](auto const& item) { - result.numberOfRows++; - if (result.minLedgerSequence == 0 || - item.first < result.minLedgerSequence) - { - result.minLedgerSequence = item.first; - } - if (item.first > result.maxLedgerSequence) - { - result.maxLedgerSequence = item.first; - } - }); - return result; - } - - bool - saveValidatedLedger( - std::shared_ptr const& ledger, - bool current) override - { - try - { - LedgerData ledgerData; - ledgerData.info = ledger->info(); - - auto aLedger = std::make_shared(ledger, app_); - for (auto const& acceptedLedgerTx : *aLedger) - { - auto const& txn = acceptedLedgerTx->getTxn(); - auto const& meta = acceptedLedgerTx->getMeta(); - auto const& id = txn->getTransactionID(); - - std::string reason; - auto accTx = std::make_pair( - std::make_shared(txn, reason, app_), - std::make_shared(meta)); - - ledgerData.transactions.emplace(id, accTx); - transactionMap_.emplace(id, accTx); - - for (auto const& account : meta.getAffectedAccounts()) - { - accountTxMap_.visit(account, [&](auto& data) { - data.second.transactions.emplace( - std::make_pair( - ledger->info().seq, - acceptedLedgerTx->getTxnSeq()), - accTx); - }); - } - } - - ledgers_.emplace(ledger->info().seq, std::move(ledgerData)); - ledgerHashToSeq_.emplace(ledger->info().hash, ledger->info().seq); - - if (current) - { - auto const cutoffSeq = - ledger->info().seq > app_.config().LEDGER_HISTORY - ? ledger->info().seq - app_.config().LEDGER_HISTORY - : 0; - - if (cutoffSeq > 0) - { - const std::size_t BATCH_SIZE = 128; - std::size_t deleted = 0; - - ledgers_.erase_if([&](auto const& item) { - if (deleted >= BATCH_SIZE) - return false; - - if (item.first < cutoffSeq) - { - item.second.transactions.visit_all( - [this](auto const& txPair) { - transactionMap_.erase(txPair.first); - }); - ledgerHashToSeq_.erase(item.second.info.hash); - deleted++; - return true; - } - return false; - }); - - if (deleted > 0) - { - accountTxMap_.visit_all([cutoffSeq](auto& item) { - item.second.transactions.erase_if( - [cutoffSeq](auto const& tx) { - return tx.first.first < cutoffSeq; - }); - }); - } - - app_.getLedgerMaster().clearPriorLedgers(cutoffSeq); - } - } - - return true; - } - catch (std::exception const&) - { - deleteTransactionByLedgerSeq(ledger->info().seq); - return false; - } - } - - std::optional - getLedgerInfoByIndex(LedgerIndex ledgerSeq) override - { - std::optional result; - ledgers_.visit(ledgerSeq, [&result](auto const& item) { - result = item.second.info; - }); - return result; - } - - std::optional - getNewestLedgerInfo() override - { - std::optional result; - ledgers_.visit_all([&result](auto const& item) { - if (!result || item.second.info.seq > result->seq) - { - result = item.second.info; - } - }); - return result; - } - - std::optional - getLimitedOldestLedgerInfo(LedgerIndex ledgerFirstIndex) override - { - std::optional result; - ledgers_.visit_all([&](auto const& item) { - if (item.first >= ledgerFirstIndex && - (!result || item.first < result->seq)) - { - result = item.second.info; - } - }); - return result; - } - - std::optional - getLimitedNewestLedgerInfo(LedgerIndex ledgerFirstIndex) override - { - std::optional result; - ledgers_.visit_all([&](auto const& item) { - if (item.first >= ledgerFirstIndex && - (!result || item.first > result->seq)) - { - result = item.second.info; - } - }); - return result; - } - - std::optional - getLedgerInfoByHash(uint256 const& ledgerHash) override - { - std::optional result; - ledgerHashToSeq_.visit(ledgerHash, [this, &result](auto const& item) { - ledgers_.visit(item.second, [&result](auto const& item) { - result = item.second.info; - }); - }); - return result; - } - uint256 - getHashByIndex(LedgerIndex ledgerIndex) override - { - uint256 result; - ledgers_.visit(ledgerIndex, [&result](auto const& item) { - result = item.second.info.hash; - }); - return result; - } - - std::optional - getHashesByIndex(LedgerIndex ledgerIndex) override - { - std::optional result; - ledgers_.visit(ledgerIndex, [&result](auto const& item) { - result = LedgerHashPair{ - item.second.info.hash, item.second.info.parentHash}; - }); - return result; - } - - std::map - getHashesByIndex(LedgerIndex minSeq, LedgerIndex maxSeq) override - { - std::map result; - ledgers_.visit_all([&](auto const& item) { - if (item.first >= minSeq && item.first <= maxSeq) - { - result[item.first] = LedgerHashPair{ - item.second.info.hash, item.second.info.parentHash}; - } - }); - return result; - } - - std::variant - getTransaction( - uint256 const& id, - std::optional> const& range, - error_code_i& ec) override - { - std::variant result = TxSearched::unknown; - transactionMap_.visit(id, [&](auto const& item) { - auto const& tx = item.second; - if (!range || - (range->lower() <= tx.second->getLgrSeq() && - tx.second->getLgrSeq() <= range->upper())) - { - result = tx; - } - else - { - result = TxSearched::all; - } - }); - return result; - } - - bool - ledgerDbHasSpace(Config const& config) override - { - return true; // In-memory database always has space - } - - bool - transactionDbHasSpace(Config const& config) override - { - return true; // In-memory database always has space - } - - std::uint32_t - getKBUsedAll() override - { - std::uint32_t size = sizeof(*this); - size += ledgers_.size() * (sizeof(LedgerIndex) + sizeof(LedgerData)); - size += - ledgerHashToSeq_.size() * (sizeof(uint256) + sizeof(LedgerIndex)); - size += transactionMap_.size() * (sizeof(uint256) + sizeof(AccountTx)); - accountTxMap_.visit_all([&size](auto const& item) { - size += sizeof(AccountID) + sizeof(AccountTxData); - size += item.second.transactions.size() * sizeof(AccountTx); - }); - return size / 1024; // Convert to KB - } - - std::uint32_t - getKBUsedLedger() override - { - std::uint32_t size = - ledgers_.size() * (sizeof(LedgerIndex) + sizeof(LedgerData)); - size += - ledgerHashToSeq_.size() * (sizeof(uint256) + sizeof(LedgerIndex)); - return size / 1024; - } - - std::uint32_t - getKBUsedTransaction() override - { - std::uint32_t size = - transactionMap_.size() * (sizeof(uint256) + sizeof(AccountTx)); - accountTxMap_.visit_all([&size](auto const& item) { - size += sizeof(AccountID) + sizeof(AccountTxData); - size += item.second.transactions.size() * sizeof(AccountTx); - }); - return size / 1024; - } - - void - closeLedgerDB() override - { - // No-op for in-memory database - } - - void - closeTransactionDB() override - { - // No-op for in-memory database - } - - ~FlatmapDatabase() - { - // Concurrent maps need visit_all - accountTxMap_.visit_all( - [](auto& pair) { pair.second.transactions.clear(); }); - accountTxMap_.clear(); - - transactionMap_.clear(); - - ledgers_.visit_all( - [](auto& pair) { pair.second.transactions.clear(); }); - ledgers_.clear(); - - ledgerHashToSeq_.clear(); - } - - std::vector> - getTxHistory(LedgerIndex startIndex) override - { - std::vector> result; - transactionMap_.visit_all([&](auto const& item) { - if (item.second.second->getLgrSeq() >= startIndex) - { - result.push_back(item.second.first); - } - }); - std::sort( - result.begin(), result.end(), [](auto const& a, auto const& b) { - return a->getLedger() > b->getLedger(); - }); - if (result.size() > 20) - { - result.resize(20); - } - return result; - } - // Helper function to handle limits - template - void - applyLimit(Container& container, std::size_t limit, bool bUnlimited) - { - if (!bUnlimited && limit > 0 && container.size() > limit) - { - container.resize(limit); - } - } - - AccountTxs - getOldestAccountTxs(AccountTxOptions const& options) override - { - AccountTxs result; - accountTxMap_.visit(options.account, [&](auto const& item) { - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - result.push_back(tx.second); - } - }); - }); - std::sort( - result.begin(), result.end(), [](auto const& a, auto const& b) { - return a.second->getLgrSeq() < b.second->getLgrSeq(); - }); - applyLimit(result, options.limit, options.bUnlimited); - return result; - } - - AccountTxs - getNewestAccountTxs(AccountTxOptions const& options) override - { - AccountTxs result; - accountTxMap_.visit(options.account, [&](auto const& item) { - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - result.push_back(tx.second); - } - }); - }); - std::sort( - result.begin(), result.end(), [](auto const& a, auto const& b) { - return a.second->getLgrSeq() > b.second->getLgrSeq(); - }); - applyLimit(result, options.limit, options.bUnlimited); - return result; - } - - MetaTxsList - getOldestAccountTxsB(AccountTxOptions const& options) override - { - MetaTxsList result; - accountTxMap_.visit(options.account, [&](auto const& item) { - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - result.emplace_back( - tx.second.first->getSTransaction() - ->getSerializer() - .peekData(), - tx.second.second->getAsObject() - .getSerializer() - .peekData(), - tx.first.first); - } - }); - }); - std::sort( - result.begin(), result.end(), [](auto const& a, auto const& b) { - return std::get<2>(a) < std::get<2>(b); - }); - applyLimit(result, options.limit, options.bUnlimited); - return result; - } - - MetaTxsList - getNewestAccountTxsB(AccountTxOptions const& options) override - { - MetaTxsList result; - accountTxMap_.visit(options.account, [&](auto const& item) { - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - result.emplace_back( - tx.second.first->getSTransaction() - ->getSerializer() - .peekData(), - tx.second.second->getAsObject() - .getSerializer() - .peekData(), - tx.first.first); - } - }); - }); - std::sort( - result.begin(), result.end(), [](auto const& a, auto const& b) { - return std::get<2>(a) > std::get<2>(b); - }); - applyLimit(result, options.limit, options.bUnlimited); - return result; - } - std::pair> - oldestAccountTxPage(AccountTxPageOptions const& options) override - { - AccountTxs result; - std::optional marker; - - accountTxMap_.visit(options.account, [&](auto const& item) { - std::vector, AccountTx>> - txs; - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - txs.emplace_back(tx); - } - }); - - std::sort(txs.begin(), txs.end(), [](auto const& a, auto const& b) { - return a.first < b.first; - }); - - auto it = txs.begin(); - if (options.marker) - { - it = std::find_if(txs.begin(), txs.end(), [&](auto const& tx) { - return tx.first.first == options.marker->ledgerSeq && - tx.first.second == options.marker->txnSeq; - }); - if (it != txs.end()) - ++it; - } - - for (; it != txs.end() && - (options.limit == 0 || result.size() < options.limit); - ++it) - { - result.push_back(it->second); - } - - if (it != txs.end()) - { - marker = AccountTxMarker{it->first.first, it->first.second}; - } - }); - - return {result, marker}; - } - - std::pair> - newestAccountTxPage(AccountTxPageOptions const& options) override - { - AccountTxs result; - std::optional marker; - - accountTxMap_.visit(options.account, [&](auto const& item) { - std::vector, AccountTx>> - txs; - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - txs.emplace_back(tx); - } - }); - - std::sort(txs.begin(), txs.end(), [](auto const& a, auto const& b) { - return a.first > b.first; - }); - - auto it = txs.begin(); - if (options.marker) - { - it = std::find_if(txs.begin(), txs.end(), [&](auto const& tx) { - return tx.first.first == options.marker->ledgerSeq && - tx.first.second == options.marker->txnSeq; - }); - if (it != txs.end()) - ++it; - } - - for (; it != txs.end() && - (options.limit == 0 || result.size() < options.limit); - ++it) - { - result.push_back(it->second); - } - - if (it != txs.end()) - { - marker = AccountTxMarker{it->first.first, it->first.second}; - } - }); - - return {result, marker}; - } - - std::pair> - oldestAccountTxPageB(AccountTxPageOptions const& options) override - { - MetaTxsList result; - std::optional marker; - - accountTxMap_.visit(options.account, [&](auto const& item) { - std::vector> txs; - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - txs.emplace_back( - tx.first.first, tx.first.second, tx.second); - } - }); - - std::sort(txs.begin(), txs.end()); - - auto it = txs.begin(); - if (options.marker) - { - it = std::find_if(txs.begin(), txs.end(), [&](auto const& tx) { - return std::get<0>(tx) == options.marker->ledgerSeq && - std::get<1>(tx) == options.marker->txnSeq; - }); - if (it != txs.end()) - ++it; - } - - for (; it != txs.end() && - (options.limit == 0 || result.size() < options.limit); - ++it) - { - const auto& [_, __, tx] = *it; - result.emplace_back( - tx.first->getSTransaction()->getSerializer().peekData(), - tx.second->getAsObject().getSerializer().peekData(), - std::get<0>(*it)); - } - - if (it != txs.end()) - { - marker = AccountTxMarker{std::get<0>(*it), std::get<1>(*it)}; - } - }); - - return {result, marker}; - } - - std::pair> - newestAccountTxPageB(AccountTxPageOptions const& options) override - { - MetaTxsList result; - std::optional marker; - - accountTxMap_.visit(options.account, [&](auto const& item) { - std::vector> txs; - item.second.transactions.visit_all([&](auto const& tx) { - if (tx.first.first >= options.minLedger && - tx.first.first <= options.maxLedger) - { - txs.emplace_back( - tx.first.first, tx.first.second, tx.second); - } - }); - - std::sort(txs.begin(), txs.end(), std::greater<>()); - - auto it = txs.begin(); - if (options.marker) - { - it = std::find_if(txs.begin(), txs.end(), [&](auto const& tx) { - return std::get<0>(tx) == options.marker->ledgerSeq && - std::get<1>(tx) == options.marker->txnSeq; - }); - if (it != txs.end()) - ++it; - } - - for (; it != txs.end() && - (options.limit == 0 || result.size() < options.limit); - ++it) - { - const auto& [_, __, tx] = *it; - result.emplace_back( - tx.first->getSTransaction()->getSerializer().peekData(), - tx.second->getAsObject().getSerializer().peekData(), - std::get<0>(*it)); - } - - if (it != txs.end()) - { - marker = AccountTxMarker{std::get<0>(*it), std::get<1>(*it)}; - } - }); - - return {result, marker}; - } -}; - -// Factory function -std::unique_ptr -getFlatmapDatabase(Application& app, Config const& config, JobQueue& jobQueue) -{ - return std::make_unique(app, config, jobQueue); -} - -} // namespace ripple -#endif // RIPPLE_APP_RDB_BACKEND_FLATMAPDATABASE_H_INCLUDED diff --git a/src/ripple/app/rdb/backend/RWDBDatabase.h b/src/ripple/app/rdb/backend/RWDBDatabase.h index 3981691bc..f91e50cda 100644 --- a/src/ripple/app/rdb/backend/RWDBDatabase.h +++ b/src/ripple/app/rdb/backend/RWDBDatabase.h @@ -28,9 +28,8 @@ private: struct AccountTxData { - AccountTxs transactions; - std::map> - ledgerTxMap; // ledgerSeq -> txSeq -> index in transactions + std::map> + ledgerTxMap; // ledgerSeq -> vector of transactions }; Application& app_; @@ -65,9 +64,12 @@ public: return {}; std::shared_lock lock(mutex_); - if (transactionMap_.empty()) - return std::nullopt; - return transactionMap_.begin()->second.second->getLgrSeq(); + for (const auto& [ledgerSeq, ledgerData] : ledgers_) + { + if (!ledgerData.transactions.empty()) + return ledgerSeq; + } + return std::nullopt; } std::optional @@ -163,14 +165,6 @@ public: { txIt = accountData.ledgerTxMap.erase(txIt); } - accountData.transactions.erase( - std::remove_if( - accountData.transactions.begin(), - accountData.transactions.end(), - [ledgerSeq](const AccountTx& tx) { - return tx.second->getLgrSeq() < ledgerSeq; - }), - accountData.transactions.end()); } } std::size_t @@ -193,7 +187,10 @@ public: std::size_t count = 0; for (const auto& [_, accountData] : accountTxMap_) { - count += accountData.transactions.size(); + for (const auto& [_, txVector] : accountData.ledgerTxMap) + { + count += txVector.size(); + } } return count; } @@ -293,10 +290,7 @@ public: accountTxMap_[account] = AccountTxData(); auto& accountData = accountTxMap_[account]; - accountData.transactions.push_back(accTx); - accountData - .ledgerTxMap[seq][acceptedLedgerTx->getTxnSeq()] = - accountData.transactions.size() - 1; + accountData.ledgerTxMap[seq].push_back(accTx); } app_.getMasterTransaction().inLedger( @@ -451,59 +445,108 @@ public: return true; // In-memory database always has space } + // Red-black tree node overhead per map entry + static constexpr size_t MAP_NODE_OVERHEAD = 40; + +private: + std::uint64_t + getBytesUsedLedger_unlocked() const + { + std::uint64_t size = 0; + + // Count structural overhead of ledger storage including map node + // overhead Note: sizeof(LedgerData) includes the map container for + // transactions, but not the actual transaction data + size += ledgers_.size() * + (sizeof(LedgerIndex) + sizeof(LedgerData) + MAP_NODE_OVERHEAD); + + // Add the transaction map nodes inside each ledger (ledger's view of + // its transactions) + for (const auto& [_, ledgerData] : ledgers_) + { + size += ledgerData.transactions.size() * + (sizeof(uint256) + sizeof(AccountTx) + MAP_NODE_OVERHEAD); + } + + // Count the ledger hash to sequence lookup map + size += ledgerHashToSeq_.size() * + (sizeof(uint256) + sizeof(LedgerIndex) + MAP_NODE_OVERHEAD); + + return size; + } + + std::uint64_t + getBytesUsedTransaction_unlocked() const + { + if (!useTxTables_) + return 0; + + std::uint64_t size = 0; + + // Count structural overhead of transaction map + // sizeof(AccountTx) is just the size of two shared_ptrs (~32 bytes) + size += transactionMap_.size() * + (sizeof(uint256) + sizeof(AccountTx) + MAP_NODE_OVERHEAD); + + // Add actual transaction and metadata data sizes + for (const auto& [_, accountTx] : transactionMap_) + { + if (accountTx.first) + size += accountTx.first->getSTransaction() + ->getSerializer() + .peekData() + .size(); + if (accountTx.second) + size += accountTx.second->getAsObject() + .getSerializer() + .peekData() + .size(); + } + + // Count structural overhead of account transaction index + // The actual transaction data is already counted above from + // transactionMap_ + for (const auto& [accountId, accountData] : accountTxMap_) + { + size += + sizeof(accountId) + sizeof(AccountTxData) + MAP_NODE_OVERHEAD; + for (const auto& [ledgerSeq, txVector] : accountData.ledgerTxMap) + { + // Use capacity() to account for actual allocated memory + size += sizeof(ledgerSeq) + MAP_NODE_OVERHEAD; + size += txVector.capacity() * sizeof(AccountTx); + } + } + + return size; + } + +public: std::uint32_t getKBUsedAll() override { std::shared_lock lock(mutex_); - std::uint32_t size = sizeof(*this); - size += ledgers_.size() * (sizeof(LedgerIndex) + sizeof(LedgerData)); - size += - ledgerHashToSeq_.size() * (sizeof(uint256) + sizeof(LedgerIndex)); - size += transactionMap_.size() * (sizeof(uint256) + sizeof(AccountTx)); - for (const auto& [_, accountData] : accountTxMap_) - { - size += sizeof(AccountID) + sizeof(AccountTxData); - size += accountData.transactions.size() * sizeof(AccountTx); - for (const auto& [_, innerMap] : accountData.ledgerTxMap) - { - size += sizeof(uint32_t) + - innerMap.size() * (sizeof(uint32_t) + sizeof(size_t)); - } - } - return size / 1024; + + // Total = base object + ledger infrastructure + transaction data + std::uint64_t size = sizeof(*this) + getBytesUsedLedger_unlocked() + + getBytesUsedTransaction_unlocked(); + + return static_cast(size / 1024); } std::uint32_t getKBUsedLedger() override { std::shared_lock lock(mutex_); - std::uint32_t size = 0; - size += ledgers_.size() * (sizeof(LedgerIndex) + sizeof(LedgerData)); - size += - ledgerHashToSeq_.size() * (sizeof(uint256) + sizeof(LedgerIndex)); - return size / 1024; + return static_cast(getBytesUsedLedger_unlocked() / 1024); } std::uint32_t getKBUsedTransaction() override { - if (!useTxTables_) - return 0; - std::shared_lock lock(mutex_); - std::uint32_t size = 0; - size += transactionMap_.size() * (sizeof(uint256) + sizeof(AccountTx)); - for (const auto& [_, accountData] : accountTxMap_) - { - size += sizeof(AccountID) + sizeof(AccountTxData); - size += accountData.transactions.size() * sizeof(AccountTx); - for (const auto& [_, innerMap] : accountData.ledgerTxMap) - { - size += sizeof(uint32_t) + - innerMap.size() * (sizeof(uint32_t) + sizeof(size_t)); - } - } - return size / 1024; + return static_cast( + getBytesUsedTransaction_unlocked() / 1024); } void @@ -605,14 +648,13 @@ public: (options.bUnlimited || result.size() < options.limit); ++txIt) { - for (const auto& [txSeq, txIndex] : txIt->second) + for (const auto& accountTx : txIt->second) { if (skipped < options.offset) { ++skipped; continue; } - AccountTx const accountTx = accountData.transactions[txIndex]; std::uint32_t const inLedger = rangeCheckedCast( accountTx.second->getLgrSeq()); accountTx.first->setStatus(COMMITTED); @@ -657,8 +699,7 @@ public: ++skipped; continue; } - AccountTx const accountTx = - accountData.transactions[innerRIt->second]; + AccountTx const accountTx = *innerRIt; std::uint32_t const inLedger = rangeCheckedCast( accountTx.second->getLgrSeq()); accountTx.first->setLedger(inLedger); @@ -692,14 +733,14 @@ public: (options.bUnlimited || result.size() < options.limit); ++txIt) { - for (const auto& [txSeq, txIndex] : txIt->second) + for (const auto& accountTx : txIt->second) { if (skipped < options.offset) { ++skipped; continue; } - const auto& [txn, txMeta] = accountData.transactions[txIndex]; + const auto& [txn, txMeta] = accountTx; result.emplace_back( txn->getSTransaction()->getSerializer().peekData(), txMeta->getAsObject().getSerializer().peekData(), @@ -743,8 +784,7 @@ public: ++skipped; continue; } - const auto& [txn, txMeta] = - accountData.transactions[innerRIt->second]; + const auto& [txn, txMeta] = *innerRIt; result.emplace_back( txn->getSTransaction()->getSerializer().peekData(), txMeta->getAsObject().getSerializer().peekData(), @@ -816,11 +856,9 @@ public: for (; txIt != txEnd; ++txIt) { std::uint32_t const ledgerSeq = txIt->first; - for (auto seqIt = txIt->second.begin(); - seqIt != txIt->second.end(); - ++seqIt) + std::uint32_t txnSeq = 0; + for (const auto& accountTx : txIt->second) { - const auto& [txnSeq, index] = *seqIt; if (lookingForMarker) { if (findLedger == ledgerSeq && findSeq == txnSeq) @@ -828,7 +866,10 @@ public: lookingForMarker = false; } else + { + ++txnSeq; continue; + } } else if (numberOfResults == 0) { @@ -837,12 +878,10 @@ public: return {newmarker, total}; } - Blob rawTxn = accountData.transactions[index] - .first->getSTransaction() + Blob rawTxn = accountTx.first->getSTransaction() ->getSerializer() .peekData(); - Blob rawMeta = accountData.transactions[index] - .second->getAsObject() + Blob rawMeta = accountTx.second->getAsObject() .getSerializer() .peekData(); @@ -856,6 +895,7 @@ public: std::move(rawMeta)); --numberOfResults; ++total; + ++txnSeq; } } } @@ -871,11 +911,11 @@ public: for (; rtxIt != rtxEnd; ++rtxIt) { std::uint32_t const ledgerSeq = rtxIt->first; + std::uint32_t txnSeq = rtxIt->second.size() - 1; for (auto innerRIt = rtxIt->second.rbegin(); innerRIt != rtxIt->second.rend(); ++innerRIt) { - const auto& [txnSeq, index] = *innerRIt; if (lookingForMarker) { if (findLedger == ledgerSeq && findSeq == txnSeq) @@ -883,7 +923,10 @@ public: lookingForMarker = false; } else + { + --txnSeq; continue; + } } else if (numberOfResults == 0) { @@ -892,12 +935,11 @@ public: return {newmarker, total}; } - Blob rawTxn = accountData.transactions[index] - .first->getSTransaction() + const auto& accountTx = *innerRIt; + Blob rawTxn = accountTx.first->getSTransaction() ->getSerializer() .peekData(); - Blob rawMeta = accountData.transactions[index] - .second->getAsObject() + Blob rawMeta = accountTx.second->getAsObject() .getSerializer() .peekData(); @@ -911,6 +953,7 @@ public: std::move(rawMeta)); --numberOfResults; ++total; + --txnSeq; } } } diff --git a/src/ripple/app/rdb/impl/RelationalDatabase.cpp b/src/ripple/app/rdb/impl/RelationalDatabase.cpp index 64161bd53..bf24d7dc7 100644 --- a/src/ripple/app/rdb/impl/RelationalDatabase.cpp +++ b/src/ripple/app/rdb/impl/RelationalDatabase.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -41,7 +40,6 @@ RelationalDatabase::init( bool use_sqlite = false; bool use_postgres = false; bool use_rwdb = false; - bool use_flatmap = false; if (config.reporting()) { @@ -60,10 +58,6 @@ RelationalDatabase::init( { use_rwdb = true; } - else if (boost::iequals(get(rdb_section, "backend"), "flatmap")) - { - use_flatmap = true; - } else { Throw( @@ -89,10 +83,6 @@ RelationalDatabase::init( { return getRWDBDatabase(app, config, jobQueue); } - else if (use_flatmap) - { - return getFlatmapDatabase(app, config, jobQueue); - } return std::unique_ptr(); } diff --git a/src/ripple/core/Config.h b/src/ripple/core/Config.h index 3e2c3c81a..0909f88ac 100644 --- a/src/ripple/core/Config.h +++ b/src/ripple/core/Config.h @@ -361,9 +361,7 @@ public: boost::beast::iequals( get(section(SECTION_RELATIONAL_DB), "backend"), "rwdb")) || (!section("node_db").empty() && - (boost::beast::iequals(get(section("node_db"), "type"), "rwdb") || - boost::beast::iequals( - get(section("node_db"), "type"), "flatmap"))); + boost::beast::iequals(get(section("node_db"), "type"), "rwdb")); // RHNOTE: memory type is not selected for here because it breaks // tests return isMem; diff --git a/src/ripple/core/impl/Config.cpp b/src/ripple/core/impl/Config.cpp index 7673d16ec..9fd23f33e 100644 --- a/src/ripple/core/impl/Config.cpp +++ b/src/ripple/core/impl/Config.cpp @@ -45,7 +45,6 @@ namespace ripple { namespace detail { - [[nodiscard]] std::uint64_t getMemorySize() { @@ -54,7 +53,6 @@ getMemorySize() return 0; } - } // namespace detail } // namespace ripple #endif @@ -64,7 +62,6 @@ getMemorySize() namespace ripple { namespace detail { - [[nodiscard]] std::uint64_t getMemorySize() { @@ -73,7 +70,6 @@ getMemorySize() return 0; } - } // namespace detail } // namespace ripple @@ -85,7 +81,6 @@ getMemorySize() namespace ripple { namespace detail { - [[nodiscard]] std::uint64_t getMemorySize() { @@ -98,13 +93,11 @@ getMemorySize() return 0; } - } // namespace detail } // namespace ripple #endif namespace ripple { - // clang-format off // The configurable node sizes are "tiny", "small", "medium", "large", "huge" inline constexpr std::array>, 13> @@ -1007,6 +1000,23 @@ Config::loadFromString(std::string const& fileContents) "the maximum number of allowed peers (peers_max)"); } } + + if (!RUN_STANDALONE) + { + auto db_section = section(ConfigSection::nodeDatabase()); + if (auto type = get(db_section, "type", ""); type == "rwdb") + { + if (auto delete_interval = get(db_section, "online_delete", 0); + delete_interval == 0) + { + Throw( + "RWDB (in-memory backend) requires online_delete to " + "prevent OOM " + "Exception: standalone mode (used by tests) doesn't need " + "online_delete"); + } + } + } } boost::filesystem::path @@ -1071,5 +1081,4 @@ setup_FeeVote(Section const& section) } return setup; } - } // namespace ripple diff --git a/src/ripple/nodestore/backend/FlatmapFactory.cpp b/src/ripple/nodestore/backend/FlatmapFactory.cpp deleted file mode 100644 index 4cec115ef..000000000 --- a/src/ripple/nodestore/backend/FlatmapFactory.cpp +++ /dev/null @@ -1,235 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ripple { -namespace NodeStore { - -class FlatmapBackend : public Backend -{ -private: - std::string name_; - beast::Journal journal_; - bool isOpen_{false}; - - struct base_uint_hasher - { - using result_type = std::size_t; - - result_type - operator()(base_uint<256> const& value) const - { - return hardened_hash<>{}(value); - } - }; - - using DataStore = boost::unordered::concurrent_flat_map< - uint256, - std::vector, // Store compressed blob data - base_uint_hasher>; - - DataStore table_; - -public: - FlatmapBackend( - size_t keyBytes, - Section const& keyValues, - beast::Journal journal) - : name_(get(keyValues, "path")), journal_(journal) - { - boost::ignore_unused(journal_); - if (name_.empty()) - name_ = "node_db"; - } - - ~FlatmapBackend() override - { - close(); - } - - std::string - getName() override - { - return name_; - } - - void - open(bool createIfMissing) override - { - if (isOpen_) - Throw("already open"); - isOpen_ = true; - } - - bool - isOpen() override - { - return isOpen_; - } - - void - close() override - { - table_.clear(); - isOpen_ = false; - } - - Status - fetch(void const* key, std::shared_ptr* pObject) override - { - if (!isOpen_) - return notFound; - - uint256 const hash(uint256::fromVoid(key)); - - bool found = table_.visit(hash, [&](const auto& key_value_pair) { - nudb::detail::buffer bf; - auto const result = nodeobject_decompress( - key_value_pair.second.data(), key_value_pair.second.size(), bf); - DecodedBlob decoded(hash.data(), result.first, result.second); - if (!decoded.wasOk()) - { - *pObject = nullptr; - return; - } - *pObject = decoded.createObject(); - }); - return found ? (*pObject ? ok : dataCorrupt) : notFound; - } - - std::pair>, Status> - fetchBatch(std::vector const& hashes) override - { - std::vector> results; - results.reserve(hashes.size()); - for (auto const& h : hashes) - { - std::shared_ptr nObj; - Status status = fetch(h->begin(), &nObj); - if (status != ok) - results.push_back({}); - else - results.push_back(nObj); - } - return {results, ok}; - } - - void - store(std::shared_ptr const& object) override - { - if (!isOpen_) - return; - - if (!object) - return; - - EncodedBlob encoded(object); - nudb::detail::buffer bf; - auto const result = - nodeobject_compress(encoded.getData(), encoded.getSize(), bf); - - std::vector compressed( - static_cast(result.first), - static_cast(result.first) + result.second); - - table_.insert_or_assign(object->getHash(), std::move(compressed)); - } - - void - storeBatch(Batch const& batch) override - { - for (auto const& e : batch) - store(e); - } - - void - sync() override - { - } - - void - for_each(std::function)> f) override - { - if (!isOpen_) - return; - - table_.visit_all([&f](const auto& entry) { - nudb::detail::buffer bf; - auto const result = nodeobject_decompress( - entry.second.data(), entry.second.size(), bf); - DecodedBlob decoded( - entry.first.data(), result.first, result.second); - if (decoded.wasOk()) - f(decoded.createObject()); - }); - } - - int - getWriteLoad() override - { - return 0; - } - - void - setDeletePath() override - { - close(); - } - - int - fdRequired() const override - { - return 0; - } - -private: - size_t - size() const - { - return table_.size(); - } -}; - -class FlatmapFactory : public Factory -{ -public: - FlatmapFactory() - { - Manager::instance().insert(*this); - } - - ~FlatmapFactory() override - { - Manager::instance().erase(*this); - } - - std::string - getName() const override - { - return "Flatmap"; - } - - std::unique_ptr - createInstance( - size_t keyBytes, - Section const& keyValues, - std::size_t burstSize, - Scheduler& scheduler, - beast::Journal journal) override - { - return std::make_unique(keyBytes, keyValues, journal); - } -}; - -static FlatmapFactory flatmapFactory; - -} // namespace NodeStore -} // namespace ripple diff --git a/src/test/app/SHAMapStore_test.cpp b/src/test/app/SHAMapStore_test.cpp index 010c83a42..8a3ca0f89 100644 --- a/src/test/app/SHAMapStore_test.cpp +++ b/src/test/app/SHAMapStore_test.cpp @@ -216,6 +216,10 @@ public: } BEAST_EXPECT(store.getLastRotated() == lastRotated); + SQLiteDatabase* const db = + dynamic_cast(&env.app().getRelationalDatabase()); + BEAST_EXPECT(*db->getTransactionsMinLedgerSeq() == 3); + for (auto i = 3; i < deleteInterval + lastRotated; ++i) { ledgers.emplace( diff --git a/src/test/core/Config_test.cpp b/src/test/core/Config_test.cpp index 3d7991d74..dbf187fa6 100644 --- a/src/test/core/Config_test.cpp +++ b/src/test/core/Config_test.cpp @@ -1206,6 +1206,97 @@ r.ripple.com:51235 } } + void + testRWDBOnlineDelete() + { + testcase("RWDB online_delete validation"); + + // Test 1: RWDB without online_delete in standalone mode (should + // succeed) + { + Config c; + std::string toLoad = + "[node_db]\n" + "type=rwdb\n" + "path=main\n"; + c.setupControl(true, true, true); // standalone = true + try + { + c.loadFromString(toLoad); + pass(); // Should succeed + } + catch (std::runtime_error const& e) + { + fail("Should not throw in standalone mode"); + } + } + + // Test 2: RWDB without online_delete NOT in standalone mode (should + // throw) + { + Config c; + std::string toLoad = + "[node_db]\n" + "type=rwdb\n" + "path=main\n"; + c.setupControl(true, true, false); // standalone = false + try + { + c.loadFromString(toLoad); + fail("Expected exception for RWDB without online_delete"); + } + catch (std::runtime_error const& e) + { + BEAST_EXPECT( + std::string(e.what()).find( + "RWDB (in-memory backend) requires online_delete") != + std::string::npos); + pass(); + } + } + + // Test 3: RWDB with online_delete NOT in standalone mode (should + // succeed) + { + Config c; + std::string toLoad = + "[node_db]\n" + "type=rwdb\n" + "path=main\n" + "online_delete=256\n"; + c.setupControl(true, true, false); // standalone = false + try + { + c.loadFromString(toLoad); + pass(); // Should succeed + } + catch (std::runtime_error const& e) + { + fail("Should not throw when online_delete is configured"); + } + } + + // Test 4: Non-RWDB without online_delete NOT in standalone mode (should + // succeed) + { + Config c; + std::string toLoad = + "[node_db]\n" + "type=NuDB\n" + "path=main\n"; + c.setupControl(true, true, false); // standalone = false + try + { + c.loadFromString(toLoad); + pass(); // Should succeed + } + catch (std::runtime_error const& e) + { + fail("Should not throw for non-RWDB backends"); + } + } + } + void testOverlay() { @@ -1295,6 +1386,7 @@ r.ripple.com:51235 testComments(); testGetters(); testAmendment(); + testRWDBOnlineDelete(); testOverlay(); testNetworkID(); } diff --git a/src/test/rdb/RelationalDatabase_test.cpp b/src/test/rdb/RelationalDatabase_test.cpp new file mode 100644 index 000000000..8f4ea3907 --- /dev/null +++ b/src/test/rdb/RelationalDatabase_test.cpp @@ -0,0 +1,756 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include +#include +#include +#include +#include +#include + +namespace ripple { +namespace test { + +class RelationalDatabase_test : public beast::unit_test::suite +{ +private: + // Helper to get SQLiteDatabase* (works for both SQLite and RWDB since RWDB + // inherits from SQLiteDatabase) + static SQLiteDatabase* + getInterface(Application& app) + { + return dynamic_cast(&app.getRelationalDatabase()); + } + + static SQLiteDatabase* + getInterface(RelationalDatabase& db) + { + return dynamic_cast(&db); + } + + static std::unique_ptr + makeConfig(std::string const& backend) + { + auto config = test::jtx::envconfig(); + // Sqlite backend doesn't need a database_path as it will just use + // in-memory databases when in standalone mode anyway. + config->overwrite(SECTION_RELATIONAL_DB, "backend", backend); + return config; + } + +public: + RelationalDatabase_test() = default; + + void + testBasicInitialization( + std::string const& backend, + std::unique_ptr config) + { + testcase("Basic initialization and empty database - " + backend); + + using namespace test::jtx; + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + // Test empty database state + BEAST_EXPECT(db.getMinLedgerSeq() == 2); + BEAST_EXPECT(db.getMaxLedgerSeq() == 2); + BEAST_EXPECT(db.getNewestLedgerInfo()->seq == 2); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + + if (sqliteDb) + { + BEAST_EXPECT(!sqliteDb->getTransactionsMinLedgerSeq().has_value()); + BEAST_EXPECT( + !sqliteDb->getAccountTransactionsMinLedgerSeq().has_value()); + + auto ledgerCount = sqliteDb->getLedgerCountMinMax(); + BEAST_EXPECT(ledgerCount.numberOfRows == 1); + BEAST_EXPECT(ledgerCount.minLedgerSequence == 2); + BEAST_EXPECT(ledgerCount.maxLedgerSequence == 2); + } + } + + void + testLedgerSequenceOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Ledger sequence operations - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + // Create initial ledger + Account alice("alice"); + env.fund(XRP(10000), alice); + env.close(); + + // Test basic sequence operations + auto minSeq = db.getMinLedgerSeq(); + auto maxSeq = db.getMaxLedgerSeq(); + + BEAST_EXPECT(minSeq.has_value()); + BEAST_EXPECT(maxSeq.has_value()); + BEAST_EXPECT(*minSeq == 2); + BEAST_EXPECT(*maxSeq == 3); + + // Create more ledgers + env(pay(alice, Account("bob"), XRP(1000))); + env.close(); + + env(pay(alice, Account("carol"), XRP(500))); + env.close(); + + // Verify sequence updates + minSeq = db.getMinLedgerSeq(); + maxSeq = db.getMaxLedgerSeq(); + + BEAST_EXPECT(*minSeq == 2); + BEAST_EXPECT(*maxSeq == 5); + + auto* sqliteDb = getInterface(db); + if (sqliteDb) + { + auto ledgerCount = sqliteDb->getLedgerCountMinMax(); + BEAST_EXPECT(ledgerCount.numberOfRows == 4); + BEAST_EXPECT(ledgerCount.minLedgerSequence == 2); + BEAST_EXPECT(ledgerCount.maxLedgerSequence == 5); + } + } + + void + testLedgerInfoOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Ledger info retrieval operations - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto* db = getInterface(env.app()); + + Account alice("alice"); + env.fund(XRP(10000), alice); + env.close(); + + // Test getNewestLedgerInfo + auto newestLedger = db->getNewestLedgerInfo(); + BEAST_EXPECT(newestLedger.has_value()); + BEAST_EXPECT(newestLedger->seq == 3); + + // Test getLedgerInfoByIndex + auto ledgerByIndex = db->getLedgerInfoByIndex(3); + BEAST_EXPECT(ledgerByIndex.has_value()); + BEAST_EXPECT(ledgerByIndex->seq == 3); + BEAST_EXPECT(ledgerByIndex->hash == newestLedger->hash); + + // Test getLedgerInfoByHash + auto ledgerByHash = db->getLedgerInfoByHash(newestLedger->hash); + BEAST_EXPECT(ledgerByHash.has_value()); + BEAST_EXPECT(ledgerByHash->seq == 3); + BEAST_EXPECT(ledgerByHash->hash == newestLedger->hash); + + // Test getLimitedOldestLedgerInfo + auto oldestLedger = db->getLimitedOldestLedgerInfo(2); + BEAST_EXPECT(oldestLedger.has_value()); + BEAST_EXPECT(oldestLedger->seq == 2); + + // Test getLimitedNewestLedgerInfo + auto limitedNewest = db->getLimitedNewestLedgerInfo(2); + BEAST_EXPECT(limitedNewest.has_value()); + BEAST_EXPECT(limitedNewest->seq == 3); + + // Test invalid queries + auto invalidLedger = db->getLedgerInfoByIndex(999); + BEAST_EXPECT(!invalidLedger.has_value()); + + uint256 invalidHash; + auto invalidHashLedger = db->getLedgerInfoByHash(invalidHash); + BEAST_EXPECT(!invalidHashLedger.has_value()); + } + + void + testHashOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Hash retrieval operations - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + Account alice("alice"); + env.fund(XRP(10000), alice); + env.close(); + + env(pay(alice, Account("bob"), XRP(1000))); + env.close(); + + // Test getHashByIndex + auto hash1 = db.getHashByIndex(3); + auto hash2 = db.getHashByIndex(4); + + BEAST_EXPECT(hash1 != uint256()); + BEAST_EXPECT(hash2 != uint256()); + BEAST_EXPECT(hash1 != hash2); + + // Test getHashesByIndex (single) + auto hashPair = db.getHashesByIndex(4); + BEAST_EXPECT(hashPair.has_value()); + BEAST_EXPECT(hashPair->ledgerHash == hash2); + BEAST_EXPECT(hashPair->parentHash == hash1); + + // Test getHashesByIndex (range) + auto hashRange = db.getHashesByIndex(3, 4); + BEAST_EXPECT(hashRange.size() == 2); + BEAST_EXPECT(hashRange[3].ledgerHash == hash1); + BEAST_EXPECT(hashRange[4].ledgerHash == hash2); + BEAST_EXPECT(hashRange[4].parentHash == hash1); + + // Test invalid hash queries + auto invalidHash = db.getHashByIndex(999); + BEAST_EXPECT(invalidHash == uint256()); + + auto invalidHashPair = db.getHashesByIndex(999); + BEAST_EXPECT(!invalidHashPair.has_value()); + + auto emptyRange = db.getHashesByIndex(10, 5); // max < min + BEAST_EXPECT(emptyRange.empty()); + } + + void + testTransactionOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Transaction storage and retrieval - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + Account alice("alice"); + Account bob("bob"); + + env.fund(XRP(10000), alice, bob); + env.close(); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + + if (!sqliteDb) + return; + + // Test initial transaction counts after funding + auto initialTxCount = sqliteDb->getTransactionCount(); + auto initialAcctTxCount = sqliteDb->getAccountTransactionCount(); + + BEAST_EXPECT(initialTxCount == 4); + BEAST_EXPECT(initialAcctTxCount == 6); + + // Create transactions + env(pay(alice, bob, XRP(1000))); + env.close(); + + env(pay(bob, alice, XRP(500))); + env.close(); + + // Test transaction counts after creation + auto txCount = sqliteDb->getTransactionCount(); + auto acctTxCount = sqliteDb->getAccountTransactionCount(); + + BEAST_EXPECT(txCount == 6); + BEAST_EXPECT(acctTxCount == 10); + + // Test transaction retrieval + uint256 invalidTxId; + error_code_i ec; + auto invalidTxResult = + sqliteDb->getTransaction(invalidTxId, std::nullopt, ec); + BEAST_EXPECT(std::holds_alternative(invalidTxResult)); + + // Test transaction history + auto txHistory = db.getTxHistory(0); + + BEAST_EXPECT(!txHistory.empty()); + BEAST_EXPECT(txHistory.size() == 6); + + // Test with valid transaction range + auto minSeq = sqliteDb->getTransactionsMinLedgerSeq(); + auto maxSeq = db.getMaxLedgerSeq(); + + if (minSeq && maxSeq) + { + ClosedInterval range(*minSeq, *maxSeq); + auto rangeResult = sqliteDb->getTransaction(invalidTxId, range, ec); + auto searched = std::get(rangeResult); + BEAST_EXPECT( + searched == TxSearched::all || searched == TxSearched::some); + } + } + + void + testAccountTransactionOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Account transaction operations - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + Account alice("alice"); + Account bob("bob"); + Account carol("carol"); + + env.fund(XRP(10000), alice, bob, carol); + env.close(); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + + if (!sqliteDb) + return; + + // Create multiple transactions involving alice + env(pay(alice, bob, XRP(1000))); + env.close(); + + env(pay(bob, alice, XRP(500))); + env.close(); + + env(pay(alice, carol, XRP(250))); + env.close(); + + auto minSeq = db.getMinLedgerSeq(); + auto maxSeq = db.getMaxLedgerSeq(); + + if (!minSeq || !maxSeq) + return; + + // Test getOldestAccountTxs + RelationalDatabase::AccountTxOptions options{ + alice.id(), *minSeq, *maxSeq, 0, 10, false}; + + auto oldestTxs = sqliteDb->getOldestAccountTxs(options); + BEAST_EXPECT(oldestTxs.size() == 5); + + // Test getNewestAccountTxs + auto newestTxs = sqliteDb->getNewestAccountTxs(options); + BEAST_EXPECT(newestTxs.size() == 5); + + // Test binary format versions + auto oldestTxsB = sqliteDb->getOldestAccountTxsB(options); + BEAST_EXPECT(oldestTxsB.size() == 5); + + auto newestTxsB = sqliteDb->getNewestAccountTxsB(options); + BEAST_EXPECT(newestTxsB.size() == 5); + + // Test with limit + options.limit = 1; + auto limitedTxs = sqliteDb->getOldestAccountTxs(options); + BEAST_EXPECT(limitedTxs.size() == 1); + + // Test with offset + options.limit = 10; + options.offset = 1; + auto offsetTxs = sqliteDb->getOldestAccountTxs(options); + BEAST_EXPECT(offsetTxs.size() == 4); + + // Test with invalid account + { + Account invalidAccount("invalid"); + RelationalDatabase::AccountTxOptions invalidOptions{ + invalidAccount.id(), *minSeq, *maxSeq, 0, 10, false}; + auto invalidAccountTxs = + sqliteDb->getOldestAccountTxs(invalidOptions); + BEAST_EXPECT(invalidAccountTxs.empty()); + } + } + + void + testAccountTransactionPaging( + std::string const& backend, + std::unique_ptr config) + { + testcase("Account transaction paging operations - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + Account alice("alice"); + Account bob("bob"); + + env.fund(XRP(10000), alice, bob); + env.close(); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + if (!sqliteDb) + return; + + // Create multiple transactions for paging + for (int i = 0; i < 5; ++i) + { + env(pay(alice, bob, XRP(100 + i))); + env.close(); + } + + auto minSeq = db.getMinLedgerSeq(); + auto maxSeq = db.getMaxLedgerSeq(); + + if (!minSeq || !maxSeq) + return; + + RelationalDatabase::AccountTxPageOptions pageOptions{ + alice.id(), *minSeq, *maxSeq, std::nullopt, 2, false}; + + // Test oldestAccountTxPage + auto [oldestPage, oldestMarker] = + sqliteDb->oldestAccountTxPage(pageOptions); + + BEAST_EXPECT(oldestPage.size() == 2); + BEAST_EXPECT(oldestMarker.has_value() == true); + + // Test newestAccountTxPage + auto [newestPage, newestMarker] = + sqliteDb->newestAccountTxPage(pageOptions); + + BEAST_EXPECT(newestPage.size() == 2); + BEAST_EXPECT(newestMarker.has_value() == true); + + // Test binary versions + auto [oldestPageB, oldestMarkerB] = + sqliteDb->oldestAccountTxPageB(pageOptions); + BEAST_EXPECT(oldestPageB.size() == 2); + + auto [newestPageB, newestMarkerB] = + sqliteDb->newestAccountTxPageB(pageOptions); + BEAST_EXPECT(newestPageB.size() == 2); + + // Test with marker continuation + if (oldestMarker.has_value()) + { + pageOptions.marker = oldestMarker; + auto [continuedPage, continuedMarker] = + sqliteDb->oldestAccountTxPage(pageOptions); + BEAST_EXPECT(continuedPage.size() == 2); + } + } + + void + testDeletionOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Deletion operations - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + Account alice("alice"); + Account bob("bob"); + + env.fund(XRP(10000), alice, bob); + env.close(); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + if (!sqliteDb) + return; + + // Create multiple ledgers and transactions + for (int i = 0; i < 3; ++i) + { + env(pay(alice, bob, XRP(100 + i))); + env.close(); + } + + auto initialTxCount = sqliteDb->getTransactionCount(); + BEAST_EXPECT(initialTxCount == 7); + auto initialAcctTxCount = sqliteDb->getAccountTransactionCount(); + BEAST_EXPECT(initialAcctTxCount == 12); + auto initialLedgerCount = sqliteDb->getLedgerCountMinMax(); + BEAST_EXPECT(initialLedgerCount.numberOfRows == 5); + + auto maxSeq = db.getMaxLedgerSeq(); + if (!maxSeq || *maxSeq <= 2) + return; + + // Test deleteTransactionByLedgerSeq + sqliteDb->deleteTransactionByLedgerSeq(*maxSeq); + auto txCountAfterDelete = sqliteDb->getTransactionCount(); + BEAST_EXPECT(txCountAfterDelete == 6); + + // Test deleteTransactionsBeforeLedgerSeq + sqliteDb->deleteTransactionsBeforeLedgerSeq(*maxSeq - 1); + auto txCountAfterBulkDelete = sqliteDb->getTransactionCount(); + BEAST_EXPECT(txCountAfterBulkDelete == 1); + + // Test deleteAccountTransactionsBeforeLedgerSeq + sqliteDb->deleteAccountTransactionsBeforeLedgerSeq(*maxSeq - 1); + auto acctTxCountAfterDelete = sqliteDb->getAccountTransactionCount(); + BEAST_EXPECT(acctTxCountAfterDelete == 4); + + // Test deleteBeforeLedgerSeq + auto minSeq = db.getMinLedgerSeq(); + if (minSeq) + { + sqliteDb->deleteBeforeLedgerSeq(*minSeq + 1); + auto ledgerCountAfterDelete = sqliteDb->getLedgerCountMinMax(); + BEAST_EXPECT(ledgerCountAfterDelete.numberOfRows == 4); + } + } + + void + testDatabaseSpaceOperations( + std::string const& backend, + std::unique_ptr config) + { + testcase("Database space and size operations - " + backend); + + using namespace test::jtx; + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + if (!sqliteDb) + return; + + // Test size queries + auto allKB = sqliteDb->getKBUsedAll(); + auto ledgerKB = sqliteDb->getKBUsedLedger(); + auto txKB = sqliteDb->getKBUsedTransaction(); + + if (backend == "rwdb") + { + // RWDB reports actual data memory (rounded down to KB) + // Initially should be < 1KB, so rounds down to 0 + // Note: These are 0 due to rounding, not because there's literally + // no data + BEAST_EXPECT(allKB == 0); // < 1024 bytes rounds to 0 KB + BEAST_EXPECT(ledgerKB == 0); // < 1024 bytes rounds to 0 KB + BEAST_EXPECT(txKB == 0); // < 1024 bytes rounds to 0 KB + } + else + { + // SQLite reports cache/engine memory which has overhead even when + // empty Just verify the functions return reasonable values + BEAST_EXPECT(allKB >= 0); + BEAST_EXPECT(ledgerKB >= 0); + BEAST_EXPECT(txKB >= 0); + } + + // Create some data and verify size increases + Account alice("alice"); + env.fund(XRP(10000), alice); + env.close(); + + auto newAllKB = sqliteDb->getKBUsedAll(); + auto newLedgerKB = sqliteDb->getKBUsedLedger(); + auto newTxKB = sqliteDb->getKBUsedTransaction(); + + if (backend == "rwdb") + { + // RWDB reports actual data memory + // After adding data, should see some increase + BEAST_EXPECT(newAllKB >= 1); // Should have at least 1KB total + BEAST_EXPECT( + newTxKB >= 0); // Transactions added (might still be < 1KB) + BEAST_EXPECT( + newLedgerKB >= 0); // Ledger data (might still be < 1KB) + + // Key relationships + BEAST_EXPECT(newAllKB >= newLedgerKB + newTxKB); // Total >= parts + BEAST_EXPECT(newAllKB >= allKB); // Should increase or stay same + BEAST_EXPECT(newTxKB >= txKB); // Should increase or stay same + } + else + { + // SQLite: Memory usage should not decrease after adding data + // Values might increase due to cache growth + BEAST_EXPECT(newAllKB >= allKB); + BEAST_EXPECT(newLedgerKB >= ledgerKB); + BEAST_EXPECT(newTxKB >= txKB); + + // SQLite's getKBUsedAll is global memory, should be >= parts + BEAST_EXPECT(newAllKB >= newLedgerKB); + BEAST_EXPECT(newAllKB >= newTxKB); + } + + // Test space availability + // Both SQLite and RWDB use in-memory databases in standalone mode, + // so file-based space checks don't apply to either backend. + // Skip these checks for both. + + // if (backend == "rwdb") + // { + // BEAST_EXPECT(db.ledgerDbHasSpace(env.app().config())); + // BEAST_EXPECT(db.transactionDbHasSpace(env.app().config())); + // } + + // Test database closure operations (should not throw) + try + { + sqliteDb->closeLedgerDB(); + sqliteDb->closeTransactionDB(); + } + catch (std::exception const& e) + { + BEAST_EXPECT(false); // Should not throw + } + } + + void + testTransactionMinLedgerSeq( + std::string const& backend, + std::unique_ptr config) + { + testcase("Transaction minimum ledger sequence tracking - " + backend); + + using namespace test::jtx; + config->LEDGER_HISTORY = 1000; + + Env env(*this, std::move(config)); + auto& db = env.app().getRelationalDatabase(); + + auto* sqliteDb = getInterface(db); + BEAST_EXPECT(sqliteDb != nullptr); + if (!sqliteDb) + return; + + // Initially should have no transactions + BEAST_EXPECT(!sqliteDb->getTransactionsMinLedgerSeq().has_value()); + BEAST_EXPECT( + !sqliteDb->getAccountTransactionsMinLedgerSeq().has_value()); + + Account alice("alice"); + Account bob("bob"); + + env.fund(XRP(10000), alice, bob); + env.close(); + + // Create first transaction + env(pay(alice, bob, XRP(1000))); + env.close(); + + auto txMinSeq = sqliteDb->getTransactionsMinLedgerSeq(); + auto acctTxMinSeq = sqliteDb->getAccountTransactionsMinLedgerSeq(); + BEAST_EXPECT(txMinSeq.has_value()); + BEAST_EXPECT(acctTxMinSeq.has_value()); + BEAST_EXPECT(*txMinSeq == 3); + BEAST_EXPECT(*acctTxMinSeq == 3); + + // Create more transactions + env(pay(bob, alice, XRP(500))); + env.close(); + + env(pay(alice, bob, XRP(250))); + env.close(); + + // Min sequences should remain the same (first transaction ledger) + auto newTxMinSeq = sqliteDb->getTransactionsMinLedgerSeq(); + auto newAcctTxMinSeq = sqliteDb->getAccountTransactionsMinLedgerSeq(); + BEAST_EXPECT(newTxMinSeq == txMinSeq); + BEAST_EXPECT(newAcctTxMinSeq == acctTxMinSeq); + } + + std::vector static getBackends(std::string const& unittest_arg) + { + // Valid backends + static const std::set validBackends = {"sqlite", "rwdb"}; + + // Default to all valid backends if no arg specified + if (unittest_arg.empty()) + return {validBackends.begin(), validBackends.end()}; + + std::set backends; // Use set to avoid duplicates + std::stringstream ss(unittest_arg); + std::string backend; + + while (std::getline(ss, backend, ',')) + { + if (!backend.empty()) + { + // Validate backend + if (validBackends.contains(backend)) + { + backends.insert(backend); + } + } + } + + // Return as vector (sorted due to set) + return {backends.begin(), backends.end()}; + } + + void + run() override + { + auto backends = getBackends(arg()); + + if (backends.empty()) + { + fail("no valid backend specified: '" + arg() + "'"); + } + + for (auto const& backend : backends) + { + testBasicInitialization(backend, makeConfig(backend)); + testLedgerSequenceOperations(backend, makeConfig(backend)); + testLedgerInfoOperations(backend, makeConfig(backend)); + testHashOperations(backend, makeConfig(backend)); + testTransactionOperations(backend, makeConfig(backend)); + testAccountTransactionOperations(backend, makeConfig(backend)); + testAccountTransactionPaging(backend, makeConfig(backend)); + testDeletionOperations(backend, makeConfig(backend)); + testDatabaseSpaceOperations(backend, makeConfig(backend)); + testTransactionMinLedgerSeq(backend, makeConfig(backend)); + } + } +}; + +BEAST_DEFINE_TESTSUITE(RelationalDatabase, rdb, ripple); + +} // namespace test +} // namespace ripple \ No newline at end of file From 46cf6785ab37bc7117a4dbbd03e3545260005289 Mon Sep 17 00:00:00 2001 From: Niq Dudfield Date: Mon, 8 Sep 2025 10:57:49 +0700 Subject: [PATCH 5/6] fix(tests): prevent buffer corruption from concurrent log writes (#565) std::endl triggers flush() which calls sync() on the shared log buffer. Multiple threads racing in sync() cause str()/str("") operations to corrupt buffer state, leading to crashes and double frees. Added mutex to serialize access to suite.log, preventing concurrent sync() calls on the same buffer. --- src/test/unit_test/SuiteJournal.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/unit_test/SuiteJournal.h b/src/test/unit_test/SuiteJournal.h index 0e80e83cd..40d6bb94b 100644 --- a/src/test/unit_test/SuiteJournal.h +++ b/src/test/unit_test/SuiteJournal.h @@ -19,9 +19,9 @@ #ifndef TEST_UNIT_TEST_SUITE_JOURNAL_H #define TEST_UNIT_TEST_SUITE_JOURNAL_H - #include #include +#include namespace ripple { namespace test { @@ -82,7 +82,13 @@ SuiteJournalSink::write( // Only write the string if the level at least equals the threshold. if (level >= threshold()) + { + // std::endl flushes → sync() → str()/str("") race in shared buffer → + // crashes + static std::mutex log_mutex; + std::lock_guard lock(log_mutex); suite_.log << s << partition_ << text << std::endl; + } } class SuiteJournal From 8f7ebf0377107a0b32d20eb6341a57b663bebedb Mon Sep 17 00:00:00 2001 From: tequ Date: Mon, 8 Sep 2025 14:53:40 +0900 Subject: [PATCH 6/6] Optimize github action cache (#544) * optimize github action cache * fix * refactor: improve github actions cache optimization (#3) - move ccache configuration logic to dedicated action - rename conanfile-changed to should-save-conan-cache for clarity --------- Co-authored-by: Niq Dudfield --- .../actions/xahau-configure-ccache/action.yml | 36 +++++++++++++++++-- .github/actions/xahau-ga-build/action.yml | 31 ++++++++++++---- .../actions/xahau-ga-dependencies/action.yml | 22 +++++++++++- .github/workflows/xahau-ga-macos.yml | 5 ++- .github/workflows/xahau-ga-nix.yml | 3 ++ 5 files changed, 87 insertions(+), 10 deletions(-) diff --git a/.github/actions/xahau-configure-ccache/action.yml b/.github/actions/xahau-configure-ccache/action.yml index 2b0a3d98b..44414b98a 100644 --- a/.github/actions/xahau-configure-ccache/action.yml +++ b/.github/actions/xahau-configure-ccache/action.yml @@ -14,6 +14,18 @@ inputs: description: 'How to check compiler for changes' required: false default: 'content' + is_main_branch: + description: 'Whether the current branch is the main branch' + required: false + default: 'false' + main_cache_dir: + description: 'Path to the main branch cache directory' + required: false + default: '~/.ccache-main' + current_cache_dir: + description: 'Path to the current branch cache directory' + required: false + default: '~/.ccache-current' runs: using: 'composite' @@ -21,11 +33,31 @@ runs: - name: Configure ccache shell: bash run: | + # Create cache directories + mkdir -p ${{ inputs.main_cache_dir }} ${{ inputs.current_cache_dir }} + + # Set compiler check globally + ccache -o compiler_check=${{ inputs.compiler_check }} + + # Use a single config file location mkdir -p ~/.ccache - export CONF_PATH="${CCACHE_CONFIGPATH:-${CCACHE_DIR:-$HOME/.ccache}/ccache.conf}" - mkdir -p $(dirname "$CONF_PATH") + export CONF_PATH="$HOME/.ccache/ccache.conf" + + # Apply common settings echo "max_size = ${{ inputs.max_size }}" > "$CONF_PATH" echo "hash_dir = ${{ inputs.hash_dir }}" >> "$CONF_PATH" echo "compiler_check = ${{ inputs.compiler_check }}" >> "$CONF_PATH" + + if [ "${{ inputs.is_main_branch }}" == "true" ]; then + # Main branch: use main branch cache + ccache --set-config=cache_dir="${{ inputs.main_cache_dir }}" + echo "CCACHE_DIR=${{ inputs.main_cache_dir }}" >> $GITHUB_ENV + else + # Feature branch: use current branch cache with main as secondary + ccache --set-config=cache_dir="${{ inputs.current_cache_dir }}" + ccache --set-config=secondary_storage="file:${{ inputs.main_cache_dir }}" + echo "CCACHE_DIR=${{ inputs.current_cache_dir }}" >> $GITHUB_ENV + fi + ccache -p # Print config for verification ccache -z # Zero statistics before the build \ No newline at end of file diff --git a/.github/actions/xahau-ga-build/action.yml b/.github/actions/xahau-ga-build/action.yml index 417190472..3387f0391 100644 --- a/.github/actions/xahau-ga-build/action.yml +++ b/.github/actions/xahau-ga-build/action.yml @@ -48,12 +48,23 @@ runs: SAFE_BRANCH=$(echo "${{ github.ref_name }}" | tr -c 'a-zA-Z0-9_.-' '-') echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT - - name: Restore ccache directory + - name: Restore ccache directory for default branch if: inputs.ccache_enabled == 'true' id: ccache-restore uses: actions/cache/restore@v4 with: - path: ~/.ccache + path: ~/.ccache-main + key: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ inputs.main_branch }} + restore-keys: | + ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}- + ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- + + - name: Restore ccache directory for current branch + if: inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch + id: ccache-restore-current-branch + uses: actions/cache/restore@v4 + with: + path: ~/.ccache-current key: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ steps.safe-branch.outputs.name }} restore-keys: | ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ inputs.main_branch }} @@ -75,6 +86,7 @@ runs: export CXX="${{ inputs.cxx }}" fi + # Configure ccache launcher args CCACHE_ARGS="" if [ "${{ inputs.ccache_enabled }}" = "true" ]; then @@ -99,9 +111,16 @@ runs: shell: bash run: ccache -s - - name: Save ccache directory - if: inputs.ccache_enabled == 'true' + - name: Save ccache directory for default branch + if: always() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch uses: actions/cache/save@v4 with: - path: ~/.ccache - key: ${{ steps.ccache-restore.outputs.cache-primary-key }} \ No newline at end of file + path: ~/.ccache-main + key: ${{ steps.ccache-restore.outputs.cache-primary-key }} + + - name: Save ccache directory for current branch + if: always() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch + uses: actions/cache/save@v4 + with: + path: ~/.ccache-current + key: ${{ steps.ccache-restore-current-branch.outputs.cache-primary-key }} diff --git a/.github/actions/xahau-ga-dependencies/action.yml b/.github/actions/xahau-ga-dependencies/action.yml index b57a9e69e..d295e20eb 100644 --- a/.github/actions/xahau-ga-dependencies/action.yml +++ b/.github/actions/xahau-ga-dependencies/action.yml @@ -42,6 +42,26 @@ runs: SAFE_BRANCH=$(echo "${{ github.ref_name }}" | tr -c 'a-zA-Z0-9_.-' '-') echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT + - name: Check conanfile changes + if: inputs.cache_enabled == 'true' + id: check-conanfile-changes + shell: bash + run: | + # Check if we're on the main branch + if [ "${{ github.ref_name }}" == "${{ inputs.main_branch }}" ]; then + echo "should-save-conan-cache=true" >> $GITHUB_OUTPUT + else + # Fetch main branch for comparison + git fetch origin ${{ inputs.main_branch }} + + # Check if conanfile.txt or conanfile.py has changed compared to main branch + if git diff --quiet origin/${{ inputs.main_branch }}..HEAD -- '**/conanfile.txt' '**/conanfile.py'; then + echo "should-save-conan-cache=false" >> $GITHUB_OUTPUT + else + echo "should-save-conan-cache=true" >> $GITHUB_OUTPUT + fi + fi + - name: Restore Conan cache if: inputs.cache_enabled == 'true' id: cache-restore-conan @@ -76,7 +96,7 @@ runs: .. - name: Save Conan cache - if: inputs.cache_enabled == 'true' && steps.cache-restore-conan.outputs.cache-hit != 'true' + if: always() && inputs.cache_enabled == 'true' && steps.cache-restore-conan.outputs.cache-hit != 'true' && steps.check-conanfile-changes.outputs.should-save-conan-cache == 'true' uses: actions/cache/save@v4 with: path: | diff --git a/.github/workflows/xahau-ga-macos.yml b/.github/workflows/xahau-ga-macos.yml index 5c802c7e9..efb1a2001 100644 --- a/.github/workflows/xahau-ga-macos.yml +++ b/.github/workflows/xahau-ga-macos.yml @@ -5,6 +5,8 @@ on: branches: ["dev", "candidate", "release"] pull_request: branches: ["dev", "candidate", "release"] + schedule: + - cron: '0 0 * * *' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -74,6 +76,7 @@ jobs: max_size: 2G hash_dir: true compiler_check: content + is_main_branch: ${{ github.ref_name == env.MAIN_BRANCH_NAME }} - name: Check environment run: | @@ -113,4 +116,4 @@ jobs: - name: Test run: | - ${{ env.build_dir }}/rippled --unittest --unittest-jobs $(nproc) \ No newline at end of file + ${{ env.build_dir }}/rippled --unittest --unittest-jobs $(nproc) diff --git a/.github/workflows/xahau-ga-nix.yml b/.github/workflows/xahau-ga-nix.yml index 486518033..eca5a660a 100644 --- a/.github/workflows/xahau-ga-nix.yml +++ b/.github/workflows/xahau-ga-nix.yml @@ -5,6 +5,8 @@ on: branches: ["dev", "candidate", "release"] pull_request: branches: ["dev", "candidate", "release"] + schedule: + - cron: '0 0 * * *' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -48,6 +50,7 @@ jobs: max_size: 2G hash_dir: true compiler_check: content + is_main_branch: ${{ github.ref_name == env.MAIN_BRANCH_NAME }} - name: Configure Conan run: |