From 171610d1a95732e9201735e1890cd74868231a35 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Sat, 1 Feb 2025 13:34:31 +0100 Subject: [PATCH] [release] add release build --- Release.Builds/Builds/CMake/CMakeFuncs.cmake | 207 ++ Release.Builds/Builds/CMake/CMake_sqlite3.txt | 60 + Release.Builds/Builds/CMake/FindRocksDB.cmake | 62 + Release.Builds/Builds/CMake/README.md | 18 + .../Builds/CMake/RippleConfig.cmake | 56 + .../Builds/CMake/RippledCompiler.cmake | 182 ++ Release.Builds/Builds/CMake/RippledCore.cmake | 1081 ++++++++ Release.Builds/Builds/CMake/RippledCov.cmake | 98 + Release.Builds/Builds/CMake/RippledDocs.cmake | 79 + .../Builds/CMake/RippledInstall.cmake | 62 + .../Builds/CMake/RippledInterface.cmake | 103 + .../Builds/CMake/RippledMultiConfig.cmake | 39 + Release.Builds/Builds/CMake/RippledNIH.cmake | 33 + .../Builds/CMake/RippledSanity.cmake | 86 + .../Builds/CMake/RippledSettings.cmake | 122 + .../Builds/CMake/RippledValidatorKeys.cmake | 22 + .../Builds/CMake/RippledVersion.cmake | 15 + .../Builds/CMake/SociConfig.cmake.patched | 106 + Release.Builds/Builds/CMake/deps/Boost.cmake | 96 + .../Builds/CMake/deps/Ed25519-donna.cmake | 28 + .../Builds/CMake/deps/FindBoost.cmake | 2170 +++++++++++++++++ .../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 ++ Release.Builds/Builds/CMake/deps/Lz4.cmake | 79 + Release.Builds/Builds/CMake/deps/Nudb.cmake | 31 + .../Builds/CMake/deps/OpenSSL.cmake | 48 + .../Builds/CMake/deps/Postgres.cmake | 70 + .../Builds/CMake/deps/Protobuf.cmake | 155 ++ .../Builds/CMake/deps/Rocksdb.cmake | 177 ++ .../Builds/CMake/deps/Secp256k1.cmake | 58 + Release.Builds/Builds/CMake/deps/Snappy.cmake | 77 + Release.Builds/Builds/CMake/deps/Soci.cmake | 165 ++ Release.Builds/Builds/CMake/deps/Sqlite.cmake | 93 + .../Builds/CMake/deps/WasmEdge.cmake | 84 + .../Builds/CMake/deps/cassandra.cmake | 167 ++ Release.Builds/Builds/CMake/deps/date.cmake | 18 + Release.Builds/Builds/CMake/deps/gRPC.cmake | 364 +++ Release.Builds/Builds/CMake/echo_file.cmake | 17 + .../Builds/CMake/rocks_thirdparty.inc | 15 + .../Builds/CMake/rocksdb_build_version.cc.in | 71 + Release.Builds/Builds/CMake/soci_patch.cmake | 49 + Release.Builds/Builds/README.md | 1 + Release.Builds/Builds/levelization/README.md | 114 + .../Builds/levelization/levelization.sh | 127 + .../Builds/levelization/results/loops.txt | 63 + .../Builds/levelization/results/ordering.txt | 226 ++ Release.Builds/CMakeLists.txt | 86 + build-core.sh | 7 + 54 files changed, 7434 insertions(+) create mode 100644 Release.Builds/Builds/CMake/CMakeFuncs.cmake create mode 100644 Release.Builds/Builds/CMake/CMake_sqlite3.txt create mode 100644 Release.Builds/Builds/CMake/FindRocksDB.cmake create mode 100644 Release.Builds/Builds/CMake/README.md create mode 100644 Release.Builds/Builds/CMake/RippleConfig.cmake create mode 100644 Release.Builds/Builds/CMake/RippledCompiler.cmake create mode 100644 Release.Builds/Builds/CMake/RippledCore.cmake create mode 100644 Release.Builds/Builds/CMake/RippledCov.cmake create mode 100644 Release.Builds/Builds/CMake/RippledDocs.cmake create mode 100644 Release.Builds/Builds/CMake/RippledInstall.cmake create mode 100644 Release.Builds/Builds/CMake/RippledInterface.cmake create mode 100644 Release.Builds/Builds/CMake/RippledMultiConfig.cmake create mode 100644 Release.Builds/Builds/CMake/RippledNIH.cmake create mode 100644 Release.Builds/Builds/CMake/RippledSanity.cmake create mode 100644 Release.Builds/Builds/CMake/RippledSettings.cmake create mode 100644 Release.Builds/Builds/CMake/RippledValidatorKeys.cmake create mode 100644 Release.Builds/Builds/CMake/RippledVersion.cmake create mode 100644 Release.Builds/Builds/CMake/SociConfig.cmake.patched create mode 100644 Release.Builds/Builds/CMake/deps/Boost.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Ed25519-donna.cmake create mode 100644 Release.Builds/Builds/CMake/deps/FindBoost.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findjemalloc.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findlibarchive_pc.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findlz4.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findsecp256k1.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findsnappy.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findsoci.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Findsqlite.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Libarchive.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Lz4.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Nudb.cmake create mode 100644 Release.Builds/Builds/CMake/deps/OpenSSL.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Postgres.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Protobuf.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Rocksdb.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Secp256k1.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Snappy.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Soci.cmake create mode 100644 Release.Builds/Builds/CMake/deps/Sqlite.cmake create mode 100644 Release.Builds/Builds/CMake/deps/WasmEdge.cmake create mode 100644 Release.Builds/Builds/CMake/deps/cassandra.cmake create mode 100644 Release.Builds/Builds/CMake/deps/date.cmake create mode 100644 Release.Builds/Builds/CMake/deps/gRPC.cmake create mode 100644 Release.Builds/Builds/CMake/echo_file.cmake create mode 100644 Release.Builds/Builds/CMake/rocks_thirdparty.inc create mode 100644 Release.Builds/Builds/CMake/rocksdb_build_version.cc.in create mode 100644 Release.Builds/Builds/CMake/soci_patch.cmake create mode 100644 Release.Builds/Builds/README.md create mode 100644 Release.Builds/Builds/levelization/README.md create mode 100755 Release.Builds/Builds/levelization/levelization.sh create mode 100644 Release.Builds/Builds/levelization/results/loops.txt create mode 100644 Release.Builds/Builds/levelization/results/ordering.txt create mode 100644 Release.Builds/CMakeLists.txt diff --git a/Release.Builds/Builds/CMake/CMakeFuncs.cmake b/Release.Builds/Builds/CMake/CMakeFuncs.cmake new file mode 100644 index 000000000..fb60fd9b4 --- /dev/null +++ b/Release.Builds/Builds/CMake/CMakeFuncs.cmake @@ -0,0 +1,207 @@ + +macro(group_sources_in source_dir curdir) + file(GLOB children RELATIVE ${source_dir}/${curdir} + ${source_dir}/${curdir}/*) + foreach (child ${children}) + if (IS_DIRECTORY ${source_dir}/${curdir}/${child}) + group_sources_in(${source_dir} ${curdir}/${child}) + else() + string(REPLACE "/" "\\" groupname ${curdir}) + source_group(${groupname} FILES + ${source_dir}/${curdir}/${child}) + endif() + endforeach() +endmacro() + +macro(group_sources curdir) + group_sources_in(${PROJECT_SOURCE_DIR} ${curdir}) +endmacro() + +macro (exclude_from_default target_) + set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_ALL ON) + set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) +endmacro () + +macro (exclude_if_included target_) + get_directory_property(has_parent PARENT_DIRECTORY) + if (has_parent) + exclude_from_default (${target_}) + endif () +endmacro () + +function (print_ep_logs _target) + ExternalProject_Get_Property (${_target} STAMP_DIR) + add_custom_command(TARGET ${_target} POST_BUILD + COMMENT "${_target} BUILD OUTPUT" + COMMAND ${CMAKE_COMMAND} + -DIN_FILE=${STAMP_DIR}/${_target}-build-out.log + -P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake + COMMAND ${CMAKE_COMMAND} + -DIN_FILE=${STAMP_DIR}/${_target}-build-err.log + -P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake) +endfunction () + +#[=========================================================[ + This is a function override for one function in the + standard ExternalProject module. We want to change + the generated build script slightly to include printing + the build logs in the case of failure. Those modifications + have been made here. This function override could break + in the future if the ExternalProject module changes internal + function names or changes the way it generates the build + scripts. + See: + https://gitlab.kitware.com/cmake/cmake/blob/df1ddeec128d68cc636f2dde6c2acd87af5658b6/Modules/ExternalProject.cmake#L1855-1952 +#]=========================================================] + +function(_ep_write_log_script name step cmd_var) + ExternalProject_Get_Property(${name} stamp_dir) + set(command "${${cmd_var}}") + + set(make "") + set(code_cygpath_make "") + if(command MATCHES "^\\$\\(MAKE\\)") + # GNU make recognizes the string "$(MAKE)" as recursive make, so + # ensure that it appears directly in the makefile. + string(REGEX REPLACE "^\\$\\(MAKE\\)" "\${make}" command "${command}") + set(make "-Dmake=$(MAKE)") + + if(WIN32 AND NOT CYGWIN) + set(code_cygpath_make " +if(\${make} MATCHES \"^/\") + execute_process( + COMMAND cygpath -w \${make} + OUTPUT_VARIABLE cygpath_make + ERROR_VARIABLE cygpath_make + RESULT_VARIABLE cygpath_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT cygpath_error) + set(make \${cygpath_make}) + endif() +endif() +") + endif() + endif() + + set(config "") + if("${CMAKE_CFG_INTDIR}" MATCHES "^\\$") + string(REPLACE "${CMAKE_CFG_INTDIR}" "\${config}" command "${command}") + set(config "-Dconfig=${CMAKE_CFG_INTDIR}") + endif() + + # Wrap multiple 'COMMAND' lines up into a second-level wrapper + # script so all output can be sent to one log file. + if(command MATCHES "(^|;)COMMAND;") + set(code_execute_process " +${code_cygpath_make} +execute_process(COMMAND \${command} RESULT_VARIABLE result) +if(result) + set(msg \"Command failed (\${result}):\\n\") + foreach(arg IN LISTS command) + set(msg \"\${msg} '\${arg}'\") + endforeach() + message(FATAL_ERROR \"\${msg}\") +endif() +") + set(code "") + set(cmd "") + set(sep "") + foreach(arg IN LISTS command) + if("x${arg}" STREQUAL "xCOMMAND") + if(NOT "x${cmd}" STREQUAL "x") + string(APPEND code "set(command \"${cmd}\")${code_execute_process}") + endif() + set(cmd "") + set(sep "") + else() + string(APPEND cmd "${sep}${arg}") + set(sep ";") + endif() + endforeach() + string(APPEND code "set(command \"${cmd}\")${code_execute_process}") + file(GENERATE OUTPUT "${stamp_dir}/${name}-${step}-$-impl.cmake" CONTENT "${code}") + set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-$-impl.cmake) + endif() + + # Wrap the command in a script to log output to files. + set(script ${stamp_dir}/${name}-${step}-$.cmake) + set(logbase ${stamp_dir}/${name}-${step}) + set(code " +${code_cygpath_make} +function (_echo_file _fil) + file (READ \${_fil} _cont) + execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"\${_cont}\") +endfunction () +set(command \"${command}\") +execute_process( + COMMAND \${command} + RESULT_VARIABLE result + OUTPUT_FILE \"${logbase}-out.log\" + ERROR_FILE \"${logbase}-err.log\" + ) +if(result) + set(msg \"Command failed: \${result}\\n\") + foreach(arg IN LISTS command) + set(msg \"\${msg} '\${arg}'\") + endforeach() + execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"Build output for ${logbase} : \") + _echo_file (\"${logbase}-out.log\") + _echo_file (\"${logbase}-err.log\") + set(msg \"\${msg}\\nSee above\\n\") + message(FATAL_ERROR \"\${msg}\") +else() + set(msg \"${name} ${step} command succeeded. See also ${logbase}-*.log\") + message(STATUS \"\${msg}\") +endif() +") + file(GENERATE OUTPUT "${script}" CONTENT "${code}") + set(command ${CMAKE_COMMAND} ${make} ${config} -P ${script}) + set(${cmd_var} "${command}" PARENT_SCOPE) +endfunction() + +find_package(Git) + +# function that calls git log to get current hash +function (git_hash hash_val) + # note: optional second extra string argument not in signature + if (NOT GIT_FOUND) + return () + endif () + set (_hash "") + set (_format "%H") + if (ARGC GREATER_EQUAL 2) + string (TOLOWER ${ARGV1} _short) + if (_short STREQUAL "short") + set (_format "%h") + endif () + endif () + execute_process (COMMAND ${GIT_EXECUTABLE} "log" "--pretty=${_format}" "-n1" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE _git_exit_code + OUTPUT_VARIABLE _temp_hash + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET) + if (_git_exit_code EQUAL 0) + set (_hash ${_temp_hash}) + endif () + set (${hash_val} "${_hash}" PARENT_SCOPE) +endfunction () + +function (git_branch branch_val) + if (NOT GIT_FOUND) + return () + endif () + set (_branch "") + execute_process (COMMAND ${GIT_EXECUTABLE} "rev-parse" "--abbrev-ref" "HEAD" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE _git_exit_code + OUTPUT_VARIABLE _temp_branch + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET) + if (_git_exit_code EQUAL 0) + set (_branch ${_temp_branch}) + endif () + set (${branch_val} "${_branch}" PARENT_SCOPE) +endfunction () + diff --git a/Release.Builds/Builds/CMake/CMake_sqlite3.txt b/Release.Builds/Builds/CMake/CMake_sqlite3.txt new file mode 100644 index 000000000..d80557a9f --- /dev/null +++ b/Release.Builds/Builds/CMake/CMake_sqlite3.txt @@ -0,0 +1,60 @@ + +#[=========================================================[ + SQLITE doesn't provide build files in the + standard source-only distribution. So we wrote + a simple cmake file and we copy it to the + external project folder so that we can use + this file to build the lib with ExternalProject +#]=========================================================] + +add_library (sqlite3 STATIC sqlite3.c) +#[=========================================================[ + When compiled with SQLITE_THREADSAFE=1, SQLite operates + in serialized mode. In this mode, SQLite can be safely + used by multiple threads with no restriction. + + NOTE: This implies a global mutex! + + When compiled with SQLITE_THREADSAFE=2, SQLite can be + used in a multithreaded program so long as no two + threads attempt to use the same database connection at + the same time. + + NOTE: This is the preferred threading model, but not + currently enabled because we need to investigate our + use-model and concurrency requirements. + + TODO: consider whether any other options should be + used: https://www.sqlite.org/compile.html +#]=========================================================] + +target_compile_definitions (sqlite3 + PRIVATE + SQLITE_THREADSAFE=1 + HAVE_USLEEP=1) +target_compile_options (sqlite3 + PRIVATE + $<$: + -wd4100 + -wd4127 + -wd4232 + -wd4244 + -wd4701 + -wd4706 + -wd4996 + > + $<$>:-Wno-array-bounds>) +install ( + TARGETS + sqlite3 + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include) +install ( + FILES + sqlite3.h + sqlite3ext.h + DESTINATION include) + + diff --git a/Release.Builds/Builds/CMake/FindRocksDB.cmake b/Release.Builds/Builds/CMake/FindRocksDB.cmake new file mode 100644 index 000000000..e0d35706b --- /dev/null +++ b/Release.Builds/Builds/CMake/FindRocksDB.cmake @@ -0,0 +1,62 @@ +set (RocksDB_DIR "" CACHE PATH "Root directory of RocksDB distribution") + +find_path (RocksDB_INCLUDE_DIR + rocksdb/db.h + PATHS ${RocksDB_DIR}) + +set (RocksDB_VERSION "") +find_file (RocksDB_VERSION_FILE + rocksdb/version.h + PATHS ${RocksDB_DIR}) +if (RocksDB_VERSION_FILE) + file (READ ${RocksDB_VERSION_FILE} _verfile) + if ("${_verfile}" MATCHES "#define[ \\t]+ROCKSDB_MAJOR[ \\t]+([0-9]+)") + string (APPEND RocksDB_VERSION "${CMAKE_MATCH_1}") + else () + string (APPEND RocksDB_VERSION "0") + endif() + if ("${_verfile}" MATCHES "#define[ \\t]+ROCKSDB_MINOR[ \\t]+([0-9]+)") + string (APPEND RocksDB_VERSION ".${CMAKE_MATCH_1}") + else () + string (APPEND RocksDB_VERSION ".0") + endif() + if ("${_verfile}" MATCHES "#define[ \\t]+ROCKSDB_PATCH[ \\t]+([0-9]+)") + string (APPEND RocksDB_VERSION ".${CMAKE_MATCH_1}") + else () + string (APPEND RocksDB_VERSION ".0") + endif() +endif () + +if (RocksDB_USE_STATIC) + list (APPEND RocksDB_NAMES + "${CMAKE_STATIC_LIBRARY_PREFIX}rocksdb${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_STATIC_LIBRARY_PREFIX}rocksdblib${CMAKE_STATIC_LIBRARY_SUFFIX}") +endif () + +list (APPEND RocksDB_NAMES rocksdb) + +find_library (RocksDB_LIBRARY NAMES ${RocksDB_NAMES} + PATHS + ${RocksDB_DIR} + ${RocksDB_DIR}/bin/Release + ${RocksDB_DIR}/bin64_vs2013/Release + PATH_SUFFIXES lib lib64) + +foreach (_n RocksDB_NAMES) + list (APPEND RocksDB_NAMES_DBG "${_n}_d" "${_n}d") +endforeach () +find_library (RocksDB_LIBRARY_DEBUG NAMES ${RocksDB_NAMES_DBG} + PATHS + ${RocksDB_DIR} + ${RocksDB_DIR}/bin/Debug + ${RocksDB_DIR}/bin64_vs2013/Debug + PATH_SUFFIXES lib lib64) + +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (RocksDB + REQUIRED_VARS RocksDB_LIBRARY RocksDB_INCLUDE_DIR + VERSION_VAR RocksDB_VERSION) + +mark_as_advanced (RocksDB_INCLUDE_DIR RocksDB_LIBRARY) +set (RocksDB_INCLUDE_DIRS ${RocksDB_INCLUDE_DIR}) +set (RocksDB_LIBRARIES ${RocksDB_LIBRARY}) diff --git a/Release.Builds/Builds/CMake/README.md b/Release.Builds/Builds/CMake/README.md new file mode 100644 index 000000000..77d6813b6 --- /dev/null +++ b/Release.Builds/Builds/CMake/README.md @@ -0,0 +1,18 @@ + +These are modules and sources that support our CMake build. + +== FindBoost.cmake == + +In order to facilitate updating to latest releases of boost, we've made a local +copy of the FindBoost cmake module in our repo. The latest official version can +generally be obtained +[here](https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake). + +The latest version provided by Kitware can be tailored for use with the +version of CMake that it ships with (typically the next upcoming CMake +release). As such, the latest version from the repository might not work +perfectly with older versions of CMake - for instance, the latest version +might use features or properties only available in the version of CMake that +it ships with. Given this, it's best to test any updates to this module with a few +different versions of cmake. + diff --git a/Release.Builds/Builds/CMake/RippleConfig.cmake b/Release.Builds/Builds/CMake/RippleConfig.cmake new file mode 100644 index 000000000..445010e91 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippleConfig.cmake @@ -0,0 +1,56 @@ +include (CMakeFindDependencyMacro) +# need to represent system dependencies of the lib here +#[=========================================================[ + Boost +#]=========================================================] +if (static OR APPLE OR MSVC) + set (Boost_USE_STATIC_LIBS ON) +endif () +set (Boost_USE_MULTITHREADED ON) +if (static OR MSVC) + set (Boost_USE_STATIC_RUNTIME ON) +else () + set (Boost_USE_STATIC_RUNTIME OFF) +endif () +find_dependency (Boost 1.70 + COMPONENTS + chrono + container + context + coroutine + date_time + filesystem + program_options + regex + system + thread) +#[=========================================================[ + OpenSSL +#]=========================================================] +if (NOT DEFINED OPENSSL_ROOT_DIR) + if (DEFINED ENV{OPENSSL_ROOT}) + set (OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT}) + elseif (APPLE) + find_program (homebrew brew) + if (homebrew) + execute_process (COMMAND ${homebrew} --prefix openssl + OUTPUT_VARIABLE OPENSSL_ROOT_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif () + endif () + file (TO_CMAKE_PATH "${OPENSSL_ROOT_DIR}" OPENSSL_ROOT_DIR) +endif () + +if (static OR APPLE OR MSVC) + set (OPENSSL_USE_STATIC_LIBS ON) +endif () +set (OPENSSL_MSVC_STATIC_RT ON) +find_dependency (OpenSSL 1.1.1 REQUIRED) +find_dependency (ZLIB) +find_dependency (date) +if (TARGET ZLIB::ZLIB) + set_target_properties(OpenSSL::Crypto PROPERTIES + INTERFACE_LINK_LIBRARIES ZLIB::ZLIB) +endif () + +include ("${CMAKE_CURRENT_LIST_DIR}/RippleTargets.cmake") diff --git a/Release.Builds/Builds/CMake/RippledCompiler.cmake b/Release.Builds/Builds/CMake/RippledCompiler.cmake new file mode 100644 index 000000000..163c82823 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledCompiler.cmake @@ -0,0 +1,182 @@ +#[===================================================================[ + setup project-wide compiler settings +#]===================================================================] + +#[=========================================================[ + TODO some/most of these common settings belong in a + toolchain file, especially the ABI-impacting ones +#]=========================================================] +add_library (common INTERFACE) +add_library (Ripple::common ALIAS common) +# add a single global dependency on this interface lib +link_libraries (Ripple::common) +set_target_properties (common + PROPERTIES INTERFACE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_CXX_EXTENSIONS OFF) +target_compile_features (common INTERFACE cxx_std_20) +target_compile_definitions (common + INTERFACE + $<$:DEBUG _DEBUG> + $<$,$>>:NDEBUG>) + # ^^^^ NOTE: CMAKE release builds already have NDEBUG + # defined, so no need to add it explicitly except for + # this special case of (profile ON) and (assert OFF) + # -- presumably this is because we don't want profile + # builds asserting unless asserts were specifically + # requested + +if (MSVC) + # remove existing exception flag since we set it to -EHa + string (REGEX REPLACE "[-/]EH[a-z]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + + foreach (var_ + CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE) + + # also remove dynamic runtime + string (REGEX REPLACE "[-/]MD[d]*" " " ${var_} "${${var_}}") + + # /ZI (Edit & Continue debugging information) is incompatible with Gy- + string (REPLACE "/ZI" "/Zi" ${var_} "${${var_}}") + + # omit debug info completely under CI (not needed) + if (is_ci) + string (REPLACE "/Zi" " " ${var_} "${${var_}}") + endif () + endforeach () + + target_compile_options (common + INTERFACE + -bigobj # Increase object file max size + -fp:precise # Floating point behavior + -Gd # __cdecl calling convention + -Gm- # Minimal rebuild: disabled + -Gy- # Function level linking: disabled + -MP # Multiprocessor compilation + -openmp- # pragma omp: disabled + -errorReport:none # No error reporting to Internet + -nologo # Suppress login banner + -wd4018 # Disable signed/unsigned comparison warnings + -wd4244 # Disable float to int possible loss of data warnings + -wd4267 # Disable size_t to T possible loss of data warnings + -wd4800 # Disable C4800(int to bool performance) + -wd4503 # Decorated name length exceeded, name was truncated + $<$: + -EHa + -GR + > + $<$:-Ox> + $<$,$>: + -GS + -Zc:forScope + > + # static runtime + $<$:-MTd> + $<$>:-MT> + $<$:-WX> + ) + target_compile_definitions (common + INTERFACE + _WIN32_WINNT=0x6000 + _SCL_SECURE_NO_WARNINGS + _CRT_SECURE_NO_WARNINGS + WIN32_CONSOLE + WIN32_LEAN_AND_MEAN + NOMINMAX + # TODO: Resolve these warnings, don't just silence them + _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS + $<$,$>:_CRTDBG_MAP_ALLOC>) + target_link_libraries (common + INTERFACE + -errorreport:none + -machine:X64) +else () + # HACK : because these need to come first, before any warning demotion + string (APPEND CMAKE_CXX_FLAGS " -Wall -Wdeprecated") + if (wextra) + string (APPEND CMAKE_CXX_FLAGS " -Wextra -Wno-unused-parameter") + endif () + # not MSVC + target_compile_options (common + INTERFACE + $<$:-Werror> + $<$: + -frtti + -Wnon-virtual-dtor + > + -Wno-sign-compare + -Wno-char-subscripts + -Wno-format + -Wno-unused-local-typedefs + $<$: + -Wno-unused-but-set-variable + -Wno-deprecated + > + $<$>:-fno-strict-aliasing> + # tweak gcc optimization for debug + $<$,$>:-O0> + # Add debug symbols to release config + $<$:-g>) + target_link_libraries (common + INTERFACE + -rdynamic + # link to static libc/c++ iff: + # * static option set and + # * NOT APPLE (AppleClang does not support static libc/c++) and + # * NOT san (sanitizers typically don't work with static libc/c++) + $<$,$>,$>>: + -static-libstdc++ + -static-libgcc + >) +endif () + +if (use_gold AND is_gcc) + # use gold linker if available + execute_process ( + COMMAND ${CMAKE_CXX_COMPILER} -fuse-ld=gold -Wl,--version + ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) + #[=========================================================[ + NOTE: THE gold linker inserts -rpath as DT_RUNPATH by + default intead of DT_RPATH, so you might have slightly + unexpected runtime ld behavior if you were expecting + DT_RPATH. Specify --disable-new-dtags to gold if you do + not want the default DT_RUNPATH behavior. This rpath + treatment as well as static/dynamic selection means that + gold does not currently have ideal default behavior when + we are using jemalloc. Thus for simplicity we don't use + it when jemalloc is requested. An alternative to + disabling would be to figure out all the settings + required to make gold play nicely with jemalloc. + #]=========================================================] + if (("${LD_VERSION}" MATCHES "GNU gold") AND (NOT jemalloc)) + target_link_libraries (common + INTERFACE + -fuse-ld=gold + -Wl,--no-as-needed + #[=========================================================[ + see https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/1253638/comments/5 + DT_RUNPATH does not work great for transitive + dependencies (of which boost has a few) - so just + switch to DT_RPATH if doing dynamic linking with gold + #]=========================================================] + $<$>:-Wl,--disable-new-dtags>) + endif () + unset (LD_VERSION) +endif () + +if (use_lld) + # use lld linker if available + execute_process ( + COMMAND ${CMAKE_CXX_COMPILER} -fuse-ld=lld -Wl,--version + ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) + if ("${LD_VERSION}" MATCHES "LLD") + target_link_libraries (common INTERFACE -fuse-ld=lld) + endif () + unset (LD_VERSION) +endif() + +if (assert) + foreach (var_ CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE) + STRING (REGEX REPLACE "[-/]DNDEBUG" "" ${var_} "${${var_}}") + endforeach () +endif () diff --git a/Release.Builds/Builds/CMake/RippledCore.cmake b/Release.Builds/Builds/CMake/RippledCore.cmake new file mode 100644 index 000000000..78843991f --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledCore.cmake @@ -0,0 +1,1081 @@ +#[===================================================================[ + xrpl_core + core functionality, useable by some client software perhaps +#]===================================================================] + +file (GLOB_RECURSE rb_headers + src/ripple/beast/*.h + src/ripple/beast/*.hpp) + +add_library (xrpl_core + ${rb_headers}) ## headers added here for benefit of IDEs +if (unity) + set_target_properties(xrpl_core PROPERTIES UNITY_BUILD ON) +endif () + +# Try to find the ACL library +find_library(ACL_LIBRARY NAMES acl) + +# Check if ACL was found +if(ACL_LIBRARY) + message(STATUS "Found ACL: ${ACL_LIBRARY}") +else() + message(STATUS "ACL not found, continuing without ACL support") +endif() + +#[===============================[ + beast/legacy FILES: + TODO: review these sources for removal or replacement +#]===============================] +target_sources (xrpl_core PRIVATE + src/ripple/beast/clock/basic_seconds_clock.cpp + src/ripple/beast/core/CurrentThreadName.cpp + src/ripple/beast/core/SemanticVersion.cpp + src/ripple/beast/hash/impl/xxhash.cpp + src/ripple/beast/insight/impl/Collector.cpp + src/ripple/beast/insight/impl/Groups.cpp + src/ripple/beast/insight/impl/Hook.cpp + src/ripple/beast/insight/impl/Metric.cpp + src/ripple/beast/insight/impl/NullCollector.cpp + src/ripple/beast/insight/impl/StatsDCollector.cpp + src/ripple/beast/net/impl/IPAddressConversion.cpp + src/ripple/beast/net/impl/IPAddressV4.cpp + src/ripple/beast/net/impl/IPAddressV6.cpp + src/ripple/beast/net/impl/IPEndpoint.cpp + src/ripple/beast/utility/src/beast_Journal.cpp + src/ripple/beast/utility/src/beast_PropertyStream.cpp) + +#[===============================[ + core sources +#]===============================] +target_sources (xrpl_core PRIVATE + #[===============================[ + main sources: + subdir: basics (partial) + #]===============================] + src/ripple/basics/impl/base64.cpp + src/ripple/basics/impl/contract.cpp + src/ripple/basics/impl/CountedObject.cpp + src/ripple/basics/impl/FileUtilities.cpp + src/ripple/basics/impl/IOUAmount.cpp + src/ripple/basics/impl/Log.cpp + src/ripple/basics/impl/Number.cpp + src/ripple/basics/impl/StringUtilities.cpp + #[===============================[ + main sources: + subdir: json + #]===============================] + src/ripple/json/impl/JsonPropertyStream.cpp + src/ripple/json/impl/Object.cpp + src/ripple/json/impl/Output.cpp + src/ripple/json/impl/Writer.cpp + src/ripple/json/impl/json_reader.cpp + src/ripple/json/impl/json_value.cpp + src/ripple/json/impl/json_valueiterator.cpp + src/ripple/json/impl/json_writer.cpp + src/ripple/json/impl/to_string.cpp + #[===============================[ + main sources: + subdir: protocol + #]===============================] + src/ripple/protocol/impl/AccountID.cpp + src/ripple/protocol/impl/Book.cpp + src/ripple/protocol/impl/BuildInfo.cpp + src/ripple/protocol/impl/ErrorCodes.cpp + src/ripple/protocol/impl/Feature.cpp + src/ripple/protocol/impl/Indexes.cpp + src/ripple/protocol/impl/InnerObjectFormats.cpp + src/ripple/protocol/impl/Issue.cpp + src/ripple/protocol/impl/Keylet.cpp + src/ripple/protocol/impl/LedgerFormats.cpp + src/ripple/protocol/impl/PublicKey.cpp + src/ripple/protocol/impl/Quality.cpp + src/ripple/protocol/impl/Rate2.cpp + src/ripple/protocol/impl/Rules.cpp + src/ripple/protocol/impl/SField.cpp + src/ripple/protocol/impl/SOTemplate.cpp + src/ripple/protocol/impl/STAccount.cpp + src/ripple/protocol/impl/STAmount.cpp + src/ripple/protocol/impl/STArray.cpp + src/ripple/protocol/impl/STBase.cpp + src/ripple/protocol/impl/STBlob.cpp + src/ripple/protocol/impl/STInteger.cpp + src/ripple/protocol/impl/STLedgerEntry.cpp + src/ripple/protocol/impl/STObject.cpp + src/ripple/protocol/impl/STParsedJSON.cpp + src/ripple/protocol/impl/STPathSet.cpp + src/ripple/protocol/impl/STTx.cpp + src/ripple/protocol/impl/STValidation.cpp + src/ripple/protocol/impl/STVar.cpp + src/ripple/protocol/impl/STVector256.cpp + src/ripple/protocol/impl/SecretKey.cpp + src/ripple/protocol/impl/Seed.cpp + src/ripple/protocol/impl/Serializer.cpp + src/ripple/protocol/impl/Sign.cpp + src/ripple/protocol/impl/TER.cpp + src/ripple/protocol/impl/TxFormats.cpp + src/ripple/protocol/impl/TxMeta.cpp + src/ripple/protocol/impl/UintTypes.cpp + src/ripple/protocol/impl/digest.cpp + src/ripple/protocol/impl/tokens.cpp + #[===============================[ + main sources: + subdir: crypto + #]===============================] + src/ripple/crypto/impl/RFC1751.cpp + src/ripple/crypto/impl/csprng.cpp + src/ripple/crypto/impl/secure_erase.cpp) + +add_library (Ripple::xrpl_core ALIAS xrpl_core) +target_include_directories (xrpl_core + PUBLIC + $ + $) + +target_compile_definitions(xrpl_core + PUBLIC + BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT + BOOST_CONTAINER_FWD_BAD_DEQUE + HAS_UNCAUGHT_EXCEPTIONS=1) +target_compile_options (xrpl_core + PUBLIC + $<$:-Wno-maybe-uninitialized>) +target_link_libraries (xrpl_core + PUBLIC + OpenSSL::Crypto + Ripple::boost + NIH::WasmEdge + Ripple::syslibs + NIH::secp256k1 + NIH::ed25519-donna + date::date + Ripple::opts) +#[=================================[ + main/core headers installation +#]=================================] +install ( + FILES + src/ripple/basics/base64.h + src/ripple/basics/Blob.h + src/ripple/basics/Buffer.h + src/ripple/basics/CountedObject.h + src/ripple/basics/FileUtilities.h + src/ripple/basics/IOUAmount.h + src/ripple/basics/LocalValue.h + src/ripple/basics/Log.h + src/ripple/basics/MathUtilities.h + src/ripple/basics/Number.h + src/ripple/basics/safe_cast.h + src/ripple/basics/Slice.h + src/ripple/basics/spinlock.h + src/ripple/basics/StringUtilities.h + src/ripple/basics/ThreadSafetyAnalysis.h + src/ripple/basics/ToString.h + src/ripple/basics/UnorderedContainers.h + src/ripple/basics/XRPAmount.h + src/ripple/basics/algorithm.h + src/ripple/basics/base_uint.h + src/ripple/basics/chrono.h + src/ripple/basics/contract.h + src/ripple/basics/FeeUnits.h + src/ripple/basics/hardened_hash.h + src/ripple/basics/strHex.h + DESTINATION include/ripple/basics) +install ( + FILES + src/ripple/crypto/RFC1751.h + src/ripple/crypto/csprng.h + src/ripple/crypto/secure_erase.h + DESTINATION include/ripple/crypto) +install ( + FILES + src/ripple/json/JsonPropertyStream.h + src/ripple/json/Object.h + src/ripple/json/Output.h + src/ripple/json/Writer.h + src/ripple/json/json_forwards.h + src/ripple/json/json_reader.h + src/ripple/json/json_value.h + src/ripple/json/json_writer.h + src/ripple/json/to_string.h + DESTINATION include/ripple/json) +install ( + FILES + src/ripple/json/impl/json_assert.h + DESTINATION include/ripple/json/impl) +install ( + FILES + src/ripple/protocol/AccountID.h + src/ripple/protocol/AmountConversions.h + src/ripple/protocol/Book.h + src/ripple/protocol/BuildInfo.h + src/ripple/protocol/ErrorCodes.h + src/ripple/protocol/Feature.h + src/ripple/protocol/HashPrefix.h + src/ripple/protocol/Indexes.h + src/ripple/protocol/InnerObjectFormats.h + src/ripple/protocol/Issue.h + src/ripple/protocol/KeyType.h + src/ripple/protocol/Keylet.h + src/ripple/protocol/KnownFormats.h + src/ripple/protocol/LedgerFormats.h + src/ripple/protocol/Protocol.h + src/ripple/protocol/PublicKey.h + src/ripple/protocol/Quality.h + src/ripple/protocol/Rate.h + src/ripple/protocol/Rules.h + src/ripple/protocol/SField.h + src/ripple/protocol/SOTemplate.h + src/ripple/protocol/STAccount.h + src/ripple/protocol/STAmount.h + src/ripple/protocol/STArray.h + src/ripple/protocol/STBase.h + src/ripple/protocol/STBitString.h + src/ripple/protocol/STBlob.h + src/ripple/protocol/STExchange.h + src/ripple/protocol/STInteger.h + src/ripple/protocol/STLedgerEntry.h + src/ripple/protocol/STObject.h + src/ripple/protocol/STParsedJSON.h + src/ripple/protocol/STPathSet.h + src/ripple/protocol/STTx.h + src/ripple/protocol/STValidation.h + src/ripple/protocol/STVector256.h + src/ripple/protocol/SecretKey.h + src/ripple/protocol/Seed.h + src/ripple/protocol/SeqProxy.h + src/ripple/protocol/Serializer.h + src/ripple/protocol/Sign.h + src/ripple/protocol/SystemParameters.h + src/ripple/protocol/TER.h + src/ripple/protocol/TxFlags.h + src/ripple/protocol/TxFormats.h + src/ripple/protocol/TxMeta.h + src/ripple/protocol/UintTypes.h + src/ripple/protocol/digest.h + src/ripple/protocol/jss.h + src/ripple/protocol/tokens.h + DESTINATION include/ripple/protocol) +install ( + FILES + src/ripple/protocol/impl/STVar.h + src/ripple/protocol/impl/secp256k1.h + DESTINATION include/ripple/protocol/impl) + +#[===================================[ + beast/legacy headers installation +#]===================================] +install ( + FILES + src/ripple/beast/clock/abstract_clock.h + src/ripple/beast/clock/basic_seconds_clock.h + src/ripple/beast/clock/manual_clock.h + DESTINATION include/ripple/beast/clock) +install ( + FILES + src/ripple/beast/core/LexicalCast.h + src/ripple/beast/core/List.h + src/ripple/beast/core/SemanticVersion.h + DESTINATION include/ripple/beast/core) +install ( + FILES + src/ripple/beast/hash/hash_append.h + src/ripple/beast/hash/uhash.h + src/ripple/beast/hash/xxhasher.h + DESTINATION include/ripple/beast/hash) +install ( + FILES src/ripple/beast/hash/impl/xxhash.h + DESTINATION include/ripple/beast/hash/impl) +install ( + FILES + src/ripple/beast/rfc2616.h + src/ripple/beast/type_name.h + src/ripple/beast/unit_test.h + src/ripple/beast/xor_shift_engine.h + DESTINATION include/ripple/beast) +install ( + FILES + src/ripple/beast/utility/Journal.h + src/ripple/beast/utility/PropertyStream.h + src/ripple/beast/utility/Zero.h + src/ripple/beast/utility/rngfill.h + DESTINATION include/ripple/beast/utility) +# WARNING!! -- horrible levelization ahead +# (these files should be isolated or moved...but +# unfortunately unit_test.h above creates this dependency) +if (tests) + install ( + FILES + src/ripple/beast/unit_test/amount.hpp + src/ripple/beast/unit_test/dstream.hpp + src/ripple/beast/unit_test/global_suites.hpp + src/ripple/beast/unit_test/match.hpp + src/ripple/beast/unit_test/recorder.hpp + src/ripple/beast/unit_test/reporter.hpp + src/ripple/beast/unit_test/results.hpp + src/ripple/beast/unit_test/runner.hpp + src/ripple/beast/unit_test/suite.hpp + src/ripple/beast/unit_test/suite_info.hpp + src/ripple/beast/unit_test/suite_list.hpp + src/ripple/beast/unit_test/thread.hpp + DESTINATION include/ripple/beast/extras/unit_test) + install ( + FILES + src/ripple/beast/unit_test/detail/const_container.hpp + DESTINATION include/ripple/beast/unit_test/detail) +endif () #tests +#[===================================================================[ + rippled executable +#]===================================================================] + +#[=========================================================[ + this one header is added as source just to keep older + versions of cmake happy. cmake 3.10+ allows + add_executable with no sources +#]=========================================================] +add_executable (rippled src/ripple/app/main/Application.h) +if (unity) + set_target_properties(rippled PROPERTIES UNITY_BUILD ON) +endif () +if (tests) + target_compile_definitions(rippled PUBLIC ENABLE_TESTS) +endif() +target_sources (rippled PRIVATE + #[===============================[ + main sources: + subdir: app + #]===============================] + src/ripple/app/consensus/RCLConsensus.cpp + src/ripple/app/consensus/RCLCxPeerPos.cpp + src/ripple/app/consensus/RCLValidations.cpp + src/ripple/app/ledger/AcceptedLedger.cpp + src/ripple/app/ledger/AcceptedLedgerTx.cpp + src/ripple/app/ledger/AccountStateSF.cpp + src/ripple/app/ledger/BookListeners.cpp + src/ripple/app/ledger/ConsensusTransSetSF.cpp + src/ripple/app/ledger/Ledger.cpp + src/ripple/app/ledger/LedgerHistory.cpp + src/ripple/app/ledger/OrderBookDB.cpp + src/ripple/app/ledger/TransactionStateSF.cpp + src/ripple/app/ledger/impl/BuildLedger.cpp + src/ripple/app/ledger/impl/InboundLedger.cpp + src/ripple/app/ledger/impl/InboundLedgers.cpp + src/ripple/app/ledger/impl/InboundTransactions.cpp + src/ripple/app/ledger/impl/LedgerCleaner.cpp + src/ripple/app/ledger/impl/LedgerDeltaAcquire.cpp + src/ripple/app/ledger/impl/LedgerMaster.cpp + src/ripple/app/ledger/impl/LedgerReplay.cpp + src/ripple/app/ledger/impl/LedgerReplayer.cpp + src/ripple/app/ledger/impl/LedgerReplayMsgHandler.cpp + src/ripple/app/ledger/impl/LedgerReplayTask.cpp + src/ripple/app/ledger/impl/LedgerToJson.cpp + src/ripple/app/ledger/impl/LocalTxs.cpp + src/ripple/app/ledger/impl/OpenLedger.cpp + src/ripple/app/ledger/impl/SkipListAcquire.cpp + src/ripple/app/ledger/impl/TimeoutCounter.cpp + src/ripple/app/ledger/impl/TransactionAcquire.cpp + src/ripple/app/ledger/impl/TransactionMaster.cpp + src/ripple/app/main/Application.cpp + src/ripple/app/main/BasicApp.cpp + src/ripple/app/main/CollectorManager.cpp + src/ripple/app/main/GRPCServer.cpp + src/ripple/app/main/LoadManager.cpp + src/ripple/app/main/Main.cpp + src/ripple/app/main/NodeIdentity.cpp + src/ripple/app/main/NodeStoreScheduler.cpp + src/ripple/app/reporting/ReportingETL.cpp + src/ripple/app/reporting/ETLSource.cpp + src/ripple/app/reporting/P2pProxy.cpp + src/ripple/app/misc/CanonicalTXSet.cpp + src/ripple/app/misc/FeeVoteImpl.cpp + src/ripple/app/misc/HashRouter.cpp + src/ripple/app/misc/NegativeUNLVote.cpp + src/ripple/app/misc/NetworkOPs.cpp + src/ripple/app/misc/SHAMapStoreImp.cpp + src/ripple/app/misc/StateAccounting.cpp + src/ripple/app/misc/detail/impl/WorkSSL.cpp + src/ripple/app/misc/impl/AccountTxPaging.cpp + src/ripple/app/misc/impl/AmendmentTable.cpp + src/ripple/app/misc/impl/LoadFeeTrack.cpp + src/ripple/app/misc/impl/Manifest.cpp + src/ripple/app/misc/impl/Transaction.cpp + src/ripple/app/misc/impl/TxQ.cpp + src/ripple/app/misc/impl/ValidatorKeys.cpp + src/ripple/app/misc/impl/ValidatorList.cpp + src/ripple/app/misc/impl/ValidatorSite.cpp + src/ripple/app/paths/AccountCurrencies.cpp + src/ripple/app/paths/Credit.cpp + src/ripple/app/paths/Flow.cpp + src/ripple/app/paths/PathRequest.cpp + src/ripple/app/paths/PathRequests.cpp + src/ripple/app/paths/Pathfinder.cpp + src/ripple/app/paths/RippleCalc.cpp + src/ripple/app/paths/RippleLineCache.cpp + src/ripple/app/paths/TrustLine.cpp + src/ripple/app/paths/impl/BookStep.cpp + src/ripple/app/paths/impl/DirectStep.cpp + src/ripple/app/paths/impl/PaySteps.cpp + src/ripple/app/paths/impl/XRPEndpointStep.cpp + src/ripple/app/rdb/backend/detail/impl/Node.cpp + src/ripple/app/rdb/backend/detail/impl/Shard.cpp + src/ripple/app/rdb/backend/impl/PostgresDatabase.cpp + src/ripple/app/rdb/backend/impl/SQLiteDatabase.cpp + src/ripple/app/rdb/impl/Download.cpp + src/ripple/app/rdb/impl/PeerFinder.cpp + src/ripple/app/rdb/impl/RelationalDatabase.cpp + src/ripple/app/rdb/impl/ShardArchive.cpp + src/ripple/app/rdb/impl/State.cpp + src/ripple/app/rdb/impl/UnitaryShard.cpp + src/ripple/app/rdb/impl/Vacuum.cpp + src/ripple/app/rdb/impl/Wallet.cpp + src/ripple/app/tx/impl/ApplyContext.cpp + src/ripple/app/tx/impl/BookTip.cpp + src/ripple/app/tx/impl/CancelCheck.cpp + src/ripple/app/tx/impl/CancelOffer.cpp + src/ripple/app/tx/impl/CashCheck.cpp + src/ripple/app/tx/impl/Change.cpp + src/ripple/app/tx/impl/ClaimReward.cpp + src/ripple/app/tx/impl/CreateCheck.cpp + src/ripple/app/tx/impl/CreateOffer.cpp + src/ripple/app/tx/impl/CreateTicket.cpp + src/ripple/app/tx/impl/DeleteAccount.cpp + src/ripple/app/tx/impl/DepositPreauth.cpp + src/ripple/app/tx/impl/Escrow.cpp + src/ripple/app/tx/impl/GenesisMint.cpp + src/ripple/app/tx/impl/Import.cpp + src/ripple/app/tx/impl/InvariantCheck.cpp + src/ripple/app/tx/impl/Invoke.cpp + src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp + src/ripple/app/tx/impl/NFTokenBurn.cpp + src/ripple/app/tx/impl/NFTokenCancelOffer.cpp + src/ripple/app/tx/impl/NFTokenCreateOffer.cpp + src/ripple/app/tx/impl/NFTokenMint.cpp + src/ripple/app/tx/impl/OfferStream.cpp + src/ripple/app/tx/impl/PayChan.cpp + src/ripple/app/tx/impl/Payment.cpp + src/ripple/app/tx/impl/Remit.cpp + src/ripple/app/tx/impl/SetAccount.cpp + src/ripple/app/tx/impl/SetHook.cpp + src/ripple/app/tx/impl/SetRegularKey.cpp + src/ripple/app/tx/impl/SetSignerList.cpp + src/ripple/app/tx/impl/SetTrust.cpp + src/ripple/app/tx/impl/SignerEntries.cpp + src/ripple/app/tx/impl/Taker.cpp + src/ripple/app/tx/impl/Transactor.cpp + src/ripple/app/tx/impl/URIToken.cpp + src/ripple/app/tx/impl/apply.cpp + src/ripple/app/tx/impl/applySteps.cpp + src/ripple/app/hook/impl/applyHook.cpp + src/ripple/app/tx/impl/details/NFTokenUtils.cpp + #[===============================[ + main sources: + subdir: basics (partial) + #]===============================] + src/ripple/basics/impl/Archive.cpp + src/ripple/basics/impl/BasicConfig.cpp + src/ripple/basics/impl/ResolverAsio.cpp + src/ripple/basics/impl/UptimeClock.cpp + src/ripple/basics/impl/make_SSLContext.cpp + src/ripple/basics/impl/mulDiv.cpp + src/ripple/basics/impl/partitioned_unordered_map.cpp + #[===============================[ + main sources: + subdir: conditions + #]===============================] + src/ripple/conditions/impl/Condition.cpp + src/ripple/conditions/impl/Fulfillment.cpp + src/ripple/conditions/impl/error.cpp + #[===============================[ + main sources: + subdir: core + #]===============================] + src/ripple/core/impl/Config.cpp + src/ripple/core/impl/DatabaseCon.cpp + src/ripple/core/impl/Job.cpp + src/ripple/core/impl/JobQueue.cpp + src/ripple/core/impl/LoadEvent.cpp + src/ripple/core/impl/LoadMonitor.cpp + src/ripple/core/impl/SNTPClock.cpp + src/ripple/core/impl/SociDB.cpp + src/ripple/core/impl/TimeKeeper.cpp + src/ripple/core/impl/Workers.cpp + src/ripple/core/Pg.cpp + #[===============================[ + main sources: + subdir: consensus + #]===============================] + src/ripple/consensus/Consensus.cpp + #[===============================[ + main sources: + subdir: ledger + #]===============================] + src/ripple/ledger/impl/ApplyStateTable.cpp + src/ripple/ledger/impl/ApplyView.cpp + src/ripple/ledger/impl/ApplyViewBase.cpp + src/ripple/ledger/impl/ApplyViewImpl.cpp + src/ripple/ledger/impl/BookDirs.cpp + src/ripple/ledger/impl/CachedView.cpp + src/ripple/ledger/impl/Directory.cpp + src/ripple/ledger/impl/OpenView.cpp + src/ripple/ledger/impl/PaymentSandbox.cpp + src/ripple/ledger/impl/RawStateTable.cpp + src/ripple/ledger/impl/ReadView.cpp + src/ripple/ledger/impl/View.cpp + #[===============================[ + main sources: + subdir: net + #]===============================] + src/ripple/net/impl/DatabaseDownloader.cpp + src/ripple/net/impl/HTTPClient.cpp + src/ripple/net/impl/HTTPDownloader.cpp + src/ripple/net/impl/HTTPStream.cpp + src/ripple/net/impl/InfoSub.cpp + src/ripple/net/impl/RPCCall.cpp + src/ripple/net/impl/RPCErr.cpp + src/ripple/net/impl/RPCSub.cpp + src/ripple/net/impl/RegisterSSLCerts.cpp + #[===============================[ + main sources: + subdir: nodestore + #]===============================] + 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 + src/ripple/nodestore/impl/BatchWriter.cpp + src/ripple/nodestore/impl/Database.cpp + src/ripple/nodestore/impl/DatabaseNodeImp.cpp + src/ripple/nodestore/impl/DatabaseRotatingImp.cpp + src/ripple/nodestore/impl/DatabaseShardImp.cpp + src/ripple/nodestore/impl/DeterministicShard.cpp + src/ripple/nodestore/impl/DecodedBlob.cpp + src/ripple/nodestore/impl/DummyScheduler.cpp + src/ripple/nodestore/impl/ManagerImp.cpp + src/ripple/nodestore/impl/NodeObject.cpp + src/ripple/nodestore/impl/Shard.cpp + src/ripple/nodestore/impl/ShardInfo.cpp + src/ripple/nodestore/impl/TaskQueue.cpp + #[===============================[ + main sources: + subdir: overlay + #]===============================] + src/ripple/overlay/impl/Cluster.cpp + src/ripple/overlay/impl/ConnectAttempt.cpp + src/ripple/overlay/impl/Handshake.cpp + src/ripple/overlay/impl/Message.cpp + src/ripple/overlay/impl/OverlayImpl.cpp + src/ripple/overlay/impl/PeerImp.cpp + src/ripple/overlay/impl/PeerReservationTable.cpp + src/ripple/overlay/impl/PeerSet.cpp + src/ripple/overlay/impl/ProtocolVersion.cpp + src/ripple/overlay/impl/TrafficCount.cpp + src/ripple/overlay/impl/TxMetrics.cpp + #[===============================[ + main sources: + subdir: peerfinder + #]===============================] + src/ripple/peerfinder/impl/Bootcache.cpp + src/ripple/peerfinder/impl/Endpoint.cpp + src/ripple/peerfinder/impl/PeerfinderConfig.cpp + src/ripple/peerfinder/impl/PeerfinderManager.cpp + src/ripple/peerfinder/impl/SlotImp.cpp + src/ripple/peerfinder/impl/SourceStrings.cpp + #[===============================[ + main sources: + subdir: resource + #]===============================] + src/ripple/resource/impl/Charge.cpp + src/ripple/resource/impl/Consumer.cpp + src/ripple/resource/impl/Fees.cpp + src/ripple/resource/impl/ResourceManager.cpp + #[===============================[ + main sources: + subdir: rpc + #]===============================] + src/ripple/rpc/handlers/AccountChannels.cpp + src/ripple/rpc/handlers/AccountCurrenciesHandler.cpp + src/ripple/rpc/handlers/AccountInfo.cpp + src/ripple/rpc/handlers/AccountLines.cpp + src/ripple/rpc/handlers/AccountObjects.cpp + src/ripple/rpc/handlers/AccountOffers.cpp + src/ripple/rpc/handlers/AccountNamespace.cpp + src/ripple/rpc/handlers/AccountTx.cpp + src/ripple/rpc/handlers/BlackList.cpp + src/ripple/rpc/handlers/BookOffers.cpp + src/ripple/rpc/handlers/CanDelete.cpp + src/ripple/rpc/handlers/Connect.cpp + src/ripple/rpc/handlers/ConsensusInfo.cpp + src/ripple/rpc/handlers/CrawlShards.cpp + src/ripple/rpc/handlers/DepositAuthorized.cpp + src/ripple/rpc/handlers/DownloadShard.cpp + src/ripple/rpc/handlers/Feature1.cpp + src/ripple/rpc/handlers/Fee1.cpp + src/ripple/rpc/handlers/FetchInfo.cpp + src/ripple/rpc/handlers/GatewayBalances.cpp + src/ripple/rpc/handlers/GetCounts.cpp + src/ripple/rpc/handlers/LedgerAccept.cpp + src/ripple/rpc/handlers/LedgerCleanerHandler.cpp + src/ripple/rpc/handlers/LedgerClosed.cpp + src/ripple/rpc/handlers/LedgerCurrent.cpp + src/ripple/rpc/handlers/LedgerData.cpp + src/ripple/rpc/handlers/LedgerDiff.cpp + src/ripple/rpc/handlers/LedgerEntry.cpp + src/ripple/rpc/handlers/LedgerHandler.cpp + src/ripple/rpc/handlers/LedgerHeader.cpp + src/ripple/rpc/handlers/LedgerRequest.cpp + src/ripple/rpc/handlers/LogLevel.cpp + src/ripple/rpc/handlers/LogRotate.cpp + src/ripple/rpc/handlers/Manifest.cpp + src/ripple/rpc/handlers/NFTOffers.cpp + src/ripple/rpc/handlers/NodeToShard.cpp + src/ripple/rpc/handlers/NoRippleCheck.cpp + src/ripple/rpc/handlers/OwnerInfo.cpp + src/ripple/rpc/handlers/PathFind.cpp + src/ripple/rpc/handlers/PayChanClaim.cpp + src/ripple/rpc/handlers/Peers.cpp + src/ripple/rpc/handlers/Ping.cpp + src/ripple/rpc/handlers/Print.cpp + src/ripple/rpc/handlers/Random.cpp + src/ripple/rpc/handlers/Reservations.cpp + src/ripple/rpc/handlers/RipplePathFind.cpp + src/ripple/rpc/handlers/ServerDefinitions.cpp + src/ripple/rpc/handlers/ServerInfo.cpp + src/ripple/rpc/handlers/ServerState.cpp + src/ripple/rpc/handlers/SignFor.cpp + src/ripple/rpc/handlers/SignHandler.cpp + src/ripple/rpc/handlers/Stop.cpp + src/ripple/rpc/handlers/Submit.cpp + src/ripple/rpc/handlers/SubmitMultiSigned.cpp + src/ripple/rpc/handlers/Subscribe.cpp + src/ripple/rpc/handlers/TransactionEntry.cpp + src/ripple/rpc/handlers/Tx.cpp + src/ripple/rpc/handlers/TxHistory.cpp + src/ripple/rpc/handlers/TxReduceRelay.cpp + src/ripple/rpc/handlers/UnlList.cpp + src/ripple/rpc/handlers/Unsubscribe.cpp + src/ripple/rpc/handlers/ValidationCreate.cpp + src/ripple/rpc/handlers/ValidatorInfo.cpp + src/ripple/rpc/handlers/ValidatorListSites.cpp + src/ripple/rpc/handlers/Validators.cpp + src/ripple/rpc/handlers/WalletPropose.cpp + src/ripple/rpc/impl/DeliveredAmount.cpp + src/ripple/rpc/impl/Handler.cpp + src/ripple/rpc/impl/LegacyPathFind.cpp + src/ripple/rpc/impl/RPCHandler.cpp + src/ripple/rpc/impl/RPCHelpers.cpp + src/ripple/rpc/impl/Role.cpp + src/ripple/rpc/impl/ServerHandlerImp.cpp + src/ripple/rpc/impl/ShardArchiveHandler.cpp + src/ripple/rpc/impl/ShardVerificationScheduler.cpp + src/ripple/rpc/impl/Status.cpp + src/ripple/rpc/impl/TransactionSign.cpp + src/ripple/rpc/impl/NFTokenID.cpp + src/ripple/rpc/impl/NFTokenOfferID.cpp + src/ripple/rpc/impl/NFTSyntheticSerializer.cpp + #[===============================[ + main sources: + subdir: perflog + #]===============================] + src/ripple/perflog/impl/PerfLogImp.cpp + + #[===============================[ + main sources: + subdir: server + #]===============================] + src/ripple/server/impl/JSONRPCUtil.cpp + src/ripple/server/impl/Port.cpp + #[===============================[ + main sources: + subdir: shamap + #]===============================] + src/ripple/shamap/impl/NodeFamily.cpp + src/ripple/shamap/impl/SHAMap.cpp + src/ripple/shamap/impl/SHAMapDelta.cpp + src/ripple/shamap/impl/SHAMapInnerNode.cpp + src/ripple/shamap/impl/SHAMapLeafNode.cpp + src/ripple/shamap/impl/SHAMapNodeID.cpp + src/ripple/shamap/impl/SHAMapSync.cpp + src/ripple/shamap/impl/SHAMapTreeNode.cpp + src/ripple/shamap/impl/ShardFamily.cpp) + + #[===============================[ + test sources: + subdir: app + #]===============================] +if (tests) + target_sources (rippled PRIVATE + src/test/app/AccountDelete_test.cpp + src/test/app/AccountTxPaging_test.cpp + src/test/app/AmendmentTable_test.cpp + src/test/app/BaseFee_test.cpp + src/test/app/Check_test.cpp + src/test/app/ClaimReward_test.cpp + src/test/app/CrossingLimits_test.cpp + src/test/app/DeliverMin_test.cpp + src/test/app/DepositAuth_test.cpp + src/test/app/Discrepancy_test.cpp + src/test/app/DNS_test.cpp + src/test/app/Escrow_test.cpp + src/test/app/FeeVote_test.cpp + src/test/app/Flow_test.cpp + src/test/app/Freeze_test.cpp + src/test/app/GenesisMint_test.cpp + src/test/app/HashRouter_test.cpp + src/test/app/Import_test.cpp + src/test/app/Invoke_test.cpp + src/test/app/LedgerHistory_test.cpp + src/test/app/LedgerLoad_test.cpp + src/test/app/LedgerMaster_test.cpp + src/test/app/LedgerReplay_test.cpp + src/test/app/LoadFeeTrack_test.cpp + src/test/app/Manifest_test.cpp + src/test/app/MultiSign_test.cpp + src/test/app/NetworkID_test.cpp + src/test/app/NFToken_test.cpp + src/test/app/NFTokenBurn_test.cpp + src/test/app/NFTokenDir_test.cpp + src/test/app/OfferStream_test.cpp + src/test/app/Offer_test.cpp + src/test/app/OversizeMeta_test.cpp + src/test/app/Path_test.cpp + src/test/app/PayChan_test.cpp + src/test/app/PayStrand_test.cpp + src/test/app/PseudoTx_test.cpp + src/test/app/RCLCensorshipDetector_test.cpp + src/test/app/RCLValidations_test.cpp + src/test/app/Regression_test.cpp + src/test/app/Remit_test.cpp + src/test/app/SHAMapStore_test.cpp + src/test/app/SetAuth_test.cpp + src/test/app/SetRegularKey_test.cpp + src/test/app/SetTrust_test.cpp + src/test/app/Taker_test.cpp + src/test/app/TheoreticalQuality_test.cpp + src/test/app/Ticket_test.cpp + src/test/app/Transaction_ordering_test.cpp + src/test/app/TrustAndBalance_test.cpp + src/test/app/TxQ_test.cpp + src/test/app/URIToken_test.cpp + src/test/app/ValidatorKeys_test.cpp + src/test/app/ValidatorList_test.cpp + src/test/app/ValidatorSite_test.cpp + src/test/app/SetHook_test.cpp + src/test/app/SetHookTSH_test.cpp + src/test/app/Wildcard_test.cpp + src/test/app/XahauGenesis_test.cpp + src/test/app/tx/apply_test.cpp + #[===============================[ + test sources: + subdir: basics + #]===============================] + src/test/basics/Buffer_test.cpp + src/test/basics/DetectCrash_test.cpp + src/test/basics/Expected_test.cpp + src/test/basics/FileUtilities_test.cpp + src/test/basics/IOUAmount_test.cpp + src/test/basics/KeyCache_test.cpp + src/test/basics/Number_test.cpp + src/test/basics/PerfLog_test.cpp + src/test/basics/RangeSet_test.cpp + src/test/basics/scope_test.cpp + src/test/basics/Slice_test.cpp + src/test/basics/StringUtilities_test.cpp + src/test/basics/TaggedCache_test.cpp + src/test/basics/XRPAmount_test.cpp + src/test/basics/base64_test.cpp + src/test/basics/base_uint_test.cpp + src/test/basics/contract_test.cpp + src/test/basics/FeeUnits_test.cpp + src/test/basics/hardened_hash_test.cpp + src/test/basics/join_test.cpp + src/test/basics/mulDiv_test.cpp + src/test/basics/tagged_integer_test.cpp + #[===============================[ + test sources: + subdir: beast + #]===============================] + src/test/beast/IPEndpoint_test.cpp + src/test/beast/LexicalCast_test.cpp + src/test/beast/SemanticVersion_test.cpp + src/test/beast/aged_associative_container_test.cpp + src/test/beast/beast_CurrentThreadName_test.cpp + src/test/beast/beast_Journal_test.cpp + src/test/beast/beast_PropertyStream_test.cpp + src/test/beast/beast_Zero_test.cpp + src/test/beast/beast_abstract_clock_test.cpp + src/test/beast/beast_basic_seconds_clock_test.cpp + src/test/beast/beast_io_latency_probe_test.cpp + src/test/beast/define_print.cpp + #[===============================[ + test sources: + subdir: conditions + #]===============================] + src/test/conditions/PreimageSha256_test.cpp + #[===============================[ + test sources: + subdir: consensus + #]===============================] + src/test/consensus/ByzantineFailureSim_test.cpp + src/test/consensus/Consensus_test.cpp + src/test/consensus/DistributedValidatorsSim_test.cpp + src/test/consensus/LedgerTiming_test.cpp + src/test/consensus/LedgerTrie_test.cpp + src/test/consensus/NegativeUNL_test.cpp + src/test/consensus/ScaleFreeSim_test.cpp + src/test/consensus/UNLReport_test.cpp + src/test/consensus/Validations_test.cpp + #[===============================[ + test sources: + subdir: core + #]===============================] + src/test/core/ClosureCounter_test.cpp + src/test/core/Config_test.cpp + src/test/core/Coroutine_test.cpp + src/test/core/CryptoPRNG_test.cpp + src/test/core/JobQueue_test.cpp + src/test/core/SociDB_test.cpp + src/test/core/Workers_test.cpp + #[===============================[ + test sources: + subdir: csf + #]===============================] + src/test/csf/BasicNetwork_test.cpp + src/test/csf/Digraph_test.cpp + src/test/csf/Histogram_test.cpp + src/test/csf/Scheduler_test.cpp + src/test/csf/impl/Sim.cpp + src/test/csf/impl/ledgers.cpp + #[===============================[ + test sources: + subdir: json + #]===============================] + src/test/json/Object_test.cpp + src/test/json/Output_test.cpp + src/test/json/Writer_test.cpp + src/test/json/json_value_test.cpp + #[===============================[ + test sources: + subdir: jtx + #]===============================] + src/test/jtx/Env_test.cpp + src/test/jtx/WSClient_test.cpp + src/test/jtx/impl/Account.cpp + src/test/jtx/impl/Env.cpp + src/test/jtx/impl/JSONRPCClient.cpp + src/test/jtx/impl/ManualTimeKeeper.cpp + src/test/jtx/impl/WSClient.cpp + src/test/jtx/impl/hook.cpp + src/test/jtx/impl/acctdelete.cpp + src/test/jtx/impl/account_txn_id.cpp + src/test/jtx/impl/amount.cpp + src/test/jtx/impl/balance.cpp + src/test/jtx/impl/check.cpp + src/test/jtx/impl/delivermin.cpp + src/test/jtx/impl/deposit.cpp + src/test/jtx/impl/envconfig.cpp + src/test/jtx/impl/escrow.cpp + src/test/jtx/impl/fee.cpp + src/test/jtx/impl/flags.cpp + src/test/jtx/impl/genesis.cpp + src/test/jtx/impl/import.cpp + src/test/jtx/impl/invoice_id.cpp + src/test/jtx/impl/invoke.cpp + src/test/jtx/impl/jtx_json.cpp + src/test/jtx/impl/last_ledger_sequence.cpp + src/test/jtx/impl/memo.cpp + src/test/jtx/impl/multisign.cpp + src/test/jtx/impl/network.cpp + src/test/jtx/impl/offer.cpp + src/test/jtx/impl/owners.cpp + src/test/jtx/impl/paths.cpp + src/test/jtx/impl/pay.cpp + src/test/jtx/impl/paychan.cpp + src/test/jtx/impl/quality2.cpp + src/test/jtx/impl/rate.cpp + src/test/jtx/impl/regkey.cpp + src/test/jtx/impl/reward.cpp + src/test/jtx/impl/remit.cpp + src/test/jtx/impl/sendmax.cpp + src/test/jtx/impl/seq.cpp + src/test/jtx/impl/sig.cpp + src/test/jtx/impl/tag.cpp + src/test/jtx/impl/ticket.cpp + src/test/jtx/impl/token.cpp + src/test/jtx/impl/trust.cpp + src/test/jtx/impl/txflags.cpp + src/test/jtx/impl/unl.cpp + src/test/jtx/impl/uritoken.cpp + src/test/jtx/impl/utility.cpp + + #[===============================[ + test sources: + subdir: ledger + #]===============================] + src/test/ledger/BookDirs_test.cpp + src/test/ledger/Directory_test.cpp + src/test/ledger/Invariants_test.cpp + src/test/ledger/PaymentSandbox_test.cpp + src/test/ledger/PendingSaves_test.cpp + src/test/ledger/SkipList_test.cpp + src/test/ledger/View_test.cpp + #[===============================[ + test sources: + subdir: net + #]===============================] + src/test/net/DatabaseDownloader_test.cpp + #[===============================[ + test sources: + subdir: nodestore + #]===============================] + src/test/nodestore/Backend_test.cpp + src/test/nodestore/Basics_test.cpp + src/test/nodestore/DatabaseShard_test.cpp + src/test/nodestore/Database_test.cpp + src/test/nodestore/Timing_test.cpp + src/test/nodestore/import_test.cpp + src/test/nodestore/varint_test.cpp + #[===============================[ + test sources: + subdir: overlay + #]===============================] + src/test/overlay/ProtocolVersion_test.cpp + src/test/overlay/cluster_test.cpp + src/test/overlay/short_read_test.cpp + src/test/overlay/compression_test.cpp + src/test/overlay/reduce_relay_test.cpp + src/test/overlay/handshake_test.cpp + src/test/overlay/tx_reduce_relay_test.cpp + #[===============================[ + test sources: + subdir: peerfinder + #]===============================] + src/test/peerfinder/Livecache_test.cpp + src/test/peerfinder/PeerFinder_test.cpp + #[===============================[ + test sources: + subdir: protocol + #]===============================] + src/test/protocol/BuildInfo_test.cpp + src/test/protocol/InnerObjectFormats_test.cpp + src/test/protocol/Issue_test.cpp + src/test/protocol/Hooks_test.cpp + src/test/protocol/Memo_test.cpp + src/test/protocol/PublicKey_test.cpp + src/test/protocol/Quality_test.cpp + src/test/protocol/STAccount_test.cpp + src/test/protocol/STAmount_test.cpp + src/test/protocol/STObject_test.cpp + src/test/protocol/STTx_test.cpp + src/test/protocol/STValidation_test.cpp + src/test/protocol/SecretKey_test.cpp + src/test/protocol/Seed_test.cpp + src/test/protocol/SeqProxy_test.cpp + src/test/protocol/TER_test.cpp + src/test/protocol/types_test.cpp + #[===============================[ + test sources: + subdir: resource + #]===============================] + src/test/resource/Logic_test.cpp + #[===============================[ + test sources: + subdir: rpc + #]===============================] + src/test/rpc/AccountCurrencies_test.cpp + src/test/rpc/AccountInfo_test.cpp + src/test/rpc/AccountLinesRPC_test.cpp + src/test/rpc/AccountObjects_test.cpp + src/test/rpc/AccountOffers_test.cpp + src/test/rpc/AccountNamespace_test.cpp + src/test/rpc/AccountSet_test.cpp + src/test/rpc/AccountTx_test.cpp + src/test/rpc/AmendmentBlocked_test.cpp + src/test/rpc/Book_test.cpp + src/test/rpc/DepositAuthorized_test.cpp + src/test/rpc/DeliveredAmount_test.cpp + src/test/rpc/Feature_test.cpp + src/test/rpc/GatewayBalances_test.cpp + src/test/rpc/GetCounts_test.cpp + src/test/rpc/JSONRPC_test.cpp + src/test/rpc/KeyGeneration_test.cpp + src/test/rpc/LedgerClosed_test.cpp + src/test/rpc/LedgerData_test.cpp + src/test/rpc/LedgerRPC_test.cpp + src/test/rpc/LedgerRequestRPC_test.cpp + src/test/rpc/ManifestRPC_test.cpp + src/test/rpc/NodeToShardRPC_test.cpp + src/test/rpc/NoRippleCheck_test.cpp + src/test/rpc/NoRipple_test.cpp + src/test/rpc/OwnerInfo_test.cpp + src/test/rpc/Peers_test.cpp + src/test/rpc/ReportingETL_test.cpp + src/test/rpc/Roles_test.cpp + src/test/rpc/RPCCall_test.cpp + src/test/rpc/RPCOverload_test.cpp + src/test/rpc/RobustTransaction_test.cpp + src/test/rpc/ServerDefinitions_test.cpp + src/test/rpc/ServerInfo_test.cpp + src/test/rpc/ShardArchiveHandler_test.cpp + src/test/rpc/Status_test.cpp + src/test/rpc/Subscribe_test.cpp + src/test/rpc/Transaction_test.cpp + src/test/rpc/TransactionEntry_test.cpp + src/test/rpc/TransactionHistory_test.cpp + src/test/rpc/ValidatorInfo_test.cpp + src/test/rpc/ValidatorRPC_test.cpp + src/test/rpc/Version_test.cpp + #[===============================[ + test sources: + subdir: server + #]===============================] + src/test/server/ServerStatus_test.cpp + src/test/server/Server_test.cpp + #[===============================[ + test sources: + subdir: shamap + #]===============================] + src/test/shamap/FetchPack_test.cpp + src/test/shamap/SHAMapSync_test.cpp + src/test/shamap/SHAMap_test.cpp + #[===============================[ + test sources: + subdir: unit_test + #]===============================] + src/test/unit_test/multi_runner.cpp) +endif () #tests + +target_link_libraries (rippled + Ripple::boost + Ripple::opts + Ripple::libs + Ripple::xrpl_core + ) +exclude_if_included (rippled) +# define a macro for tests that might need to +# be exluded or run differently in CI environment +if (is_ci) + target_compile_definitions(rippled PRIVATE RIPPLED_RUNNING_IN_CI) +endif () + +if(reporting) +set_target_properties(rippled PROPERTIES OUTPUT_NAME rippled-reporting) +get_target_property(BIN_NAME rippled OUTPUT_NAME) +message(STATUS "Reporting mode build: rippled renamed ${BIN_NAME}") + target_compile_definitions(rippled PRIVATE RIPPLED_REPORTING) +endif() + +# any files that don't play well with unity should be added here +if (tests) + set_source_files_properties( + # these two seem to produce conflicts in beast teardown template methods + src/test/rpc/ValidatorRPC_test.cpp + src/test/rpc/ShardArchiveHandler_test.cpp + PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) +endif () #tests + +if(ACL_LIBRARY) + target_link_libraries(rippled ${ACL_LIBRARY}) +endif() diff --git a/Release.Builds/Builds/CMake/RippledCov.cmake b/Release.Builds/Builds/CMake/RippledCov.cmake new file mode 100644 index 000000000..e177aa52a --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledCov.cmake @@ -0,0 +1,98 @@ +#[===================================================================[ + coverage report target +#]===================================================================] + +if (coverage) + if (is_clang) + if (APPLE) + execute_process (COMMAND xcrun -f llvm-profdata + OUTPUT_VARIABLE LLVM_PROFDATA + OUTPUT_STRIP_TRAILING_WHITESPACE) + else () + find_program (LLVM_PROFDATA llvm-profdata) + endif () + if (NOT LLVM_PROFDATA) + message (WARNING "unable to find llvm-profdata - skipping coverage_report target") + endif () + + if (APPLE) + execute_process (COMMAND xcrun -f llvm-cov + OUTPUT_VARIABLE LLVM_COV + OUTPUT_STRIP_TRAILING_WHITESPACE) + else () + find_program (LLVM_COV llvm-cov) + endif () + if (NOT LLVM_COV) + message (WARNING "unable to find llvm-cov - skipping coverage_report target") + endif () + + set (extract_pattern "") + if (coverage_core_only) + set (extract_pattern "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/") + endif () + + if (LLVM_COV AND LLVM_PROFDATA) + add_custom_target (coverage_report + USES_TERMINAL + COMMAND ${CMAKE_COMMAND} -E echo "Generating coverage - results will be in ${CMAKE_BINARY_DIR}/coverage/index.html." + COMMAND ${CMAKE_COMMAND} -E echo "Running rippled tests." + COMMAND rippled --unittest$<$:=${coverage_test}> --quiet --unittest-log + COMMAND ${LLVM_PROFDATA} + merge -sparse default.profraw -o rip.profdata + COMMAND ${CMAKE_COMMAND} -E echo "Summary of coverage:" + COMMAND ${LLVM_COV} + report -instr-profile=rip.profdata + $ ${extract_pattern} + # generate html report + COMMAND ${LLVM_COV} + show -format=html -output-dir=${CMAKE_BINARY_DIR}/coverage + -instr-profile=rip.profdata + $ ${extract_pattern} + BYPRODUCTS coverage/index.html) + endif () + elseif (is_gcc) + find_program (LCOV lcov) + if (NOT LCOV) + message (WARNING "unable to find lcov - skipping coverage_report target") + endif () + + find_program (GENHTML genhtml) + if (NOT GENHTML) + message (WARNING "unable to find genhtml - skipping coverage_report target") + endif () + + set (extract_pattern "*") + if (coverage_core_only) + set (extract_pattern "*/src/ripple/*") + endif () + + if (LCOV AND GENHTML) + add_custom_target (coverage_report + USES_TERMINAL + COMMAND ${CMAKE_COMMAND} -E echo "Generating coverage- results will be in ${CMAKE_BINARY_DIR}/coverage/index.html." + # create baseline info file + COMMAND ${LCOV} + --no-external -d "${CMAKE_CURRENT_SOURCE_DIR}" -c -d . -i -o baseline.info + | grep -v "ignoring data for external file" + # run tests + COMMAND ${CMAKE_COMMAND} -E echo "Running rippled tests for coverage report." + COMMAND rippled --unittest$<$:=${coverage_test}> --quiet --unittest-log + # Create test coverage data file + COMMAND ${LCOV} + --no-external -d "${CMAKE_CURRENT_SOURCE_DIR}" -c -d . -o tests.info + | grep -v "ignoring data for external file" + # Combine baseline and test coverage data + COMMAND ${LCOV} + -a baseline.info -a tests.info -o lcov-all.info + # extract our files + COMMAND ${LCOV} + -e lcov-all.info "${extract_pattern}" -o lcov.info + COMMAND ${CMAKE_COMMAND} -E echo "Summary of coverage:" + COMMAND ${LCOV} --summary lcov.info + # generate HTML report + COMMAND ${GENHTML} + -o ${CMAKE_BINARY_DIR}/coverage lcov.info + BYPRODUCTS coverage/index.html) + endif () + endif () +endif () diff --git a/Release.Builds/Builds/CMake/RippledDocs.cmake b/Release.Builds/Builds/CMake/RippledDocs.cmake new file mode 100644 index 000000000..6cb8f730d --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledDocs.cmake @@ -0,0 +1,79 @@ +#[===================================================================[ + docs target (optional) +#]===================================================================] +if (tests) + find_package (Doxygen) + if (NOT TARGET Doxygen::doxygen) + message (STATUS "doxygen executable not found -- skipping docs target") + return () + endif () + + set (doxygen_output_directory "${CMAKE_BINARY_DIR}/docs") + set (doxygen_include_path "${CMAKE_CURRENT_SOURCE_DIR}/src") + set (doxygen_index_file "${doxygen_output_directory}/html/index.html") + set (doxyfile "${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile") + + file (GLOB_RECURSE doxygen_input + docs/*.md + src/ripple/*.h + src/ripple/*.cpp + src/ripple/*.md + src/test/*.h + src/test/*.md + Builds/*/README.md) + list (APPEND doxygen_input + README.md + RELEASENOTES.md + src/README.md) + set (dependencies "${doxygen_input}" "${doxyfile}") + + function (verbose_find_path variable name) + # find_path sets a CACHE variable, so don't try using a "local" variable. + find_path (${variable} "${name}" ${ARGN}) + if (NOT ${variable}) + message (NOTICE "could not find ${name}") + else () + message (STATUS "found ${name}: ${${variable}}/${name}") + endif () + endfunction () + + verbose_find_path (doxygen_plantuml_jar_path plantuml.jar PATH_SUFFIXES share/plantuml) + verbose_find_path (doxygen_dot_path dot) + + # https://en.cppreference.com/w/Cppreference:Archives + # https://stackoverflow.com/questions/60822559/how-to-move-a-file-download-from-configure-step-to-build-step + set (download_script "${CMAKE_BINARY_DIR}/docs/download-cppreference.cmake") + file (WRITE + "${download_script}" + "file (DOWNLOAD \ + http://upload.cppreference.com/mwiki/images/b/b2/html_book_20190607.zip \ + ${CMAKE_BINARY_DIR}/docs/cppreference.zip \ + EXPECTED_HASH MD5=82b3a612d7d35a83e3cb1195a63689ab \ + )\n \ + execute_process ( \ + COMMAND \"${CMAKE_COMMAND}\" -E tar -xf cppreference.zip \ + )\n" + ) + set (tagfile "${CMAKE_BINARY_DIR}/docs/cppreference-doxygen-web.tag.xml") + add_custom_command ( + OUTPUT "${tagfile}" + COMMAND "${CMAKE_COMMAND}" -P "${download_script}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/docs" + ) + set (doxygen_tagfiles "${tagfile}=http://en.cppreference.com/w/") + + add_custom_command ( + OUTPUT "${doxygen_index_file}" + COMMAND "${CMAKE_COMMAND}" -E env + "DOXYGEN_OUTPUT_DIRECTORY=${doxygen_output_directory}" + "DOXYGEN_INCLUDE_PATH=${doxygen_include_path}" + "DOXYGEN_TAGFILES=${doxygen_tagfiles}" + "DOXYGEN_PLANTUML_JAR_PATH=${doxygen_plantuml_jar_path}" + "DOXYGEN_DOT_PATH=${doxygen_dot_path}" + "${DOXYGEN_EXECUTABLE}" "${doxyfile}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + DEPENDS "${dependencies}" "${tagfile}") + add_custom_target (docs + DEPENDS "${doxygen_index_file}" + SOURCES "${dependencies}") +endif () diff --git a/Release.Builds/Builds/CMake/RippledInstall.cmake b/Release.Builds/Builds/CMake/RippledInstall.cmake new file mode 100644 index 000000000..3cdeca9e6 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledInstall.cmake @@ -0,0 +1,62 @@ +#[===================================================================[ + install stuff +#]===================================================================] + +install ( + TARGETS + ed25519-donna + common + opts + ripple_syslibs + ripple_boost + xrpl_core + EXPORT RippleExports + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include) + +if(${INSTALL_SECP256K1}) +install ( + TARGETS + secp256k1 + EXPORT RippleExports + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include) +endif() + +install (EXPORT RippleExports + FILE RippleTargets.cmake + NAMESPACE Ripple:: + DESTINATION lib/cmake/ripple) +include (CMakePackageConfigHelpers) +write_basic_package_version_file ( + RippleConfigVersion.cmake + VERSION ${rippled_version} + COMPATIBILITY SameMajorVersion) + +if (is_root_project) + install (TARGETS rippled RUNTIME DESTINATION bin) + set_target_properties(rippled PROPERTIES INSTALL_RPATH_USE_LINK_PATH ON) + install ( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/RippleConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/RippleConfigVersion.cmake + DESTINATION lib/cmake/ripple) + # sample configs should not overwrite existing files + # install if-not-exists workaround as suggested by + # https://cmake.org/Bug/view.php?id=12646 + install(CODE " + macro (copy_if_not_exists SRC DEST NEWNAME) + if (NOT EXISTS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${DEST}/\${NEWNAME}\") + file (INSTALL FILE_PERMISSIONS OWNER_READ OWNER_WRITE DESTINATION \"\${CMAKE_INSTALL_PREFIX}/\${DEST}\" FILES \"\${SRC}\" RENAME \"\${NEWNAME}\") + else () + message (\"-- Skipping : \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${DEST}/\${NEWNAME}\") + endif () + endmacro() + copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/rippled-example.cfg\" etc rippled.cfg) + copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/validators-example.txt\" etc validators.txt) + ") +endif () diff --git a/Release.Builds/Builds/CMake/RippledInterface.cmake b/Release.Builds/Builds/CMake/RippledInterface.cmake new file mode 100644 index 000000000..28a531246 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledInterface.cmake @@ -0,0 +1,103 @@ +#[===================================================================[ + rippled compile options/settings via an interface library +#]===================================================================] + +add_library (opts INTERFACE) +add_library (Ripple::opts ALIAS opts) +target_compile_definitions (opts + INTERFACE + BOOST_ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS + $<$: + BOOST_ASIO_NO_DEPRECATED + BOOST_FILESYSTEM_NO_DEPRECATED + > + $<$>: + BOOST_COROUTINES_NO_DEPRECATION_WARNING + BOOST_BEAST_ALLOW_DEPRECATED + BOOST_FILESYSTEM_DEPRECATED + > + $<$:BEAST_NO_UNIT_TEST_INLINE=1> + $<$:BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES=1> + $<$:RIPPLE_SINGLE_IO_SERVICE_THREAD=1>) +target_compile_options (opts + INTERFACE + $<$,$>:-Wsuggest-override> + $<$:-fno-omit-frame-pointer> + $<$,$>:-fprofile-arcs -ftest-coverage> + $<$,$>:-fprofile-instr-generate -fcoverage-mapping> + $<$:-pg> + $<$,$>:-p>) + +target_link_libraries (opts + INTERFACE + $<$,$>:-fprofile-arcs -ftest-coverage> + $<$,$>:-fprofile-instr-generate -fcoverage-mapping> + $<$:-pg> + $<$,$>:-p>) + +if (jemalloc) + if (static) + set(JEMALLOC_USE_STATIC ON CACHE BOOL "" FORCE) + endif () + find_package (jemalloc REQUIRED) + target_compile_definitions (opts INTERFACE PROFILE_JEMALLOC) + target_include_directories (opts SYSTEM INTERFACE ${JEMALLOC_INCLUDE_DIRS}) + target_link_libraries (opts INTERFACE ${JEMALLOC_LIBRARIES}) + get_filename_component (JEMALLOC_LIB_PATH ${JEMALLOC_LIBRARIES} DIRECTORY) + ## TODO see if we can use the BUILD_RPATH target property (is it transitive?) + set (CMAKE_BUILD_RPATH ${CMAKE_BUILD_RPATH} ${JEMALLOC_LIB_PATH}) +endif () + +if (san) + target_compile_options (opts + INTERFACE + # sanitizers recommend minimum of -O1 for reasonable performance + $<$:-O1> + ${SAN_FLAG} + -fno-omit-frame-pointer) + target_compile_definitions (opts + INTERFACE + $<$:SANITIZER=ASAN> + $<$:SANITIZER=TSAN> + $<$:SANITIZER=MSAN> + $<$:SANITIZER=UBSAN>) + target_link_libraries (opts INTERFACE ${SAN_FLAG} ${SAN_LIB}) +endif () + +#[===================================================================[ + rippled transitive library deps via an interface library +#]===================================================================] + +add_library (ripple_syslibs INTERFACE) +add_library (Ripple::syslibs ALIAS ripple_syslibs) +target_link_libraries (ripple_syslibs + INTERFACE + $<$: + legacy_stdio_definitions.lib + Shlwapi + kernel32 + user32 + gdi32 + winspool + comdlg32 + advapi32 + shell32 + ole32 + oleaut32 + uuid + odbc32 + odbccp32 + crypt32 + > + $<$>:dl> + $<$,$>>:rt>) + +if (NOT MSVC) + set (THREADS_PREFER_PTHREAD_FLAG ON) + find_package (Threads) + target_link_libraries (ripple_syslibs INTERFACE Threads::Threads) +endif () + +add_library (ripple_libs INTERFACE) +add_library (Ripple::libs ALIAS ripple_libs) +target_link_libraries (ripple_libs INTERFACE Ripple::syslibs) diff --git a/Release.Builds/Builds/CMake/RippledMultiConfig.cmake b/Release.Builds/Builds/CMake/RippledMultiConfig.cmake new file mode 100644 index 000000000..3bc500b53 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledMultiConfig.cmake @@ -0,0 +1,39 @@ +#[===================================================================[ + multiconfig misc +#]===================================================================] + +if (is_multiconfig) + # This code finds all source files in the src subdirectory for inclusion + # in the IDE file tree as non-compiled sources. Since this file list will + # have some overlap with files we have already added to our targets to + # be compiled, we explicitly remove any of these target source files from + # this list. + file (GLOB_RECURSE all_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + CONFIGURE_DEPENDS + src/*.* Builds/*.md docs/*.md src/*.md Builds/*.cmake) + file(GLOB md_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS + *.md) + LIST(APPEND all_sources ${md_files}) + foreach (_target secp256k1 ed25519-donna pbufs xrpl_core rippled) + get_target_property (_type ${_target} TYPE) + if(_type STREQUAL "INTERFACE_LIBRARY") + continue() + endif() + get_target_property (_src ${_target} SOURCES) + list (REMOVE_ITEM all_sources ${_src}) + endforeach () + target_sources (rippled PRIVATE ${all_sources}) + set_property ( + SOURCE ${all_sources} + APPEND + PROPERTY HEADER_FILE_ONLY true) + if (MSVC) + set_property( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + PROPERTY VS_STARTUP_PROJECT rippled) + endif () + + group_sources(src) + group_sources(docs) + group_sources(Builds) +endif () diff --git a/Release.Builds/Builds/CMake/RippledNIH.cmake b/Release.Builds/Builds/CMake/RippledNIH.cmake new file mode 100644 index 000000000..60ab3e4bf --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledNIH.cmake @@ -0,0 +1,33 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/RippledSanity.cmake b/Release.Builds/Builds/CMake/RippledSanity.cmake new file mode 100644 index 000000000..9e7fd113a --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledSanity.cmake @@ -0,0 +1,86 @@ +#[===================================================================[ + convenience variables and sanity checks +#]===================================================================] + +if (NOT ep_procs) + ProcessorCount(ep_procs) + if (ep_procs GREATER 1) + # never use more than half of cores for EP builds + math (EXPR ep_procs "${ep_procs} / 2") + message (STATUS "Using ${ep_procs} cores for ExternalProject builds.") + endif () +endif () +get_property (is_multiconfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if (is_multiconfig STREQUAL "NOTFOUND") + if (${CMAKE_GENERATOR} STREQUAL "Xcode" OR ${CMAKE_GENERATOR} MATCHES "^Visual Studio") + set (is_multiconfig TRUE) + endif () +endif () + +set (CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE) +if (NOT is_multiconfig) + if (NOT CMAKE_BUILD_TYPE) + message (STATUS "Build type not specified - defaulting to Release") + set (CMAKE_BUILD_TYPE Release CACHE STRING "build type" FORCE) + elseif (NOT (CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL Release)) + # for simplicity, these are the only two config types we care about. Limiting + # the build types simplifies dealing with external project builds especially + message (FATAL_ERROR " *** Only Debug or Release build types are currently supported ***") + endif () +endif () + +get_directory_property(has_parent PARENT_DIRECTORY) +if (has_parent) + set (is_root_project OFF) +else () + set (is_root_project ON) +endif () + +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang") # both Clang and AppleClang + set (is_clang TRUE) + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND + CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) + message (FATAL_ERROR "This project requires clang 8 or later") + endif () + # TODO min AppleClang version check ? +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set (is_gcc TRUE) + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) + message (FATAL_ERROR "This project requires GCC 8 or later") + endif () +endif () +if (CMAKE_GENERATOR STREQUAL "Xcode") + set (is_xcode TRUE) +endif () + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + set (is_linux TRUE) +else () + set (is_linux FALSE) +endif () + +if ("$ENV{CI}" STREQUAL "true" OR "$ENV{CONTINUOUS_INTEGRATION}" STREQUAL "true") + set (is_ci TRUE) +else () + set (is_ci FALSE) +endif () + +# check for in-source build and fail +if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + message (FATAL_ERROR "Builds (in-source) are not allowed in " + "${CMAKE_CURRENT_SOURCE_DIR}. Please remove CMakeCache.txt and the CMakeFiles " + "directory from ${CMAKE_CURRENT_SOURCE_DIR} and try building in a separate directory.") +endif () + +if (MSVC AND CMAKE_GENERATOR_PLATFORM STREQUAL "Win32") + message (FATAL_ERROR "Visual Studio 32-bit build is not supported.") +endif () + +if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8) + message (FATAL_ERROR "Rippled requires a 64 bit target architecture.\n" + "The most likely cause of this warning is trying to build rippled with a 32-bit OS.") +endif () + +if (APPLE AND NOT HOMEBREW) + find_program (HOMEBREW brew) +endif () diff --git a/Release.Builds/Builds/CMake/RippledSettings.cmake b/Release.Builds/Builds/CMake/RippledSettings.cmake new file mode 100644 index 000000000..0cdfb8e84 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledSettings.cmake @@ -0,0 +1,122 @@ +#[===================================================================[ + declare user options/settings +#]===================================================================] + +option (assert "Enables asserts, even in release builds" OFF) + +option (reporting "Build rippled with reporting mode enabled" OFF) + +option (tests "Build tests" ON) + +option (unity "Creates a build using UNITY support in cmake. This is the default" ON) +if (unity) + if (NOT is_ci) + set (CMAKE_UNITY_BUILD_BATCH_SIZE 15 CACHE STRING "") + endif () +endif () +if (is_gcc OR is_clang) + option (coverage "Generates coverage info." OFF) + option (profile "Add profiling flags" OFF) + set (coverage_test "" CACHE STRING + "On gcc & clang, the specific unit test(s) to run for coverage. Default is all tests.") + if (coverage_test AND NOT coverage) + set (coverage ON CACHE BOOL "gcc/clang only" FORCE) + endif () + option (coverage_core_only + "Include only src/ripple files when generating coverage report. \ + Set to OFF to include all sources in coverage report." + ON) + option (wextra "compile with extra gcc/clang warnings enabled" ON) +else () + set (profile OFF CACHE BOOL "gcc/clang only" FORCE) + set (coverage OFF CACHE BOOL "gcc/clang only" FORCE) + set (wextra OFF CACHE BOOL "gcc/clang only" FORCE) +endif () +if (is_linux) + option (BUILD_SHARED_LIBS "build shared ripple libraries" OFF) + option (static "link protobuf, openssl, libc++, and boost statically" ON) + option (perf "Enables flags that assist with perf recording" OFF) + option (use_gold "enables detection of gold (binutils) linker" ON) +else () + # we are not ready to allow shared-libs on windows because it would require + # export declarations. On macos it's more feasible, but static openssl + # produces odd linker errors, thus we disable shared lib builds for now. + set (BUILD_SHARED_LIBS OFF CACHE BOOL "build shared ripple libraries - OFF for win/macos" FORCE) + set (static ON CACHE BOOL "static link, linux only. ON for WIN/macos" FORCE) + set (perf OFF CACHE BOOL "perf flags, linux only" FORCE) + set (use_gold OFF CACHE BOOL "gold linker, linux only" FORCE) +endif () +if (is_clang) + option (use_lld "enables detection of lld linker" ON) +else () + set (use_lld OFF CACHE BOOL "try lld linker, clang only" FORCE) +endif () +option (jemalloc "Enables jemalloc for heap profiling" OFF) +option (werr "treat warnings as errors" OFF) +option (local_protobuf + "Force a local build of protobuf instead of looking for an installed version." OFF) +option (local_grpc + "Force a local build of gRPC instead of looking for an installed version." OFF) + +# this one is a string and therefore can't be an option +set (san "" CACHE STRING "On gcc & clang, add sanitizer instrumentation") +set_property (CACHE san PROPERTY STRINGS ";undefined;memory;address;thread") +if (san) + string (TOLOWER ${san} san) + set (SAN_FLAG "-fsanitize=${san}") + set (SAN_LIB "") + if (is_gcc) + if (san STREQUAL "address") + set (SAN_LIB "asan") + elseif (san STREQUAL "thread") + set (SAN_LIB "tsan") + elseif (san STREQUAL "memory") + set (SAN_LIB "msan") + elseif (san STREQUAL "undefined") + set (SAN_LIB "ubsan") + endif () + endif () + set (_saved_CRL ${CMAKE_REQUIRED_LIBRARIES}) + set (CMAKE_REQUIRED_LIBRARIES "${SAN_FLAG};${SAN_LIB}") + check_cxx_compiler_flag (${SAN_FLAG} COMPILER_SUPPORTS_SAN) + set (CMAKE_REQUIRED_LIBRARIES ${_saved_CRL}) + if (NOT COMPILER_SUPPORTS_SAN) + message (FATAL_ERROR "${san} sanitizer does not seem to be supported by your compiler") + endif () +endif () +set (container_label "" CACHE STRING "tag to use for package building containers") +option (packages_only + "ONLY generate package building targets. This is special use-case and almost \ + certainly not what you want. Use with caution as you won't be able to build \ + any compiled targets locally." OFF) +option (have_package_container + "Sometimes you already have the tagged container you want to use for package \ + building and you don't want docker to rebuild it. This flag will detach the \ + dependency of the package build from the container build. It's an advanced \ + use case and most likely you should not be touching this flag." OFF) + +# the remaining options are obscure and rarely used +option (beast_no_unit_test_inline + "Prevents unit test definitions from being inserted into global table" + OFF) +option (single_io_service_thread + "Restricts the number of threads calling io_service::run to one. \ + This can be useful when debugging." + OFF) +option (boost_show_deprecated + "Allow boost to fail on deprecated usage. Only useful if you're trying\ + to find deprecated calls." + OFF) +option (beast_hashers + "Use local implementations for sha/ripemd hashes (experimental, not recommended)" + OFF) + +if (WIN32) + option (beast_disable_autolink "Disables autolinking of system libraries on WIN32" OFF) +else () + set (beast_disable_autolink OFF CACHE BOOL "WIN32 only" FORCE) +endif () +if (coverage) + message (STATUS "coverage build requested - forcing Debug build") + set (CMAKE_BUILD_TYPE Debug CACHE STRING "build type" FORCE) +endif () diff --git a/Release.Builds/Builds/CMake/RippledValidatorKeys.cmake b/Release.Builds/Builds/CMake/RippledValidatorKeys.cmake new file mode 100644 index 000000000..dfd56f9f1 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledValidatorKeys.cmake @@ -0,0 +1,22 @@ +option (validator_keys "Enables building of validator-keys-tool as a separate target (imported via FetchContent)" OFF) + +if (validator_keys) + git_branch (current_branch) + # default to tracking VK develop branch unless we are on master/release + if (NOT (current_branch STREQUAL "master" OR current_branch STREQUAL "release")) + set (current_branch "develop") + endif () + message (STATUS "tracking ValidatorKeys branch: ${current_branch}") + + FetchContent_Declare ( + validator_keys_src + GIT_REPOSITORY https://github.com/ripple/validator-keys-tool.git + GIT_TAG "${current_branch}" + ) + FetchContent_GetProperties (validator_keys_src) + if (NOT validator_keys_src_POPULATED) + message (STATUS "Pausing to download ValidatorKeys...") + FetchContent_Populate (validator_keys_src) + endif () + add_subdirectory (${validator_keys_src_SOURCE_DIR} ${CMAKE_BINARY_DIR}/validator-keys) +endif () diff --git a/Release.Builds/Builds/CMake/RippledVersion.cmake b/Release.Builds/Builds/CMake/RippledVersion.cmake new file mode 100644 index 000000000..936852af5 --- /dev/null +++ b/Release.Builds/Builds/CMake/RippledVersion.cmake @@ -0,0 +1,15 @@ +#[===================================================================[ + read version from source +#]===================================================================] + +file (STRINGS src/ripple/protocol/impl/BuildInfo.cpp BUILD_INFO) +foreach (line_ ${BUILD_INFO}) + if (line_ MATCHES "versionString[ ]*=[ ]*\"(.+)\"") + set (rippled_version ${CMAKE_MATCH_1}) + endif () +endforeach () +if (rippled_version) + message (STATUS "rippled version: ${rippled_version}") +else () + message (FATAL_ERROR "unable to determine rippled version") +endif () diff --git a/Release.Builds/Builds/CMake/SociConfig.cmake.patched b/Release.Builds/Builds/CMake/SociConfig.cmake.patched new file mode 100644 index 000000000..11bcd1f3d --- /dev/null +++ b/Release.Builds/Builds/CMake/SociConfig.cmake.patched @@ -0,0 +1,106 @@ +################################################################################ +# SociConfig.cmake - CMake build configuration of SOCI library +################################################################################ +# Copyright (C) 2010 Mateusz Loskot +# +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) +################################################################################ + +include(CheckCXXSymbolExists) + +if(WIN32) + check_cxx_symbol_exists("_M_AMD64" "" SOCI_TARGET_ARCH_X64) + if(NOT RTC_ARCH_X64) + check_cxx_symbol_exists("_M_IX86" "" SOCI_TARGET_ARCH_X86) + endif(NOT RTC_ARCH_X64) + # add check for arm here + # see http://msdn.microsoft.com/en-us/library/b0084kay.aspx +else(WIN32) + check_cxx_symbol_exists("__i386__" "" SOCI_TARGET_ARCH_X86) + check_cxx_symbol_exists("__x86_64__" "" SOCI_TARGET_ARCH_X64) + check_cxx_symbol_exists("__arm__" "" SOCI_TARGET_ARCH_ARM) +endif(WIN32) + +if(NOT DEFINED LIB_SUFFIX) + if(SOCI_TARGET_ARCH_X64) + set(_lib_suffix "64") + else() + set(_lib_suffix "") + endif() + set(LIB_SUFFIX ${_lib_suffix} CACHE STRING "Specifies suffix for the lib directory") +endif() + +# +# C++11 Option +# + +if(NOT SOCI_CXX_C11) + set (SOCI_CXX_C11 OFF CACHE BOOL "Build to the C++11 standard") +endif() + +# +# Force compilation flags and set desired warnings level +# + +if (MSVC) + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + add_definitions(-D_CRT_NONSTDC_NO_WARNING) + add_definitions(-D_SCL_SECURE_NO_WARNINGS) + + if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /we4266") + endif() + +else() + + set(SOCI_GCC_CLANG_COMMON_FLAGS "") + # "-pedantic -Werror -Wno-error=parentheses -Wall -Wextra -Wpointer-arith -Wcast-align -Wcast-qual -Wfloat-equal -Woverloaded-virtual -Wredundant-decls -Wno-long-long") + + + if (SOCI_CXX_C11) + set(SOCI_CXX_VERSION_FLAGS "-std=c++11") + else() + set(SOCI_CXX_VERSION_FLAGS "-std=gnu++98") + endif() + + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER}" MATCHES "clang") + + if(NOT CMAKE_CXX_COMPILER_VERSION LESS 3.1 AND SOCI_ASAN) + set(SOCI_GCC_CLANG_COMMON_FLAGS "${SOCI_GCC_CLANG_COMMON_FLAGS} -fsanitize=address") + endif() + + # enforce C++11 for Clang + set(SOCI_CXX_C11 ON) + set(SOCI_CXX_VERSION_FLAGS "-std=c++11") + add_definitions(-DCATCH_CONFIG_CPP11_NO_IS_ENUM) + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SOCI_GCC_CLANG_COMMON_FLAGS} ${SOCI_CXX_VERSION_FLAGS}") + + elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + + if(NOT CMAKE_CXX_COMPILER_VERSION LESS 4.8 AND SOCI_ASAN) + set(SOCI_GCC_CLANG_COMMON_FLAGS "${SOCI_GCC_CLANG_COMMON_FLAGS} -fsanitize=address") + endif() + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SOCI_GCC_CLANG_COMMON_FLAGS} ${SOCI_CXX_VERSION_FLAGS} ") + if (CMAKE_COMPILER_IS_GNUCXX) + if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-variadic-macros") + endif() + endif() + + else() + message(WARNING "Unknown toolset - using default flags to build SOCI") + endif() + +endif() + +# Set SOCI_HAVE_* variables for soci-config.h generator +set(SOCI_HAVE_CXX_C11 ${SOCI_CXX_C11} CACHE INTERNAL "Enables C++11 support") diff --git a/Release.Builds/Builds/CMake/deps/Boost.cmake b/Release.Builds/Builds/CMake/deps/Boost.cmake new file mode 100644 index 000000000..5038234bc --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Boost.cmake @@ -0,0 +1,96 @@ +#[===================================================================[ + NIH dep: boost +#]===================================================================] + +if((NOT DEFINED BOOST_ROOT) AND(DEFINED ENV{BOOST_ROOT})) + set(BOOST_ROOT $ENV{BOOST_ROOT}) +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(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 + container + context + coroutine + date_time + filesystem + program_options + regex + system + thread) + +add_library(ripple_boost INTERFACE) +add_library(Ripple::boost ALIAS ripple_boost) +if(is_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::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() diff --git a/Release.Builds/Builds/CMake/deps/Ed25519-donna.cmake b/Release.Builds/Builds/CMake/deps/Ed25519-donna.cmake new file mode 100644 index 000000000..7f352423f --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Ed25519-donna.cmake @@ -0,0 +1,28 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/FindBoost.cmake b/Release.Builds/Builds/CMake/deps/FindBoost.cmake new file mode 100644 index 000000000..121e72641 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/FindBoost.cmake @@ -0,0 +1,2170 @@ +# 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 + +#------------------------------------------------------------------------------- +# 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() + if(NOT Boost_VERSION_STRING VERSION_LESS 1.77.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() + + # 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/Release.Builds/Builds/CMake/deps/Findjemalloc.cmake b/Release.Builds/Builds/CMake/deps/Findjemalloc.cmake new file mode 100644 index 000000000..820ceeed4 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findjemalloc.cmake @@ -0,0 +1,47 @@ +# - 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/Release.Builds/Builds/CMake/deps/Findlibarchive_pc.cmake b/Release.Builds/Builds/CMake/deps/Findlibarchive_pc.cmake new file mode 100644 index 000000000..8f248b287 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findlibarchive_pc.cmake @@ -0,0 +1,22 @@ +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/Release.Builds/Builds/CMake/deps/Findlz4.cmake b/Release.Builds/Builds/CMake/deps/Findlz4.cmake new file mode 100644 index 000000000..835f5989d --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findlz4.cmake @@ -0,0 +1,24 @@ +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/Release.Builds/Builds/CMake/deps/Findsecp256k1.cmake b/Release.Builds/Builds/CMake/deps/Findsecp256k1.cmake new file mode 100644 index 000000000..7be3d0272 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findsecp256k1.cmake @@ -0,0 +1,24 @@ +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/Release.Builds/Builds/CMake/deps/Findsnappy.cmake b/Release.Builds/Builds/CMake/deps/Findsnappy.cmake new file mode 100644 index 000000000..ddf3cb280 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findsnappy.cmake @@ -0,0 +1,24 @@ +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/Release.Builds/Builds/CMake/deps/Findsoci.cmake b/Release.Builds/Builds/CMake/deps/Findsoci.cmake new file mode 100644 index 000000000..c3d910623 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findsoci.cmake @@ -0,0 +1,19 @@ +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/Release.Builds/Builds/CMake/deps/Findsqlite.cmake b/Release.Builds/Builds/CMake/deps/Findsqlite.cmake new file mode 100644 index 000000000..ef5c6befc --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Findsqlite.cmake @@ -0,0 +1,24 @@ +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/Release.Builds/Builds/CMake/deps/Libarchive.cmake b/Release.Builds/Builds/CMake/deps/Libarchive.cmake new file mode 100644 index 000000000..57b8d2e39 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Libarchive.cmake @@ -0,0 +1,163 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Lz4.cmake b/Release.Builds/Builds/CMake/deps/Lz4.cmake new file mode 100644 index 000000000..15d890692 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Lz4.cmake @@ -0,0 +1,79 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Nudb.cmake b/Release.Builds/Builds/CMake/deps/Nudb.cmake new file mode 100644 index 000000000..9698d3f06 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Nudb.cmake @@ -0,0 +1,31 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/OpenSSL.cmake b/Release.Builds/Builds/CMake/deps/OpenSSL.cmake new file mode 100644 index 000000000..ad5117aac --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/OpenSSL.cmake @@ -0,0 +1,48 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Postgres.cmake b/Release.Builds/Builds/CMake/deps/Postgres.cmake new file mode 100644 index 000000000..bb94832a4 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Postgres.cmake @@ -0,0 +1,70 @@ +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/Release.Builds/Builds/CMake/deps/Protobuf.cmake b/Release.Builds/Builds/CMake/deps/Protobuf.cmake new file mode 100644 index 000000000..35d5b9f0f --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Protobuf.cmake @@ -0,0 +1,155 @@ +#[===================================================================[ + 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. +#]===================================================================] + +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) + + 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 + 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) diff --git a/Release.Builds/Builds/CMake/deps/Rocksdb.cmake b/Release.Builds/Builds/CMake/deps/Rocksdb.cmake new file mode 100644 index 000000000..2c832c593 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Rocksdb.cmake @@ -0,0 +1,177 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Secp256k1.cmake b/Release.Builds/Builds/CMake/deps/Secp256k1.cmake new file mode 100644 index 000000000..319731562 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Secp256k1.cmake @@ -0,0 +1,58 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Snappy.cmake b/Release.Builds/Builds/CMake/deps/Snappy.cmake new file mode 100644 index 000000000..331ac2fbe --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Snappy.cmake @@ -0,0 +1,77 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Soci.cmake b/Release.Builds/Builds/CMake/deps/Soci.cmake new file mode 100644 index 000000000..d165d6e1f --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Soci.cmake @@ -0,0 +1,165 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/Sqlite.cmake b/Release.Builds/Builds/CMake/deps/Sqlite.cmake new file mode 100644 index 000000000..7b34c1121 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/Sqlite.cmake @@ -0,0 +1,93 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/WasmEdge.cmake b/Release.Builds/Builds/CMake/deps/WasmEdge.cmake new file mode 100644 index 000000000..56f145f1d --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/WasmEdge.cmake @@ -0,0 +1,84 @@ +#[===================================================================[ + 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 (NIH::WasmEdge ALIAS wasmedge) diff --git a/Release.Builds/Builds/CMake/deps/cassandra.cmake b/Release.Builds/Builds/CMake/deps/cassandra.cmake new file mode 100644 index 000000000..4563a3413 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/cassandra.cmake @@ -0,0 +1,167 @@ +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/Release.Builds/Builds/CMake/deps/date.cmake b/Release.Builds/Builds/CMake/deps/date.cmake new file mode 100644 index 000000000..b9155c264 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/date.cmake @@ -0,0 +1,18 @@ +#[===================================================================[ + 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/Release.Builds/Builds/CMake/deps/gRPC.cmake b/Release.Builds/Builds/CMake/deps/gRPC.cmake new file mode 100644 index 000000000..8dd094175 --- /dev/null +++ b/Release.Builds/Builds/CMake/deps/gRPC.cmake @@ -0,0 +1,364 @@ + +# 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 () + add_library (c-ares::cares ${_static} IMPORTED GLOBAL) + 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_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 () + +#[=================================[ + 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 protobuf::libprotobuf "gRPC::grpc++${grpc_suffix}") +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) diff --git a/Release.Builds/Builds/CMake/echo_file.cmake b/Release.Builds/Builds/CMake/echo_file.cmake new file mode 100644 index 000000000..8a593a789 --- /dev/null +++ b/Release.Builds/Builds/CMake/echo_file.cmake @@ -0,0 +1,17 @@ +#[=========================================================[ + This is a CMake script file that is used to write + the contents of a file to stdout (using the cmake + echo command). The input file is passed via the + IN_FILE variable. +#]=========================================================] + +if (EXISTS ${IN_FILE}) + file (READ ${IN_FILE} contents) + ## only print files that actually have some text in them + if (contents MATCHES "[a-z0-9A-Z]+") + execute_process( + COMMAND + ${CMAKE_COMMAND} -E echo "${contents}") + endif () +endif () + diff --git a/Release.Builds/Builds/CMake/rocks_thirdparty.inc b/Release.Builds/Builds/CMake/rocks_thirdparty.inc new file mode 100644 index 000000000..cba23df71 --- /dev/null +++ b/Release.Builds/Builds/CMake/rocks_thirdparty.inc @@ -0,0 +1,15 @@ +set (THIRDPARTY_LIBS "") + +if(WITH_SNAPPY) + add_definitions(-DSNAPPY) + include_directories(${snappy_INCLUDE_DIRS}) + set (THIRDPARTY_LIBS ${THIRDPARTY_LIBS} ${snappy_LIBRARIES}) +endif() + +if(WITH_LZ4) + add_definitions(-DLZ4) + include_directories(${lz4_INCLUDE_DIRS}) + set (THIRDPARTY_LIBS ${THIRDPARTY_LIBS} ${lz4_LIBRARIES}) +endif() + + diff --git a/Release.Builds/Builds/CMake/rocksdb_build_version.cc.in b/Release.Builds/Builds/CMake/rocksdb_build_version.cc.in new file mode 100644 index 000000000..9ef424669 --- /dev/null +++ b/Release.Builds/Builds/CMake/rocksdb_build_version.cc.in @@ -0,0 +1,71 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +#include + +#include "rocksdb/version.h" +#include "util/string_util.h" + +// The build script may replace these values with real values based +// on whether or not GIT is available and the platform settings +static const std::string rocksdb_build_git_sha = "rocksdb_build_git_sha:@GIT_SHA@"; +static const std::string rocksdb_build_git_tag = "rocksdb_build_git_tag:@GIT_TAG@"; +#define HAS_GIT_CHANGES @GIT_MOD@ +#if HAS_GIT_CHANGES == 0 +// If HAS_GIT_CHANGES is 0, the GIT date is used. +// Use the time the branch/tag was last modified +static const std::string rocksdb_build_date = "rocksdb_build_date:@GIT_DATE@"; +#else +// If HAS_GIT_CHANGES is > 0, the branch/tag has modifications. +// Use the time the build was created. +static const std::string rocksdb_build_date = "rocksdb_build_date:@BUILD_DATE@"; +#endif + +namespace ROCKSDB_NAMESPACE { +static void AddProperty(std::unordered_map *props, const std::string& name) { + size_t colon = name.find(":"); + if (colon != std::string::npos && colon > 0 && colon < name.length() - 1) { + // If we found a "@:", then this property was a build-time substitution that failed. Skip it + size_t at = name.find("@", colon); + if (at != colon + 1) { + // Everything before the colon is the name, after is the value + (*props)[name.substr(0, colon)] = name.substr(colon + 1); + } + } +} + +static std::unordered_map* LoadPropertiesSet() { + auto * properties = new std::unordered_map(); + AddProperty(properties, rocksdb_build_git_sha); + AddProperty(properties, rocksdb_build_git_tag); + AddProperty(properties, rocksdb_build_date); + return properties; +} + +const std::unordered_map& GetRocksBuildProperties() { + static std::unique_ptr> props(LoadPropertiesSet()); + return *props; +} + +std::string GetRocksVersionAsString(bool with_patch) { + std::string version = ToString(ROCKSDB_MAJOR) + "." + ToString(ROCKSDB_MINOR); + if (with_patch) { + return version + "." + ToString(ROCKSDB_PATCH); + } else { + return version; + } +} + +std::string GetRocksBuildInfoAsString(const std::string& program, bool verbose) { + std::string info = program + " (RocksDB) " + GetRocksVersionAsString(true); + if (verbose) { + for (const auto& it : GetRocksBuildProperties()) { + info.append("\n "); + info.append(it.first); + info.append(": "); + info.append(it.second); + } + } + return info; +} +} // namespace ROCKSDB_NAMESPACE + diff --git a/Release.Builds/Builds/CMake/soci_patch.cmake b/Release.Builds/Builds/CMake/soci_patch.cmake new file mode 100644 index 000000000..0c2a75c0d --- /dev/null +++ b/Release.Builds/Builds/CMake/soci_patch.cmake @@ -0,0 +1,49 @@ +# This patches unsigned-types.h in the soci official sources +# so as to remove type range check exceptions that cause +# us trouble when using boost::optional to select int values + +# Soci's CMake setup leaves flags in place that will cause warnings to +# be treated as errors, but some compiler versions throw "new" warnings +# that then cause the build to fail. Simplify that until soci fixes +# those warnings. +if (RIPPLED_SOURCE) + execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${RIPPLED_SOURCE}/Builds/CMake/SociConfig.cmake.patched + cmake/SociConfig.cmake ) +endif () + +# Some versions of CMake erroneously patch external projects on every build. +# If the patch makes no changes, skip it. This workaround can be +# removed once we stop supporting vulnerable versions of CMake. +# https://gitlab.kitware.com/cmake/cmake/-/issues/21086 +file (STRINGS include/soci/unsigned-types.h sourcecode) +# Delete the .patched file if it exists, so it doesn't end up duplicated. +# Trying to remove a file that does not exist is not a problem. +file (REMOVE include/soci/unsigned-types.h.patched) +foreach (line_ ${sourcecode}) + if (line_ MATCHES "^[ \\t]+throw[ ]+soci_error[ ]*\\([ ]*\"Value outside of allowed.+$") + set (line_ "//${CMAKE_MATCH_0}") + endif () + file (APPEND include/soci/unsigned-types.h.patched "${line_}\n") +endforeach () +execute_process( COMMAND ${CMAKE_COMMAND} -E compare_files + include/soci/unsigned-types.h include/soci/unsigned-types.h.patched + RESULT_VARIABLE compare_result +) +if( compare_result EQUAL 0) + message(DEBUG "The soci source and patch files are identical. Make no changes.") + file (REMOVE include/soci/unsigned-types.h.patched) + return() +endif() +file (RENAME include/soci/unsigned-types.h include/soci/unsigned-types.h.orig) +file (RENAME include/soci/unsigned-types.h.patched include/soci/unsigned-types.h) +# also fix Boost.cmake so that it just returns when we override the Boost_FOUND var +file (APPEND cmake/dependencies/Boost.cmake.patched "if (Boost_FOUND)\n") +file (APPEND cmake/dependencies/Boost.cmake.patched " return ()\n") +file (APPEND cmake/dependencies/Boost.cmake.patched "endif ()\n") +file (STRINGS cmake/dependencies/Boost.cmake sourcecode) +foreach (line_ ${sourcecode}) + file (APPEND cmake/dependencies/Boost.cmake.patched "${line_}\n") +endforeach () +file (RENAME cmake/dependencies/Boost.cmake.patched cmake/dependencies/Boost.cmake) + diff --git a/Release.Builds/Builds/README.md b/Release.Builds/Builds/README.md new file mode 100644 index 000000000..e99ba8c9a --- /dev/null +++ b/Release.Builds/Builds/README.md @@ -0,0 +1 @@ +[Please see the BUILD instructions here](../BUILD.md) diff --git a/Release.Builds/Builds/levelization/README.md b/Release.Builds/Builds/levelization/README.md new file mode 100644 index 000000000..4ff3a5423 --- /dev/null +++ b/Release.Builds/Builds/levelization/README.md @@ -0,0 +1,114 @@ +# Levelization + +Levelization is the term used to describe efforts to prevent rippled from +having or creating cyclic dependencies. + +rippled code is organized into directories under `src/rippled` (and +`src/test`) representing modules. The modules are intended to be +organized into "tiers" or "levels" such that a module from one level can +only include code from lower levels. Additionally, a module +in one level should never include code in an `impl` folder of any level +other than it's own. + +Unfortunately, over time, enforcement of levelization has been +inconsistent, so the current state of the code doesn't necessarily +reflect these rules. Whenever possible, developers should refactor any +levelization violations they find (by moving files or individual +classes). At the very least, don't make things worse. + +The table below summarizes the _desired_ division of modules, based on the +state of the rippled code when it was created. The levels are numbered from +the bottom up with the lower level, lower numbered, more independent +modules listed first, and the higher level, higher numbered modules with +more dependencies listed later. + +**tl;dr:** The modules listed first are more independent than the modules +listed later. + +| Level / Tier | Module(s) | +|--------------|-----------------------------------------------| +| 01 | ripple/beast ripple/unity +| 02 | ripple/basics +| 03 | ripple/json ripple/crypto +| 04 | ripple/protocol +| 05 | ripple/core ripple/conditions ripple/consensus ripple/resource ripple/server +| 06 | ripple/peerfinder ripple/ledger ripple/nodestore ripple/net +| 07 | ripple/shamap ripple/overlay +| 08 | ripple/app +| 09 | ripple/rpc +| 10 | ripple/perflog +| 11 | test/jtx test/beast test/csf +| 12 | test/unit_test +| 13 | test/crypto test/conditions test/json test/resource test/shamap test/peerfinder test/basics test/overlay +| 14 | test +| 15 | test/net test/protocol test/ledger test/consensus test/core test/server test/nodestore +| 16 | test/rpc test/app + +(Note that `test` levelization is *much* less important and *much* less +strictly enforced than `ripple` levelization, other than the requirement +that `test` code should *never* be included in `ripple` code.) + +## Validation + +The [levelization.sh](levelization.sh) script takes no parameters, +reads no environment variables, and can be run from any directory, +as long as it is in the expected location in the rippled repo. +It can be run at any time from within a checked out repo, and will +do an analysis of all the `#include`s in +the rippled source. The only caveat is that it runs much slower +under Windows than in Linux. It hasn't yet been tested under MacOS. +It generates many files of [results](results): + +* `rawincludes.txt`: The raw dump of the `#includes` +* `paths.txt`: A second dump grouping the source module + to the destination module, deduped, and with frequency counts. +* `includes/`: A directory where each file represents a module and + contains a list of modules and counts that the module _includes_. +* `includedby/`: Similar to `includes/`, but the other way around. Each + file represents a module and contains a list of modules and counts + that _include_ the module. +* [`loops.txt`](results/loops.txt): A list of direct loops detected + between modules as they actually exist, as opposed to how they are + desired as described above. In a perfect repo, this file will be + empty. + This file is committed to the repo, and is used by the [levelization + Github workflow](../../.github/workflows/levelization.yml) to validate + that nothing changed. +* [`ordering.txt`](results/ordering.txt): A list showing relationships + between modules where there are no loops as they actually exist, as + opposed to how they are desired as described above. + This file is committed to the repo, and is used by the [levelization + Github workflow](../../.github/workflows/levelization.yml) to validate + that nothing changed. +* [`levelization.yml`](../../.github/workflows/levelization.yml) + Github Actions workflow to test that levelization loops haven't + changed. Unfortunately, if changes are detected, it can't tell if + they are improvements or not, so if you have resolved any issues or + done anything else to improve levelization, run `levelization.sh`, + and commit the updated results. + +The `loops.txt` and `ordering.txt` files relate the modules +using comparison signs, which indicate the number of times each +module is included in the other. + +* `A > B` means that A should probably be at a higher level than B, + because B is included in A significantly more than A is included in B. + These results can be included in both `loops.txt` and `ordering.txt`. + Because `ordering.txt`only includes relationships where B is not + included in A at all, it will only include these types of results. +* `A ~= B` means that A and B are included in each other a different + number of times, but the values are so close that the script can't + definitively say that one should be above the other. These results + will only be included in `loops.txt`. +* `A == B` means that A and B include each other the same number of + times, so the script has no clue which should be higher. These results + will only be included in `loops.txt`. + +The committed files hide the detailed values intentionally, to +prevent false alarms and merging issues, and because it's easy to +get those details locally. + +1. Run `levelization.sh` +2. Grep the modules in `paths.txt`. + * For example, if a cycle is found `A ~= B`, simply `grep -w + A Builds/levelization/results/paths.txt | grep -w B` diff --git a/Release.Builds/Builds/levelization/levelization.sh b/Release.Builds/Builds/levelization/levelization.sh new file mode 100755 index 000000000..34487f746 --- /dev/null +++ b/Release.Builds/Builds/levelization/levelization.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +# Usage: levelization.sh +# This script takes no parameters, reads no environment variables, +# and can be run from any directory, as long as it is in the expected +# location in the repo. + +pushd $( dirname $0 ) + +if [ -v PS1 ] +then + # if the shell is interactive, clean up any flotsam before analyzing + git clean -ix +fi + +rm -rfv results +mkdir results +includes="$( pwd )/results/rawincludes.txt" +pushd ../.. +echo Raw includes: +grep -r '#include.*/.*\.h' src/ripple/ src/test/ | \ + grep -v boost | tee ${includes} +popd +pushd results + +oldifs=${IFS} +IFS=: +mkdir includes +mkdir includedby +echo Build levelization paths +exec 3< ${includes} # open rawincludes.txt for input +while read -r -u 3 file include +do + level=$( echo ${file} | cut -d/ -f 2,3 ) + # If the "level" indicates a file, cut off the filename + if [[ "${level##*.}" != "${level}" ]] + then + # Use the "toplevel" label as a workaround for `sort` + # inconsistencies between different utility versions + level="$( dirname ${level} )/toplevel" + fi + level=$( echo ${level} | tr '/' '.' ) + + includelevel=$( echo ${include} | sed 's/.*["<]//; s/[">].*//' | \ + cut -d/ -f 1,2 ) + if [[ "${includelevel##*.}" != "${includelevel}" ]] + then + # Use the "toplevel" label as a workaround for `sort` + # inconsistencies between different utility versions + includelevel="$( dirname ${includelevel} )/toplevel" + fi + includelevel=$( echo ${includelevel} | tr '/' '.' ) + + if [[ "$level" != "$includelevel" ]] + then + echo $level $includelevel | tee -a paths.txt + fi +done +echo Sort and dedup paths +sort -ds paths.txt | uniq -c | tee sortedpaths.txt +mv sortedpaths.txt paths.txt +exec 3>&- #close fd 3 +IFS=${oldifs} +unset oldifs + +echo Split into flat-file database +exec 4&- #close fd 4 + +loops="$( pwd )/loops.txt" +ordering="$( pwd )/ordering.txt" +pushd includes +echo Search for loops +# Redirect stdout to a file +exec 4>&1 +exec 1>"${loops}" +for source in * +do + if [[ -f "$source" ]] + then + exec 5<"${source}" # open for input + while read -r -u 5 include includefreq + do + if [[ -f $include ]] + then + if grep -q -w $source $include + then + if grep -q -w "Loop: $include $source" "${loops}" + then + continue + fi + sourcefreq=$( grep -w $source $include | cut -d\ -f2 ) + echo "Loop: $source $include" + # If the counts are close, indicate that the two modules are + # on the same level, though they shouldn't be + if [[ $(( $includefreq - $sourcefreq )) -gt 3 ]] + then + echo -e " $source > $include\n" + elif [[ $(( $sourcefreq - $includefreq )) -gt 3 ]] + then + echo -e " $include > $source\n" + elif [[ $sourcefreq -eq $includefreq ]] + then + echo -e " $include == $source\n" + else + echo -e " $include ~= $source\n" + fi + else + echo "$source > $include" >> "${ordering}" + fi + fi + done + exec 5>&- #close fd 5 + fi +done +exec 1>&4 #close fd 1 +exec 4>&- #close fd 4 +cat "${ordering}" +cat "${loops}" +popd +popd +popd diff --git a/Release.Builds/Builds/levelization/results/loops.txt b/Release.Builds/Builds/levelization/results/loops.txt new file mode 100644 index 000000000..a41254a70 --- /dev/null +++ b/Release.Builds/Builds/levelization/results/loops.txt @@ -0,0 +1,63 @@ +Loop: ripple.app ripple.core + ripple.app > ripple.core + +Loop: ripple.app ripple.ledger + ripple.app > ripple.ledger + +Loop: ripple.app ripple.net + ripple.app > ripple.net + +Loop: ripple.app ripple.nodestore + ripple.app > ripple.nodestore + +Loop: ripple.app ripple.overlay + ripple.overlay ~= ripple.app + +Loop: ripple.app ripple.peerfinder + ripple.app > ripple.peerfinder + +Loop: ripple.app ripple.protocol + ripple.app > ripple.protocol + +Loop: ripple.app ripple.rpc + ripple.rpc > ripple.app + +Loop: ripple.app ripple.shamap + ripple.app > ripple.shamap + +Loop: ripple.basics ripple.core + ripple.core > ripple.basics + +Loop: ripple.basics ripple.json + ripple.json ~= ripple.basics + +Loop: ripple.basics ripple.protocol + ripple.protocol > ripple.basics + +Loop: ripple.core ripple.net + ripple.net > ripple.core + +Loop: ripple.ledger ripple.protocol + ripple.ledger > ripple.protocol + +Loop: ripple.net ripple.rpc + ripple.rpc > ripple.net + +Loop: ripple.nodestore ripple.overlay + ripple.overlay ~= ripple.nodestore + +Loop: ripple.overlay ripple.rpc + ripple.rpc ~= ripple.overlay + +Loop: test.app test.jtx + test.app > test.jtx + +Loop: test.app test.rpc + test.rpc ~= test.app + +Loop: test.jtx test.toplevel + test.toplevel > test.jtx + +Loop: test.jtx test.unit_test + test.unit_test == test.jtx + diff --git a/Release.Builds/Builds/levelization/results/ordering.txt b/Release.Builds/Builds/levelization/results/ordering.txt new file mode 100644 index 000000000..12df1a86e --- /dev/null +++ b/Release.Builds/Builds/levelization/results/ordering.txt @@ -0,0 +1,226 @@ +ripple.app > ripple.basics +ripple.app > ripple.beast +ripple.app > ripple.conditions +ripple.app > ripple.consensus +ripple.app > ripple.crypto +ripple.app > ripple.json +ripple.app > ripple.resource +ripple.app > test.unit_test +ripple.basics > ripple.beast +ripple.conditions > ripple.basics +ripple.conditions > ripple.protocol +ripple.consensus > ripple.basics +ripple.consensus > ripple.beast +ripple.consensus > ripple.json +ripple.consensus > ripple.protocol +ripple.core > ripple.beast +ripple.core > ripple.json +ripple.core > ripple.protocol +ripple.crypto > ripple.basics +ripple.json > ripple.beast +ripple.ledger > ripple.basics +ripple.ledger > ripple.beast +ripple.ledger > ripple.core +ripple.ledger > ripple.json +ripple.net > ripple.basics +ripple.net > ripple.beast +ripple.net > ripple.json +ripple.net > ripple.protocol +ripple.net > ripple.resource +ripple.nodestore > ripple.basics +ripple.nodestore > ripple.beast +ripple.nodestore > ripple.core +ripple.nodestore > ripple.json +ripple.nodestore > ripple.protocol +ripple.nodestore > ripple.unity +ripple.overlay > ripple.basics +ripple.overlay > ripple.beast +ripple.overlay > ripple.core +ripple.overlay > ripple.json +ripple.overlay > ripple.peerfinder +ripple.overlay > ripple.protocol +ripple.overlay > ripple.resource +ripple.overlay > ripple.server +ripple.peerfinder > ripple.basics +ripple.peerfinder > ripple.beast +ripple.peerfinder > ripple.core +ripple.peerfinder > ripple.protocol +ripple.perflog > ripple.basics +ripple.perflog > ripple.beast +ripple.perflog > ripple.core +ripple.perflog > ripple.json +ripple.perflog > ripple.nodestore +ripple.perflog > ripple.protocol +ripple.perflog > ripple.rpc +ripple.protocol > ripple.beast +ripple.protocol > ripple.crypto +ripple.protocol > ripple.json +ripple.resource > ripple.basics +ripple.resource > ripple.beast +ripple.resource > ripple.json +ripple.resource > ripple.protocol +ripple.rpc > ripple.basics +ripple.rpc > ripple.beast +ripple.rpc > ripple.core +ripple.rpc > ripple.crypto +ripple.rpc > ripple.json +ripple.rpc > ripple.ledger +ripple.rpc > ripple.nodestore +ripple.rpc > ripple.protocol +ripple.rpc > ripple.resource +ripple.rpc > ripple.server +ripple.rpc > ripple.shamap +ripple.server > ripple.basics +ripple.server > ripple.beast +ripple.server > ripple.crypto +ripple.server > ripple.json +ripple.server > ripple.protocol +ripple.shamap > ripple.basics +ripple.shamap > ripple.beast +ripple.shamap > ripple.crypto +ripple.shamap > ripple.nodestore +ripple.shamap > ripple.protocol +test.app > ripple.app +test.app > ripple.basics +test.app > ripple.beast +test.app > ripple.core +test.app > ripple.json +test.app > ripple.ledger +test.app > ripple.overlay +test.app > ripple.protocol +test.app > ripple.resource +test.app > ripple.rpc +test.app > test.toplevel +test.app > test.unit_test +test.basics > ripple.basics +test.basics > ripple.beast +test.basics > ripple.json +test.basics > ripple.protocol +test.basics > ripple.rpc +test.basics > test.jtx +test.basics > test.unit_test +test.beast > ripple.basics +test.beast > ripple.beast +test.conditions > ripple.basics +test.conditions > ripple.beast +test.conditions > ripple.conditions +test.consensus > ripple.app +test.consensus > ripple.basics +test.consensus > ripple.beast +test.consensus > ripple.consensus +test.consensus > ripple.core +test.consensus > ripple.ledger +test.consensus > ripple.protocol +test.consensus > test.csf +test.consensus > test.toplevel +test.consensus > test.unit_test +test.core > ripple.basics +test.core > ripple.beast +test.core > ripple.core +test.core > ripple.crypto +test.core > ripple.json +test.core > ripple.server +test.core > test.jtx +test.core > test.toplevel +test.core > test.unit_test +test.csf > ripple.basics +test.csf > ripple.beast +test.csf > ripple.consensus +test.csf > ripple.json +test.csf > ripple.protocol +test.json > ripple.beast +test.json > ripple.json +test.json > test.jtx +test.jtx > ripple.app +test.jtx > ripple.basics +test.jtx > ripple.beast +test.jtx > ripple.consensus +test.jtx > ripple.core +test.jtx > ripple.json +test.jtx > ripple.ledger +test.jtx > ripple.net +test.jtx > ripple.protocol +test.jtx > ripple.server +test.ledger > ripple.app +test.ledger > ripple.basics +test.ledger > ripple.beast +test.ledger > ripple.core +test.ledger > ripple.ledger +test.ledger > ripple.protocol +test.ledger > test.jtx +test.ledger > test.toplevel +test.net > ripple.net +test.net > test.jtx +test.net > test.toplevel +test.net > test.unit_test +test.nodestore > ripple.app +test.nodestore > ripple.basics +test.nodestore > ripple.beast +test.nodestore > ripple.core +test.nodestore > ripple.nodestore +test.nodestore > ripple.protocol +test.nodestore > ripple.unity +test.nodestore > test.jtx +test.nodestore > test.toplevel +test.nodestore > test.unit_test +test.overlay > ripple.app +test.overlay > ripple.basics +test.overlay > ripple.beast +test.overlay > ripple.core +test.overlay > ripple.overlay +test.overlay > ripple.peerfinder +test.overlay > ripple.protocol +test.overlay > ripple.shamap +test.overlay > test.jtx +test.overlay > test.unit_test +test.peerfinder > ripple.basics +test.peerfinder > ripple.beast +test.peerfinder > ripple.core +test.peerfinder > ripple.peerfinder +test.peerfinder > ripple.protocol +test.peerfinder > test.beast +test.peerfinder > test.unit_test +test.protocol > ripple.basics +test.protocol > ripple.beast +test.protocol > ripple.crypto +test.protocol > ripple.json +test.protocol > ripple.protocol +test.protocol > test.toplevel +test.resource > ripple.basics +test.resource > ripple.beast +test.resource > ripple.resource +test.resource > test.unit_test +test.rpc > ripple.app +test.rpc > ripple.basics +test.rpc > ripple.beast +test.rpc > ripple.core +test.rpc > ripple.json +test.rpc > ripple.net +test.rpc > ripple.nodestore +test.rpc > ripple.overlay +test.rpc > ripple.protocol +test.rpc > ripple.resource +test.rpc > ripple.rpc +test.rpc > test.jtx +test.rpc > test.nodestore +test.rpc > test.toplevel +test.server > ripple.app +test.server > ripple.basics +test.server > ripple.beast +test.server > ripple.core +test.server > ripple.json +test.server > ripple.rpc +test.server > ripple.server +test.server > test.jtx +test.server > test.toplevel +test.server > test.unit_test +test.shamap > ripple.basics +test.shamap > ripple.beast +test.shamap > ripple.nodestore +test.shamap > ripple.protocol +test.shamap > ripple.shamap +test.shamap > test.unit_test +test.toplevel > ripple.json +test.toplevel > test.csf +test.unit_test > ripple.basics +test.unit_test > ripple.beast diff --git a/Release.Builds/CMakeLists.txt b/Release.Builds/CMakeLists.txt new file mode 100644 index 000000000..043443ae9 --- /dev/null +++ b/Release.Builds/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required (VERSION 3.16) + +if (POLICY CMP0074) + cmake_policy(SET CMP0074 NEW) +endif () + +project (rippled) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(Boost_NO_BOOST_CMAKE ON) + +# make GIT_COMMIT_HASH define available to all sources +find_package(Git) +if(Git_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --abbrev=40 + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gch) + if(gch) + set(GIT_COMMIT_HASH "${gch}") + message(STATUS gch: ${GIT_COMMIT_HASH}) + add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") + endif() +endif() #git + +if (thread_safety_analysis) + add_compile_options(-Wthread-safety -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -DRIPPLE_ENABLE_THREAD_SAFETY_ANNOTATIONS) + add_compile_options("-stdlib=libc++") + add_link_options("-stdlib=libc++") +endif() + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/deps") + +include (CheckCXXCompilerFlag) +include (FetchContent) +include (ExternalProject) +include (CMakeFuncs) # must come *after* ExternalProject b/c it overrides one function in EP +include (ProcessorCount) +if (target) + message (FATAL_ERROR "The target option has been removed - use native cmake options to control build") +endif () + +include(RippledSanity) +include(RippledVersion) +include(RippledSettings) +include(RippledNIH) +# this check has to remain in the top-level cmake +# because of the early return statement +if (packages_only) + if (NOT TARGET rpm) + message (FATAL_ERROR "packages_only requested, but targets were not created - is docker installed?") + endif() + return () +endif () +include(RippledCompiler) +include(RippledInterface) + +### + +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) + +### + +include(RippledCore) +include(RippledInstall) +include(RippledCov) +include(RippledMultiConfig) +include(RippledDocs) +include(RippledValidatorKeys) \ No newline at end of file diff --git a/build-core.sh b/build-core.sh index 6d95ccea1..2d35947bd 100755 --- a/build-core.sh +++ b/build-core.sh @@ -20,6 +20,13 @@ if [[ "$?" -ne "0" ]]; then exit 127 fi +#!/bin/bash +rm -r Builds CMakeLists.txt && +cp Release.Builds/CMakeLists.txt CMakeLists.txt && +cp Release.Builds/Builds Builds -r && +sed -i 's/ed25519.h/ed25519-donna\/ed25519.h/g' src/ripple/protocol/impl/PublicKey.cpp && +sed -i 's/ed25519.h/ed25519-donna\/ed25519.h/g' src/ripple/protocol/impl/SecretKey.cpp && +sed -i 's/ed25519.h/ed25519-donna\/ed25519.h/g' src/ripple/rpc/handlers/WalletPropose.cpp && 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 && mv Builds/CMake/deps/WasmEdge.cmake Builds/CMake/deps/WasmEdge.old && echo "find_package(LLVM REQUIRED CONFIG)