cmake_minimum_required(VERSION 3.16) if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() if(POLICY CMP0077) cmake_policy(SET CMP0077 NEW) endif() # Fix "unrecognized escape" issues when passing CMAKE_MODULE_PATH on Windows. if(DEFINED CMAKE_MODULE_PATH) file(TO_CMAKE_PATH "${CMAKE_MODULE_PATH}" CMAKE_MODULE_PATH) endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(xrpl) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(CompilationEnv) if(is_gcc) # GCC-specific fixes add_compile_options(-Wno-unknown-pragmas -Wno-subobject-linkage) # -Wno-subobject-linkage can be removed when we upgrade GCC version to at least 13.3 elseif(is_clang) # Clang-specific fixes add_compile_options(-Wno-unknown-warning-option) # Ignore unknown warning options elseif(is_msvc) # MSVC-specific fixes add_compile_options(/wd4068) # Ignore unknown pragmas endif() # Enable ccache to speed up builds. include(Ccache) if(thread_safety_analysis) add_compile_options( -Wthread-safety -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -DXRPL_ENABLE_THREAD_SAFETY_ANNOTATIONS ) add_compile_options("-stdlib=libc++") add_link_options("-stdlib=libc++") endif() include(CheckCXXCompilerFlag) include(FetchContent) include(ExternalProject) include(CMakeFuncs) # must come *after* ExternalProject b/c it overrides one function in EP if(target) message( FATAL_ERROR "The target option has been removed - use native cmake options to control build" ) endif() include(XrplSanity) include(XrplVersion) include(XrplSettings) # 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(XrplCompiler) include(XrplSanitizers) include(XrplInterface) option(only_docs "Include only the docs target?" FALSE) include(XrplDocs) if(only_docs) return() endif() include(deps/Boost) add_subdirectory(external/antithesis-sdk) find_package(date REQUIRED) find_package(ed25519 REQUIRED) find_package(gRPC REQUIRED) find_package(LibArchive REQUIRED) find_package(lz4 REQUIRED) find_package(nudb REQUIRED) find_package(OpenSSL REQUIRED) find_package(secp256k1 REQUIRED) find_package(SOCI REQUIRED) find_package(SQLite3 REQUIRED) find_package(xxHash REQUIRED) target_link_libraries( xrpl_libs INTERFACE ed25519::ed25519 lz4::lz4 OpenSSL::Crypto OpenSSL::SSL secp256k1::secp256k1 soci::soci SQLite::SQLite3 ) option(rocksdb "Enable RocksDB" ON) if(rocksdb) find_package(RocksDB REQUIRED) set_target_properties( RocksDB::rocksdb PROPERTIES INTERFACE_COMPILE_DEFINITIONS XRPL_ROCKSDB_AVAILABLE=1 ) target_link_libraries(xrpl_libs INTERFACE RocksDB::rocksdb) endif() # Work around changes to Conan recipe for now. if(TARGET nudb::core) set(nudb nudb::core) elseif(TARGET NuDB::nudb) set(nudb NuDB::nudb) else() message(FATAL_ERROR "unknown nudb target") endif() target_link_libraries(xrpl_libs INTERFACE ${nudb}) if(coverage) include(XrplCov) endif() include(XrplCore) include(XrplProtocolAutogen) include(XrplInstall) include(XrplValidatorKeys) if(tests) include(CTest) add_subdirectory(src/tests/libxrpl) endif()