diff --git a/.gitmodules b/.gitmodules index d4d194f4c..e69de29bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +0,0 @@ -[submodule "src/nudb/extras/beast"] - path = src/nudb/extras/beast - url = https://github.com/vinniefalco/Beast.git -[submodule "src/nudb/extras/rocksdb"] - path = src/nudb/extras/rocksdb - url = https://github.com/facebook/rocksdb.git -[submodule "src/nudb/doc/docca"] - path = src/nudb/doc/docca - url = https://github.com/vinniefalco/docca.git diff --git a/.travis.yml b/.travis.yml index 3eb5967d8..0683a2906 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,26 +36,10 @@ matrix: include: - compiler: gcc - env: GCC_VER=5 TARGET=debug - - # - compiler: gcc - # env: GCC_VER=5 TARGET=debug.nounity - - # - compiler: gcc - # env: GCC_VER=5 TARGET=coverage PATH=$PWD/cmake/bin:$PATH + env: GCC_VER=5 BUILD_TYPE=Debug - compiler: clang - env: GCC_VER=5 TARGET=debug - - # - compiler: clang - # env: GCC_VER=5 TARGET=debug.nounity - - # The clang cmake builds do not link. - # - compiler: clang - # env: GCC_VER=5 TARGET=debug CLANG_VER=3.8 PATH=$PWD/llvm-$LLVM_VERSION/bin:$PWD/cmake/bin:$PATH - - # - compiler: clang - # env: GCC_VER=5 TARGET=debug.nounity CLANG_VER=3.8 PATH=$PWD/llvm-$LLVM_VERSION/bin:$PWD/cmake/bin:$PATH + env: GCC_VER=5 BUILD_TYPE=Debug cache: directories: diff --git a/Builds/CMake/CMakeFuncs.cmake b/Builds/CMake/CMakeFuncs.cmake index a02ac5553..b7336f965 100644 --- a/Builds/CMake/CMakeFuncs.cmake +++ b/Builds/CMake/CMakeFuncs.cmake @@ -115,3 +115,134 @@ macro (exclude_if_included 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_SOURCE_DIR}/Builds/CMake/echo_file.cmake + COMMAND ${CMAKE_COMMAND} + -DIN_FILE=${STAMP_DIR}/${_target}-build-err.log + -P ${CMAKE_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() + diff --git a/Builds/CMake/CMake_sqlite3.txt b/Builds/CMake/CMake_sqlite3.txt new file mode 100644 index 000000000..d80557a9f --- /dev/null +++ b/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/Builds/CMake/echo_file.cmake b/Builds/CMake/echo_file.cmake new file mode 100644 index 000000000..eda858994 --- /dev/null +++ b/Builds/CMake/echo_file.cmake @@ -0,0 +1,15 @@ +#[=========================================================[ + 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. +#]=========================================================] + +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 () + diff --git a/Builds/CMake/soci_patch.cmake b/Builds/CMake/soci_patch.cmake new file mode 100644 index 000000000..7cfeaa2e4 --- /dev/null +++ b/Builds/CMake/soci_patch.cmake @@ -0,0 +1,13 @@ +# 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 +file (STRINGS include/soci/unsigned-types.h sourcecode) +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 () +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) + diff --git a/CMakeLists.txt b/CMakeLists.txt index 95c6d4c9e..e91a05781 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,13 @@ cmake_minimum_required (VERSION 3.9.0) set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake ${CMAKE_MODULE_PATH}) -include (CMakeFuncs) include (CheckCXXCompilerFlag) +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.11) + include (FetchContent) +endif () include (ExternalProject) +include (CMakeFuncs) # must come *after* ExternalProject b/c it overrides one function in EP +include (ProcessorCount) if (target) message (WARNING "The target option is deprecated and will be removed in a future release") @@ -15,6 +19,7 @@ project (rippled) convenience variables and sanity checks #]===================================================================] +ProcessorCount(num_procs) 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") @@ -22,6 +27,18 @@ if (is_multiconfig STREQUAL "NOTFOUND") 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 () + if (${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_SOURCE_DIR}) set (is_root_project ON) else () @@ -36,7 +53,7 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") message (FATAL_ERROR "This project requires GCC 5.1 or later") endif () endif () -if (${CMAKE_GENERATOR} STREQUAL "Xcode") +if (CMAKE_GENERATOR STREQUAL "Xcode") set (is_xcode TRUE) endif () @@ -46,11 +63,6 @@ else () set (is_linux FALSE) endif () -if (NOT is_multiconfig AND NOT CMAKE_BUILD_TYPE) - message (STATUS "Build type not specified - defaulting to Release") - set (CMAKE_BUILD_TYPE Release CACHE STRING "build type" FORCE) -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 " @@ -178,7 +190,7 @@ else () endif () if (coverage) message (STATUS "coverage build requested - forcing Debug build") - set (CMAKE_BUILD_TYPE Debug) + set (CMAKE_BUILD_TYPE Debug CACHE STRING "build type" FORCE) endif () #[===================================================================[ @@ -213,9 +225,7 @@ if (MSVC) # also remove dynamic runtime foreach (var_ CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE) string (REGEX REPLACE "[-/]MD[d]*" " " ${var_} "${${var_}}") endforeach () @@ -337,13 +347,7 @@ if (is_clang) endif() if (assert) - foreach (var_ - CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL - CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL - CMAKE_CXX_FLAGS_RELWITHDEBINFO) + foreach (var_ CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE) STRING (REGEX REPLACE "[-/]DNDEBUG" "" ${var_} "${${var_}}") endforeach () endif () @@ -452,6 +456,40 @@ add_library (ripple_libs INTERFACE) add_library (Ripple::libs ALIAS ripple_libs) target_link_libraries (ripple_libs INTERFACE Ripple::syslibs) +#[===================================================================[ + 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_SOURCE_DIR}) + endif () +endif () +set (nih_cache_path + "${NIH_CACHE_ROOT}/.nih_c/${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) + #[===================================================================[ NIH dep: boost #]===================================================================] @@ -650,51 +688,72 @@ install ( NIH dep: lz4 #]===================================================================] -add_library (lz4 STATIC - src/lz4/lib/lz4.c - src/lz4/lib/lz4hc.c - src/lz4/lib/lz4frame.c - src/lz4/lib/xxhash.c) -target_compile_definitions (lz4 - PRIVATE XXH_NAMESPACE=LZ4_) -add_library (NIH::lz4 ALIAS lz4) -target_link_libraries (ripple_libs INTERFACE NIH::lz4) -## pseudo-install our files so that dependent builds can find them -file (MAKE_DIRECTORY - ${CMAKE_BINARY_DIR}/lz4/include - ${CMAKE_BINARY_DIR}/lz4/lib) -target_include_directories (lz4 PUBLIC ${CMAKE_BINARY_DIR}/lz4/include) -add_custom_command (TARGET lz4 POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/src/lz4/lib/lz4.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/lz4/lib/lz4frame.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/lz4/lib/lz4hc.h - ${CMAKE_BINARY_DIR}/lz4/include - COMMAND ${CMAKE_COMMAND} -E copy - $ ${CMAKE_BINARY_DIR}/lz4/lib) +ExternalProject_Add (lz4 + PREFIX ${nih_cache_path} + GIT_REPOSITORY https://github.com/lz4/lz4.git + GIT_TAG v1.8.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$<$: ${num_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) +ExternalProject_Get_Property (lz4 STAMP_DIR) +if (CMAKE_VERBOSE_MAKEFILE) + print_ep_logs (lz4) +endif () +add_library (lz4_lib STATIC IMPORTED GLOBAL) +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) +add_dependencies (lz4_lib lz4) +target_link_libraries (ripple_libs INTERFACE lz4_lib) exclude_if_included (lz4) +exclude_if_included (lz4_lib) #[===================================================================[ - NIH dep: libarchive (via external project) + NIH dep: libarchive #]===================================================================] -set (la_root_suffix) + +set (lib_post "") if (MSVC) - set (la_root_suffix "_static") + set (lib_post "_static") endif () -string (REGEX REPLACE "[ \\/%]+" "_" gen_for_path ${CMAKE_GENERATOR}) -string (TOLOWER ${gen_for_path} gen_for_path) -# hack: trying to shorten paths for windows CI (hits 260 MAXPATH easily) -string (REPLACE "visual_studio" "vs" gen_for_path ${gen_for_path}) -set (nih_cache_path - ${CMAKE_SOURCE_DIR}/.nih_c/${gen_for_path}/${CMAKE_CXX_COMPILER_ID}_${CMAKE_CXX_COMPILER_VERSION}) -if (NOT is_multiconfig) - if (CMAKE_BUILD_TYPE STREQUAL Debug) - set (nih_cache_path "${nih_cache_path}/Debug") - else () - set (nih_cache_path "${nih_cache_path}/Release") - endif () -endif () -message (STATUS "NIH-EP cache path: ${nih_cache_path}") ExternalProject_Add (libarchive PREFIX ${nih_cache_path} # TODO: switch back to official repo once they allow ENABLE_WERROR option in @@ -708,11 +767,18 @@ ExternalProject_Add (libarchive -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> - -DCMAKE_PREFIX_PATH=${CMAKE_BINARY_DIR}/lz4 -DCMAKE_DEBUG_POSTFIX=_d - -DCMAKE_BUILD_TYPE=$,Debug,Release> + $<$>:-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 @@ -741,8 +807,6 @@ ExternalProject_Add (libarchive "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" "-DCMAKE_C_FLAGS_DEBUG=-MTd" "-DCMAKE_C_FLAGS_RELEASE=-MT" - "-DCMAKE_C_FLAGS_RELWITHDEBINFO=-MT" - "-DCMAKE_C_FLAGS_MINSIZEREL=-MT" > LOG_BUILD ON LOG_CONFIGURE ON @@ -751,148 +815,285 @@ ExternalProject_Add (libarchive --build . --config $ --target archive_static + $<$:--parallel$<$: ${num_procs}>> $<$: COMMAND ${CMAKE_COMMAND} -E copy - /libarchive/$/${CMAKE_STATIC_LIBRARY_PREFIX}archive${la_root_suffix}$<$:_d>${CMAKE_STATIC_LIBRARY_SUFFIX} - /libarchive + /libarchive/$/${ep_lib_prefix}archive${lib_post}$<$:_d>${ep_lib_suffix} + /libarchive > TEST_COMMAND "" INSTALL_COMMAND "" DEPENDS lz4 BUILD_BYPRODUCTS - /libarchive/${CMAKE_STATIC_LIBRARY_PREFIX}archive${la_root_suffix}${CMAKE_STATIC_LIBRARY_SUFFIX} - /libarchive/${CMAKE_STATIC_LIBRARY_PREFIX}archive${la_root_suffix}_d${CMAKE_STATIC_LIBRARY_SUFFIX} + /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) +ExternalProject_Get_Property (libarchive STAMP_DIR) +if (CMAKE_VERBOSE_MAKEFILE) + print_ep_logs (libarchive) +endif () add_library (archive_lib STATIC IMPORTED GLOBAL) file (MAKE_DIRECTORY ${SOURCE_DIR}/libarchive) set_target_properties (archive_lib PROPERTIES IMPORTED_LOCATION_DEBUG - ${BINARY_DIR}/libarchive/${CMAKE_STATIC_LIBRARY_PREFIX}archive${la_root_suffix}_d${CMAKE_STATIC_LIBRARY_SUFFIX} + ${BINARY_DIR}/libarchive/${ep_lib_prefix}archive${lib_post}_d${ep_lib_suffix} IMPORTED_LOCATION_RELEASE - ${BINARY_DIR}/libarchive/${CMAKE_STATIC_LIBRARY_PREFIX}archive${la_root_suffix}${CMAKE_STATIC_LIBRARY_SUFFIX} - INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/libarchive - INTERFACE_COMPILE_DEFINITIONS LIBARCHIVE_STATIC) + ${BINARY_DIR}/libarchive/${ep_lib_prefix}archive${lib_post}${ep_lib_suffix} + INTERFACE_INCLUDE_DIRECTORIES + ${SOURCE_DIR}/libarchive + INTERFACE_COMPILE_DEFINITIONS + LIBARCHIVE_STATIC) add_dependencies (archive_lib libarchive) -target_link_libraries (archive_lib INTERFACE NIH::lz4) +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) #[===================================================================[ NIH dep: sqlite #]===================================================================] -add_library (sqlite3 STATIC - src/sqlite/sqlite/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. - - VFALCO 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. - - VFALCO NOTE: This is the preferred threading model. -#]=========================================================] -target_compile_definitions (sqlite3 - PRIVATE - SQLITE_THREADSAFE=1 - HAVE_USLEEP=1) -target_compile_options (sqlite3 - PRIVATE +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-3240000.zip + # ^^^ version is apparent in the URL: 3240000 => 3.24.0 + URL_HASH SHA256=ad68c1216c3a474cf360c7581a4001e952515b3649342100f2d7ca7c8e313da6 + # 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_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}> $<$: - -wd4100 - -wd4127 - -wd4232 - -wd4244 - -wd4701 - -wd4706 - -wd4996 + "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" + "-DCMAKE_C_FLAGS_DEBUG=-MTd" + "-DCMAKE_C_FLAGS_RELEASE=-MT" > - $<$>:-Wno-array-bounds>) -add_library (NIH::sqlite3 ALIAS sqlite3) -target_link_libraries (sqlite3 PUBLIC $<$>:dl>) -target_link_libraries (ripple_libs INTERFACE NIH::sqlite3) -file (MAKE_DIRECTORY - ${CMAKE_BINARY_DIR}/sqlite3/include - ${CMAKE_BINARY_DIR}/sqlite3/lib) -target_include_directories (sqlite3 - PRIVATE - src/sqlite - src/sqlite/sqlite - INTERFACE - ${CMAKE_BINARY_DIR}/sqlite3/include) -add_custom_command (TARGET sqlite3 POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/src/sqlite/sqlite ${CMAKE_BINARY_DIR}/sqlite3/include - COMMAND ${CMAKE_COMMAND} -E copy - $ ${CMAKE_BINARY_DIR}/sqlite3/lib - BYPRODUCTS ${CMAKE_BINARY_DIR}/sqlite3/include/sqlite3.h) + LOG_BUILD ON + LOG_CONFIGURE ON + BUILD_COMMAND + ${CMAKE_COMMAND} + --build . + --config $ + $<$:--parallel$<$: ${num_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) +ExternalProject_Get_Property (sqlite3 STAMP_DIR) +if (CMAKE_VERBOSE_MAKEFILE) + print_ep_logs (sqlite3) +endif () +add_library (sqlite STATIC IMPORTED GLOBAL) +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) +target_link_libraries (sqlite INTERFACE $<$>:dl>) +target_link_libraries (ripple_libs INTERFACE sqlite) exclude_if_included (sqlite3) +exclude_if_included (sqlite) +set(sqlite_BINARY_DIR ${BINARY_DIR}) #[===================================================================[ NIH dep: soci #]===================================================================] -add_library (soci STATIC - #[=========================================================[ - this unity file is our interpretation of - what sources constitute soci-lib. - #]=========================================================] - src/ripple/unity/soci.cpp - # this header is here to create dependency on the sqlite post-build step - ${CMAKE_BINARY_DIR}/sqlite3/include/sqlite3.h) -target_compile_definitions (soci PUBLIC SOCI_HAVE_CXX_C11=1) -target_include_directories (soci - PUBLIC - src/soci/src - src/soci/include - #[=========================================================[ - HACK for ninja..which doesn't properly see - the POST_BUILD dependency on sqlite (TODO: diagnose) - so we must include the original source dir - #]=========================================================] - $<$: - ${CMAKE_CURRENT_SOURCE_DIR}/src/sqlite +set (lib_pre ${ep_lib_prefix}) +set (lib_post "") +if (WIN32) + # for some reason soci on windows still prepends lib (non-standard) + set (lib_pre lib) + # this version in the name might change if/when we change versions of soci + set (lib_post "_4_0") +endif () +ExternalProject_Add (soci + PREFIX ${nih_cache_path} + GIT_REPOSITORY https://github.com/SOCI/soci.git + GIT_TAG 3a1f602b3021b925d38828e3ff95f9e7f8887ff7 + # 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} -P ${CMAKE_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_PREFIX_PATH=${CMAKE_BINARY_DIR}/sqlite3 + -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 + -DBOOST_ROOT=${Boost_DIR} + -DWITH_BOOST=ON + -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" > - PRIVATE - src - src/soci/src/core - src/soci/include/private) -target_link_libraries (soci - NIH::sqlite3 - Ripple::boost) -add_library (NIH::soci ALIAS soci) -target_link_libraries (ripple_libs INTERFACE NIH::soci) + $<$>: + "-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" + > + LOG_BUILD ON + LOG_CONFIGURE ON + BUILD_COMMAND + ${CMAKE_COMMAND} + --build . + --config $ + $<$:--parallel$<$: ${num_procs}>> + $<$: + COMMAND + ${CMAKE_COMMAND} -E copy + /lib/$/${lib_pre}soci_core${lib_post}$<$:_d>${ep_lib_suffix} + /lib/$/${lib_pre}soci_empty${lib_post}$<$:_d>${ep_lib_suffix} + /lib/$/${lib_pre}soci_sqlite3${lib_post}$<$:_d>${ep_lib_suffix} + /lib + > + TEST_COMMAND "" + INSTALL_COMMAND "" + DEPENDS sqlite3 + BUILD_BYPRODUCTS + /lib/${lib_pre}soci_core${lib_post}${ep_lib_suffix} + /lib/${lib_pre}soci_core${lib_post}_d${ep_lib_suffix} + /lib/${lib_pre}soci_empty${lib_post}${ep_lib_suffix} + /lib/${lib_pre}soci_empty${lib_post}_d${ep_lib_suffix} + /lib/${lib_pre}soci_sqlite3${lib_post}${ep_lib_suffix} + /lib/${lib_pre}soci_sqlite3${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) + add_library ("soci_${_comp}" STATIC IMPORTED GLOBAL) + set_target_properties ("soci_${_comp}" PROPERTIES + IMPORTED_LOCATION_DEBUG + ${BINARY_DIR}/lib/${lib_pre}soci_${_comp}${lib_post}_d${ep_lib_suffix} + IMPORTED_LOCATION_RELEASE + ${BINARY_DIR}/lib/${lib_pre}soci_${_comp}${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 () + exclude_if_included ("soci_${_comp}") +endforeach () exclude_if_included (soci) #[===================================================================[ NIH dep: snappy #]===================================================================] -add_library (snappy STATIC - src/snappy/snappy/snappy.cc - src/snappy/snappy/snappy-sinksource.cc - src/snappy/snappy/snappy-stubs-internal.cc) -target_compile_options (snappy - PRIVATE - $<$>: - -Wno-deprecated - -Wno-unused-function +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 + -DSNAPPY_BUILD_TESTS=OFF + $<$: + "-DCMAKE_C_FLAGS=-GR -Gd -fp:precise -FS -MP" + "-DCMAKE_C_FLAGS_DEBUG=-MTd" + "-DCMAKE_C_FLAGS_RELEASE=-MT" > - $<$:-Wno-nonnull-compare>) -target_include_directories (snappy - PUBLIC - src/snappy/snappy - src/snappy/config) -add_library (NIH::snappy ALIAS snappy) -target_link_libraries (ripple_libs INTERFACE NIH::snappy) + LOG_BUILD ON + LOG_CONFIGURE ON + BUILD_COMMAND + ${CMAKE_COMMAND} + --build . + --config $ + $<$:--parallel$<$: ${num_procs}>> + $<$: + COMMAND + ${CMAKE_COMMAND} -E copy + /$/${ep_lib_prefix}snappy$<$:_d>${ep_lib_suffix} + + > + TEST_COMMAND "" + INSTALL_COMMAND "" + 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) +ExternalProject_Get_Property (snappy STAMP_DIR) +if (CMAKE_VERBOSE_MAKEFILE) + print_ep_logs (snappy) +endif () +add_library (snappy_lib STATIC IMPORTED GLOBAL) +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};${BINARY_DIR}") +add_dependencies (snappy_lib snappy) +target_link_libraries (ripple_libs INTERFACE snappy_lib) exclude_if_included (snappy) +exclude_if_included (snappy_lib) #[===================================================================[ NIH dep: rocksdb @@ -909,7 +1110,7 @@ if (NOT MSVC) PRIVATE $<$:-w> PUBLIC - $<$,$>: + $<$,$,7>>: -Wno-inconsistent-missing-override -Wno-uninitialized > @@ -932,25 +1133,53 @@ if (NOT MSVC) $<$:OS_MACOSX=1> $<$:OS_LINUX> ) - target_link_libraries (rocksdb NIH::snappy) + target_link_libraries (rocksdb snappy_lib) + exclude_if_included (rocksdb) else () add_library (rocksdb INTERFACE) target_compile_definitions (rocksdb INTERFACE RIPPLE_ROCKSDB_AVAILABLE=0) endif () add_library (NIH::rocksdb ALIAS rocksdb) target_link_libraries (ripple_libs INTERFACE NIH::rocksdb) -exclude_if_included (rocksdb) #[===================================================================[ NIH dep: nudb NuDB is header-only, thus is an INTERFACE lib in CMake. - TODO: move this into NuDB repo, add proper targets and - export/install + TODO: move the library definition into NuDB repo and add + proper targets and export/install #]===================================================================] +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.11) + FetchContent_Declare( + nudb_src + GIT_REPOSITORY https://github.com/vinniefalco/NuDB.git + GIT_TAG 1.0.0 + ) + FetchContent_GetProperties(nudb_src) + if(NOT nudb_src_POPULATED) + message (STATUS "Pausing to download NuDB...") + FetchContent_Populate(nudb_src) + endif() +else () + ExternalProject_Add (nudb_src + PREFIX ${nih_cache_path} + GIT_REPOSITORY https://github.com/vinniefalco/NuDB.git + GIT_TAG 1.0.0 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + TEST_COMMAND "" + INSTALL_COMMAND "" + ) + ExternalProject_Get_Property (nudb_src SOURCE_DIR) + set (nudb_src_SOURCE_DIR "${SOURCE_DIR}") + file (MAKE_DIRECTORY ${nudb_src_SOURCE_DIR}/include) +endif () + add_library (nudb INTERFACE) -target_include_directories (nudb INTERFACE src/nudb/include) +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 @@ -1574,7 +1803,6 @@ target_sources (rippled PRIVATE #]===============================] src/ripple/core/impl/Config.cpp src/ripple/core/impl/DatabaseCon.cpp - src/ripple/core/impl/DummySociDynamicBackend.cpp src/ripple/core/impl/Job.cpp src/ripple/core/impl/JobQueue.cpp src/ripple/core/impl/LoadEvent.cpp @@ -2158,3 +2386,4 @@ if (TARGET Doxygen::doxygen) else () message (STATUS "doxygen executable not found -- skipping docs target") endif () + diff --git a/Jenkinsfile b/Jenkinsfile index 0ecbd1ee4..2b4d78044 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -150,8 +150,11 @@ try { def compiler = getFirstPart(bldtype) def config = getSecondPart(bldtype) + def target = 'install' // currently ignored for windows builds if (compiler == 'docs') { compiler = 'gcc' + config = 'Release' + target = 'docs' } def cc = (compiler == 'clang') ? '/opt/llvm-5.0.1/bin/clang' : 'gcc' @@ -167,6 +170,7 @@ try { def max_minutes = 25 def env_vars = [ + "TARGET=${target}", "BUILD_TYPE=${config}", "COMPILER=${compiler}", "PARALLEL_TESTS=${pt}", @@ -187,6 +191,8 @@ try { echo "COMPILER: ${compiler}" echo "BUILD_TYPE: ${config}" echo "USE_CC: ${ucc}" + env_vars.addAll([ + "NIH_CACHE_ROOT=${cdir}"]) if (compiler == 'msvc') { env_vars.addAll([ 'BOOST_ROOT=c:\\lib\\boost_1_67', @@ -542,7 +548,7 @@ def getSecondPart(bld) { // functions in groovy.... @NonCPS def upDir(path) { - def matcher = path =~ /^(.+)\/(.+?)/ + def matcher = path =~ /^(.+)[\/\\](.+?)/ matcher ? matcher[0][1] : path } diff --git a/appveyor.yml b/appveyor.yml index f2ba8ba55..6b59eaf05 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ environment: # CMake honors these environment variables, setting the include/lib paths. BOOST_ROOT: C:/%RIPPLED_DEPS_PATH%/boost OPENSSL_ROOT: C:/%RIPPLED_DEPS_PATH%/openssl + NIH_CACHE_ROOT: C:/%RIPPLED_DEPS_PATH%/ # We've had trouble with AppVeyor apparently not having a stack as large # as the *nix CI platforms. AppVeyor support suggested that we try @@ -74,7 +75,7 @@ build_script: Push-Location "build/$cmake_target" cmake -G"Visual Studio 15 2017 Win64" ../.. if ($LastExitCode -ne 0) { throw "CMake failed" } - cmake --build . --config $env:buildconfig -- -m + cmake --build . --config $env:buildconfig --parallel 3 if ($LastExitCode -ne 0) { throw "CMake build failed" } Pop-Location @@ -87,7 +88,7 @@ test_script: - ps: | & { # Run the rippled unit tests - & $exe --unittest --unittest-log + & $exe --unittest --unittest-log --unittest-jobs 2 # https://connect.microsoft.com/PowerShell/feedback/details/751703/option-to-stop-script-if-command-line-exe-fails if ($LastExitCode -ne 0) { throw "Unit tests failed" } } diff --git a/bin/ci/ubuntu/build-and-test.sh b/bin/ci/ubuntu/build-and-test.sh index 512c38f40..62b05db0f 100755 --- a/bin/ci/ubuntu/build-and-test.sh +++ b/bin/ci/ubuntu/build-and-test.sh @@ -17,6 +17,9 @@ fi : ${BUILD_TYPE:=Debug} echo "BUILD TYPE: $BUILD_TYPE" +: ${TARGET:=install} +echo "BUILD TARGET: $TARGET" + # Ensure APP defaults to rippled if it's not set. : ${APP:=rippled} echo "using APP: $APP" @@ -73,9 +76,11 @@ fi mkdir -p "build/${BUILD_DIR}" pushd "build/${BUILD_DIR}" +# generate $time cmake ../.. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_EXTRA_ARGS} -if [[ ${BUILD_TYPE} == "docs" ]]; then - $time cmake --build . --target docs -- $BUILDARGS +# build +time DESTDIR=$(pwd)/_INSTALLED_ cmake --build . --target ${TARGET} -- $BUILDARGS +if [[ ${TARGET} == "docs" ]]; then ## mimic the standard test output for docs build ## to make controlling processes like jenkins happy if [ -f html_doc/index.html ]; then @@ -84,8 +89,6 @@ if [[ ${BUILD_TYPE} == "docs" ]]; then echo "1 case, 1 test total, 1 failures" fi exit -else - $time cmake --build . -- $BUILDARGS fi popd export APP_PATH="$PWD/build/${BUILD_DIR}/${APP}" diff --git a/src/README.md b/src/README.md index c1ede369c..aca905f3b 100644 --- a/src/README.md +++ b/src/README.md @@ -16,15 +16,23 @@ Source folders: | Folder | Upstream Repo | Description | |:----------------|:---------------------------------------------|:------------| -| `beast` | https://github.com/boostorg/beast | Cross-platform library for WebSocket and HTTP built on [Boost.Asio](https://think-async.com/Asio) | +| `beast` | N/A | legacy utility code that was formerly associated with boost::beast | `ed25519-donna` | https://github.com/floodyberry/ed25519-donna | [Ed25519](http://ed25519.cr.yp.to/) digital signatures | -| `lz4` | https://github.com/lz4/lz4 | LZ4 lossless compression algorithm | -| `nudb` | https://github.com/vinniefalco/NuDB | Constant-time insert-only key/value database for SSD drives (Less memory usage than RocksDB.) | | `protobuf` | https://github.com/google/protobuf | Protocol buffer data interchange format. Ripple has changed some names in order to support the unity-style of build (a single .cpp added to the project, instead of linking to a separately built static library). | | `ripple` | N/A | **Core source code for `rippled`** | | `rocksdb2` | https://github.com/facebook/rocksdb | Fast key/value database. (Supports rotational disks better than NuDB.) | | `secp256k1` | https://github.com/bitcoin-core/secp256k1 | ECDSA digital signatures using the **secp256k1** curve | -| `snappy` | https://github.com/google/snappy | "Snappy" lossless compression algorithm. (Technically, the source is in `snappy/snappy`, while `snappy/` also has config options that aren't part of the upstream repository.) | -| `soci` | https://github.com/SOCI/soci | Abstraction layer for database access. | -| `sqlite` | https://www.sqlite.org/src | An embedded database engine that writes to simple files. (Technically not a subtree, just a direct copy of the [SQLite source distribution](http://sqlite.org/download.html).) | | `test` | N/A | **Unit tests for `rippled`** | + +The following dependencies are downloaded and built using ExternalProject +(or FetchContent, where possible). Refer to CMakeLists.txt file for +details about how these sources are built : + +| Name | Upstream Repo | Description | +|:----------------|:---------------------------------------------|:------------| +| `lz4` | https://github.com/lz4/lz4 | LZ4 lossless compression algorithm | +| `nudb` | https://github.com/vinniefalco/NuDB | Constant-time insert-only key/value database for SSD drives (Less memory usage than RocksDB.) | +| `snappy` | https://github.com/google/snappy | "Snappy" lossless compression algorithm. | +| `soci` | https://github.com/SOCI/soci | Abstraction layer for database access. | +| `sqlite` | https://www.sqlite.org/src | An embedded database engine that writes to simple files. | + diff --git a/src/ripple/core/impl/DummySociDynamicBackend.cpp b/src/ripple/core/impl/DummySociDynamicBackend.cpp deleted file mode 100644 index 4e87db8cd..000000000 --- a/src/ripple/core/impl/DummySociDynamicBackend.cpp +++ /dev/null @@ -1,66 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012-2015 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -/* Stub functions for soci dynamic backends. - - Ripple does not use dynamic backends, and inclduing soci's - dynamic backends compilcates the build (it requires a generated - header file and some macros to be defined.) -*/ - -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated" -#endif - -#include -#include -#include - -// dummy soci-backend -namespace soci { -namespace dynamic_backends { -// used internally by session -backend_factory const& get (std::string const& name) -{ - ripple::Throw ("Not Supported"); - return std::ref(soci::sqlite3); // Silence compiler warning. -}; - -// provided for advanced user-level management -std::vector& search_paths () -{ - static std::vector empty; - return empty; -}; -void register_backend (std::string const&, std::string const&){}; -void register_backend (std::string const&, backend_factory const&){}; -std::vector list_all () -{ - return {}; -}; -void unload (std::string const&){}; -void unload_all (){}; - -} // namespace dynamic_backends -} // namespace soci - -#if defined(__clang__) -#pragma clang diagnostic pop -#endif diff --git a/src/ripple/nodestore/impl/codec.h b/src/ripple/nodestore/impl/codec.h index 191f46bae..112063b63 100644 --- a/src/ripple/nodestore/impl/codec.h +++ b/src/ripple/nodestore/impl/codec.h @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/ripple/unity/soci_ripple.cpp b/src/ripple/unity/soci_ripple.cpp index cbaec0f3f..0a4c7a7e7 100644 --- a/src/ripple/unity/soci_ripple.cpp +++ b/src/ripple/unity/soci_ripple.cpp @@ -18,5 +18,4 @@ //============================================================================== -#include #include