From d5fb99b41fc83e7229328bc39dc5e6c78ffd239b Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Thu, 4 Apr 2019 17:35:02 +0200 Subject: [PATCH 001/117] SSE intrinsic rename --- src/crypto/city.cpp | 11 ++++++----- src/crypto/crc.cpp | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/crypto/city.cpp b/src/crypto/city.cpp index af3a91b..cfd72e0 100644 --- a/src/crypto/city.cpp +++ b/src/crypto/city.cpp @@ -38,9 +38,10 @@ #include #if defined(__SSE4_2__) && defined(__x86_64__) -#include + #include + #define _mm_crc32_u64_impl _mm_crc32_u64 #else -uint64_t _mm_crc32_u64(uint64_t a, uint64_t b ); + uint64_t _mm_crc32_u64_impl(uint64_t a, uint64_t b ); #endif namespace fc { @@ -563,9 +564,9 @@ static void CityHashCrc256Long(const char *s, size_t len, g += e; \ e += z; \ g += x; \ - z = _mm_crc32_u64(z, b + g); \ - y = _mm_crc32_u64(y, e + h); \ - x = _mm_crc32_u64(x, f + a); \ + z = _mm_crc32_u64_impl(z, b + g); \ + y = _mm_crc32_u64_impl(y, e + h); \ + x = _mm_crc32_u64_impl(x, f + a); \ e = Rotate(e, r); \ c += e; \ s += 40 diff --git a/src/crypto/crc.cpp b/src/crypto/crc.cpp index 7fa8cb1..28e99c9 100644 --- a/src/crypto/crc.cpp +++ b/src/crypto/crc.cpp @@ -604,7 +604,7 @@ static const uint32_t crc_c[256] = { #if !defined __SSE4_2__ || (defined __SSE4_2__ && !defined __x86_64__) -uint64_t _mm_crc32_u64(uint64_t a, uint64_t b ) +uint64_t _mm_crc32_u64_impl(uint64_t a, uint64_t b ) { // Squelch warning about unusued variable crc_c (void)(crc_c); @@ -619,7 +619,7 @@ int main( int argc, char** argv ) { uint64_t f = 0x1234; uint64_t a = 0x5678; - uint32_t f1 = _mm_crc32_u64(f, a); + uint32_t f1 = _mm_crc32_u64_impl(f, a); uint32_t f4 = crc32cSlicingBy8(f, (unsigned char*)&a, sizeof(a)); std::cout< Date: Thu, 4 Apr 2019 17:36:04 +0200 Subject: [PATCH 002/117] Update build system for MinGW --- CMakeLists.txt | 100 +++++++++++------------------------------ include/fc/variant.hpp | 2 +- src/variant.cpp | 2 +- 3 files changed, 29 insertions(+), 75 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d28877..01fe9d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # Defines fc library target. PROJECT( fc ) -CMAKE_MINIMUM_REQUIRED( VERSION 3.1 ) +CMAKE_MINIMUM_REQUIRED( VERSION 3.2 ) set( CMAKE_CXX_STANDARD 14 ) SET( CMAKE_CXX_STANDARD_REQUIRED ON ) @@ -22,6 +22,10 @@ INCLUDE(GetGitRevisionDescription) INCLUDE(CheckLibraryExists) INCLUDE(CheckLibcxxAtomic) +if (APPLE) + INCLUDE(Legacy) +endif (APPLE) + get_git_head_revision(GIT_REFSPEC FC_GIT_REVISION_SHA) get_git_unix_timestamp(FC_GIT_REVISION_UNIX_TIMESTAMP) @@ -39,7 +43,7 @@ endif() SET (ORIGINAL_LIB_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) SET(BOOST_COMPONENTS) -LIST(APPEND BOOST_COMPONENTS thread date_time filesystem system program_options chrono unit_test_framework context iostreams regex) +LIST(APPEND BOOST_COMPONENTS coroutine thread date_time filesystem system program_options chrono unit_test_framework context iostreams regex) # boost::endian is also required, but FindBoost can't handle header-only libs SET( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" ) @@ -98,17 +102,7 @@ endif ( MSVC ) # End configure secp256k1-zkp # Configure editline -if ( MSVC ) -# # autoconf won't work here, hard code the defines -# set( EDITLINE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline" ) -# -# file( GLOB EDITLINE_SOURCES "${EDITLINE_DIR}/src/editline.c" ) -# add_library( editline ${EDITLINE_SOURCES} ) -# -# target_include_directories( editline PRIVATE "${EDITLINE_DIR}" PUBLIC "${EDITLINE_DIR}/include" ) -# -# set_target_properties( editline PROPERTIES COMPILE_DEFINITIONS LINKER_LANGUAGE C ) -else ( MSVC ) +if ( NOT WIN32 ) include(ExternalProject) if ( MINGW ) # Editline is not avalible in MINGW @@ -120,7 +114,7 @@ else ( MSVC ) BUILD_COMMAND make INSTALL_COMMAND true BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/vendor/editline/src/project_editline-build/src/.libs/libeditline.a - ) + ) ExternalProject_Add_Step(project_editline autogen WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline/autogen.sh @@ -133,7 +127,7 @@ else ( MSVC ) add_dependencies(editline project_editline) install( FILES ${binary_dir}/src/.libs/libeditline${CMAKE_STATIC_LIBRARY_SUFFIX} DESTINATION lib/cryptonomex ) endif ( MINGW ) -endif ( MSVC ) +endif ( NOT WIN32 ) # End configure editline IF( WIN32 ) @@ -142,30 +136,21 @@ IF( WIN32 ) set( RPCRT4 rpcrt4 ) #boost - SET(BOOST_ROOT $ENV{BOOST_ROOT}) -# set(Boost_USE_DEBUG_PYTHON ON) + if ($ENV{BOOST_ROOT}) + SET(BOOST_ROOT $ENV{BOOST_ROOT}) + endif() + + set(Boost_USE_DEBUG_PYTHON ON) set(Boost_USE_MULTITHREADED ON) set(BOOST_ALL_DYN_LINK OFF) # force dynamic linking for all libraries - FIND_PACKAGE(Boost 1.53 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) - # For Boost 1.53 on windows, coroutine was not in BOOST_LIBRARYDIR and do not need it to build, but if boost versin >= 1.54, find coroutine otherwise will cause link errors - IF(NOT "${Boost_VERSION}" MATCHES "1.53(.*)") - SET(BOOST_LIBRARIES_TEMP ${Boost_LIBRARIES}) - FIND_PACKAGE(Boost 1.54 REQUIRED COMPONENTS coroutine) - LIST(APPEND BOOST_COMPONENTS coroutine) - SET(Boost_LIBRARIES ${BOOST_LIBRARIES_TEMP} ${Boost_LIBRARIES}) - ENDIF() + LIST(APPEND PLATFORM_SPECIFIC_LIBS ws2_32 crypt32 mswsock userenv) - LIST(APPEND PLATFORM_SPECIFIC_LIBS wsock32.lib ws2_32.lib userenv.lib) # iphlpapi.lib ELSE(WIN32) MESSAGE(STATUS "Configuring fc to build on Unix/Apple") - LIST(APPEND BOOST_COMPONENTS coroutine) - - FIND_PACKAGE(Boost 1.53 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) - SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so") IF(NOT APPLE) @@ -175,9 +160,10 @@ ELSE(WIN32) ENDIF(NOT APPLE) ENDIF(WIN32) +FIND_PACKAGE(Boost 1.57 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) -IF(NOT "$ENV{OPENSSL_ROOT_DIR}" STREQUAL "") +IF($ENV{OPENSSL_ROOT_DIR}) set(OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT_DIR} ) set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include) message(STATUS "Setting up OpenSSL root and include vars to ${OPENSSL_ROOT_DIR}, ${OPENSSL_INCLUDE_DIR}") @@ -283,12 +269,11 @@ setup_library( fc SOURCES ${sources} LIBRARY_TYPE STATIC ) install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include ) # begin editline stuff -if(NOT (MSVC OR MINGW)) - target_compile_definitions (fc PRIVATE HAVE_EDITLINE) - set(editline_libraries editline) -endif(NOT (MSVC OR MINGW)) if(WIN32) target_compile_definitions( fc PRIVATE _CRT_NONSTDC_NO_DEPRECATE ) +elseif(WIN32) + target_compile_definitions (fc PRIVATE HAVE_EDITLINE) + set(editline_libraries editline) endif(WIN32) # end editline stuff @@ -383,9 +368,11 @@ target_link_libraries( fc PUBLIC ${LINK_USR_LOCAL_LIB} ${OPENSSL_LIBRARIES} ${Z ${PLATFORM_SPECIFIC_LIBS} ${RPCRT4} ${CMAKE_DL_LIBS} ${rt_library} ${editline_libraries} secp256k1 ${CMAKE_REQUIRED_LIBRARIES} ) -if(MSVC) - set_source_files_properties( src/network/http/websocket.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) -endif(MSVC) +if(WIN32 AND MSVC) + set_source_files_properties( src/network/http/websocket.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) +elseif(WIN32 AND MINGW) + set_source_files_properties( src/network/http/websocket.cpp PROPERTIES LINK_FLAGS "-mbig-obj" ) +endif() IF(NOT Boost_UNIT_TEST_FRAMEWORK_LIBRARY MATCHES "\\.(a|lib)$") @@ -400,18 +387,10 @@ include_directories( vendor/websocketpp ) add_subdirectory(tests) -if(WIN32) +if(MSVC) # add addtional import library on windows platform target_link_libraries( fc PUBLIC crypt32.lib) - # now generate a list of the DLLs we're using to use during the install process - include (ParseLibraryList) - PARSE_LIBRARY_LIST(${Boost_LIBRARIES} - FOUND parseOk - DEBUG Boost_LIBRARIES_DEBUG - OPT Boost_LIBRARIES_RELEASE - GENERAL Boost_LIBRARIES_GENERAL) - #Variable will hold list of .pdb files generated for libraries the 'fc' module is linked to set(INTERFACE_LINK_PDB_RELEASE) @@ -480,31 +459,6 @@ if(WIN32) set_property(TARGET fc PROPERTY SHARED_LIBRARIES_DEBUG ${SHARED_LIBRARIES_DEBUG}) set_property(TARGET fc PROPERTY SHARED_LIBRARIES_RELEASE ${SHARED_LIBRARIES_RELEASE}) -endif(WIN32) - -SET(OPENSSL_CONF_TARGET ) -IF(DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) - SET (OPENSSL_CONF_TARGET ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) -ELSE() - SET (OPENSSL_CONF_TARGET ${CMAKE_CURRENT_BINARY_DIR}) -ENDIF() - - IF(WIN32) - IF("${OPENSSL_ROOT_DIR}" STREQUAL "") - get_filename_component(OPENSSL_ROOT_DIR "${OPENSSL_INCLUDE_DIR}/.." REALPATH) - ENDIF() - IF("${OPENSSL_CONF_SOURCE}" STREQUAL "") - SET(OPENSSL_CONF_SOURCE "${OPENSSL_ROOT_DIR}/ssl/openssl.cnf") - IF(MINGW) - SET(OPENSSL_CONF_SOURCE "${OPENSSL_ROOT_DIR}/openssl.cnf") - ENDIF(MINGW) - ENDIF() - SET(POST_BUILD_STEP_COMMANDS ${POST_BUILD_STEP_COMMANDS} - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OPENSSL_CONF_SOURCE}" "${OPENSSL_CONF_TARGET}/openssl.cnf") - ENDIF(WIN32) - -ADD_CUSTOM_COMMAND(TARGET fc POST_BUILD ${POST_BUILD_STEP_COMMANDS} - COMMENT "Copying OpenSSL/ssl/openssl.cnf into target directory." -) +endif(MSVC) MESSAGE(STATUS "Finished fc module configuration...") diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index 2e08740..5f1ce5b 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -148,7 +148,7 @@ namespace fc #ifdef __APPLE__ void to_variant( size_t s, variant& v, uint32_t max_depth = 1 ); - #elif !defined(_MSC_VER) + #elif !defined(_WIN32) void to_variant( long long int s, variant& v, uint32_t max_depth = 1 ); void to_variant( unsigned long long int s, variant& v, uint32_t max_depth = 1 ); #endif diff --git a/src/variant.cpp b/src/variant.cpp index 4e52ec9..3d24e28 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -673,7 +673,7 @@ void from_variant( const variant& var, std::vector& vo, uint32_t max_depth } #ifdef __APPLE__ -#elif !defined(_MSC_VER) +#elif !defined(_WIN32) void to_variant( long long int s, variant& v, uint32_t max_depth ) { v = variant( int64_t(s) ); } void to_variant( unsigned long long int s, variant& v, uint32_t max_depth ) { v = variant( uint64_t(s)); } #endif From c9b3d57b0e0ac0eddbdd673316943cb6db19d8bf Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 9 Apr 2019 16:37:32 +0200 Subject: [PATCH 003/117] Updated Boost searching --- CMakeLists.txt | 8 +- CMakeModules/Boost/BoostConfig.cmake | 18 + .../{ => Legacy/Boost}/FindBoost.cmake | 2360 ++++++++--------- CMakeModules/Legacy/CMakeLists.txt | 27 + 4 files changed, 1228 insertions(+), 1185 deletions(-) create mode 100644 CMakeModules/Boost/BoostConfig.cmake rename CMakeModules/{ => Legacy/Boost}/FindBoost.cmake (97%) create mode 100644 CMakeModules/Legacy/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 01fe9d0..37dae09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ # # Defines fc library target. +CMAKE_MINIMUM_REQUIRED( VERSION 3.1.2 FATAL_ERROR ) PROJECT( fc ) -CMAKE_MINIMUM_REQUIRED( VERSION 3.2 ) set( CMAKE_CXX_STANDARD 14 ) SET( CMAKE_CXX_STANDARD_REQUIRED ON ) @@ -22,9 +22,7 @@ INCLUDE(GetGitRevisionDescription) INCLUDE(CheckLibraryExists) INCLUDE(CheckLibcxxAtomic) -if (APPLE) - INCLUDE(Legacy) -endif (APPLE) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/Legacy) get_git_head_revision(GIT_REFSPEC FC_GIT_REVISION_SHA) get_git_unix_timestamp(FC_GIT_REVISION_UNIX_TIMESTAMP) @@ -160,7 +158,7 @@ ELSE(WIN32) ENDIF(NOT APPLE) ENDIF(WIN32) -FIND_PACKAGE(Boost 1.57 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) +FIND_PACKAGE(Boost CONFIG COMPONENTS ${BOOST_COMPONENTS}) IF($ENV{OPENSSL_ROOT_DIR}) diff --git a/CMakeModules/Boost/BoostConfig.cmake b/CMakeModules/Boost/BoostConfig.cmake new file mode 100644 index 0000000..5a6bac8 --- /dev/null +++ b/CMakeModules/Boost/BoostConfig.cmake @@ -0,0 +1,18 @@ +# This overrides `find_package(Boost ... CONFIG ... )` calls +# - calls the CMAke's built-in `FindBoost.cmake` and adds `pthread` library dependency + +MESSAGE(STATUS "Using custom FindBoost config") + +find_package(Boost 1.57 REQUIRED COMPONENTS ${Boost_FIND_COMPONENTS}) + +# Inject `pthread` dependency to Boost if needed +if (UNIX AND NOT CYGWIN) + list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread) + if (_using_boost_thread GREATER -1) + find_library(BOOST_THREAD_LIBRARY NAMES pthread DOC "The threading library used by boost-thread") + if (BOOST_THREAD_LIBRARY) + MESSAGE(STATUS "Adding Boost thread lib dependency: ${BOOST_THREAD_LIBRARY}") + list(APPEND Boost_LIBRARIES ${BOOST_THREAD_LIBRARY}) + endif () + endif () +endif () \ No newline at end of file diff --git a/CMakeModules/FindBoost.cmake b/CMakeModules/Legacy/Boost/FindBoost.cmake similarity index 97% rename from CMakeModules/FindBoost.cmake rename to CMakeModules/Legacy/Boost/FindBoost.cmake index 4c37f5f..b8276af 100644 --- a/CMakeModules/FindBoost.cmake +++ b/CMakeModules/Legacy/Boost/FindBoost.cmake @@ -1,1180 +1,1180 @@ -# - 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.36.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" -# 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 - BOOST_VERSION value from boost/version.hpp -# Boost_LIB_VERSION - Version string appended to library filenames -# Boost_MAJOR_VERSION - Boost major version number (X in X.y.z) -# Boost_MINOR_VERSION - Boost minor version number (Y in x.Y.z) -# Boost_SUBMINOR_VERSION - Boost subminor version number (Z in x.y.Z) -# Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows) -# - Pass to add_definitions() to have diagnostic -# information about Boost's automatic linking -# displayed during compilation -# -# 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 - Directory containing Boost libraries -# Boost__LIBRARY_DEBUG - Component library debug variant -# Boost__LIBRARY_RELEASE - Component library release variant -# Users may set the 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 directory in Boost_LIBRARY_DIR 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_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_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. -# Boost_THREADAPI - Suffix for "thread" component library name, -# such as "pthread" or "win32". Names with -# and without this suffix will both be tried. -# 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_DETAILED_FAILURE_MSG -# - Set to ON to add detailed information to the -# failure message even when the REQUIRED option -# is not given to the find_package call. -# 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.42.0" instead of -# "/usr/lib/libboost_system.so". This does not -# affect linking and should not be enabled unless -# the user needs this information. -# 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 headers and some libraries: -# set(Boost_USE_STATIC_LIBS ON) -# set(Boost_USE_MULTITHREADED ON) -# set(Boost_USE_STATIC_RUNTIME OFF) -# find_package(Boost 1.36.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 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. - -#============================================================================= -# Copyright 2006-2012 Kitware, Inc. -# Copyright 2006-2008 Andreas Schneider -# Copyright 2007 Wengo -# Copyright 2007 Mike Jackson -# Copyright 2008 Andreas Pakulat -# Copyright 2008-2012 Philip Lowman -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - - -#------------------------------------------------------------------------------- -# Before we go searching, check whether boost-cmake is avaialble, unless the -# user specifically asked NOT to search for boost-cmake. -# -# 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. -# - -message(STATUS "Using custom FindBoost.cmake") - -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 boost-cmake, then we're done. Print out what we found. - # Otherwise let the rest of the module try to find it. - if (Boost_FOUND) - message("Boost ${Boost_FIND_VERSION} found.") - if (Boost_FIND_COMPONENTS) - message("Found Boost components:") - message(" ${Boost_FIND_COMPONENTS}") - endif() - return() - endif() -endif() - - -#------------------------------------------------------------------------------- -# FindBoost functions & macros -# - -############################################ -# -# 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 supports configuration types then set - # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value - if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE) - set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) - else() - # if there are no configuration types and CMAKE_BUILD_TYPE has no value - # then 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) - set(Boost_${basename}_FOUND ON) - endif() - - endif() - # Make variables changeble to the advanced user - mark_as_advanced( - Boost_${basename}_LIBRARY_RELEASE - Boost_${basename}_LIBRARY_DEBUG - ) -endmacro() - -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() - -macro(_Boost_FIND_LIBRARY var) - find_library(${var} ${ARGN}) - - # If we found the first library save Boost_LIBRARY_DIR. - if(${var} AND NOT Boost_LIBRARY_DIR) - get_filename_component(_dir "${${var}}" PATH) - set(Boost_LIBRARY_DIR "${_dir}" CACHE PATH "Boost library directory" FORCE) - endif() - - # If Boost_LIBRARY_DIR is known then search only there. - if(Boost_LIBRARY_DIR) - set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH) - endif() -endmacro() - -#------------------------------------------------------------------------------- - -# -# Runs compiler with "-dumpversion" and parses major/minor -# version with a regex. -# -function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION) - - exec_program(${CMAKE_CXX_COMPILER} - ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion - OUTPUT_VARIABLE _boost_COMPILER_VERSION - ) - string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1\\2" - _boost_COMPILER_VERSION ${_boost_COMPILER_VERSION}) - - set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} 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("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" - OR "${CMAKE_CXX_COMPILER}" MATCHES "icl" - OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc") - if(WIN32) - set (_boost_COMPILER "-iw") - else() - set (_boost_COMPILER "-il") - endif() - elseif (MSVC12) - set(_boost_COMPILER "-vc120") - elseif (MSVC11) - set(_boost_COMPILER "-vc110") - elseif (MSVC10) - set(_boost_COMPILER "-vc100") - elseif (MSVC90) - set(_boost_COMPILER "-vc90") - elseif (MSVC80) - set(_boost_COMPILER "-vc80") - elseif (MSVC71) - set(_boost_COMPILER "-vc71") - elseif (MSVC70) # Good luck! - set(_boost_COMPILER "-vc7") # yes, this is correct - elseif (MSVC60) # Good luck! - set(_boost_COMPILER "-vc6") # yes, this is correct - elseif (BORLAND) - set(_boost_COMPILER "-bcb") - elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "SunPro") - set(_boost_COMPILER "-sw") - elseif (MINGW) - if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) - set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34 - else() - _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION) - set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}") - endif() - elseif (UNIX) - if (CMAKE_COMPILER_IS_GNUCXX) - if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) - set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 - else() - _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION) - # Determine which version of GCC we have. - if(APPLE) - if(Boost_MINOR_VERSION) - if(${Boost_MINOR_VERSION} GREATER 35) - # In Boost 1.36.0 and newer, the mangled compiler name used - # on Mac OS X/Darwin is "xgcc". - set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}") - else() - # In Boost <= 1.35.0, there is no mangled compiler name for - # the Mac OS X/Darwin version of GCC. - set(_boost_COMPILER "") - endif() - else() - # We don't know the Boost version, so assume it's - # pre-1.36.0. - set(_boost_COMPILER "") - endif() - else() - set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") - endif() - endif() - endif () - else() - # TODO at least Boost_DEBUG here? - set(_boost_COMPILER "") - endif() - set(${_ret} ${_boost_COMPILER} PARENT_SCOPE) -endfunction() - -function(_Boost_consider_adding_pthreads _outvar) - # On Unix platforms (excluding cygwin) add pthreads to Boost_LIBRARIES - # if the user is searching for the boost-thread component. - if(UNIX AND NOT CYGWIN) - list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread) - if(_using_boost_thread GREATER -1) - find_library(BOOST_THREAD_LIBRARY NAMES pthread - DOC "The threading library used by boost-thread" - ) - if(BOOST_THREAD_LIBRARY) - set(${_outvar} ${ARGN} ${BOOST_THREAD_LIBRARY} PARENT_SCOPE) - endif() - endif() - endif() -endfunction() - -# -# End functions/macros -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# main. -#------------------------------------------------------------------------------- - -if(NOT DEFINED Boost_USE_MULTITHREADED) - set(Boost_USE_MULTITHREADED 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. - set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} - "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() - -# The reason that we failed to find Boost. This will be set to a -# user-friendly message when we fail to find some necessary piece of -# Boost. -set(Boost_ERROR_REASON) - -if(Boost_DEBUG) - # Output some of their choices - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_USE_MULTITHREADED = ${Boost_USE_MULTITHREADED}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_USE_STATIC_LIBS = ${Boost_USE_STATIC_LIBS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_USE_STATIC_RUNTIME = ${Boost_USE_STATIC_RUNTIME}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_ADDITIONAL_VERSIONS = ${Boost_ADDITIONAL_VERSIONS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_NO_SYSTEM_PATHS = ${Boost_NO_SYSTEM_PATHS}") -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") -endif() - -_Boost_CHECK_SPELLING(Boost_ROOT) -_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 - ) - -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Declared as CMake or Environmental Variables:") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " BOOST_ROOT = ${BOOST_ROOT}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") -endif() - -# ------------------------------------------------------------------------ -# 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) - else() - 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]+") - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1_\\2_\\3" - _boost_BOOSTIFIED_VERSION ${_boost_VER}) - elseif(_boost_VER MATCHES "[0-9]+\\.[0-9]+") - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\1_\\2" - _boost_BOOSTIFIED_VERSION ${_boost_VER}) - 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() - - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Include debugging info:") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " _boost_INCLUDE_SEARCH_DIRS = ${_boost_INCLUDE_SEARCH_DIRS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " _boost_PATH_SUFFIXES = ${_boost_PATH_SUFFIXES}") - endif() - - # 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 -# ------------------------------------------------------------------------ - -# Set Boost_FOUND based only on header location and version. -# It will be updated below for component libraries. -if(Boost_INCLUDE_DIR) - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp") - endif() - - # Extract Boost_VERSION and Boost_LIB_VERSION from version.hpp - set(Boost_VERSION 0) - set(Boost_LIB_VERSION "") - file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ") - set(_Boost_VERSION_REGEX "([0-9]+)") - set(_Boost_LIB_VERSION_REGEX "\"([0-9_]+)\"") - foreach(v VERSION LIB_VERSION) - if("${_boost_VERSION_HPP_CONTENTS}" MATCHES ".*#define BOOST_${v} ${_Boost_${v}_REGEX}.*") - set(Boost_${v} "${CMAKE_MATCH_1}") - endif() - endforeach() - unset(_boost_VERSION_HPP_CONTENTS) - - math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000") - math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000") - math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100") - - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\nBoost include path: ${Boost_INCLUDE_DIR}") - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "version.hpp reveals boost " - "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - endif() - - if(Boost_FIND_VERSION) - # Set Boost_FOUND based on requested version. - set(_Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - if("${_Boost_VERSION}" VERSION_LESS "${Boost_FIND_VERSION}") - set(Boost_FOUND 0) - set(_Boost_VERSION_AGE "old") - elseif(Boost_FIND_VERSION_EXACT AND - NOT "${_Boost_VERSION}" VERSION_EQUAL "${Boost_FIND_VERSION}") - set(Boost_FOUND 0) - set(_Boost_VERSION_AGE "new") - else() - set(Boost_FOUND 1) - endif() - if(NOT Boost_FOUND) - # State that we found a version of Boost that is too new or too old. - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}\nDetected version of Boost is too ${_Boost_VERSION_AGE}. Requested version was ${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") - if (Boost_FIND_VERSION_PATCH) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}.${Boost_FIND_VERSION_PATCH}") - endif () - if (NOT Boost_FIND_VERSION_EXACT) - set(Boost_ERROR_REASON "${Boost_ERROR_REASON} (or newer)") - endif () - set(Boost_ERROR_REASON "${Boost_ERROR_REASON}.") - endif () - else() - # Caller will accept any Boost version. - set(Boost_FOUND 1) - endif() -else() - set(Boost_FOUND 0) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers.") -endif() - -# ------------------------------------------------------------------------ -# Suffix initialization and compiler suffix detection. -# ------------------------------------------------------------------------ - -set(_Boost_VARS_NAME - 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 -set(Boost_LIB_PREFIX "") -if ( WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) - set(Boost_LIB_PREFIX "lib") -endif() - -if (Boost_COMPILER) - set(_boost_COMPILER ${Boost_COMPILER}) - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "using user-specified Boost_COMPILER = ${_boost_COMPILER}") - endif() -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) - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "guessed _boost_COMPILER = ${_boost_COMPILER}") - endif() -endif() - -set (_boost_MULTITHREADED "-mt") -if( NOT Boost_USE_MULTITHREADED ) - set (_boost_MULTITHREADED "") -endif() -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_MULTITHREADED = ${_boost_MULTITHREADED}") -endif() - -#====================== -# Systematically build up the Boost ABI tag -# http://boost.org/doc/libs/1_41_0/more/getting_started/windows.html#library-naming -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) - if(MSVC OR "${CMAKE_CXX_COMPILER}" MATCHES "icl" - OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc") - set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}g") - endif() -endif() -# y using special debug build of python -if(Boost_USE_DEBUG_PYTHON) - set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}y") -endif() -# d using a debug version of your code -set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}d") -# p using the STLport standard library rather than the -# default one supplied with your compiler -if(Boost_USE_STLPORT) - set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}p") - set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}p") -endif() -# n using the STLport deprecated "native iostreams" feature -if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS) - set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}n") - set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}n") -endif() - -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_RELEASE_ABI_TAG = ${_boost_RELEASE_ABI_TAG}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_DEBUG_ABI_TAG = ${_boost_DEBUG_ABI_TAG}") -endif() - -# ------------------------------------------------------------------------ -# Begin finding boost libraries -# ------------------------------------------------------------------------ -set(_Boost_VARS_LIB BOOST_LIBRARYDIR Boost_LIBRARY_DIR) -_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR ${_Boost_VARS_DIR} ${_Boost_VARS_LIB} Boost_INCLUDE_DIR) -# Clear Boost_LIBRARY_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_LIBDIR AND NOT _Boost_LIBRARY_DIR_CHANGED) - unset(Boost_LIBRARY_DIR CACHE) -endif() - -if(Boost_LIBRARY_DIR) - set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH) -else() - set(_boost_LIBRARY_SEARCH_DIRS "") - if(BOOST_LIBRARYDIR) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${BOOST_LIBRARYDIR}) - elseif(_ENV_BOOST_LIBRARYDIR) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${_ENV_BOOST_LIBRARYDIR}) - endif() - - if(BOOST_ROOT) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib) - elseif(_ENV_BOOST_ROOT) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib) - endif() - - list(APPEND _boost_LIBRARY_SEARCH_DIRS - ${Boost_INCLUDE_DIR}/lib - ${Boost_INCLUDE_DIR}/../lib - ${Boost_INCLUDE_DIR}/../lib/${CMAKE_LIBRARY_ARCHITECTURE} - ${Boost_INCLUDE_DIR}/stage/lib - ) - if( Boost_NO_SYSTEM_PATHS ) - list(APPEND _boost_LIBRARY_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH) - else() - list(APPEND _boost_LIBRARY_SEARCH_DIRS PATHS - C:/boost/lib - C:/boost - /sw/local/lib - ) - endif() -endif() - -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_LIBRARY_SEARCH_DIRS = ${_boost_LIBRARY_SEARCH_DIRS}") -endif() - -# 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) - set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - 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 AND Boost_FIND_COMPONENTS) - if(Boost_VERSION LESS 103500) - list(REMOVE_ITEM Boost_FIND_COMPONENTS system) - endif() -endif() - -# If the user changed any of our control inputs flush previous results. -if(_Boost_CHANGE_LIBDIR 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)") - - # - # Find RELEASE libraries - # - set(_boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT} ) - if(_boost_STATIC_RUNTIME_WORKAROUND) - set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") - list(APPEND _boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) - endif() - if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") - _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES}) - endif() - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}") - endif() - - # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. - string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS}") - - _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE - NAMES ${_boost_RELEASE_NAMES} - HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} - NAMES_PER_DIR - DOC "${_boost_docstring_release}" - ) - - # - # Find DEBUG libraries - # - set(_boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED} - ${Boost_LIB_PREFIX}boost_${COMPONENT} ) - if(_boost_STATIC_RUNTIME_WORKAROUND) - set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") - list(APPEND _boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) - endif() - if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") - _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES}) - endif() - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}") - endif() - - # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. - string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS}") - - _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG - NAMES ${_boost_DEBUG_NAMES} - HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} - NAMES_PER_DIR - DOC "${_boost_docstring_debug}" - ) - - 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}) - -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 ${Boost_LIBRARY_DIR}) - -# The above setting of Boost_FOUND was based only on the header files. -# Update it for the requested component libraries. -if(Boost_FOUND) - # The headers were found. Check for requested component libs. - set(_boost_CHECKED_COMPONENT FALSE) - set(_Boost_MISSING_COMPONENTS "") - foreach(COMPONENT ${Boost_FIND_COMPONENTS}) - string(TOUPPER ${COMPONENT} COMPONENT) - set(_boost_CHECKED_COMPONENT TRUE) - if(NOT Boost_${COMPONENT}_FOUND) - string(TOLOWER ${COMPONENT} COMPONENT) - list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT}) - endif() - endforeach() - - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] Boost_FOUND = ${Boost_FOUND}") - endif() - - if (_Boost_MISSING_COMPONENTS) - set(Boost_FOUND 0) - # We were unable to find some libraries, so generate a sensible - # error message that lists the libraries we were unable to find. - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}\nThe following Boost libraries could not be found:\n") - foreach(COMPONENT ${_Boost_MISSING_COMPONENTS}) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON} boost_${COMPONENT}\n") - endforeach() - - list(LENGTH Boost_FIND_COMPONENTS Boost_NUM_COMPONENTS_WANTED) - list(LENGTH _Boost_MISSING_COMPONENTS Boost_NUM_MISSING_COMPONENTS) - if (${Boost_NUM_COMPONENTS_WANTED} EQUAL ${Boost_NUM_MISSING_COMPONENTS}) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") - else () - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") - endif () - endif () - - if( NOT Boost_LIBRARY_DIRS AND NOT _boost_CHECKED_COMPONENT ) - # 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") - set(_boost_LIB_DIR ${_boost_LIB_DIR}/lib) - else() - if(EXISTS "${_boost_LIB_DIR}/stage/lib") - set(_boost_LIB_DIR ${_boost_LIB_DIR}/stage/lib) - else() - set(_boost_LIB_DIR "") - endif() - 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() - -# ------------------------------------------------------------------------ -# Notification to end user about what was found -# ------------------------------------------------------------------------ - -set(Boost_LIBRARIES "") -if(Boost_FOUND) - if(NOT Boost_FIND_QUIETLY) - message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - if(Boost_FIND_COMPONENTS) - message(STATUS "Found the following Boost libraries:") - endif() - endif() - foreach( COMPONENT ${Boost_FIND_COMPONENTS} ) - string( TOUPPER ${COMPONENT} UPPERCOMPONENT ) - if( Boost_${UPPERCOMPONENT}_FOUND ) - if(NOT Boost_FIND_QUIETLY) - message (STATUS " ${COMPONENT}") - endif() - list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY}) - endif() - endforeach() - - # Add pthread library on UNIX if thread component was found - _Boost_consider_adding_pthreads(Boost_LIBRARIES ${Boost_LIBRARIES}) -else() - if(Boost_FIND_REQUIRED) - message(SEND_ERROR "Unable to find the requested Boost libraries.\n${Boost_ERROR_REASON}") - else() - if(NOT Boost_FIND_QUIETLY) - # we opt not to automatically output Boost_ERROR_REASON here as - # it could be quite lengthy and somewhat imposing in its requests - # Since Boost is not always a required dependency we'll leave this - # up to the end-user. - if(Boost_DEBUG OR Boost_DETAILED_FAILURE_MSG) - message(STATUS "Could NOT find Boost\n${Boost_ERROR_REASON}") - else() - message(STATUS "Could NOT find Boost") - endif() - endif() - endif() -endif() - -# 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.") +# - 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.36.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" +# 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 - BOOST_VERSION value from boost/version.hpp +# Boost_LIB_VERSION - Version string appended to library filenames +# Boost_MAJOR_VERSION - Boost major version number (X in X.y.z) +# Boost_MINOR_VERSION - Boost minor version number (Y in x.Y.z) +# Boost_SUBMINOR_VERSION - Boost subminor version number (Z in x.y.Z) +# Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows) +# - Pass to add_definitions() to have diagnostic +# information about Boost's automatic linking +# displayed during compilation +# +# 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 - Directory containing Boost libraries +# Boost__LIBRARY_DEBUG - Component library debug variant +# Boost__LIBRARY_RELEASE - Component library release variant +# Users may set the 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 directory in Boost_LIBRARY_DIR 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_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_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. +# Boost_THREADAPI - Suffix for "thread" component library name, +# such as "pthread" or "win32". Names with +# and without this suffix will both be tried. +# 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_DETAILED_FAILURE_MSG +# - Set to ON to add detailed information to the +# failure message even when the REQUIRED option +# is not given to the find_package call. +# 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.42.0" instead of +# "/usr/lib/libboost_system.so". This does not +# affect linking and should not be enabled unless +# the user needs this information. +# 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 headers and some libraries: +# set(Boost_USE_STATIC_LIBS ON) +# set(Boost_USE_MULTITHREADED ON) +# set(Boost_USE_STATIC_RUNTIME OFF) +# find_package(Boost 1.36.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 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. + +#============================================================================= +# Copyright 2006-2012 Kitware, Inc. +# Copyright 2006-2008 Andreas Schneider +# Copyright 2007 Wengo +# Copyright 2007 Mike Jackson +# Copyright 2008 Andreas Pakulat +# Copyright 2008-2012 Philip Lowman +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + + +#------------------------------------------------------------------------------- +# Before we go searching, check whether boost-cmake is avaialble, unless the +# user specifically asked NOT to search for boost-cmake. +# +# 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. +# + +message(STATUS "Using custom FindBoost.cmake") + +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 boost-cmake, then we're done. Print out what we found. + # Otherwise let the rest of the module try to find it. + if (Boost_FOUND) + message("Boost ${Boost_FIND_VERSION} found.") + if (Boost_FIND_COMPONENTS) + message("Found Boost components:") + message(" ${Boost_FIND_COMPONENTS}") + endif() + return() + endif() +endif() + + +#------------------------------------------------------------------------------- +# FindBoost functions & macros +# + +############################################ +# +# 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 supports configuration types then set + # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value + if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE) + set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) + else() + # if there are no configuration types and CMAKE_BUILD_TYPE has no value + # then 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) + set(Boost_${basename}_FOUND ON) + endif() + + endif() + # Make variables changeble to the advanced user + mark_as_advanced( + Boost_${basename}_LIBRARY_RELEASE + Boost_${basename}_LIBRARY_DEBUG + ) +endmacro() + +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() + +macro(_Boost_FIND_LIBRARY var) + find_library(${var} ${ARGN}) + + # If we found the first library save Boost_LIBRARY_DIR. + if(${var} AND NOT Boost_LIBRARY_DIR) + get_filename_component(_dir "${${var}}" PATH) + set(Boost_LIBRARY_DIR "${_dir}" CACHE PATH "Boost library directory" FORCE) + endif() + + # If Boost_LIBRARY_DIR is known then search only there. + if(Boost_LIBRARY_DIR) + set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH) + endif() +endmacro() + +#------------------------------------------------------------------------------- + +# +# Runs compiler with "-dumpversion" and parses major/minor +# version with a regex. +# +function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION) + + exec_program(${CMAKE_CXX_COMPILER} + ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion + OUTPUT_VARIABLE _boost_COMPILER_VERSION + ) + string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1\\2" + _boost_COMPILER_VERSION ${_boost_COMPILER_VERSION}) + + set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} 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("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" + OR "${CMAKE_CXX_COMPILER}" MATCHES "icl" + OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc") + if(WIN32) + set (_boost_COMPILER "-iw") + else() + set (_boost_COMPILER "-il") + endif() + elseif (MSVC12) + set(_boost_COMPILER "-vc120") + elseif (MSVC11) + set(_boost_COMPILER "-vc110") + elseif (MSVC10) + set(_boost_COMPILER "-vc100") + elseif (MSVC90) + set(_boost_COMPILER "-vc90") + elseif (MSVC80) + set(_boost_COMPILER "-vc80") + elseif (MSVC71) + set(_boost_COMPILER "-vc71") + elseif (MSVC70) # Good luck! + set(_boost_COMPILER "-vc7") # yes, this is correct + elseif (MSVC60) # Good luck! + set(_boost_COMPILER "-vc6") # yes, this is correct + elseif (BORLAND) + set(_boost_COMPILER "-bcb") + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "SunPro") + set(_boost_COMPILER "-sw") + elseif (MINGW) + if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) + set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34 + else() + _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION) + set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}") + endif() + elseif (UNIX) + if (CMAKE_COMPILER_IS_GNUCXX) + if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) + set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 + else() + _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION) + # Determine which version of GCC we have. + if(APPLE) + if(Boost_MINOR_VERSION) + if(${Boost_MINOR_VERSION} GREATER 35) + # In Boost 1.36.0 and newer, the mangled compiler name used + # on Mac OS X/Darwin is "xgcc". + set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}") + else() + # In Boost <= 1.35.0, there is no mangled compiler name for + # the Mac OS X/Darwin version of GCC. + set(_boost_COMPILER "") + endif() + else() + # We don't know the Boost version, so assume it's + # pre-1.36.0. + set(_boost_COMPILER "") + endif() + else() + set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") + endif() + endif() + endif () + else() + # TODO at least Boost_DEBUG here? + set(_boost_COMPILER "") + endif() + set(${_ret} ${_boost_COMPILER} PARENT_SCOPE) +endfunction() + +function(_Boost_consider_adding_pthreads _outvar) + # On Unix platforms (excluding cygwin) add pthreads to Boost_LIBRARIES + # if the user is searching for the boost-thread component. + if(UNIX AND NOT CYGWIN) + list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread) + if(_using_boost_thread GREATER -1) + find_library(BOOST_THREAD_LIBRARY NAMES pthread + DOC "The threading library used by boost-thread" + ) + if(BOOST_THREAD_LIBRARY) + set(${_outvar} ${ARGN} ${BOOST_THREAD_LIBRARY} PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + +# +# End functions/macros +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# main. +#------------------------------------------------------------------------------- + +if(NOT DEFINED Boost_USE_MULTITHREADED) + set(Boost_USE_MULTITHREADED 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. + set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} + "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() + +# The reason that we failed to find Boost. This will be set to a +# user-friendly message when we fail to find some necessary piece of +# Boost. +set(Boost_ERROR_REASON) + +if(Boost_DEBUG) + # Output some of their choices + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_MULTITHREADED = ${Boost_USE_MULTITHREADED}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_STATIC_LIBS = ${Boost_USE_STATIC_LIBS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_USE_STATIC_RUNTIME = ${Boost_USE_STATIC_RUNTIME}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_ADDITIONAL_VERSIONS = ${Boost_ADDITIONAL_VERSIONS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Boost_NO_SYSTEM_PATHS = ${Boost_NO_SYSTEM_PATHS}") +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") +endif() + +_Boost_CHECK_SPELLING(Boost_ROOT) +_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 + ) + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Declared as CMake or Environmental Variables:") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_ROOT = ${BOOST_ROOT}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") +endif() + +# ------------------------------------------------------------------------ +# 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) + else() + 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]+") + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1_\\2_\\3" + _boost_BOOSTIFIED_VERSION ${_boost_VER}) + elseif(_boost_VER MATCHES "[0-9]+\\.[0-9]+") + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\1_\\2" + _boost_BOOSTIFIED_VERSION ${_boost_VER}) + 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() + + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Include debugging info:") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " _boost_INCLUDE_SEARCH_DIRS = ${_boost_INCLUDE_SEARCH_DIRS}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + " _boost_PATH_SUFFIXES = ${_boost_PATH_SUFFIXES}") + endif() + + # 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 +# ------------------------------------------------------------------------ + +# Set Boost_FOUND based only on header location and version. +# It will be updated below for component libraries. +if(Boost_INCLUDE_DIR) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp") + endif() + + # Extract Boost_VERSION and Boost_LIB_VERSION from version.hpp + set(Boost_VERSION 0) + set(Boost_LIB_VERSION "") + file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ") + set(_Boost_VERSION_REGEX "([0-9]+)") + set(_Boost_LIB_VERSION_REGEX "\"([0-9_]+)\"") + foreach(v VERSION LIB_VERSION) + if("${_boost_VERSION_HPP_CONTENTS}" MATCHES ".*#define BOOST_${v} ${_Boost_${v}_REGEX}.*") + set(Boost_${v} "${CMAKE_MATCH_1}") + endif() + endforeach() + unset(_boost_VERSION_HPP_CONTENTS) + + math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000") + math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000") + math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100") + + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\nBoost include path: ${Boost_INCLUDE_DIR}") + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "version.hpp reveals boost " + "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + endif() + + if(Boost_FIND_VERSION) + # Set Boost_FOUND based on requested version. + set(_Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + if("${_Boost_VERSION}" VERSION_LESS "${Boost_FIND_VERSION}") + set(Boost_FOUND 0) + set(_Boost_VERSION_AGE "old") + elseif(Boost_FIND_VERSION_EXACT AND + NOT "${_Boost_VERSION}" VERSION_EQUAL "${Boost_FIND_VERSION}") + set(Boost_FOUND 0) + set(_Boost_VERSION_AGE "new") + else() + set(Boost_FOUND 1) + endif() + if(NOT Boost_FOUND) + # State that we found a version of Boost that is too new or too old. + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}\nDetected version of Boost is too ${_Boost_VERSION_AGE}. Requested version was ${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") + if (Boost_FIND_VERSION_PATCH) + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}.${Boost_FIND_VERSION_PATCH}") + endif () + if (NOT Boost_FIND_VERSION_EXACT) + set(Boost_ERROR_REASON "${Boost_ERROR_REASON} (or newer)") + endif () + set(Boost_ERROR_REASON "${Boost_ERROR_REASON}.") + endif () + else() + # Caller will accept any Boost version. + set(Boost_FOUND 1) + endif() +else() + set(Boost_FOUND 0) + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers.") +endif() + +# ------------------------------------------------------------------------ +# Suffix initialization and compiler suffix detection. +# ------------------------------------------------------------------------ + +set(_Boost_VARS_NAME + 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 +set(Boost_LIB_PREFIX "") +if ( WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) + set(Boost_LIB_PREFIX "lib") +endif() + +if (Boost_COMPILER) + set(_boost_COMPILER ${Boost_COMPILER}) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "using user-specified Boost_COMPILER = ${_boost_COMPILER}") + endif() +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) + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "guessed _boost_COMPILER = ${_boost_COMPILER}") + endif() +endif() + +set (_boost_MULTITHREADED "-mt") +if( NOT Boost_USE_MULTITHREADED ) + set (_boost_MULTITHREADED "") +endif() +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_MULTITHREADED = ${_boost_MULTITHREADED}") +endif() + +#====================== +# Systematically build up the Boost ABI tag +# http://boost.org/doc/libs/1_41_0/more/getting_started/windows.html#library-naming +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) + if(MSVC OR "${CMAKE_CXX_COMPILER}" MATCHES "icl" + OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc") + set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}g") + endif() +endif() +# y using special debug build of python +if(Boost_USE_DEBUG_PYTHON) + set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}y") +endif() +# d using a debug version of your code +set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}d") +# p using the STLport standard library rather than the +# default one supplied with your compiler +if(Boost_USE_STLPORT) + set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}p") + set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}p") +endif() +# n using the STLport deprecated "native iostreams" feature +if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS) + set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}n") + set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}n") +endif() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_RELEASE_ABI_TAG = ${_boost_RELEASE_ABI_TAG}") + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_DEBUG_ABI_TAG = ${_boost_DEBUG_ABI_TAG}") +endif() + +# ------------------------------------------------------------------------ +# Begin finding boost libraries +# ------------------------------------------------------------------------ +set(_Boost_VARS_LIB BOOST_LIBRARYDIR Boost_LIBRARY_DIR) +_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR ${_Boost_VARS_DIR} ${_Boost_VARS_LIB} Boost_INCLUDE_DIR) +# Clear Boost_LIBRARY_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_LIBDIR AND NOT _Boost_LIBRARY_DIR_CHANGED) + unset(Boost_LIBRARY_DIR CACHE) +endif() + +if(Boost_LIBRARY_DIR) + set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH) +else() + set(_boost_LIBRARY_SEARCH_DIRS "") + if(BOOST_LIBRARYDIR) + list(APPEND _boost_LIBRARY_SEARCH_DIRS ${BOOST_LIBRARYDIR}) + elseif(_ENV_BOOST_LIBRARYDIR) + list(APPEND _boost_LIBRARY_SEARCH_DIRS ${_ENV_BOOST_LIBRARYDIR}) + endif() + + if(BOOST_ROOT) + list(APPEND _boost_LIBRARY_SEARCH_DIRS ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib) + elseif(_ENV_BOOST_ROOT) + list(APPEND _boost_LIBRARY_SEARCH_DIRS ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib) + endif() + + list(APPEND _boost_LIBRARY_SEARCH_DIRS + ${Boost_INCLUDE_DIR}/lib + ${Boost_INCLUDE_DIR}/../lib + ${Boost_INCLUDE_DIR}/../lib/${CMAKE_LIBRARY_ARCHITECTURE} + ${Boost_INCLUDE_DIR}/stage/lib + ) + if( Boost_NO_SYSTEM_PATHS ) + list(APPEND _boost_LIBRARY_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH) + else() + list(APPEND _boost_LIBRARY_SEARCH_DIRS PATHS + C:/boost/lib + C:/boost + /sw/local/lib + ) + endif() +endif() + +if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "_boost_LIBRARY_SEARCH_DIRS = ${_boost_LIBRARY_SEARCH_DIRS}") +endif() + +# 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) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + 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 AND Boost_FIND_COMPONENTS) + if(Boost_VERSION LESS 103500) + list(REMOVE_ITEM Boost_FIND_COMPONENTS system) + endif() +endif() + +# If the user changed any of our control inputs flush previous results. +if(_Boost_CHANGE_LIBDIR 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)") + + # + # Find RELEASE libraries + # + set(_boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} + ${Boost_LIB_PREFIX}boost_${COMPONENT} ) + if(_boost_STATIC_RUNTIME_WORKAROUND) + set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") + list(APPEND _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) + endif() + if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") + _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES}) + endif() + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}") + endif() + + # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. + string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS}") + + _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE + NAMES ${_boost_RELEASE_NAMES} + HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} + NAMES_PER_DIR + DOC "${_boost_docstring_release}" + ) + + # + # Find DEBUG libraries + # + set(_boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED} + ${Boost_LIB_PREFIX}boost_${COMPONENT} ) + if(_boost_STATIC_RUNTIME_WORKAROUND) + set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") + list(APPEND _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION} + ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) + endif() + if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") + _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES}) + endif() + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " + "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}") + endif() + + # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. + string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS}") + + _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG + NAMES ${_boost_DEBUG_NAMES} + HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} + NAMES_PER_DIR + DOC "${_boost_docstring_debug}" + ) + + 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}) + +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 ${Boost_LIBRARY_DIR}) + +# The above setting of Boost_FOUND was based only on the header files. +# Update it for the requested component libraries. +if(Boost_FOUND) + # The headers were found. Check for requested component libs. + set(_boost_CHECKED_COMPONENT FALSE) + set(_Boost_MISSING_COMPONENTS "") + foreach(COMPONENT ${Boost_FIND_COMPONENTS}) + string(TOUPPER ${COMPONENT} COMPONENT) + set(_boost_CHECKED_COMPONENT TRUE) + if(NOT Boost_${COMPONENT}_FOUND) + string(TOLOWER ${COMPONENT} COMPONENT) + list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT}) + endif() + endforeach() + + if(Boost_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] Boost_FOUND = ${Boost_FOUND}") + endif() + + if (_Boost_MISSING_COMPONENTS) + set(Boost_FOUND 0) + # We were unable to find some libraries, so generate a sensible + # error message that lists the libraries we were unable to find. + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}\nThe following Boost libraries could not be found:\n") + foreach(COMPONENT ${_Boost_MISSING_COMPONENTS}) + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON} boost_${COMPONENT}\n") + endforeach() + + list(LENGTH Boost_FIND_COMPONENTS Boost_NUM_COMPONENTS_WANTED) + list(LENGTH _Boost_MISSING_COMPONENTS Boost_NUM_MISSING_COMPONENTS) + if (${Boost_NUM_COMPONENTS_WANTED} EQUAL ${Boost_NUM_MISSING_COMPONENTS}) + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") + else () + set(Boost_ERROR_REASON + "${Boost_ERROR_REASON}Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") + endif () + endif () + + if( NOT Boost_LIBRARY_DIRS AND NOT _boost_CHECKED_COMPONENT ) + # 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") + set(_boost_LIB_DIR ${_boost_LIB_DIR}/lib) + else() + if(EXISTS "${_boost_LIB_DIR}/stage/lib") + set(_boost_LIB_DIR ${_boost_LIB_DIR}/stage/lib) + else() + set(_boost_LIB_DIR "") + endif() + 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() + +# ------------------------------------------------------------------------ +# Notification to end user about what was found +# ------------------------------------------------------------------------ + +set(Boost_LIBRARIES "") +if(Boost_FOUND) + if(NOT Boost_FIND_QUIETLY) + message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") + if(Boost_FIND_COMPONENTS) + message(STATUS "Found the following Boost libraries:") + endif() + endif() + foreach( COMPONENT ${Boost_FIND_COMPONENTS} ) + string( TOUPPER ${COMPONENT} UPPERCOMPONENT ) + if( Boost_${UPPERCOMPONENT}_FOUND ) + if(NOT Boost_FIND_QUIETLY) + message (STATUS " ${COMPONENT}") + endif() + list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY}) + endif() + endforeach() + + # Add pthread library on UNIX if thread component was found + _Boost_consider_adding_pthreads(Boost_LIBRARIES ${Boost_LIBRARIES}) +else() + if(Boost_FIND_REQUIRED) + message(SEND_ERROR "Unable to find the requested Boost libraries.\n${Boost_ERROR_REASON}") + else() + if(NOT Boost_FIND_QUIETLY) + # we opt not to automatically output Boost_ERROR_REASON here as + # it could be quite lengthy and somewhat imposing in its requests + # Since Boost is not always a required dependency we'll leave this + # up to the end-user. + if(Boost_DEBUG OR Boost_DETAILED_FAILURE_MSG) + message(STATUS "Could NOT find Boost\n${Boost_ERROR_REASON}") + else() + message(STATUS "Could NOT find Boost") + endif() + endif() + endif() +endif() + +# 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.") diff --git a/CMakeModules/Legacy/CMakeLists.txt b/CMakeModules/Legacy/CMakeLists.txt new file mode 100644 index 0000000..353391d --- /dev/null +++ b/CMakeModules/Legacy/CMakeLists.txt @@ -0,0 +1,27 @@ +# If you are running recent enough version of CMake you shall consider updating/removing these lines ... +MESSAGE(STATUS "Configuring build scripts for older CMake versions") + +# This patches your current boost searching routine so that `pthread` library is included if needed +# - this is here to fix some older CMake + Boost configurations +set(Boost_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../Boost" PARENT_SCOPE) + +if (APPLE OR USE_LEGACY_FIND_BOOST) + MESSAGE(STATUS "Configuring for custom FindBoost.cmake") + # Custom FindBoost.cmake + # - overrides `find_package( Boost )` functionality + # - it's a modified https://github.com/Kitware/CMake/blob/363825cd55595b7de62fcf610836f6156a9f1a31/Modules/FindBoost.cmake + # - adds additional Boost search path + # - adds pthread as an dependency if needed + ###### + # This is using an old version of FindBoost.cmake irregardless of your CMake version + # - this will be removed in future release + # - improves Boost library search in some Apple OS configrations + # - this can be fixed with properly setting BOOST_LIBRARYDIR + ##### + + MESSAGE(DEPRECATION "Custom FindBoost.cmake will be deprecated in some future release. If you are using some of the affected configurations try setting the BOOST_LIBRARYDIR variable.") + + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Boost") + + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE) +endif () \ No newline at end of file From 8d33bb844d04d7e59092ea4b8823aa62400d9d29 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 23 Apr 2019 13:45:18 +0200 Subject: [PATCH 004/117] Fixed `pthread` dependency --- CMakeLists.txt | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 37dae09..b5a3808 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,6 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(platformBitness 64) endif() -SET (ORIGINAL_LIB_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - SET(BOOST_COMPONENTS) LIST(APPEND BOOST_COMPONENTS coroutine thread date_time filesystem system program_options chrono unit_test_framework context iostreams regex) # boost::endian is also required, but FindBoost can't handle header-only libs @@ -145,21 +143,18 @@ IF( WIN32 ) LIST(APPEND PLATFORM_SPECIFIC_LIBS ws2_32 crypt32 mswsock userenv) # iphlpapi.lib - -ELSE(WIN32) - MESSAGE(STATUS "Configuring fc to build on Unix/Apple") - - SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so") - - IF(NOT APPLE) - # Linux or other unix - SET(rt_library rt ) - SET(pthread_library pthread) - ENDIF(NOT APPLE) ENDIF(WIN32) FIND_PACKAGE(Boost CONFIG COMPONENTS ${BOOST_COMPONENTS}) +IF(NOT WIN32) + MESSAGE(STATUS "Configuring fc to build on Unix/Apple") + + if(NOT APPLE) + SET(rt_library rt) + SET(pthread_library pthread) + endif(NOT APPLE) +ENDIF(NOT WIN32) IF($ENV{OPENSSL_ROOT_DIR}) set(OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT_DIR} ) @@ -173,8 +168,6 @@ ENDIF( LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB ) find_package(OpenSSL REQUIRED) -set( CMAKE_FIND_LIBRARY_SUFFIXES ${ORIGINAL_LIB_SUFFIXES} ) - option( UNITY_BUILD OFF ) set( fc_sources From c453db886bec1984f9d691325c2ca8569a51e6d7 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 23 Apr 2019 17:23:00 +0200 Subject: [PATCH 005/117] CMake version bump --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b5a3808..79bf995 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # # Defines fc library target. -CMAKE_MINIMUM_REQUIRED( VERSION 3.1.2 FATAL_ERROR ) +CMAKE_MINIMUM_REQUIRED( VERSION 3.2 FATAL_ERROR ) PROJECT( fc ) set( CMAKE_CXX_STANDARD 14 ) From b8a87bde7630464478398c7fe3d0ede72a9866cf Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 23 Apr 2019 17:23:37 +0200 Subject: [PATCH 006/117] BoostConfig EOF newline --- CMakeModules/Boost/BoostConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeModules/Boost/BoostConfig.cmake b/CMakeModules/Boost/BoostConfig.cmake index 5a6bac8..b0d9323 100644 --- a/CMakeModules/Boost/BoostConfig.cmake +++ b/CMakeModules/Boost/BoostConfig.cmake @@ -15,4 +15,4 @@ if (UNIX AND NOT CYGWIN) list(APPEND Boost_LIBRARIES ${BOOST_THREAD_LIBRARY}) endif () endif () -endif () \ No newline at end of file +endif () From a2303d35282fb402854164e9923777ada79a7c29 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Thu, 25 Apr 2019 11:51:21 +0200 Subject: [PATCH 007/117] Updated CMake for MinGW --- CMakeLists.txt | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79bf995..a154c9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,7 @@ LIST(APPEND BOOST_COMPONENTS coroutine thread date_time filesystem system progra SET( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" ) # Configure secp256k1-zkp -if ( MSVC ) +if ( WIN32 ) # autoconf won't work here, hard code the defines set( SECP256K1_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp" ) @@ -60,18 +60,9 @@ if ( MSVC ) USE_SCALAR_8X32 USE_SCALAR_INV_BUILTIN ) set_target_properties( secp256k1 PROPERTIES COMPILE_DEFINITIONS "${SECP256K1_BUILD_DEFINES}" LINKER_LANGUAGE C ) -else ( MSVC ) +else ( WIN32 ) include(ExternalProject) - if ( MINGW ) - ExternalProject_Add( project_secp256k1 - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/vendor/secp256k1-zkp - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp - CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp/configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/vendor/secp256k1-zkp --with-bignum=no --host=x86_64-w64-mingw32 - BUILD_COMMAND make - INSTALL_COMMAND true - BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/vendor/secp256k1-zkp/src/project_secp256k1-build/.libs/libsecp256k1.a - ) - else ( MINGW ) + ExternalProject_Add( project_secp256k1 PREFIX ${CMAKE_CURRENT_BINARY_DIR}/vendor/secp256k1-zkp SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp @@ -80,7 +71,7 @@ else ( MSVC ) INSTALL_COMMAND true BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/vendor/secp256k1-zkp/src/project_secp256k1-build/.libs/libsecp256k1.a ) - endif ( MINGW ) + ExternalProject_Add_Step(project_secp256k1 autogen WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp/autogen.sh @@ -94,15 +85,13 @@ else ( MSVC ) set_property(TARGET secp256k1 PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/vendor/secp256k1-zkp/include) add_dependencies(secp256k1 project_secp256k1) install( FILES ${binary_dir}/.libs/libsecp256k1${CMAKE_STATIC_LIBRARY_SUFFIX} DESTINATION lib/cryptonomex ) -endif ( MSVC ) +endif ( WIN32 ) # End configure secp256k1-zkp # Configure editline if ( NOT WIN32 ) include(ExternalProject) - if ( MINGW ) -# Editline is not avalible in MINGW - else ( MINGW ) + ExternalProject_Add( project_editline PREFIX ${CMAKE_CURRENT_BINARY_DIR}/vendor/editline SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline @@ -111,6 +100,7 @@ if ( NOT WIN32 ) INSTALL_COMMAND true BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/vendor/editline/src/project_editline-build/src/.libs/libeditline.a ) + ExternalProject_Add_Step(project_editline autogen WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline/autogen.sh @@ -122,7 +112,6 @@ if ( NOT WIN32 ) set_property(TARGET editline PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/vendor/editline/include) add_dependencies(editline project_editline) install( FILES ${binary_dir}/src/.libs/libeditline${CMAKE_STATIC_LIBRARY_SUFFIX} DESTINATION lib/cryptonomex ) - endif ( MINGW ) endif ( NOT WIN32 ) # End configure editline @@ -316,6 +305,7 @@ ENDIF(APPLE) if( ZLIB_FOUND ) MESSAGE( STATUS "zlib found" ) + target_include_directories(fc PUBLIC ${ZLIB_INCLUDE_DIRS}) add_definitions( -DHAS_ZLIB ) else() MESSAGE( STATUS "zlib not found" ) From 241f1f2f0d9090ebbd693225b85c2a680432192f Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Fri, 26 Apr 2019 09:25:05 +0200 Subject: [PATCH 008/117] Legacy/CMakeLists.txt EOF newline --- CMakeModules/Legacy/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeModules/Legacy/CMakeLists.txt b/CMakeModules/Legacy/CMakeLists.txt index 353391d..56c115f 100644 --- a/CMakeModules/Legacy/CMakeLists.txt +++ b/CMakeModules/Legacy/CMakeLists.txt @@ -24,4 +24,4 @@ if (APPLE OR USE_LEGACY_FIND_BOOST) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Boost") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE) -endif () \ No newline at end of file +endif () From 86b025007a4e1b6a9d5d3679e6625973f33b27f5 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Mon, 20 May 2019 14:59:30 +0200 Subject: [PATCH 009/117] Bumped Boost version --- CMakeModules/Boost/BoostConfig.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeModules/Boost/BoostConfig.cmake b/CMakeModules/Boost/BoostConfig.cmake index b0d9323..a5e01f2 100644 --- a/CMakeModules/Boost/BoostConfig.cmake +++ b/CMakeModules/Boost/BoostConfig.cmake @@ -1,9 +1,9 @@ # This overrides `find_package(Boost ... CONFIG ... )` calls -# - calls the CMAke's built-in `FindBoost.cmake` and adds `pthread` library dependency +# - calls the CMake's built-in `FindBoost.cmake` and adds `pthread` library dependency MESSAGE(STATUS "Using custom FindBoost config") -find_package(Boost 1.57 REQUIRED COMPONENTS ${Boost_FIND_COMPONENTS}) +find_package(Boost 1.58 REQUIRED COMPONENTS ${Boost_FIND_COMPONENTS}) # Inject `pthread` dependency to Boost if needed if (UNIX AND NOT CYGWIN) From ab617200a5052c07315ba93c2fa34f5b26463a92 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Mon, 20 May 2019 15:00:02 +0200 Subject: [PATCH 010/117] Removed unneeded definitions --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a154c9b..c722b18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,7 +141,6 @@ IF(NOT WIN32) if(NOT APPLE) SET(rt_library rt) - SET(pthread_library pthread) endif(NOT APPLE) ENDIF(NOT WIN32) From dfc0a357d379f1c497d8a5e9cc9401f48999bc6a Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Mon, 20 May 2019 15:01:00 +0200 Subject: [PATCH 011/117] Updated Boost Lockfree compilation test --- CMakeModules/CheckLibcxxAtomic.cmake | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeModules/CheckLibcxxAtomic.cmake b/CMakeModules/CheckLibcxxAtomic.cmake index 0e55627..7239d6f 100644 --- a/CMakeModules/CheckLibcxxAtomic.cmake +++ b/CMakeModules/CheckLibcxxAtomic.cmake @@ -18,11 +18,15 @@ function(check_cxx_atomics varname) if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters") endif() + + set(OLD_CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIRS}) + check_cxx_source_compiles(" #include #include -boost::lockfree::queue q; +boost::lockfree::queue> q; int main(int, char**) { uint32_t* a; uint32_t* b; @@ -31,6 +35,7 @@ int main(int, char**) { } " ${varname}) set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_INCLUDES ${OLD_CMAKE_REQUIRED_INCLUDES}) endfunction(check_cxx_atomics) # Perform the check for 64bit atomics without libatomic. From b2c2a475210b5347e9e90b8c18d1af0e6abf4abd Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Mon, 8 Jul 2019 13:41:44 +0200 Subject: [PATCH 012/117] CheckLibcxxAtomic after Boost --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c722b18..f5c3995 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,6 @@ INCLUDE( VersionMacros ) INCLUDE( SetupTargetMacros ) INCLUDE(GetGitRevisionDescription) INCLUDE(CheckLibraryExists) -INCLUDE(CheckLibcxxAtomic) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/Legacy) @@ -441,4 +440,6 @@ if(MSVC) endif(MSVC) +INCLUDE(CheckLibcxxAtomic) + MESSAGE(STATUS "Finished fc module configuration...") From e4b35e4a42cbd1c53a945ff0f8cd28d3ab4a2138 Mon Sep 17 00:00:00 2001 From: Abit Date: Thu, 18 Jul 2019 23:15:22 +0200 Subject: [PATCH 013/117] Update a comment to avoid confusing doxygen --- include/fc/utf8.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/utf8.hpp b/include/fc/utf8.hpp index c573029..8dd934e 100644 --- a/include/fc/utf8.hpp +++ b/include/fc/utf8.hpp @@ -3,7 +3,7 @@ #include -/// This file contains general purpose utilities related to UTF-8 <-> Unicode conversions +// This file contains general purpose utilities related to UTF-8 <-> Unicode conversions namespace fc { From 2c5c30848a2d1cdd774ecaef2b051565f6f151f9 Mon Sep 17 00:00:00 2001 From: abitmore Date: Fri, 19 Jul 2019 15:55:35 -0400 Subject: [PATCH 014/117] Correctly close websocket API connection --- src/rpc/websocket_api.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rpc/websocket_api.cpp b/src/rpc/websocket_api.cpp index 0798f8f..da97a9e 100644 --- a/src/rpc/websocket_api.cpp +++ b/src/rpc/websocket_api.cpp @@ -74,7 +74,10 @@ websocket_api_connection::websocket_api_connection( const std::shared_ptrclosed.connect( [this](){ closed(); } ); + _connection->closed.connect( [this](){ + closed(); + _connection = nullptr; + } ); } variant websocket_api_connection::send_call( From 94f77ffc8521bca352f93c1e9d9b3248ee82eb8a Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 23 Jul 2019 17:14:01 -0500 Subject: [PATCH 015/117] Add hash160 md algo --- CMakeLists.txt | 1 + include/fc/crypto/hash160.hpp | 134 ++++++++++++++++++++++++++++++++ src/crypto/hash160.cpp | 140 ++++++++++++++++++++++++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 include/fc/crypto/hash160.hpp create mode 100644 src/crypto/hash160.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d28877..f923083 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,6 +247,7 @@ set( fc_sources src/crypto/hex.cpp src/crypto/sha1.cpp src/crypto/ripemd160.cpp + src/crypto/hash160.cpp src/crypto/sha256.cpp src/crypto/sha224.cpp src/crypto/sha512.cpp diff --git a/include/fc/crypto/hash160.hpp b/include/fc/crypto/hash160.hpp new file mode 100644 index 0000000..3b59ded --- /dev/null +++ b/include/fc/crypto/hash160.hpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018 jmjatlanta and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#pragma once +#include +#include +#include +#include + +namespace fc{ +class sha512; +class sha256; +class ripemd160; + +class hash160 +{ + public: + hash160(); + explicit hash160( const string& hex_str ); + + string str()const; + explicit operator string()const; + + char* data() const; + size_t data_size() const { return 160/8; } + + static hash160 hash( const char* d, uint32_t dlen ); + static hash160 hash( const string& ); + + template + static hash160 hash( const T& t ) + { + hash160::encoder e; + fc::raw::pack(e,t); + return e.result(); + } + + class encoder + { + public: + encoder(); + ~encoder(); + + void write( const char* d, uint32_t dlen ); + void put( char c ) { write( &c, 1 ); } + void reset(); + hash160 result(); + + private: + class impl; + fc::fwd my; + std::vector bytes; + }; + + template + inline friend T& operator<<( T& ds, const hash160& ep ) { + ds.write( ep.data(), sizeof(ep) ); + return ds; + } + + template + inline friend T& operator>>( T& ds, hash160& ep ) { + ds.read( ep.data(), sizeof(ep) ); + return ds; + } + friend hash160 operator << ( const hash160& h1, uint32_t i ); + friend bool operator == ( const hash160& h1, const hash160& h2 ); + friend bool operator != ( const hash160& h1, const hash160& h2 ); + friend hash160 operator ^ ( const hash160& h1, const hash160& h2 ); + friend bool operator >= ( const hash160& h1, const hash160& h2 ); + friend bool operator > ( const hash160& h1, const hash160& h2 ); + friend bool operator < ( const hash160& h1, const hash160& h2 ); + + boost::endian::little_uint32_buf_t _hash[5]; +}; + +namespace raw { + + template + inline void pack( T& ds, const hash160& ep, uint32_t _max_depth ) { + ds << ep; + } + + template + inline void unpack( T& ds, hash160& ep, uint32_t _max_depth ) { + ds >> ep; + } + +} + + class variant; + void to_variant( const hash160& bi, variant& v, uint32_t max_depth ); + void from_variant( const variant& v, hash160& bi, uint32_t max_depth ); + + /* + typedef hash160 uint160_t; + typedef hash160 uint160; + + template<> struct get_typename { static const char* name() { return "uint160_t"; } }; + */ + template<> struct get_typename { static const char* name() { return "hash160"; } }; +} // namespace fc + +namespace std +{ + template<> + struct hash + { + size_t operator()( const fc::hash160& s )const + { + return *((size_t*)&s); + } + }; +} diff --git a/src/crypto/hash160.cpp b/src/crypto/hash160.cpp new file mode 100644 index 0000000..ab131e5 --- /dev/null +++ b/src/crypto/hash160.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018 jmjatlanta and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "_digest_common.hpp" + +namespace fc +{ + +hash160::hash160() { memset( _hash, 0, sizeof(_hash) ); } + +hash160::hash160( const string& hex_str ) { + fc::from_hex( hex_str, (char*)_hash, sizeof(_hash) ); +} + +string hash160::str()const { + return fc::to_hex( (char*)_hash, sizeof(_hash) ); +} + +hash160::operator string()const { return str(); } + +char* hash160::data()const { return (char*)&_hash[0]; } + + +class hash160::encoder::impl { +public: + impl() + { + } + +}; + +hash160::encoder::~encoder() {} +hash160::encoder::encoder() {} + +hash160 hash160::hash( const char* d, uint32_t dlen ) { + encoder e; + e.write(d,dlen); + return e.result(); +} +hash160 hash160::hash( const string& s ) { + return hash( s.c_str(), s.size() ); +} + +void hash160::encoder::write( const char* d, uint32_t dlen ) +{ + for(uint32_t i = 0; i < dlen; ++i) + bytes.push_back(d[i]); +} + +hash160 hash160::encoder::result() { + // perform the first hashing function + SHA256_CTX sha_ctx; + SHA256_Init(&sha_ctx); + SHA256_Update( &sha_ctx, bytes.data(), bytes.size()); + unsigned char sha_hash[SHA256_DIGEST_LENGTH]; + SHA256_Final( sha_hash, &sha_ctx ); + // perform the second hashing function + RIPEMD160_CTX ripe_ctx; + RIPEMD160_Init(&ripe_ctx); + RIPEMD160_Update( &ripe_ctx, sha_hash, SHA256_DIGEST_LENGTH ); + hash160 h; + RIPEMD160_Final( (uint8_t *)h.data(), &ripe_ctx ); + return h; +} + +hash160 operator << ( const hash160& h1, uint32_t i ) { + hash160 result; + fc::detail::shift_l( h1.data(), result.data(), result.data_size(), i ); + return result; +} +hash160 operator ^ ( const hash160& h1, const hash160& h2 ) { + hash160 result; + result._hash[0] = h1._hash[0].value() ^ h2._hash[0].value(); + result._hash[1] = h1._hash[1].value() ^ h2._hash[1].value(); + result._hash[2] = h1._hash[2].value() ^ h2._hash[2].value(); + result._hash[3] = h1._hash[3].value() ^ h2._hash[3].value(); + result._hash[4] = h1._hash[4].value() ^ h2._hash[4].value(); + return result; +} +bool operator >= ( const hash160& h1, const hash160& h2 ) { + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) >= 0; +} +bool operator > ( const hash160& h1, const hash160& h2 ) { + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) > 0; +} +bool operator < ( const hash160& h1, const hash160& h2 ) { + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) < 0; +} +bool operator != ( const hash160& h1, const hash160& h2 ) { + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) != 0; +} +bool operator == ( const hash160& h1, const hash160& h2 ) { + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) == 0; +} + + void to_variant( const hash160& bi, variant& v, uint32_t max_depth ) + { + to_variant( std::vector( (const char*)&bi, ((const char*)&bi) + sizeof(bi) ), v, max_depth ); + } + void from_variant( const variant& v, hash160& bi, uint32_t max_depth ) + { + std::vector ve = v.as< std::vector >( max_depth ); + memset( &bi, char(0), sizeof(bi) ); + if( ve.size() ) + memcpy( &bi, ve.data(), std::min(ve.size(),sizeof(bi)) ); + } + +} // fc From ea9128257cca8f951cc9de0c346ecfbbcdf4668f Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 23 Jul 2019 17:25:02 -0500 Subject: [PATCH 016/117] Remove unnecessary predeclarations --- include/fc/crypto/hash160.hpp | 9 --------- src/crypto/hash160.cpp | 3 --- 2 files changed, 12 deletions(-) diff --git a/include/fc/crypto/hash160.hpp b/include/fc/crypto/hash160.hpp index 3b59ded..75604f8 100644 --- a/include/fc/crypto/hash160.hpp +++ b/include/fc/crypto/hash160.hpp @@ -28,9 +28,6 @@ #include namespace fc{ -class sha512; -class sha256; -class ripemd160; class hash160 { @@ -112,12 +109,6 @@ namespace raw { void to_variant( const hash160& bi, variant& v, uint32_t max_depth ); void from_variant( const variant& v, hash160& bi, uint32_t max_depth ); - /* - typedef hash160 uint160_t; - typedef hash160 uint160; - - template<> struct get_typename { static const char* name() { return "uint160_t"; } }; - */ template<> struct get_typename { static const char* name() { return "hash160"; } }; } // namespace fc diff --git a/src/crypto/hash160.cpp b/src/crypto/hash160.cpp index ab131e5..d4b390a 100644 --- a/src/crypto/hash160.cpp +++ b/src/crypto/hash160.cpp @@ -28,9 +28,6 @@ #include #include #include -#include -#include -#include #include #include #include "_digest_common.hpp" From 55e2abe7d59d3b462af013f19cea6b373d846258 Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 23 Jul 2019 17:32:29 -0500 Subject: [PATCH 017/117] Fix spacing --- src/crypto/hash160.cpp | 80 ++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/crypto/hash160.cpp b/src/crypto/hash160.cpp index d4b390a..68c4191 100644 --- a/src/crypto/hash160.cpp +++ b/src/crypto/hash160.cpp @@ -38,36 +38,33 @@ namespace fc hash160::hash160() { memset( _hash, 0, sizeof(_hash) ); } hash160::hash160( const string& hex_str ) { - fc::from_hex( hex_str, (char*)_hash, sizeof(_hash) ); + fc::from_hex( hex_str, (char*)_hash, sizeof(_hash) ); } string hash160::str()const { - return fc::to_hex( (char*)_hash, sizeof(_hash) ); + return fc::to_hex( (char*)_hash, sizeof(_hash) ); } hash160::operator string()const { return str(); } char* hash160::data()const { return (char*)&_hash[0]; } - class hash160::encoder::impl { -public: - impl() - { - } - + public: + impl() { } }; hash160::encoder::~encoder() {} hash160::encoder::encoder() {} hash160 hash160::hash( const char* d, uint32_t dlen ) { - encoder e; - e.write(d,dlen); - return e.result(); + encoder e; + e.write(d,dlen); + return e.result(); } + hash160 hash160::hash( const string& s ) { - return hash( s.c_str(), s.size() ); + return hash( s.c_str(), s.size() ); } void hash160::encoder::write( const char* d, uint32_t dlen ) @@ -93,45 +90,52 @@ hash160 hash160::encoder::result() { } hash160 operator << ( const hash160& h1, uint32_t i ) { - hash160 result; - fc::detail::shift_l( h1.data(), result.data(), result.data_size(), i ); - return result; + hash160 result; + fc::detail::shift_l( h1.data(), result.data(), result.data_size(), i ); + return result; } + hash160 operator ^ ( const hash160& h1, const hash160& h2 ) { - hash160 result; - result._hash[0] = h1._hash[0].value() ^ h2._hash[0].value(); - result._hash[1] = h1._hash[1].value() ^ h2._hash[1].value(); - result._hash[2] = h1._hash[2].value() ^ h2._hash[2].value(); - result._hash[3] = h1._hash[3].value() ^ h2._hash[3].value(); - result._hash[4] = h1._hash[4].value() ^ h2._hash[4].value(); - return result; + hash160 result; + result._hash[0] = h1._hash[0].value() ^ h2._hash[0].value(); + result._hash[1] = h1._hash[1].value() ^ h2._hash[1].value(); + result._hash[2] = h1._hash[2].value() ^ h2._hash[2].value(); + result._hash[3] = h1._hash[3].value() ^ h2._hash[3].value(); + result._hash[4] = h1._hash[4].value() ^ h2._hash[4].value(); + return result; } + bool operator >= ( const hash160& h1, const hash160& h2 ) { - return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) >= 0; + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) >= 0; } + bool operator > ( const hash160& h1, const hash160& h2 ) { - return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) > 0; + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) > 0; } + bool operator < ( const hash160& h1, const hash160& h2 ) { - return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) < 0; + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) < 0; } + bool operator != ( const hash160& h1, const hash160& h2 ) { - return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) != 0; + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) != 0; } + bool operator == ( const hash160& h1, const hash160& h2 ) { - return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) == 0; + return memcmp( h1._hash, h2._hash, sizeof(h1._hash) ) == 0; } - void to_variant( const hash160& bi, variant& v, uint32_t max_depth ) - { - to_variant( std::vector( (const char*)&bi, ((const char*)&bi) + sizeof(bi) ), v, max_depth ); - } - void from_variant( const variant& v, hash160& bi, uint32_t max_depth ) - { - std::vector ve = v.as< std::vector >( max_depth ); - memset( &bi, char(0), sizeof(bi) ); - if( ve.size() ) - memcpy( &bi, ve.data(), std::min(ve.size(),sizeof(bi)) ); - } +void to_variant( const hash160& bi, variant& v, uint32_t max_depth ) +{ + to_variant( std::vector( (const char*)&bi, ((const char*)&bi) + sizeof(bi) ), v, max_depth ); +} + +void from_variant( const variant& v, hash160& bi, uint32_t max_depth ) +{ + std::vector ve = v.as< std::vector >( max_depth ); + memset( &bi, char(0), sizeof(bi) ); + if( ve.size() ) + memcpy( &bi, ve.data(), std::min(ve.size(),sizeof(bi)) ); +} } // fc From 5681dd1c0e80058781e722723703d5de2fa202c6 Mon Sep 17 00:00:00 2001 From: John Jones Date: Wed, 24 Jul 2019 10:15:10 -0500 Subject: [PATCH 018/117] Add hash160 test --- tests/crypto/sha_tests.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/crypto/sha_tests.cpp b/tests/crypto/sha_tests.cpp index 9a5665c..7e3d572 100644 --- a/tests/crypto/sha_tests.cpp +++ b/tests/crypto/sha_tests.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -108,6 +109,18 @@ BOOST_AUTO_TEST_CASE(ripemd160_test) test_stream(); } +BOOST_AUTO_TEST_CASE( hash160_test ) +{ + + test( TEST1, "bb1be98c142444d7a56aa3981c3942a978e4dc33" ); + test( TEST2, "b472a266d0bd89c13706a4132ccfb16f7c3b9fcb" ); + test( TEST3, "69dda8a60e0cfc2353aa776864092c0e5ccb4834" ); + test( TEST4, "dfcc6db6ea54d85d2e3a76573183f7a037a729b0" ); + init_5(); + test( TEST5, "f9be0e104ef2ed83a7ddb4765780951405e56ba4" ); + test( TEST6, "3eca00d3b1fcafb0b74fa07fe890bea9b053a17e" ); +} + BOOST_AUTO_TEST_CASE(sha1_test) { init_5(); From 451ed46ecc7ca60c108e446cc0b7c9d6aa29c1dc Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 24 Jun 2019 13:01:45 +0200 Subject: [PATCH 019/117] Replace one more "new promise" with "promise::create" --- include/fc/asio.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/fc/asio.hpp b/include/fc/asio.hpp index 4c330c4..bc9377d 100644 --- a/include/fc/asio.hpp +++ b/include/fc/asio.hpp @@ -102,7 +102,7 @@ namespace asio { */ template size_t read( AsyncReadStream& s, const MutableBufferSequence& buf ) { - promise::ptr p(new promise("fc::asio::read")); + promise::ptr p = promise::create("fc::asio::read"); boost::asio::async_read( s, buf, detail::read_write_handler(p) ); return p->wait(); } @@ -249,7 +249,6 @@ namespace asio { */ template void accept( AcceptorType& acc, SocketType& sock ) { - //promise::ptr p( new promise("fc::asio::tcp::accept") ); promise::ptr p = promise::create("fc::asio::tcp::accept"); acc.async_accept( sock, boost::bind( fc::asio::detail::error_handler, p, _1 ) ); p->wait(); From e160afce1693f1c582b6b1a7e38ee87c6d443dd9 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 24 Jun 2019 13:16:53 +0200 Subject: [PATCH 020/117] Attempt to fix uint128 for mac --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6daae58..af06637 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ PROJECT( fc ) set( CMAKE_CXX_STANDARD 14 ) SET( CMAKE_CXX_STANDARD_REQUIRED ON ) -if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" ) +if( "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Apple)?Clang|GNU$" ) set( CMAKE_CXX_EXTENSIONS ON ) # for __int128 support else( GNU ) set( CMAKE_CXX_EXTENSIONS OFF ) From c8f3e452d34ecf38806fc87c426492e84a43f829 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 24 Jun 2019 13:25:33 +0200 Subject: [PATCH 021/117] Use array::data instead of array::begin --- src/crypto/elliptic_common.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/crypto/elliptic_common.cpp b/src/crypto/elliptic_common.cpp index 56eeebc..dd89c3a 100644 --- a/src/crypto/elliptic_common.cpp +++ b/src/crypto/elliptic_common.cpp @@ -55,7 +55,7 @@ namespace fc { namespace ecc { static chr37 _derive_message( unsigned char first, const unsigned char* key32, int i ) { chr37 result; - unsigned char* dest = result.begin(); + unsigned char* dest = result.data(); *dest++ = first; memcpy( dest, key32, 32 ); dest += 32; _put( &dest, i ); @@ -64,7 +64,7 @@ namespace fc { namespace ecc { chr37 _derive_message( const public_key_data& key, int i ) { - return _derive_message( *key.begin(), key.begin() + 1, i ); + return _derive_message( *key.data(), key.data() + 1, i ); } static chr37 _derive_message( const private_key_secret& key, int i ) @@ -142,9 +142,9 @@ namespace fc { namespace ecc { sha256 check = sha256::hash((char*) key.data(), sizeof(key)); static_assert(sizeof(key) + 4 == 37, "Elliptic public key size (or its hash) is incorrect"); detail::chr37 data; - memcpy(data.data(), key.begin(), key.size()); - memcpy(data.begin() + key.size(), (const char*)check._hash, 4); - return fc::to_base58((char*) data.begin(), data.size()); + memcpy(data.data(), key.data(), key.size()); + memcpy(data.data() + key.size(), (const char*)check._hash, 4); + return fc::to_base58((char*) data.data(), data.size()); } public_key public_key::from_base58( const std::string& b58 ) @@ -163,7 +163,7 @@ namespace fc { namespace ecc { unsigned int public_key::fingerprint() const { public_key_data key = serialize(); - ripemd160 hash = ripemd160::hash( sha256::hash( (char*) key.begin(), key.size() ) ); + ripemd160 hash = ripemd160::hash( sha256::hash( (char*) key.data(), key.size() ) ); unsigned char* fp = (unsigned char*) hash._hash; return (fp[0] << 24) | (fp[1] << 16) | (fp[2] << 8) | fp[3]; } @@ -233,8 +233,8 @@ namespace fc { namespace ecc { { size_t buf_len = key.size() + 4; char *buffer = (char*)alloca(buf_len); - memcpy( buffer, key.begin(), key.size() ); - fc::sha256 double_hash = fc::sha256::hash( fc::sha256::hash( (char*) key.begin(), key.size() )); + memcpy( buffer, key.data(), key.size() ); + fc::sha256 double_hash = fc::sha256::hash( fc::sha256::hash( (char*) key.data(), key.size() )); memcpy( buffer + key.size(), double_hash.data(), 4 ); return fc::to_base58( buffer, buf_len ); } @@ -260,14 +260,14 @@ namespace fc { namespace ecc { extended_key_data extended_public_key::serialize_extended() const { extended_key_data result; - unsigned char* dest = (unsigned char*) result.begin(); + unsigned char* dest = (unsigned char*) result.data(); detail::_put( &dest, BTC_EXT_PUB_MAGIC ); *dest++ = depth; detail::_put( &dest, parent_fp ); detail::_put( &dest, child_num ); memcpy( dest, c.data(), c.data_size() ); dest += 32; public_key_data key = serialize(); - memcpy( dest, key.begin(), key.size() ); + memcpy( dest, key.data(), key.size() ); return result; } @@ -293,7 +293,7 @@ namespace fc { namespace ecc { fc::sha256 chain; memcpy( chain.data(), ptr, chain.data_size() ); ptr += chain.data_size(); public_key_data key; - memcpy( key.begin(), ptr, key.size() ); + memcpy( key.data(), ptr, key.size() ); return extended_public_key( key, chain, cn, fp, d ); } @@ -311,7 +311,7 @@ namespace fc { namespace ecc { { const detail::chr37 data = detail::_derive_message( get_public_key().serialize(), i ); hmac_sha512 mac; - fc::sha512 l = mac.digest( c.data(), c.data_size(), (char*) data.begin(), data.size() ); + fc::sha512 l = mac.digest( c.data(), c.data_size(), (char*) data.data(), data.size() ); return private_derive_rest( l, i ); } @@ -320,14 +320,14 @@ namespace fc { namespace ecc { hmac_sha512 mac; private_key_secret key = get_secret(); const detail::chr37 data = detail::_derive_message( key, i ); - fc::sha512 l = mac.digest( c.data(), c.data_size(), (char*) data.begin(), data.size() ); + fc::sha512 l = mac.digest( c.data(), c.data_size(), (char*) data.data(), data.size() ); return private_derive_rest( l, i ); } extended_key_data extended_private_key::serialize_extended() const { extended_key_data result; - unsigned char* dest = (unsigned char*) result.begin(); + unsigned char* dest = (unsigned char*) result.data(); detail::_put( &dest, BTC_EXT_PRIV_MAGIC ); *dest++ = depth; detail::_put( &dest, parent_fp ); From 6008c96c1a6324b5706e50454f97a41449c851af Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 24 Jun 2019 13:30:24 +0200 Subject: [PATCH 022/117] Allow more space for windows sockets due to fc::future changes --- include/fc/network/tcp_socket.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/network/tcp_socket.hpp b/include/fc/network/tcp_socket.hpp index fe6b837..9bb6ea5 100644 --- a/include/fc/network/tcp_socket.hpp +++ b/include/fc/network/tcp_socket.hpp @@ -51,7 +51,7 @@ namespace fc { friend class tcp_server; class impl; #ifdef _WIN64 - fc::fwd my; + fc::fwd my; #else fc::fwd my; #endif From ce79181dcf688a820e8f5feda6fe747e5e0495bf Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 26 Jul 2019 15:03:22 +0200 Subject: [PATCH 023/117] Replaced more instances of array::begin with array::data --- src/crypto/elliptic_impl_priv.cpp | 7 +++++-- src/crypto/elliptic_secp256k1.cpp | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/crypto/elliptic_impl_priv.cpp b/src/crypto/elliptic_impl_priv.cpp index 585ffde..96ce6e4 100644 --- a/src/crypto/elliptic_impl_priv.cpp +++ b/src/crypto/elliptic_impl_priv.cpp @@ -72,7 +72,8 @@ namespace fc { namespace ecc { FC_ASSERT( my->_key != empty_priv ); public_key_data pub; unsigned int pk_len; - FC_ASSERT( secp256k1_ec_pubkey_create( detail::_get_context(), (unsigned char*) pub.begin(), (int*) &pk_len, (unsigned char*) my->_key.data(), 1 ) ); + FC_ASSERT( secp256k1_ec_pubkey_create( detail::_get_context(), pub.data(), (int*) &pk_len, + (unsigned char*) my->_key.data(), 1 ) ); FC_ASSERT( pk_len == pub.size() ); return public_key(pub); } @@ -93,7 +94,9 @@ namespace fc { namespace ecc { unsigned int counter = 0; do { - FC_ASSERT( secp256k1_ecdsa_sign_compact( detail::_get_context(), (unsigned char*) digest.data(), (unsigned char*) result.begin() + 1, (unsigned char*) my->_key.data(), extended_nonce_function, &counter, &recid )); + FC_ASSERT( secp256k1_ecdsa_sign_compact( detail::_get_context(), (unsigned char*) digest.data(), + result.data() + 1, (unsigned char*) my->_key.data(), + extended_nonce_function, &counter, &recid )); } while( require_canonical && !public_key::is_canonical( result ) ); result.begin()[0] = 27 + 4 + recid; return result; diff --git a/src/crypto/elliptic_secp256k1.cpp b/src/crypto/elliptic_secp256k1.cpp index 7f8d841..a8e29ed 100644 --- a/src/crypto/elliptic_secp256k1.cpp +++ b/src/crypto/elliptic_secp256k1.cpp @@ -70,8 +70,9 @@ namespace fc { namespace ecc { FC_ASSERT( my->_key != empty_priv ); FC_ASSERT( other.my->_key != empty_pub ); public_key_data pub(other.my->_key); - FC_ASSERT( secp256k1_ec_pubkey_tweak_mul( detail::_get_context(), pub.begin(), pub.size(), (unsigned char*) my->_key.data() ) ); - return fc::sha512::hash( (char*) pub.begin() + 1, pub.size() - 1 ); + FC_ASSERT( secp256k1_ec_pubkey_tweak_mul( detail::_get_context(), pub.data(), pub.size(), + (unsigned char*) my->_key.data() ) ); + return fc::sha512::hash( (char*) pub.data() + 1, pub.size() - 1 ); } @@ -104,8 +105,9 @@ namespace fc { namespace ecc { { FC_ASSERT( my->_key != empty_pub ); public_key_data new_key; - memcpy( new_key.begin(), my->_key.begin(), new_key.size() ); - FC_ASSERT( secp256k1_ec_pubkey_tweak_add( detail::_get_context(), new_key.begin(), new_key.size(), (unsigned char*) digest.data() ) ); + memcpy( new_key.begin(), my->_key.data(), new_key.size() ); + FC_ASSERT( secp256k1_ec_pubkey_tweak_add( detail::_get_context(), new_key.data(), new_key.size(), + (unsigned char*) digest.data() ) ); return public_key( new_key ); } @@ -126,8 +128,8 @@ namespace fc { namespace ecc { FC_ASSERT( my->_key != empty_pub ); public_key_point_data dat; unsigned int pk_len = my->_key.size(); - memcpy( dat.begin(), my->_key.begin(), pk_len ); - FC_ASSERT( secp256k1_ec_pubkey_decompress( detail::_get_context(), dat.begin(), (int*) &pk_len ) ); + memcpy( dat.begin(), my->_key.data(), pk_len ); + FC_ASSERT( secp256k1_ec_pubkey_decompress( detail::_get_context(), dat.data(), (int*) &pk_len ) ); FC_ASSERT( pk_len == dat.size() ); return dat; } @@ -142,7 +144,7 @@ namespace fc { namespace ecc { key = o2i_ECPublicKey( &key, &front, sizeof(dat) ); FC_ASSERT( key ); EC_KEY_set_conv_form( key, POINT_CONVERSION_COMPRESSED ); - unsigned char* buffer = my->_key.begin(); + unsigned char* buffer = my->_key.data(); i2o_ECPublicKey( key, &buffer ); // FIXME: questionable memory handling EC_KEY_free( key ); } @@ -165,7 +167,9 @@ namespace fc { namespace ecc { } unsigned int pk_len; - FC_ASSERT( secp256k1_ecdsa_recover_compact( detail::_get_context(), (unsigned char*) digest.data(), c.begin() + 1, my->_key.begin(), (int*) &pk_len, 1, (*c.begin() - 27) & 3 ) ); + FC_ASSERT( secp256k1_ecdsa_recover_compact( detail::_get_context(), (unsigned char*) digest.data(), + c.data() + 1, my->_key.data(), (int*) &pk_len, 1, + (*c.data() - 27) & 3 ) ); FC_ASSERT( pk_len == my->_key.size() ); } @@ -178,10 +182,11 @@ namespace fc { namespace ecc { hmac_sha512 mac; public_key_data key = serialize(); const detail::chr37 data = detail::_derive_message( key, i ); - fc::sha512 l = mac.digest( c.data(), c.data_size(), data.begin(), data.size() ); + fc::sha512 l = mac.digest( c.data(), c.data_size(), data.data(), data.size() ); fc::sha256 left = detail::_left(l); FC_ASSERT( left < detail::get_curve_order() ); - FC_ASSERT( secp256k1_ec_pubkey_tweak_add( detail::_get_context(), key.begin(), key.size(), (unsigned char*) left.data() ) > 0 ); + FC_ASSERT( secp256k1_ec_pubkey_tweak_add( detail::_get_context(), key.data(), key.size(), + (unsigned char*) left.data() ) > 0 ); // FIXME: check validity - if left + key == infinity then invalid extended_public_key result( key, detail::_right(l), i, fingerprint(), depth + 1 ); return result; From a9a6cb94d173d0c51a708d8cf2e3ff22b97eb31e Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 29 Jul 2019 12:21:15 +0200 Subject: [PATCH 024/117] Replaced more begin() with data() --- src/crypto/elliptic_secp256k1.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crypto/elliptic_secp256k1.cpp b/src/crypto/elliptic_secp256k1.cpp index a8e29ed..2edf5f8 100644 --- a/src/crypto/elliptic_secp256k1.cpp +++ b/src/crypto/elliptic_secp256k1.cpp @@ -105,7 +105,7 @@ namespace fc { namespace ecc { { FC_ASSERT( my->_key != empty_pub ); public_key_data new_key; - memcpy( new_key.begin(), my->_key.data(), new_key.size() ); + memcpy( new_key.data(), my->_key.data(), new_key.size() ); FC_ASSERT( secp256k1_ec_pubkey_tweak_add( detail::_get_context(), new_key.data(), new_key.size(), (unsigned char*) digest.data() ) ); return public_key( new_key ); @@ -128,7 +128,7 @@ namespace fc { namespace ecc { FC_ASSERT( my->_key != empty_pub ); public_key_point_data dat; unsigned int pk_len = my->_key.size(); - memcpy( dat.begin(), my->_key.data(), pk_len ); + memcpy( dat.data(), my->_key.data(), pk_len ); FC_ASSERT( secp256k1_ec_pubkey_decompress( detail::_get_context(), dat.data(), (int*) &pk_len ) ); FC_ASSERT( pk_len == dat.size() ); return dat; From cabab23e2c4a57d525aecd65dab0805a1c753714 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 2 Aug 2019 17:17:13 +0200 Subject: [PATCH 025/117] Replaced more array::begin() with data() --- src/crypto/elliptic_impl_priv.cpp | 2 +- tests/crypto/ecc_test.cpp | 8 ++++---- tests/hmac_test.cpp | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/crypto/elliptic_impl_priv.cpp b/src/crypto/elliptic_impl_priv.cpp index 96ce6e4..3263927 100644 --- a/src/crypto/elliptic_impl_priv.cpp +++ b/src/crypto/elliptic_impl_priv.cpp @@ -98,7 +98,7 @@ namespace fc { namespace ecc { result.data() + 1, (unsigned char*) my->_key.data(), extended_nonce_function, &counter, &recid )); } while( require_canonical && !public_key::is_canonical( result ) ); - result.begin()[0] = 27 + 4 + recid; + result.data()[0] = 27 + 4 + recid; return result; } diff --git a/tests/crypto/ecc_test.cpp b/tests/crypto/ecc_test.cpp index 94028ae..79ac1e1 100644 --- a/tests/crypto/ecc_test.cpp +++ b/tests/crypto/ecc_test.cpp @@ -23,7 +23,7 @@ static void interop_do(const char * const data, size_t len) { } static void interop_do(const fc::ecc::public_key_data &data) { - interop_do((char*) data.begin(), data.size()); + interop_do((char*) data.data(), data.size()); } static void interop_do(const fc::ecc::private_key_secret &data) { @@ -31,7 +31,7 @@ static void interop_do(const fc::ecc::private_key_secret &data) { } static void interop_do(const fc::ecc::public_key_point_data &data) { - interop_do((char*) data.begin(), data.size()); + interop_do((char*) data.data(), data.size()); } static void interop_do(const std::string &data) { @@ -44,11 +44,11 @@ static void interop_do(const fc::sha512 &data) { static void interop_do(fc::ecc::compact_signature &data) { if (write_mode) { - interop_data.write((char*) data.begin(), data.size()); + interop_data.write((char*) data.data(), data.size()); return; } - interop_data.read((char*) data.begin(), data.size()); + interop_data.read((char*) data.data(), data.size()); } static void interop_file(const char * const name) { diff --git a/tests/hmac_test.cpp b/tests/hmac_test.cpp index 82079be..fdd1e4c 100644 --- a/tests/hmac_test.cpp +++ b/tests/hmac_test.cpp @@ -79,13 +79,13 @@ static void run_test( const std::string& key, const std::string& data, const std { std::array key_arr; - BOOST_CHECK_EQUAL( fc::from_hex( key, key_arr.begin(), key_arr.size() ), N ); + BOOST_CHECK_EQUAL( fc::from_hex( key, key_arr.data(), key_arr.size() ), N ); std::array data_arr; - BOOST_CHECK_EQUAL( fc::from_hex( data, data_arr.begin(), data_arr.size() ), M ); + BOOST_CHECK_EQUAL( fc::from_hex( data, data_arr.data(), data_arr.size() ), M ); - BOOST_CHECK_EQUAL( mac_224.digest( key_arr.begin(), N, data_arr.begin(), M ).str(), expect_224 ); - BOOST_CHECK_EQUAL( mac_256.digest( key_arr.begin(), N, data_arr.begin(), M ).str(), expect_256 ); - BOOST_CHECK_EQUAL( mac_512.digest( key_arr.begin(), N, data_arr.begin(), M ).str(), expect_512 ); + BOOST_CHECK_EQUAL( mac_224.digest( key_arr.data(), N, data_arr.data(), M ).str(), expect_224 ); + BOOST_CHECK_EQUAL( mac_256.digest( key_arr.data(), N, data_arr.data(), M ).str(), expect_256 ); + BOOST_CHECK_EQUAL( mac_512.digest( key_arr.data(), N, data_arr.data(), M ).str(), expect_512 ); } BOOST_AUTO_TEST_CASE(hmac_test_1) From 42be69c3f7d3130ebb1867f46abb1cc06c36b0ae Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 2 Aug 2019 17:31:28 +0200 Subject: [PATCH 026/117] Removed unused var --- include/fc/reflect/reflect.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/reflect/reflect.hpp b/include/fc/reflect/reflect.hpp index 3bf0ef7..7578360 100644 --- a/include/fc/reflect/reflect.hpp +++ b/include/fc/reflect/reflect.hpp @@ -175,7 +175,7 @@ template<> struct reflector { \ { \ i = boost::lexical_cast(s); \ } \ - catch( const boost::bad_lexical_cast& e ) \ + catch( const boost::bad_lexical_cast& ) \ { \ fc::throw_bad_enum_cast( s, BOOST_PP_STRINGIZE(ENUM) ); \ } \ From fd0b1979001cb2a2e3f358f7f9f8adf62c70777c Mon Sep 17 00:00:00 2001 From: John Jones Date: Mon, 5 Aug 2019 10:24:12 -0500 Subject: [PATCH 027/117] bump websocketpp for Boost 1.70 --- vendor/websocketpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/websocketpp b/vendor/websocketpp index 4543c5f..969c993 160000 --- a/vendor/websocketpp +++ b/vendor/websocketpp @@ -1 +1 @@ -Subproject commit 4543c5f9860333e9c73552362ae74239f98e80fe +Subproject commit 969c9939112cd9f8a99e9d051cadc406ee634140 From 2dc5ad8bac8d4af7fe87fc458387881993850928 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 5 Aug 2019 21:18:17 +0200 Subject: [PATCH 028/117] Try to work around __int128 problem on mac --- src/variant.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/variant.cpp b/src/variant.cpp index 9eb6251..7a527e9 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -11,6 +11,10 @@ #include #include +#ifdef __APPLE__ +#include +#endif + namespace fc { @@ -675,12 +679,26 @@ void from_variant( const variant& var, std::vector& vo, uint32_t max_depth void to_variant( const uint128_t& var, variant& vo, uint32_t max_depth ) { +#ifdef __APPLE__ + boost::multiprecision::uint128_t helper = uint128_hi64( var ); + helper <<= 64; + helper += uint128_lo64( var ); + vo = boost::lexical_cast( helper ); +#else vo = boost::lexical_cast( var ); +#endif } void from_variant( const variant& var, uint128_t& vo, uint32_t max_depth ) { +#ifdef __APPLE__ + boost::multiprecision::uint128_t helper = boost::lexical_cast( var.as_string() ); + vo = static_cast( helper >> 64 ); + vo <<= 64; + vo += static_cast( helper & 0xffffffffffffffffULL ); +#else vo = boost::lexical_cast( var.as_string() ); +#endif } #ifdef __APPLE__ From d8bec3d8470dd11066d3713ddee0cd3c25b364d1 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 5 Aug 2019 21:27:53 +0200 Subject: [PATCH 029/117] Resolved another begin/data inconsistency --- include/fc/static_variant.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 7ed4d90..6f1841c 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -222,7 +222,7 @@ static const std::array init_wrappers( Visitor& v, Data d, typename Visitor::result_type(**funcs)(Visitor&,Data) = 0 ) { std::array result{}; - if( !funcs ) funcs = result.begin(); + if( !funcs ) funcs = result.data(); *funcs++ = [] ( Visitor& v, Data d ) { return v( *reinterpret_cast( d ) ); }; init_wrappers( v, d, funcs ); return result; @@ -240,7 +240,7 @@ static const std::array init_const_wrappers( Visitor& v, Data d, typename Visitor::result_type(**funcs)(Visitor&,Data) = 0 ) { std::array result{}; - if( !funcs ) funcs = result.begin(); + if( !funcs ) funcs = result.data(); *funcs++ = [] ( Visitor& v, Data d ) { return v( *reinterpret_cast( d ) ); }; init_const_wrappers( v, d, funcs ); return result; From e45a44970144bdedf44a1e077b2caa508a644816 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 5 Aug 2019 21:28:12 +0200 Subject: [PATCH 030/117] Fixed type of chr37 --- src/crypto/elliptic_secp256k1.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crypto/elliptic_secp256k1.cpp b/src/crypto/elliptic_secp256k1.cpp index 2edf5f8..b180d44 100644 --- a/src/crypto/elliptic_secp256k1.cpp +++ b/src/crypto/elliptic_secp256k1.cpp @@ -53,7 +53,7 @@ namespace fc { namespace ecc { public_key_data _key; }; - typedef std::array chr37; + typedef std::array chr37; chr37 _derive_message( const public_key_data& key, int i ); fc::sha256 _left( const fc::sha512& v ); fc::sha256 _right( const fc::sha512& v ); @@ -182,7 +182,7 @@ namespace fc { namespace ecc { hmac_sha512 mac; public_key_data key = serialize(); const detail::chr37 data = detail::_derive_message( key, i ); - fc::sha512 l = mac.digest( c.data(), c.data_size(), data.data(), data.size() ); + fc::sha512 l = mac.digest( c.data(), c.data_size(), (const char*) data.data(), data.size() ); fc::sha256 left = detail::_left(l); FC_ASSERT( left < detail::get_curve_order() ); FC_ASSERT( secp256k1_ec_pubkey_tweak_add( detail::_get_context(), key.data(), key.size(), From d3c85a841501e60db475fa6a2bc13ea6d913d759 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 11 Aug 2019 12:15:54 +0200 Subject: [PATCH 031/117] Fix cmake warning --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af06637..bad2407 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,9 +9,9 @@ SET( CMAKE_CXX_STANDARD_REQUIRED ON ) if( "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Apple)?Clang|GNU$" ) set( CMAKE_CXX_EXTENSIONS ON ) # for __int128 support -else( GNU ) +else( "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Apple)?Clang|GNU$" ) set( CMAKE_CXX_EXTENSIONS OFF ) -endif( GNU ) +endif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Apple)?Clang|GNU$" ) MESSAGE(STATUS "Configuring project fc located in: ${CMAKE_CURRENT_SOURCE_DIR}") SET( CMAKE_AUTOMOC OFF ) From 06f88979a09364ff9e88c1de681786c79ed1ca8b Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Sun, 11 Aug 2019 13:44:18 -0500 Subject: [PATCH 032/117] Resolve #1898: Fix crash in API We were getting the moral equivalent of a null pointer dereference by incrementing an iterator past its past-the-end position, then dereferencing it. This is now fixed. --- include/fc/rpc/api_connection.hpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/include/fc/rpc/api_connection.hpp b/include/fc/rpc/api_connection.hpp index 71eaf80..281f1d2 100644 --- a/include/fc/rpc/api_connection.hpp +++ b/include/fc/rpc/api_connection.hpp @@ -44,13 +44,18 @@ namespace fc { } template - R call_generic( const std::function& f, variants::const_iterator a0, variants::const_iterator e, uint32_t max_depth ) + R call_generic( const std::function& f, variants::const_iterator a0, + variants::const_iterator e, uint32_t max_depth ) { bool optional_args = all_optionals, std::decay_t...>::value; FC_ASSERT( a0 != e || optional_args ); FC_ASSERT( max_depth > 0, "Recursion depth exceeded!" ); - auto arg = (a0 == e)? std::decay_t() : a0->as>(max_depth - 1); - return call_generic( bind_first_arg( f, arg ), a0+1, e, max_depth - 1 ); + if (a0==e) + return call_generic( bind_first_arg( f, std::decay_t() ), a0, + e, max_depth - 1 ); + auto arg = a0->as>(max_depth - 1); + return call_generic( bind_first_arg( f, std::move(arg) ), a0+1, e, + max_depth - 1 ); } template @@ -180,13 +185,18 @@ namespace fc { } template - R call_generic( const std::function& f, variants::const_iterator a0, variants::const_iterator e, uint32_t max_depth ) + R call_generic( const std::function& f, variants::const_iterator a0, + variants::const_iterator e, uint32_t max_depth ) { bool optional_args = detail::all_optionals, std::decay_t...>::value; FC_ASSERT( a0 != e || optional_args, "too few arguments passed to method" ); FC_ASSERT( max_depth > 0, "Recursion depth exceeded!" ); - auto arg = (a0 == e)? std::decay_t() : a0->as>(max_depth - 1); - return call_generic( this->bind_first_arg( f, arg ), a0+1, e, max_depth - 1 ); + if (a0==e) + return call_generic( this->bind_first_arg( f, std::decay_t() ), a0, + e, max_depth - 1 ); + auto arg = a0->as>(max_depth - 1); + return call_generic( this->bind_first_arg( f, std::move(arg) ), a0+1, e, + max_depth - 1 ); } struct api_visitor From 7b6c359a327f42312444a7bcafddf30a214c016b Mon Sep 17 00:00:00 2001 From: abitmore Date: Tue, 13 Aug 2019 13:09:31 -0400 Subject: [PATCH 033/117] Update test case for optional API arguments Reproduces https://github.com/bitshares/bitshares-core/issues/1898 --- tests/api_tests.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/tests/api_tests.cpp b/tests/api_tests.cpp index dff5350..ef42b8d 100644 --- a/tests/api_tests.cpp +++ b/tests/api_tests.cpp @@ -39,8 +39,12 @@ public: const fc::optional& third ) { return fc::json::to_string(fc::variants{first, {second, 2}, {third, 2}}); } + std::string bar( fc::optional first, fc::optional second, + fc::optional third ) { + return fc::json::to_string(fc::variants{{first,2}, {second, 2}, {third, 2}}); + } }; -FC_API( optionals_api, (foo) ); +FC_API( optionals_api, (foo)(bar) ); using namespace fc; @@ -106,6 +110,12 @@ BOOST_AUTO_TEST_CASE(optionals_test) { BOOST_CHECK_EQUAL(oapi->foo("a", "b", "c"), "[\"a\",\"b\",\"c\"]"); BOOST_CHECK_EQUAL(oapi->foo("a", {}, "c"), "[\"a\",null,\"c\"]"); + BOOST_CHECK_EQUAL(oapi->bar(), "[null,null,null]"); + BOOST_CHECK_EQUAL(oapi->bar("a"), "[\"a\",null,null]"); + BOOST_CHECK_EQUAL(oapi->bar("a", "b"), "[\"a\",\"b\",null]"); + BOOST_CHECK_EQUAL(oapi->bar("a", "b", "c"), "[\"a\",\"b\",\"c\"]"); + BOOST_CHECK_EQUAL(oapi->bar("a", {}, "c"), "[\"a\",null,\"c\"]"); + auto server = std::make_shared(); server->on_connection([&]( const websocket_connection_ptr& c ){ auto wsc = std::make_shared(c, MAX_DEPTH); @@ -119,7 +129,6 @@ BOOST_AUTO_TEST_CASE(optionals_test) { auto client = std::make_shared(); auto con = client->connect( "ws://localhost:" + std::to_string(listen_port) ); - server->stop_listening(); auto apic = std::make_shared(con, MAX_DEPTH); auto remote_optionals = apic->get_remote_api(); @@ -128,6 +137,37 @@ BOOST_AUTO_TEST_CASE(optionals_test) { BOOST_CHECK_EQUAL(remote_optionals->foo("a", "b", "c"), "[\"a\",\"b\",\"c\"]"); BOOST_CHECK_EQUAL(remote_optionals->foo("a", {}, "c"), "[\"a\",null,\"c\"]"); + BOOST_CHECK_EQUAL(remote_optionals->bar(), "[null,null,null]"); + BOOST_CHECK_EQUAL(remote_optionals->bar("a"), "[\"a\",null,null]"); + BOOST_CHECK_EQUAL(remote_optionals->bar("a", "b"), "[\"a\",\"b\",null]"); + BOOST_CHECK_EQUAL(remote_optionals->bar("a", "b", "c"), "[\"a\",\"b\",\"c\"]"); + BOOST_CHECK_EQUAL(remote_optionals->bar("a", {}, "c"), "[\"a\",null,\"c\"]"); + + auto client2 = std::make_shared(); + auto con2 = client2->connect( "ws://localhost:" + std::to_string(listen_port) ); + string response; + con2->on_message_handler([&](const std::string& s){ + response = s; + }); + + con2->send_message( "{\"id\":1,\"method\":\"call\",\"params\":[0,\"bar\",[\"a\",\"b\",\"c\"]]}" ); + fc::usleep(fc::milliseconds(50)); + BOOST_CHECK_EQUAL( response, "{\"id\":1,\"result\":\"[\\\"a\\\",\\\"b\\\",\\\"c\\\"]\"}" ); + + con2->send_message( "{\"id\":2,\"method\":\"call\",\"params\":[0,\"bar\",[\"a\",\"b\"]]}" ); + fc::usleep(fc::milliseconds(50)); + BOOST_CHECK_EQUAL( response, "{\"id\":2,\"result\":\"[\\\"a\\\",\\\"b\\\",null]\"}" ); + + con2->send_message( "{\"id\":3,\"method\":\"call\",\"params\":[0,\"bar\",[\"a\"]]}" ); + fc::usleep(fc::milliseconds(50)); + BOOST_CHECK_EQUAL( response, "{\"id\":3,\"result\":\"[\\\"a\\\",null,null]\"}" ); + + con2->send_message( "{\"id\":4,\"method\":\"call\",\"params\":[0,\"bar\",[]]}" ); + fc::usleep(fc::milliseconds(50)); + BOOST_CHECK_EQUAL( response, "{\"id\":4,\"result\":\"[null,null,null]\"}" ); + + server->stop_listening(); + client->synchronous_close(); server->close(); fc::usleep(fc::milliseconds(50)); From 8426b45d6c84f6d8c3160da3bb5daa19373bf17f Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 13 Aug 2019 13:11:36 -0500 Subject: [PATCH 034/117] Increase size for Boost 1.70 --- include/fc/network/tcp_socket.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/network/tcp_socket.hpp b/include/fc/network/tcp_socket.hpp index 9bb6ea5..160df37 100644 --- a/include/fc/network/tcp_socket.hpp +++ b/include/fc/network/tcp_socket.hpp @@ -51,7 +51,7 @@ namespace fc { friend class tcp_server; class impl; #ifdef _WIN64 - fc::fwd my; + fc::fwd my; #else fc::fwd my; #endif From a1c2ff99434977a6a66d3e11089a3613f6973893 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 13 Aug 2019 17:31:22 +0200 Subject: [PATCH 035/117] support openbsd // make code compliant with clang --- CMakeLists.txt | 8 ++++---- include/fc/string.hpp | 2 +- include/fc/variant.hpp | 6 +++--- src/stacktrace.cpp | 3 +++ src/variant.cpp | 12 +++++++----- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bad2407..e391325 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,11 +141,11 @@ ENDIF(WIN32) FIND_PACKAGE(Boost CONFIG COMPONENTS ${BOOST_COMPONENTS}) IF(NOT WIN32) - MESSAGE(STATUS "Configuring fc to build on Unix/Apple") + MESSAGE(STATUS "Configuring fc to build on Unix/Apple") - if(NOT APPLE) - SET(rt_library rt) - endif(NOT APPLE) + IF(NOT APPLE AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") + SET(rt_library rt ) + ENDIF(NOT APPLE AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") ENDIF(NOT WIN32) IF($ENV{OPENSSL_ROOT_DIR}) diff --git a/include/fc/string.hpp b/include/fc/string.hpp index 7fbe2e5..8f269f0 100644 --- a/include/fc/string.hpp +++ b/include/fc/string.hpp @@ -17,7 +17,7 @@ namespace fc std::string to_pretty_string( int64_t ); inline std::string to_string( int32_t v ) { return to_string( int64_t(v) ); } inline std::string to_string( uint32_t v ){ return to_string( uint64_t(v) ); } -#ifdef __APPLE__ +#if defined(__APPLE__) or defined(__OpenBSD__) inline std::string to_string( size_t s) { return to_string(uint64_t(s)); } #endif diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index f7ef613..66c422e 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -153,7 +153,7 @@ namespace fc void to_variant( const uint128_t& var, variant& vo, uint32_t max_depth = 1 ); void from_variant( const variant& var, uint128_t& vo, uint32_t max_depth = 1 ); - #ifdef __APPLE__ + #if defined(__APPLE__) or defined(__OpenBSD__) void to_variant( size_t s, variant& v, uint32_t max_depth = 1 ); #elif !defined(_WIN32) void to_variant( long long int s, variant& v, uint32_t max_depth = 1 ); @@ -229,7 +229,7 @@ namespace fc variant( uint32_t val, uint32_t max_depth = 1 ); variant( int32_t val, uint32_t max_depth = 1 ); variant( uint64_t val, uint32_t max_depth = 1 ); -#ifdef __APPLE__ +#if defined(__APPLE__) or defined(__OpenBSD__) variant( size_t val, uint32_t max_depth = 1 ); #endif variant( int64_t val, uint32_t max_depth = 1 ); @@ -632,7 +632,7 @@ namespace fc template void to_variant( const safe& s, variant& v, uint32_t max_depth ) { - to_variant( s.value, v, max_depth ); + to_variant( static_cast(s.value), v, max_depth ); } template diff --git a/src/stacktrace.cpp b/src/stacktrace.cpp index 126691f..910b48f 100644 --- a/src/stacktrace.cpp +++ b/src/stacktrace.cpp @@ -8,6 +8,9 @@ #if BOOST_VERSION / 100 >= 1065 && !defined(__APPLE__) #include #include +#if defined(__OpenBSD__) + #define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED +#endif #include namespace fc diff --git a/src/variant.cpp b/src/variant.cpp index 7a527e9..eaa12d3 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -11,7 +11,7 @@ #include #include -#ifdef __APPLE__ +#if defined(__APPLE__) or defined(__OpenBSD__) #include #endif @@ -79,7 +79,7 @@ variant::variant( uint64_t val, uint32_t max_depth ) set_variant_type( this, uint64_type ); } -#ifdef __APPLE__ +#if defined(__APPLE__) or defined(__OpenBSD__) variant::variant( size_t val, uint32_t max_depth ) { *reinterpret_cast(this) = val; @@ -679,7 +679,7 @@ void from_variant( const variant& var, std::vector& vo, uint32_t max_depth void to_variant( const uint128_t& var, variant& vo, uint32_t max_depth ) { -#ifdef __APPLE__ +#if defined(__APPLE__) or defined(__OpenBSD__) boost::multiprecision::uint128_t helper = uint128_hi64( var ); helper <<= 64; helper += uint128_lo64( var ); @@ -691,7 +691,7 @@ void to_variant( const uint128_t& var, variant& vo, uint32_t max_depth ) void from_variant( const variant& var, uint128_t& vo, uint32_t max_depth ) { -#ifdef __APPLE__ +#if defined(__APPLE__) or defined(__OpenBSD__) boost::multiprecision::uint128_t helper = boost::lexical_cast( var.as_string() ); vo = static_cast( helper >> 64 ); vo <<= 64; @@ -701,7 +701,9 @@ void from_variant( const variant& var, uint128_t& vo, uint32_t max_depth ) #endif } -#ifdef __APPLE__ +#if defined(__APPLE__) +#elif defined(__OpenBSD__) + void to_variant( size_t s, variant& v, uint32_t max_depth ) { v = variant( int64_t(s) ); } #elif !defined(_WIN32) void to_variant( long long int s, variant& v, uint32_t max_depth ) { v = variant( int64_t(s) ); } void to_variant( unsigned long long int s, variant& v, uint32_t max_depth ) { v = variant( uint64_t(s)); } From cb5f7d3cddbcad3b9a42de5b66f0b4af06791b34 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 13 Aug 2019 17:32:17 +0200 Subject: [PATCH 036/117] support openbsd // get rid of alloca --- src/crypto/elliptic_common.cpp | 9 +++------ src/crypto/elliptic_secp256k1.cpp | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/crypto/elliptic_common.cpp b/src/crypto/elliptic_common.cpp index dd89c3a..8e4f802 100644 --- a/src/crypto/elliptic_common.cpp +++ b/src/crypto/elliptic_common.cpp @@ -7,8 +7,6 @@ #ifdef _WIN32 # include -#else -# include #endif /* stuff common to all ecc implementations */ @@ -231,12 +229,11 @@ namespace fc { namespace ecc { static std::string _to_base58( const extended_key_data& key ) { - size_t buf_len = key.size() + 4; - char *buffer = (char*)alloca(buf_len); + char buffer[key.size() + 4]; // it's a small static array => allocate on stack memcpy( buffer, key.data(), key.size() ); - fc::sha256 double_hash = fc::sha256::hash( fc::sha256::hash( (char*) key.data(), key.size() )); + fc::sha256 double_hash = fc::sha256::hash( fc::sha256::hash( (char*)key.data(), key.size() )); memcpy( buffer + key.size(), double_hash.data(), 4 ); - return fc::to_base58( buffer, buf_len ); + return fc::to_base58( buffer, sizeof(buffer) ); } static void _parse_extended_data( unsigned char* buffer, std::string base58 ) diff --git a/src/crypto/elliptic_secp256k1.cpp b/src/crypto/elliptic_secp256k1.cpp index b180d44..11969fc 100644 --- a/src/crypto/elliptic_secp256k1.cpp +++ b/src/crypto/elliptic_secp256k1.cpp @@ -14,8 +14,6 @@ #if _WIN32 # include -#else -# include #endif #include "_elliptic_impl_priv.hpp" From 4ac6887deb99ce2e26bd34688deaafa23fe4dd03 Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 13 Aug 2019 17:33:12 +0200 Subject: [PATCH 037/117] support openbsd // compile with libressl --- src/crypto/openssl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/crypto/openssl.cpp b/src/crypto/openssl.cpp index 3f8df03..e4c0e88 100644 --- a/src/crypto/openssl.cpp +++ b/src/crypto/openssl.cpp @@ -39,7 +39,11 @@ namespace fc ~openssl_scope() { +#if not defined(LIBRESSL_VERSION_NUMBER) + // No FIPS in LibreSSL. + // https://marc.info/?l=openbsd-misc&m=139819485423701&w=2 FIPS_mode_set(0); +#endif CONF_modules_unload(1); EVP_cleanup(); CRYPTO_cleanup_all_ex_data(); From 727e09ebe7be57672d3a3f11b0b7cfebaea2675b Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Tue, 13 Aug 2019 17:37:58 +0200 Subject: [PATCH 038/117] support openbsd // implement tcp keep-alive polling --- src/network/tcp_socket.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/network/tcp_socket.cpp b/src/network/tcp_socket.cpp index 0012ba6..1152496 100644 --- a/src/network/tcp_socket.cpp +++ b/src/network/tcp_socket.cpp @@ -11,6 +11,13 @@ # include #endif +#if defined __OpenBSD__ +# include +# include +# include +# include +#endif + namespace fc { namespace detail @@ -186,16 +193,37 @@ namespace fc { if (setsockopt(my->_sock.native_handle(), IPPROTO_TCP, #if defined( __APPLE__ ) TCP_KEEPALIVE, + #elif defined( __OpenBSD__ ) + SO_KEEPALIVE, #else TCP_KEEPIDLE, #endif (char*)&timeout_sec, sizeof(timeout_sec)) < 0) wlog("Error setting TCP keepalive idle time"); -# if !defined(__APPLE__) || defined(TCP_KEEPINTVL) // TCP_KEEPINTVL not defined before 10.9 +# if defined(__OpenBSD__) + int name[4]; + name[0] = CTL_NET; + name[1] = PF_INET; + name[2] = IPPROTO_TCP; + + int value; + size_t sz; + + // get tics per second + name[3] = TCPCTL_SLOWHZ; + if (sysctl(name, 4, &value, &sz, NULL, 0) == -1) + wlog("Error setting TCP keepalive interval"); + + // set interval + value *= timeout_sec; + name[3] = TCPCTL_KEEPINTVL; + if (sysctl(name, 4, NULL, NULL, &value, sizeof(value)) == -1) + wlog("Error setting TCP keepalive interval"); +# elif !defined(__APPLE__) || defined(TCP_KEEPINTVL) // TCP_KEEPINTVL not defined before 10.9 if (setsockopt(my->_sock.native_handle(), IPPROTO_TCP, TCP_KEEPINTVL, (char*)&timeout_sec, sizeof(timeout_sec)) < 0) wlog("Error setting TCP keepalive interval"); -# endif // !__APPLE__ || TCP_KEEPINTVL +# endif // (__OpenBSD__) or (!__APPLE__ || TCP_KEEPINTVL) #endif // !WIN32 } else From 3f1096d23e132ee748724481c8737e9a7aa4f010 Mon Sep 17 00:00:00 2001 From: John Jones Date: Fri, 16 Aug 2019 13:24:28 -0500 Subject: [PATCH 039/117] Remove custom FindBoost.cmake --- CMakeLists.txt | 4 +- CMakeModules/Boost/BoostConfig.cmake | 18 - CMakeModules/Legacy/Boost/FindBoost.cmake | 1180 --------------------- CMakeModules/Legacy/CMakeLists.txt | 27 - 4 files changed, 1 insertion(+), 1228 deletions(-) delete mode 100644 CMakeModules/Boost/BoostConfig.cmake delete mode 100644 CMakeModules/Legacy/Boost/FindBoost.cmake delete mode 100644 CMakeModules/Legacy/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index bad2407..4394887 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,6 @@ INCLUDE( SetupTargetMacros ) INCLUDE(GetGitRevisionDescription) INCLUDE(CheckLibraryExists) -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/Legacy) - get_git_head_revision(GIT_REFSPEC FC_GIT_REVISION_SHA) get_git_unix_timestamp(FC_GIT_REVISION_UNIX_TIMESTAMP) @@ -138,7 +136,7 @@ IF( WIN32 ) # iphlpapi.lib ENDIF(WIN32) -FIND_PACKAGE(Boost CONFIG COMPONENTS ${BOOST_COMPONENTS}) +FIND_PACKAGE(Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED) IF(NOT WIN32) MESSAGE(STATUS "Configuring fc to build on Unix/Apple") diff --git a/CMakeModules/Boost/BoostConfig.cmake b/CMakeModules/Boost/BoostConfig.cmake deleted file mode 100644 index a5e01f2..0000000 --- a/CMakeModules/Boost/BoostConfig.cmake +++ /dev/null @@ -1,18 +0,0 @@ -# This overrides `find_package(Boost ... CONFIG ... )` calls -# - calls the CMake's built-in `FindBoost.cmake` and adds `pthread` library dependency - -MESSAGE(STATUS "Using custom FindBoost config") - -find_package(Boost 1.58 REQUIRED COMPONENTS ${Boost_FIND_COMPONENTS}) - -# Inject `pthread` dependency to Boost if needed -if (UNIX AND NOT CYGWIN) - list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread) - if (_using_boost_thread GREATER -1) - find_library(BOOST_THREAD_LIBRARY NAMES pthread DOC "The threading library used by boost-thread") - if (BOOST_THREAD_LIBRARY) - MESSAGE(STATUS "Adding Boost thread lib dependency: ${BOOST_THREAD_LIBRARY}") - list(APPEND Boost_LIBRARIES ${BOOST_THREAD_LIBRARY}) - endif () - endif () -endif () diff --git a/CMakeModules/Legacy/Boost/FindBoost.cmake b/CMakeModules/Legacy/Boost/FindBoost.cmake deleted file mode 100644 index b8276af..0000000 --- a/CMakeModules/Legacy/Boost/FindBoost.cmake +++ /dev/null @@ -1,1180 +0,0 @@ -# - 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.36.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" -# 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 - BOOST_VERSION value from boost/version.hpp -# Boost_LIB_VERSION - Version string appended to library filenames -# Boost_MAJOR_VERSION - Boost major version number (X in X.y.z) -# Boost_MINOR_VERSION - Boost minor version number (Y in x.Y.z) -# Boost_SUBMINOR_VERSION - Boost subminor version number (Z in x.y.Z) -# Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows) -# - Pass to add_definitions() to have diagnostic -# information about Boost's automatic linking -# displayed during compilation -# -# 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 - Directory containing Boost libraries -# Boost__LIBRARY_DEBUG - Component library debug variant -# Boost__LIBRARY_RELEASE - Component library release variant -# Users may set the 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 directory in Boost_LIBRARY_DIR 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_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_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. -# Boost_THREADAPI - Suffix for "thread" component library name, -# such as "pthread" or "win32". Names with -# and without this suffix will both be tried. -# 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_DETAILED_FAILURE_MSG -# - Set to ON to add detailed information to the -# failure message even when the REQUIRED option -# is not given to the find_package call. -# 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.42.0" instead of -# "/usr/lib/libboost_system.so". This does not -# affect linking and should not be enabled unless -# the user needs this information. -# 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 headers and some libraries: -# set(Boost_USE_STATIC_LIBS ON) -# set(Boost_USE_MULTITHREADED ON) -# set(Boost_USE_STATIC_RUNTIME OFF) -# find_package(Boost 1.36.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 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. - -#============================================================================= -# Copyright 2006-2012 Kitware, Inc. -# Copyright 2006-2008 Andreas Schneider -# Copyright 2007 Wengo -# Copyright 2007 Mike Jackson -# Copyright 2008 Andreas Pakulat -# Copyright 2008-2012 Philip Lowman -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - - -#------------------------------------------------------------------------------- -# Before we go searching, check whether boost-cmake is avaialble, unless the -# user specifically asked NOT to search for boost-cmake. -# -# 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. -# - -message(STATUS "Using custom FindBoost.cmake") - -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 boost-cmake, then we're done. Print out what we found. - # Otherwise let the rest of the module try to find it. - if (Boost_FOUND) - message("Boost ${Boost_FIND_VERSION} found.") - if (Boost_FIND_COMPONENTS) - message("Found Boost components:") - message(" ${Boost_FIND_COMPONENTS}") - endif() - return() - endif() -endif() - - -#------------------------------------------------------------------------------- -# FindBoost functions & macros -# - -############################################ -# -# 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 supports configuration types then set - # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value - if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE) - set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG}) - else() - # if there are no configuration types and CMAKE_BUILD_TYPE has no value - # then 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) - set(Boost_${basename}_FOUND ON) - endif() - - endif() - # Make variables changeble to the advanced user - mark_as_advanced( - Boost_${basename}_LIBRARY_RELEASE - Boost_${basename}_LIBRARY_DEBUG - ) -endmacro() - -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() - -macro(_Boost_FIND_LIBRARY var) - find_library(${var} ${ARGN}) - - # If we found the first library save Boost_LIBRARY_DIR. - if(${var} AND NOT Boost_LIBRARY_DIR) - get_filename_component(_dir "${${var}}" PATH) - set(Boost_LIBRARY_DIR "${_dir}" CACHE PATH "Boost library directory" FORCE) - endif() - - # If Boost_LIBRARY_DIR is known then search only there. - if(Boost_LIBRARY_DIR) - set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH) - endif() -endmacro() - -#------------------------------------------------------------------------------- - -# -# Runs compiler with "-dumpversion" and parses major/minor -# version with a regex. -# -function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION) - - exec_program(${CMAKE_CXX_COMPILER} - ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion - OUTPUT_VARIABLE _boost_COMPILER_VERSION - ) - string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1\\2" - _boost_COMPILER_VERSION ${_boost_COMPILER_VERSION}) - - set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} 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("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel" - OR "${CMAKE_CXX_COMPILER}" MATCHES "icl" - OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc") - if(WIN32) - set (_boost_COMPILER "-iw") - else() - set (_boost_COMPILER "-il") - endif() - elseif (MSVC12) - set(_boost_COMPILER "-vc120") - elseif (MSVC11) - set(_boost_COMPILER "-vc110") - elseif (MSVC10) - set(_boost_COMPILER "-vc100") - elseif (MSVC90) - set(_boost_COMPILER "-vc90") - elseif (MSVC80) - set(_boost_COMPILER "-vc80") - elseif (MSVC71) - set(_boost_COMPILER "-vc71") - elseif (MSVC70) # Good luck! - set(_boost_COMPILER "-vc7") # yes, this is correct - elseif (MSVC60) # Good luck! - set(_boost_COMPILER "-vc6") # yes, this is correct - elseif (BORLAND) - set(_boost_COMPILER "-bcb") - elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "SunPro") - set(_boost_COMPILER "-sw") - elseif (MINGW) - if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) - set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34 - else() - _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION) - set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}") - endif() - elseif (UNIX) - if (CMAKE_COMPILER_IS_GNUCXX) - if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) - set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 - else() - _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION) - # Determine which version of GCC we have. - if(APPLE) - if(Boost_MINOR_VERSION) - if(${Boost_MINOR_VERSION} GREATER 35) - # In Boost 1.36.0 and newer, the mangled compiler name used - # on Mac OS X/Darwin is "xgcc". - set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}") - else() - # In Boost <= 1.35.0, there is no mangled compiler name for - # the Mac OS X/Darwin version of GCC. - set(_boost_COMPILER "") - endif() - else() - # We don't know the Boost version, so assume it's - # pre-1.36.0. - set(_boost_COMPILER "") - endif() - else() - set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") - endif() - endif() - endif () - else() - # TODO at least Boost_DEBUG here? - set(_boost_COMPILER "") - endif() - set(${_ret} ${_boost_COMPILER} PARENT_SCOPE) -endfunction() - -function(_Boost_consider_adding_pthreads _outvar) - # On Unix platforms (excluding cygwin) add pthreads to Boost_LIBRARIES - # if the user is searching for the boost-thread component. - if(UNIX AND NOT CYGWIN) - list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread) - if(_using_boost_thread GREATER -1) - find_library(BOOST_THREAD_LIBRARY NAMES pthread - DOC "The threading library used by boost-thread" - ) - if(BOOST_THREAD_LIBRARY) - set(${_outvar} ${ARGN} ${BOOST_THREAD_LIBRARY} PARENT_SCOPE) - endif() - endif() - endif() -endfunction() - -# -# End functions/macros -# -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# main. -#------------------------------------------------------------------------------- - -if(NOT DEFINED Boost_USE_MULTITHREADED) - set(Boost_USE_MULTITHREADED 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. - set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS} - "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() - -# The reason that we failed to find Boost. This will be set to a -# user-friendly message when we fail to find some necessary piece of -# Boost. -set(Boost_ERROR_REASON) - -if(Boost_DEBUG) - # Output some of their choices - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_USE_MULTITHREADED = ${Boost_USE_MULTITHREADED}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_USE_STATIC_LIBS = ${Boost_USE_STATIC_LIBS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_USE_STATIC_RUNTIME = ${Boost_USE_STATIC_RUNTIME}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_ADDITIONAL_VERSIONS = ${Boost_ADDITIONAL_VERSIONS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Boost_NO_SYSTEM_PATHS = ${Boost_NO_SYSTEM_PATHS}") -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") -endif() - -_Boost_CHECK_SPELLING(Boost_ROOT) -_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 - ) - -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Declared as CMake or Environmental Variables:") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " BOOST_ROOT = ${BOOST_ROOT}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}") -endif() - -# ------------------------------------------------------------------------ -# 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) - else() - 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]+") - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1_\\2_\\3" - _boost_BOOSTIFIED_VERSION ${_boost_VER}) - elseif(_boost_VER MATCHES "[0-9]+\\.[0-9]+") - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\1_\\2" - _boost_BOOSTIFIED_VERSION ${_boost_VER}) - 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() - - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Include debugging info:") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " _boost_INCLUDE_SEARCH_DIRS = ${_boost_INCLUDE_SEARCH_DIRS}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - " _boost_PATH_SUFFIXES = ${_boost_PATH_SUFFIXES}") - endif() - - # 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 -# ------------------------------------------------------------------------ - -# Set Boost_FOUND based only on header location and version. -# It will be updated below for component libraries. -if(Boost_INCLUDE_DIR) - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp") - endif() - - # Extract Boost_VERSION and Boost_LIB_VERSION from version.hpp - set(Boost_VERSION 0) - set(Boost_LIB_VERSION "") - file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ") - set(_Boost_VERSION_REGEX "([0-9]+)") - set(_Boost_LIB_VERSION_REGEX "\"([0-9_]+)\"") - foreach(v VERSION LIB_VERSION) - if("${_boost_VERSION_HPP_CONTENTS}" MATCHES ".*#define BOOST_${v} ${_Boost_${v}_REGEX}.*") - set(Boost_${v} "${CMAKE_MATCH_1}") - endif() - endforeach() - unset(_boost_VERSION_HPP_CONTENTS) - - math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000") - math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000") - math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100") - - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\nBoost include path: ${Boost_INCLUDE_DIR}") - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "version.hpp reveals boost " - "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - endif() - - if(Boost_FIND_VERSION) - # Set Boost_FOUND based on requested version. - set(_Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - if("${_Boost_VERSION}" VERSION_LESS "${Boost_FIND_VERSION}") - set(Boost_FOUND 0) - set(_Boost_VERSION_AGE "old") - elseif(Boost_FIND_VERSION_EXACT AND - NOT "${_Boost_VERSION}" VERSION_EQUAL "${Boost_FIND_VERSION}") - set(Boost_FOUND 0) - set(_Boost_VERSION_AGE "new") - else() - set(Boost_FOUND 1) - endif() - if(NOT Boost_FOUND) - # State that we found a version of Boost that is too new or too old. - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}\nDetected version of Boost is too ${_Boost_VERSION_AGE}. Requested version was ${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}") - if (Boost_FIND_VERSION_PATCH) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}.${Boost_FIND_VERSION_PATCH}") - endif () - if (NOT Boost_FIND_VERSION_EXACT) - set(Boost_ERROR_REASON "${Boost_ERROR_REASON} (or newer)") - endif () - set(Boost_ERROR_REASON "${Boost_ERROR_REASON}.") - endif () - else() - # Caller will accept any Boost version. - set(Boost_FOUND 1) - endif() -else() - set(Boost_FOUND 0) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers.") -endif() - -# ------------------------------------------------------------------------ -# Suffix initialization and compiler suffix detection. -# ------------------------------------------------------------------------ - -set(_Boost_VARS_NAME - 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 -set(Boost_LIB_PREFIX "") -if ( WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) - set(Boost_LIB_PREFIX "lib") -endif() - -if (Boost_COMPILER) - set(_boost_COMPILER ${Boost_COMPILER}) - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "using user-specified Boost_COMPILER = ${_boost_COMPILER}") - endif() -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) - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "guessed _boost_COMPILER = ${_boost_COMPILER}") - endif() -endif() - -set (_boost_MULTITHREADED "-mt") -if( NOT Boost_USE_MULTITHREADED ) - set (_boost_MULTITHREADED "") -endif() -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_MULTITHREADED = ${_boost_MULTITHREADED}") -endif() - -#====================== -# Systematically build up the Boost ABI tag -# http://boost.org/doc/libs/1_41_0/more/getting_started/windows.html#library-naming -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) - if(MSVC OR "${CMAKE_CXX_COMPILER}" MATCHES "icl" - OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc") - set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}g") - endif() -endif() -# y using special debug build of python -if(Boost_USE_DEBUG_PYTHON) - set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}y") -endif() -# d using a debug version of your code -set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}d") -# p using the STLport standard library rather than the -# default one supplied with your compiler -if(Boost_USE_STLPORT) - set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}p") - set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}p") -endif() -# n using the STLport deprecated "native iostreams" feature -if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS) - set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}n") - set( _boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}n") -endif() - -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_RELEASE_ABI_TAG = ${_boost_RELEASE_ABI_TAG}") - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_DEBUG_ABI_TAG = ${_boost_DEBUG_ABI_TAG}") -endif() - -# ------------------------------------------------------------------------ -# Begin finding boost libraries -# ------------------------------------------------------------------------ -set(_Boost_VARS_LIB BOOST_LIBRARYDIR Boost_LIBRARY_DIR) -_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR ${_Boost_VARS_DIR} ${_Boost_VARS_LIB} Boost_INCLUDE_DIR) -# Clear Boost_LIBRARY_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_LIBDIR AND NOT _Boost_LIBRARY_DIR_CHANGED) - unset(Boost_LIBRARY_DIR CACHE) -endif() - -if(Boost_LIBRARY_DIR) - set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH) -else() - set(_boost_LIBRARY_SEARCH_DIRS "") - if(BOOST_LIBRARYDIR) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${BOOST_LIBRARYDIR}) - elseif(_ENV_BOOST_LIBRARYDIR) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${_ENV_BOOST_LIBRARYDIR}) - endif() - - if(BOOST_ROOT) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib) - elseif(_ENV_BOOST_ROOT) - list(APPEND _boost_LIBRARY_SEARCH_DIRS ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib) - endif() - - list(APPEND _boost_LIBRARY_SEARCH_DIRS - ${Boost_INCLUDE_DIR}/lib - ${Boost_INCLUDE_DIR}/../lib - ${Boost_INCLUDE_DIR}/../lib/${CMAKE_LIBRARY_ARCHITECTURE} - ${Boost_INCLUDE_DIR}/stage/lib - ) - if( Boost_NO_SYSTEM_PATHS ) - list(APPEND _boost_LIBRARY_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH) - else() - list(APPEND _boost_LIBRARY_SEARCH_DIRS PATHS - C:/boost/lib - C:/boost - /sw/local/lib - ) - endif() -endif() - -if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "_boost_LIBRARY_SEARCH_DIRS = ${_boost_LIBRARY_SEARCH_DIRS}") -endif() - -# 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) - set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - 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 AND Boost_FIND_COMPONENTS) - if(Boost_VERSION LESS 103500) - list(REMOVE_ITEM Boost_FIND_COMPONENTS system) - endif() -endif() - -# If the user changed any of our control inputs flush previous results. -if(_Boost_CHANGE_LIBDIR 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)") - - # - # Find RELEASE libraries - # - set(_boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT} ) - if(_boost_STATIC_RUNTIME_WORKAROUND) - set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") - list(APPEND _boost_RELEASE_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} ) - endif() - if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") - _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES}) - endif() - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}") - endif() - - # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. - string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS}") - - _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE - NAMES ${_boost_RELEASE_NAMES} - HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} - NAMES_PER_DIR - DOC "${_boost_docstring_release}" - ) - - # - # Find DEBUG libraries - # - set(_boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED} - ${Boost_LIB_PREFIX}boost_${COMPONENT} ) - if(_boost_STATIC_RUNTIME_WORKAROUND) - set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") - list(APPEND _boost_DEBUG_NAMES - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION} - ${Boost_LIB_PREFIX}boost_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} ) - endif() - if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread") - _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES}) - endif() - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " - "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}") - endif() - - # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing. - string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS}") - - _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG - NAMES ${_boost_DEBUG_NAMES} - HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp} - NAMES_PER_DIR - DOC "${_boost_docstring_debug}" - ) - - 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}) - -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 ${Boost_LIBRARY_DIR}) - -# The above setting of Boost_FOUND was based only on the header files. -# Update it for the requested component libraries. -if(Boost_FOUND) - # The headers were found. Check for requested component libs. - set(_boost_CHECKED_COMPONENT FALSE) - set(_Boost_MISSING_COMPONENTS "") - foreach(COMPONENT ${Boost_FIND_COMPONENTS}) - string(TOUPPER ${COMPONENT} COMPONENT) - set(_boost_CHECKED_COMPONENT TRUE) - if(NOT Boost_${COMPONENT}_FOUND) - string(TOLOWER ${COMPONENT} COMPONENT) - list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT}) - endif() - endforeach() - - if(Boost_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] Boost_FOUND = ${Boost_FOUND}") - endif() - - if (_Boost_MISSING_COMPONENTS) - set(Boost_FOUND 0) - # We were unable to find some libraries, so generate a sensible - # error message that lists the libraries we were unable to find. - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}\nThe following Boost libraries could not be found:\n") - foreach(COMPONENT ${_Boost_MISSING_COMPONENTS}) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON} boost_${COMPONENT}\n") - endforeach() - - list(LENGTH Boost_FIND_COMPONENTS Boost_NUM_COMPONENTS_WANTED) - list(LENGTH _Boost_MISSING_COMPONENTS Boost_NUM_MISSING_COMPONENTS) - if (${Boost_NUM_COMPONENTS_WANTED} EQUAL ${Boost_NUM_MISSING_COMPONENTS}) - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") - else () - set(Boost_ERROR_REASON - "${Boost_ERROR_REASON}Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.") - endif () - endif () - - if( NOT Boost_LIBRARY_DIRS AND NOT _boost_CHECKED_COMPONENT ) - # 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") - set(_boost_LIB_DIR ${_boost_LIB_DIR}/lib) - else() - if(EXISTS "${_boost_LIB_DIR}/stage/lib") - set(_boost_LIB_DIR ${_boost_LIB_DIR}/stage/lib) - else() - set(_boost_LIB_DIR "") - endif() - 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() - -# ------------------------------------------------------------------------ -# Notification to end user about what was found -# ------------------------------------------------------------------------ - -set(Boost_LIBRARIES "") -if(Boost_FOUND) - if(NOT Boost_FIND_QUIETLY) - message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - if(Boost_FIND_COMPONENTS) - message(STATUS "Found the following Boost libraries:") - endif() - endif() - foreach( COMPONENT ${Boost_FIND_COMPONENTS} ) - string( TOUPPER ${COMPONENT} UPPERCOMPONENT ) - if( Boost_${UPPERCOMPONENT}_FOUND ) - if(NOT Boost_FIND_QUIETLY) - message (STATUS " ${COMPONENT}") - endif() - list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY}) - endif() - endforeach() - - # Add pthread library on UNIX if thread component was found - _Boost_consider_adding_pthreads(Boost_LIBRARIES ${Boost_LIBRARIES}) -else() - if(Boost_FIND_REQUIRED) - message(SEND_ERROR "Unable to find the requested Boost libraries.\n${Boost_ERROR_REASON}") - else() - if(NOT Boost_FIND_QUIETLY) - # we opt not to automatically output Boost_ERROR_REASON here as - # it could be quite lengthy and somewhat imposing in its requests - # Since Boost is not always a required dependency we'll leave this - # up to the end-user. - if(Boost_DEBUG OR Boost_DETAILED_FAILURE_MSG) - message(STATUS "Could NOT find Boost\n${Boost_ERROR_REASON}") - else() - message(STATUS "Could NOT find Boost") - endif() - endif() - endif() -endif() - -# 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.") diff --git a/CMakeModules/Legacy/CMakeLists.txt b/CMakeModules/Legacy/CMakeLists.txt deleted file mode 100644 index 56c115f..0000000 --- a/CMakeModules/Legacy/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# If you are running recent enough version of CMake you shall consider updating/removing these lines ... -MESSAGE(STATUS "Configuring build scripts for older CMake versions") - -# This patches your current boost searching routine so that `pthread` library is included if needed -# - this is here to fix some older CMake + Boost configurations -set(Boost_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../Boost" PARENT_SCOPE) - -if (APPLE OR USE_LEGACY_FIND_BOOST) - MESSAGE(STATUS "Configuring for custom FindBoost.cmake") - # Custom FindBoost.cmake - # - overrides `find_package( Boost )` functionality - # - it's a modified https://github.com/Kitware/CMake/blob/363825cd55595b7de62fcf610836f6156a9f1a31/Modules/FindBoost.cmake - # - adds additional Boost search path - # - adds pthread as an dependency if needed - ###### - # This is using an old version of FindBoost.cmake irregardless of your CMake version - # - this will be removed in future release - # - improves Boost library search in some Apple OS configrations - # - this can be fixed with properly setting BOOST_LIBRARYDIR - ##### - - MESSAGE(DEPRECATION "Custom FindBoost.cmake will be deprecated in some future release. If you are using some of the affected configurations try setting the BOOST_LIBRARYDIR variable.") - - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Boost") - - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE) -endif () From 699238f08ffd9ebf1594c5692dc965c67c290817 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 17 Aug 2019 10:23:15 +0200 Subject: [PATCH 040/117] Fix build with older cmake --- CMakeLists.txt | 3 ++- CMakeModules/Boost/BoostConfig.cmake | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 CMakeModules/Boost/BoostConfig.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4394887..0966c95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,7 +136,8 @@ IF( WIN32 ) # iphlpapi.lib ENDIF(WIN32) -FIND_PACKAGE(Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED) +set(Boost_DIR "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/Boost") +FIND_PACKAGE(Boost CONFIG COMPONENTS ${BOOST_COMPONENTS} ) IF(NOT WIN32) MESSAGE(STATUS "Configuring fc to build on Unix/Apple") diff --git a/CMakeModules/Boost/BoostConfig.cmake b/CMakeModules/Boost/BoostConfig.cmake new file mode 100644 index 0000000..a5e01f2 --- /dev/null +++ b/CMakeModules/Boost/BoostConfig.cmake @@ -0,0 +1,18 @@ +# This overrides `find_package(Boost ... CONFIG ... )` calls +# - calls the CMake's built-in `FindBoost.cmake` and adds `pthread` library dependency + +MESSAGE(STATUS "Using custom FindBoost config") + +find_package(Boost 1.58 REQUIRED COMPONENTS ${Boost_FIND_COMPONENTS}) + +# Inject `pthread` dependency to Boost if needed +if (UNIX AND NOT CYGWIN) + list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread) + if (_using_boost_thread GREATER -1) + find_library(BOOST_THREAD_LIBRARY NAMES pthread DOC "The threading library used by boost-thread") + if (BOOST_THREAD_LIBRARY) + MESSAGE(STATUS "Adding Boost thread lib dependency: ${BOOST_THREAD_LIBRARY}") + list(APPEND Boost_LIBRARIES ${BOOST_THREAD_LIBRARY}) + endif () + endif () +endif () From 7b37cd6effd6d854d4b9af134ba3c82cd2e1daef Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 19 Aug 2019 12:09:53 +0200 Subject: [PATCH 041/117] Fix core #1935 --- include/fc/network/tcp_socket.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/network/tcp_socket.hpp b/include/fc/network/tcp_socket.hpp index 160df37..320d45c 100644 --- a/include/fc/network/tcp_socket.hpp +++ b/include/fc/network/tcp_socket.hpp @@ -53,7 +53,7 @@ namespace fc { #ifdef _WIN64 fc::fwd my; #else - fc::fwd my; + fc::fwd my; #endif }; typedef std::shared_ptr tcp_socket_ptr; From 81cc84c1727c1b1c1782e63aba22202cba649af7 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 21 Aug 2019 11:31:09 +0200 Subject: [PATCH 042/117] Fix core #1948 - editline does not build --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bad2407..292b574 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -250,7 +250,7 @@ install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include ) # begin editline stuff if(WIN32) target_compile_definitions( fc PRIVATE _CRT_NONSTDC_NO_DEPRECATE ) -elseif(WIN32) +else(WIN32) target_compile_definitions (fc PRIVATE HAVE_EDITLINE) set(editline_libraries editline) endif(WIN32) From ea85954e1735c2cdc7287dbe13568a4290789f6e Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 21 Aug 2019 11:31:41 +0200 Subject: [PATCH 043/117] Adjust whitespace --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 292b574..02dab61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -251,8 +251,8 @@ install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include ) if(WIN32) target_compile_definitions( fc PRIVATE _CRT_NONSTDC_NO_DEPRECATE ) else(WIN32) - target_compile_definitions (fc PRIVATE HAVE_EDITLINE) - set(editline_libraries editline) + target_compile_definitions( fc PRIVATE HAVE_EDITLINE ) + set( editline_libraries editline ) endif(WIN32) # end editline stuff From 78ffb6dbd3c3696f5838d005e3f159b42805172c Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 22 Aug 2019 11:11:17 +0200 Subject: [PATCH 044/117] Possible fix for core #1952 --- include/fc/variant.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index f7ef613..b083012 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -27,7 +27,7 @@ namespace fc { void throw_assertion_failure( const std::string& message ); } -#define _FC_ASSERT( cond, msg ) { if( !(cond) ) { fc::throw_assertion_failure( #cond ": " msg ); } } +#define _FC_ASSERT( cond, msg ) { if( !(cond) ) { char t[] = #cond ": " msg; fc::throw_assertion_failure( t ); } } #endif namespace fc From 5bb0254d83ef892186a356f8f54cc4507710b9ba Mon Sep 17 00:00:00 2001 From: crypto-ape <43807588+crypto-ape@users.noreply.github.com> Date: Mon, 26 Aug 2019 14:10:43 +0200 Subject: [PATCH 045/117] fix array declaration for broken msvc static expression evaluation --- src/crypto/elliptic_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/elliptic_common.cpp b/src/crypto/elliptic_common.cpp index 8e4f802..407b9d5 100644 --- a/src/crypto/elliptic_common.cpp +++ b/src/crypto/elliptic_common.cpp @@ -229,7 +229,7 @@ namespace fc { namespace ecc { static std::string _to_base58( const extended_key_data& key ) { - char buffer[key.size() + 4]; // it's a small static array => allocate on stack + char buffer[std::tuple_size::value + 4]; // it's a small static array => allocate on stack memcpy( buffer, key.data(), key.size() ); fc::sha256 double_hash = fc::sha256::hash( fc::sha256::hash( (char*)key.data(), key.size() )); memcpy( buffer + key.size(), double_hash.data(), 4 ); From 9f7f1b479067ffe75e293b8e54aa13f7bd052b0a Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Wed, 28 Aug 2019 15:45:47 -0500 Subject: [PATCH 046/117] Replace improper static_variant operator overloads with comparators --- include/fc/reflect/typename.hpp | 2 +- include/fc/static_variant.hpp | 16 ++++++++-------- tests/variant_test.cpp | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/fc/reflect/typename.hpp b/include/fc/reflect/typename.hpp index 3fe9a83..bcd4f2a 100644 --- a/include/fc/reflect/typename.hpp +++ b/include/fc/reflect/typename.hpp @@ -41,7 +41,7 @@ namespace fc { return n.c_str(); } }; - template struct get_typename> + template struct get_typename> { static const char* name() { static std::string n = std::string("flat_set<") + get_typename::name() + ">"; diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 6f1841c..89baa4e 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -302,6 +302,14 @@ public: static constexpr int value = impl::position::pos; }; + struct type_lt { + bool operator()(const static_variant& a, const static_variant& b) const { return a.which() < b.which(); } + }; + struct type_eq { + bool operator()(const static_variant& a, const static_variant& b) const { return a.which() == b.which(); } + }; + using flat_set_type = flat_set; + static_variant() { init_from_tag(0); @@ -352,14 +360,6 @@ public: v.visit( impl::move_construct(*this) ); return *this; } - friend bool operator == ( const static_variant& a, const static_variant& b ) - { - return a.which() == b.which(); - } - friend bool operator < ( const static_variant& a, const static_variant& b ) - { - return a.which() < b.which(); - } template> X& get() { diff --git a/tests/variant_test.cpp b/tests/variant_test.cpp index 96e62b5..35186d7 100644 --- a/tests/variant_test.cpp +++ b/tests/variant_test.cpp @@ -182,7 +182,7 @@ BOOST_AUTO_TEST_CASE( nested_objects_test ) from_variant( v, sv1, nested_levels + 2 ); - BOOST_CHECK( sv == sv1 ); + BOOST_CHECK( decltype(sv)::type_eq()(sv, sv1) ); // both log and dump should never throw BOOST_TEST_MESSAGE( "========== About to log static_variant. ==========" ); @@ -215,7 +215,7 @@ BOOST_AUTO_TEST_CASE( nested_objects_test ) from_variant( v, vec1, nested_levels + 3 ); - BOOST_CHECK( vec == vec1 ); + BOOST_CHECK( std::equal(vec.begin(), vec.end(), vec1.begin(), decltype(vec)::value_type::type_eq()) ); // both log and dump should never throw BOOST_TEST_MESSAGE( "========== About to log vector. ==========" ); From cce644f686f78491e6823845dd585fcb1e52ef49 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Thu, 29 Aug 2019 11:26:34 -0500 Subject: [PATCH 047/117] Fix warnings The `appender` class is intended to be inherited and used polymorphically, but does not have a virtual destructor, which causes warnings. This adds a virtual destructor to fix these warnings. --- include/fc/log/appender.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/fc/log/appender.hpp b/include/fc/log/appender.hpp index f8f442f..518c734 100644 --- a/include/fc/log/appender.hpp +++ b/include/fc/log/appender.hpp @@ -34,6 +34,7 @@ namespace fc { return register_appender( type, appender_factory::ptr( new detail::appender_factory_impl() ) ); } + virtual ~appender() = default; static appender::ptr create( const std::string& name, const std::string& type, const variant& args ); static appender::ptr get( const std::string& name ); static bool register_appender( const std::string& type, const appender_factory::ptr& f ); From 45cb433d47086464bed71fb96827fea7b75a0a9d Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Fri, 30 Aug 2019 11:52:05 -0500 Subject: [PATCH 048/117] Fixes from code review --- include/fc/reflect/typename.hpp | 14 ++++++++++++-- tests/variant_test.cpp | 7 +++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/fc/reflect/typename.hpp b/include/fc/reflect/typename.hpp index bcd4f2a..41fc348 100644 --- a/include/fc/reflect/typename.hpp +++ b/include/fc/reflect/typename.hpp @@ -12,6 +12,7 @@ #include namespace fc { + template class static_variant; class value; class exception; namespace ip { class address; } @@ -41,10 +42,19 @@ namespace fc { return n.c_str(); } }; - template struct get_typename> + template struct get_typename> + { + static const char* name() { + static std::string n = std::string("flat_set<") + get_typename::name() + ">"; + return n.c_str(); + } + }; + template + struct get_typename, typename static_variant::type_lt>> { static const char* name() { - static std::string n = std::string("flat_set<") + get_typename::name() + ">"; + using TN = get_typename>; + static std::string n = std::string("flat_set<") + TN::name() + ", " + TN::name() + "::type_lt>"; return n.c_str(); } }; diff --git a/tests/variant_test.cpp b/tests/variant_test.cpp index 35186d7..474e5ae 100644 --- a/tests/variant_test.cpp +++ b/tests/variant_test.cpp @@ -182,7 +182,10 @@ BOOST_AUTO_TEST_CASE( nested_objects_test ) from_variant( v, sv1, nested_levels + 2 ); - BOOST_CHECK( decltype(sv)::type_eq()(sv, sv1) ); + auto sv_equal = [](const fc::static_variant& v1, const fc::static_variant& v2) { + return v1.get() == v2.get(); + }; + BOOST_CHECK( sv_equal(sv, sv1) ); // both log and dump should never throw BOOST_TEST_MESSAGE( "========== About to log static_variant. ==========" ); @@ -215,7 +218,7 @@ BOOST_AUTO_TEST_CASE( nested_objects_test ) from_variant( v, vec1, nested_levels + 3 ); - BOOST_CHECK( std::equal(vec.begin(), vec.end(), vec1.begin(), decltype(vec)::value_type::type_eq()) ); + BOOST_CHECK( std::equal(vec.begin(), vec.end(), vec1.begin(), sv_equal) ); // both log and dump should never throw BOOST_TEST_MESSAGE( "========== About to log vector. ==========" ); From c69ea32613f7e4bbc318d3d59a3b18dc834cd4e5 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Tue, 9 Jul 2019 17:00:03 -0500 Subject: [PATCH 049/117] Improve reflection system and static_variant Previously, fc reflection generated visitor infrastructure capable of visiting each field of a struct; however, this is only useful for run- time operations on structures. No compile-time information was preserved about the fields of a struct, making compile-time introspection of types impossible. Now FC reflection generates rich compile-time information about the members of structs, including types, names, and structure, allowing code to be written to explore types in detail at compile-time and fetch arbitrary fields at runtime without needing to iterate over the unwanted fields. To make this a reality, a new `typelist` type was added to store this compile-time information. This type is also useful within the context of `static_variant`, as SV previously used implementation detail types in a private namespace to provide this functionality. Now `static_variant` uses the reusable functionality of `typelist` to operate, dramatically reducing the amount of code dedicated to `static_variant` and also making `static_variant` types more flexible to work with since their infrastructure is now based on the `typelist` public interface. --- include/fc/reflect/reflect.hpp | 206 ++++++++++++++----- include/fc/reflect/typelist.hpp | 262 ++++++++++++++++++++++++ include/fc/reflect/typename.hpp | 16 ++ include/fc/static_variant.hpp | 340 ++++++++++---------------------- src/network/http/websocket.cpp | 4 + tests/CMakeLists.txt | 1 + tests/reflection_tests.cpp | 126 ++++++++++++ tests/serialization_test.cpp | 1 - 8 files changed, 669 insertions(+), 287 deletions(-) create mode 100644 include/fc/reflect/typelist.hpp create mode 100644 tests/reflection_tests.cpp diff --git a/include/fc/reflect/reflect.hpp b/include/fc/reflect/reflect.hpp index 7578360..348477a 100644 --- a/include/fc/reflect/reflect.hpp +++ b/include/fc/reflect/reflect.hpp @@ -1,6 +1,6 @@ #pragma once /** - * @file fc/reflect.hpp + * @file fc/reflect/reflect.hpp * * @brief Defines types and macros used to provide reflection. * @@ -18,9 +18,114 @@ #include #include +#include namespace fc { +template struct reflector; +namespace member_names { +/// A template which stores the name of the native member at a given index in a given class +template struct member_name { + constexpr static const char* value = "Unknown member"; +}; +} + +/** + * @brief A template to store compile-time information about a field in a reflected struct + * + * @tparam Container The type of the struct or class containing the field + * @tparam Member The type of the field + * @tparam field A pointer-to-member for the reflected field + */ +template +struct field_reflection { + using container = Container; + using type = Member; + using reflector = fc::reflector; + constexpr static std::size_t index = Index; + constexpr static bool is_derived = false; + constexpr static type container::*pointer = field; + + /// @brief Given a reference to the container type, get a reference to the field + static type& get(container& c) { return c.*field; } + static const type& get(const container& c) { return c.*field; } + /// @brief Get the name of the field + static const char* get_name() { return fc::member_names::member_name::value; } +}; +/// Basically the same as @ref field_reflection, but for inherited fields +/// Note that inherited field reflections do not have an index field; indexes are for native fields only +template +struct inherited_field_reflection { + using container = Derived; + using field_container = Base; + using type = Member; + using reflector = fc::reflector; + constexpr static std::size_t index_in_base = IndexInBase; + constexpr static bool is_derived = true; + constexpr static type field_container::*pointer = field; + + static type& get(container& c) { + // And we need a distinct inherited_field_reflection type because this conversion can't be done statically + type container::* derived_field = field; + return c.*derived_field; + } + static const type& get(const container& c) { + type container::* derived_field = field; + return c.*derived_field; + } + static const char* get_name() { + using Reflector = typename fc::reflector::native_members::template at; + return Reflector::get_name(); + } +}; + +namespace impl { +/// Helper template to create a @ref field_reflection without any commas (makes it macro-friendly) +template +struct Reflect_type { + template + struct with_field_type { + template + struct at_index { + template + struct with_field_pointer { + using type = field_reflection; + }; + }; + }; +}; +/// Template to make a transformer of a @ref field_reflection from a base class to a derived class +template +struct Derivation_reflection_transformer { + template struct transform; + template + struct transform> { + using type = inherited_field_reflection; + }; + template + struct transform> { + using type = inherited_field_reflection; + }; +}; +} // namespace impl + +/// Macro to transform reflected fields of a base class to a derived class and concatenate them to a type list +#define FC_CONCAT_BASE_MEMBER_REFLECTIONS(r, derived, base) \ + ::add_list::members, impl::Derivation_reflection_transformer>> +/// Macro to concatenate a new @ref field_reflection to a typelist +#define FC_CONCAT_MEMBER_REFLECTION(r, container, idx, member) \ + ::add::template with_field_type \ + ::template at_index \ + ::template with_field_pointer<&container::member>::type> +#define FC_REFLECT_MEMBER_NAME(r, container, idx, member) \ + template<> struct member_name { constexpr static const char* value = BOOST_PP_STRINGIZE(member); }; +#define FC_REFLECT_TEMPLATE_MEMBER_NAME(r, data, idx, member) \ + template struct member_name { \ + constexpr static const char* value = BOOST_PP_STRINGIZE(member); }; +/// Macro to concatenate a new type to a typelist +#define FC_CONCAT_TYPE(r, x, TYPE) ::add + /** * @brief defines visit functions for T * Unless this is specialized, visit() will not be defined for T. @@ -34,6 +139,14 @@ template struct reflector{ typedef T type; typedef std::false_type is_defined; + /// A typelist with a @ref field_reflection for each native member (non-inherited) of the struct + using native_members = typelist::list<>; + /// A typelist with a @ref field_reflection for each inherited member of the struct + using inherited_members = typelist::list<>; + /// A typelist with a @ref field_reflection for each member of the struct, starting with inherited members + using members = typelist::list<>; + /// A typelist of base classes for this type + using base_classes = typelist::list<>; /** * @tparam Visitor a function object of the form: @@ -91,31 +204,11 @@ void throw_bad_enum_cast( const char* k, const char* e ); case I: FC_REFLECT_VISIT_MEMBER( r, visitor, elem ) break; -#define FC_REFLECT_BASE_MEMBER_COUNT( r, OP, elem ) \ - OP fc::reflector::total_member_count - -#define FC_REFLECT_MEMBER_COUNT( r, OP, elem ) \ - OP 1 - #define FC_REFLECT_DERIVED_IMPL_INLINE( TYPE, INHERITS, MEMBERS ) \ template\ static inline void visit( const Visitor& v ) { \ BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_VISIT_BASE, v, INHERITS ) \ BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_VISIT_MEMBER, v, MEMBERS ) \ -}\ -template\ -static inline void visit_local_member( const Visitor& v, IndexType index ) { \ - switch( index ) {\ - BOOST_PP_SEQ_FOR_EACH_I( FC_REFLECT_VISIT_MEMBER_I, v, MEMBERS ) \ - default: break;\ - }\ -} - -#define FC_REFLECT_DERIVED_IMPL_EXT( TYPE, INHERITS, MEMBERS ) \ -template\ -void fc::reflector::visit( const Visitor& v ) { \ - BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_VISIT_BASE, v, INHERITS ) \ - BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_VISIT_MEMBER, v, MEMBERS ) \ } #endif // DOXYGEN @@ -214,26 +307,50 @@ namespace fc { \ template<> struct reflector {\ typedef TYPE type; \ typedef std::true_type is_defined; \ + using native_members = \ + typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH_I( FC_CONCAT_MEMBER_REFLECTION, TYPE, MEMBERS ) ::finalize; \ + using inherited_members = \ + typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH( FC_CONCAT_BASE_MEMBER_REFLECTIONS, TYPE, INHERITS ) ::finalize; \ + using members = typename typelist::concat::type; \ + using base_classes = typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH( FC_CONCAT_TYPE, x, INHERITS ) ::finalize; \ enum member_count_enum { \ - local_member_count = 0 BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_MEMBER_COUNT, +, MEMBERS ),\ - total_member_count = local_member_count BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_BASE_MEMBER_COUNT, +, INHERITS )\ + local_member_count = typelist::length(), \ + total_member_count = typelist::length() \ }; \ FC_REFLECT_DERIVED_IMPL_INLINE( TYPE, INHERITS, MEMBERS ) \ -}; } +}; \ +namespace member_names { \ +BOOST_PP_SEQ_FOR_EACH_I( FC_REFLECT_MEMBER_NAME, TYPE, MEMBERS ) \ +} } #define FC_REFLECT_DERIVED_TEMPLATE( TEMPLATE_ARGS, TYPE, INHERITS, MEMBERS ) \ namespace fc { \ - template struct get_typename { static const char* name() { return BOOST_PP_STRINGIZE(TYPE); } }; \ + template struct get_typename { \ + static const char* name() { return BOOST_PP_STRINGIZE(TYPE); } \ + }; \ template struct reflector {\ typedef TYPE type; \ typedef std::true_type is_defined; \ + using native_members = \ + typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH_I( FC_CONCAT_MEMBER_REFLECTION, TYPE, MEMBERS ) ::finalize; \ + using inherited_members = \ + typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH( FC_CONCAT_BASE_MEMBER_REFLECTIONS, TYPE, INHERITS ) ::finalize; \ + using members = typename typelist::concat::type; \ + using base_classes = typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH( FC_CONCAT_TYPE, x, INHERITS ) ::finalize; \ enum member_count_enum { \ - local_member_count = 0 BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_MEMBER_COUNT, +, MEMBERS ),\ - total_member_count = local_member_count BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_BASE_MEMBER_COUNT, +, INHERITS )\ + local_member_count = typelist::length(), \ + total_member_count = typelist::length() \ }; \ FC_REFLECT_DERIVED_IMPL_INLINE( TYPE, INHERITS, MEMBERS ) \ -}; } - -//BOOST_PP_SEQ_SIZE(MEMBERS), +}; \ +namespace member_names { \ +BOOST_PP_SEQ_FOR_EACH_I( FC_REFLECT_TEMPLATE_MEMBER_NAME, (TEMPLATE_ARGS)(TYPE), MEMBERS ) \ +} } /** * @def FC_REFLECT(TYPE,MEMBERS) @@ -244,7 +361,8 @@ template struct reflector {\ * @see FC_REFLECT_DERIVED */ #define FC_REFLECT( TYPE, MEMBERS ) \ - FC_REFLECT_DERIVED( TYPE, BOOST_PP_SEQ_NIL, MEMBERS ) + FC_REFLECT_DERIVED( TYPE, BOOST_PP_SEQ_NIL, MEMBERS ) + #define FC_REFLECT_TEMPLATE( TEMPLATE_ARGS, TYPE, MEMBERS ) \ FC_REFLECT_DERIVED_TEMPLATE( TEMPLATE_ARGS, TYPE, BOOST_PP_SEQ_NIL, MEMBERS ) @@ -257,25 +375,11 @@ namespace fc { \ template<> struct get_typename { static const char* name() { return BOOST_PP_STRINGIZE(TYPE); } }; \ } -#define FC_REFLECT_FWD( TYPE ) \ -namespace fc { \ - template<> struct get_typename { static const char* name() { return BOOST_PP_STRINGIZE(TYPE); } }; \ -template<> struct reflector {\ - typedef TYPE type; \ - typedef std::true_type is_defined; \ - enum member_count_enum { \ - local_member_count = BOOST_PP_SEQ_SIZE(MEMBERS), \ - total_member_count = local_member_count BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_BASE_MEMBER_COUNT, +, INHERITS )\ - }; \ - template static void visit( const Visitor& v ); \ -}; } - - -#define FC_REFLECT_DERIVED_IMPL( TYPE, MEMBERS ) \ - FC_REFLECT_IMPL_DERIVED_EXT( TYPE, BOOST_PP_SEQ_NIL, MEMBERS ) - -#define FC_REFLECT_IMPL( TYPE, MEMBERS ) \ - FC_REFLECT_DERIVED_IMPL_EXT( TYPE, BOOST_PP_SEQ_NIL, MEMBERS ) - +// vvv These are preserved to merge more smoothly vvv +#define FC_REFLECT_BASE_MEMBER_COUNT( r, OP, elem ) \ + OP fc::reflector::total_member_count +#define FC_REFLECT_MEMBER_COUNT( r, OP, elem ) \ + OP 1 +// ^^^ These can be removed after updating graphene/protocol/types.hpp ^^^ diff --git a/include/fc/reflect/typelist.hpp b/include/fc/reflect/typelist.hpp new file mode 100644 index 0000000..d1d3e0d --- /dev/null +++ b/include/fc/reflect/typelist.hpp @@ -0,0 +1,262 @@ +#pragma once +/** + * @file fc/reflect/typelist.hpp + * + * @brief Defines a template for manipulating and storing compile-time lists of types + */ + +#include +#include + +namespace fc { + +/// This namespace contains the list type, and all of the operations and queries which can be performed upon it +namespace typelist { + +// Forward declare the list so impl can see it +template struct list; + +namespace impl { +using typelist::list; + +template class> struct apply; +template class Delegate> +struct apply, Delegate> { using type = Delegate; }; + +template +struct length; +template<> struct length<> { constexpr static std::size_t value = 0; }; +template +struct length { constexpr static std::size_t value = length::value+1; }; + +template struct concat; +template +struct concat, list> { + using type = list; +}; +template +struct concat, list, NextList, Lists...> { + using type = typename concat, NextList, Lists...>::type; +}; + +template struct make_sequence; +template<> struct make_sequence<0> { using type = list<>; }; +template<> struct make_sequence<1> { using type = list>; }; +template +struct make_sequence { + using type = typename concat::type, + list>>::type; +}; + +template struct transform; +template +struct transform, Transformer> { + using type = list::type...>; +}; + +template struct index_of; +template struct index_of> { constexpr static int value = -1; }; +template +struct index_of> { + constexpr static int deeper = index_of>::value; + constexpr static int value = std::is_same::value? 0 : (deeper == -1? -1 : deeper + 1); +}; + +template struct concat_unique; +template +struct concat_unique, list<>> { + using type = list; +}; +template +struct concat_unique, list> { + using type = std::conditional_t>::value >= 0, + list, list>; +}; +template +struct concat_unique, list> { + using type = typename concat_unique< + typename concat_unique, list>::type, list>::type; +}; +template +struct concat_unique, list<>, Lists...> { + using type = typename concat_unique, Lists...>::type; +}; +template +struct concat_unique, L2, Lists...> { + using type = typename concat_unique>::type, L2, Lists...>::type; +}; + +template struct at; +template +struct at, 0> { using type = T; }; +template +struct at, index> : at, index-1> {}; + +template struct remove_at; +template +struct remove_at, list, 0> { using type = list; }; +template +struct remove_at, list, index> { + using type = typename remove_at, list, index-1>::type; +}; + +template class Filter, typename Filtered, typename List> struct filter; +template class Filter, typename... Filtered> +struct filter, list<>> { using type = list; }; +template class Filter, typename... Filtered, typename T1, typename... Types> +struct filter, list> { + using type = typename std::conditional_t::value, + filter, list>, + filter, list>>::type; +}; + +template struct slice; +template +struct slice, list, index, index, void> { using type = list; }; +template +struct slice, list, 0, end, std::enable_if_t> + : slice, list, 0, end-1> {}; +template +struct slice, list, start, end, std::enable_if_t> + : slice, list, start-1, end-1> {}; + +template struct zip; +template<> +struct zip, list<>> { using type = list<>; }; +template +struct zip, list> { + using type = typename concat>, typename zip, list>::type>::type; +}; + +template +Ret dispatch_helper(Callable& c) { return c(T()); } + +} // namespace impl + +/// The actual list type +template +struct list { using type = list; }; + +/// Apply a list of types as arguments to another template +template class Delegate> +using apply = typename impl::apply::type; + +/// Get the number of types in a list +template +constexpr static std::size_t length() { return apply::value; } + +/// Concatenate two or more typelists together +template +using concat = typename impl::concat::type; + +/// Create a list of sequential integers ranging from [0, count) +template +using make_sequence = typename impl::make_sequence::type; + +/// Template to build typelists using the following syntax: +/// builder<>::type::add::add::add[...]::finalize +/// Or: +/// builder<>::type::add_list>::add_list>[...]::finalize +template> +struct builder { + template using add = typename builder>::type>::type; + template using add_list = typename builder::type>::type; + using type = builder; + using finalize = List; +}; + +/// Transform elements of a typelist +template +using transform = typename impl::transform::type; + +/// Get the index of the given type within a list, or -1 if type is not found +template +constexpr static int index_of() { return impl::index_of::value; } + +/// Check if a given type is in a list +template +constexpr static bool contains() { return impl::index_of::value != -1; } + +/// Remove duplicate items from one or more typelists and concatenate them all together +template +using concat_unique = typename impl::concat_unique, TypeLists...>::type; + +/// Get the type at the specified list index +template +using at = typename impl::at::type; + +/// Get the type at the beginning of the list +template +using first = at; +/// Get the type at the end of the list +template +using last = at()-1>; + +/// Get the list with the element at the given index removed +template +using remove_at = typename impl::remove_at, List, index>::type; + +/// Get the list with the given type removed +template +using remove_element = remove_at()>; + +/// Get a list with all elements that do not pass a filter removed +template class Filter> +using filter = typename impl::filter, List>::type; + +/// Template to invert a filter, i.e. filter::type> +template class Filter> +struct invert_filter { + template + struct type { constexpr static bool value = !Filter::value; }; +}; + +/// Take the sublist at indexes [start, end) +template()> +using slice = typename impl::slice, List, start, end>::type; + +/// Zip two equal-length typelists together, i.e. zip, list> == list, list> +template +using zip = typename impl::zip::type; + +/// Add indexes to types in the list, i.e. index> == list, list<1, B>, list<2, C>> where +/// 0, 1, and 2 are std::integral_constants of type std::size_t +template +using index = typename impl::zip()>::type, List>::type; + +/// This namespace contains some utilities that provide runtime operations on typelists +namespace runtime { +/// Type wrapper object allowing arbitrary types to be passed to functions as information rather than data +template struct wrapper { using type = T; }; + +/** + * @brief Index into the typelist for a type T, and invoke the callable with an argument wrapper() + * @param index Index of the type in the typelist to invoke the callable with + * @param c The callable to invoke + * @return The value returned by the callable + * @note The callable return type must be the same for all list elements + * + * If index is out of bounds, throws std::out_of_range exception + */ +template::value != 0>, + typename Return = decltype(std::declval()(wrapper, 0>>()))> +Return dispatch(list, std::size_t index, Callable c) { + static std::function call_table[] = + { impl::dispatch_helper>... }; + if (index < impl::length::value) return call_table[index](c); + throw std::out_of_range("Invalid index to fc::typelist::runtime::dispatch()"); +} +template +auto dispatch(List l, int64_t index, Callable c) { + if (index < 0) throw std::out_of_range("Negative index to fc::typelist::runtime::dispatch()"); + return dispatch(l, std::size_t(index), std::move(c)); +} + +/// @brief Invoke the provided callable with an argument wrapper() for each type in the list +template +void for_each(list, Callable c) { + bool trues[] = { [](Callable& c, auto t) { c(t); return true; }(c, wrapper())... }; + (void)(trues); +} + +} } } // namespace fc::typelist::runtime diff --git a/include/fc/reflect/typename.hpp b/include/fc/reflect/typename.hpp index 41fc348..15b8523 100644 --- a/include/fc/reflect/typename.hpp +++ b/include/fc/reflect/typename.hpp @@ -112,6 +112,22 @@ namespace fc { return _name.c_str(); } }; + template struct get_typename< const T* > + { + static const char* name() + { + static std::string n = std::string("const ") + get_typename::name() + "*"; + return n.c_str(); + } + }; + template struct get_typename< T* > + { + static const char* name() + { + static std::string n = std::string(get_typename::name()) + "*"; + return n.c_str(); + } + }; struct unsigned_int; class variant_object; diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 89baa4e..d284963 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -23,174 +23,6 @@ namespace fc { // Implementation details, the user should not import this: namespace impl { -template -struct storage_ops; - -template -struct position; - -template -struct type_info; - -template -struct copy_construct -{ - typedef void result_type; - StaticVariant& sv; - copy_construct( StaticVariant& s ):sv(s){} - template - void operator()( const T& v )const - { - sv.init(v); - } -}; - -template -struct move_construct -{ - typedef void result_type; - StaticVariant& sv; - move_construct( StaticVariant& s ):sv(s){} - template - void operator()( T& v )const - { - sv.init( std::move(v) ); - } -}; - -template -struct storage_ops { - static void del(int n, void *data) {} - static void con(int n, void *data) {} - - template - static typename visitor::result_type apply(int n, void *data, visitor& v) {} - - template - static typename visitor::result_type apply(int n, void *data, const visitor& v) {} - - template - static typename visitor::result_type apply(int n, const void *data, visitor& v) {} - - template - static typename visitor::result_type apply(int n, const void *data, const visitor& v) {} -}; - -template -struct storage_ops { - static void del(int n, void *data) { - if(n == N) reinterpret_cast(data)->~T(); - else storage_ops::del(n, data); - } - static void con(int n, void *data) { - if(n == N) new(reinterpret_cast(data)) T(); - else storage_ops::con(n, data); - } - - template - static typename visitor::result_type apply(int n, void *data, visitor& v) { - if(n == N) return v(*reinterpret_cast(data)); - else return storage_ops::apply(n, data, v); - } - - template - static typename visitor::result_type apply(int n, void *data, const visitor& v) { - if(n == N) return v(*reinterpret_cast(data)); - else return storage_ops::apply(n, data, v); - } - - template - static typename visitor::result_type apply(int n, const void *data, visitor& v) { - if(n == N) return v(*reinterpret_cast(data)); - else return storage_ops::apply(n, data, v); - } - - template - static typename visitor::result_type apply(int n, const void *data, const visitor& v) { - if(n == N) return v(*reinterpret_cast(data)); - else return storage_ops::apply(n, data, v); - } -}; - -template -struct storage_ops { - static void del(int n, void *data) { - FC_THROW_EXCEPTION( fc::assert_exception, "Internal error: static_variant tag is invalid."); - } - static void con(int n, void *data) { - FC_THROW_EXCEPTION( fc::assert_exception, "Internal error: static_variant tag is invalid." ); - } - - template - static typename visitor::result_type apply(int n, void *data, visitor& v) { - FC_THROW_EXCEPTION( fc::assert_exception, "Internal error: static_variant tag is invalid." ); - } - template - static typename visitor::result_type apply(int n, void *data, const visitor& v) { - FC_THROW_EXCEPTION( fc::assert_exception, "Internal error: static_variant tag is invalid." ); - } - template - static typename visitor::result_type apply(int n, const void *data, visitor& v) { - FC_THROW_EXCEPTION( fc::assert_exception, "Internal error: static_variant tag is invalid." ); - } - template - static typename visitor::result_type apply(int n, const void *data, const visitor& v) { - FC_THROW_EXCEPTION( fc::assert_exception, "Internal error: static_variant tag is invalid." ); - } -}; - -template -struct position { - static constexpr int pos = -1; -}; - -template -struct position { - static constexpr int pos = 0; -}; - -template -struct position { - static constexpr int pos = position::pos != -1 ? position::pos + 1 : -1; -}; - -template -struct type_info { - static constexpr bool no_reference_types = false; - static constexpr bool no_duplicates = position::pos == -1 && type_info::no_duplicates; - static constexpr size_t size = type_info::size > sizeof(T&) ? type_info::size : sizeof(T&); - static constexpr size_t count = 1 + type_info::count; -}; - -template -struct type_info { - static constexpr bool no_reference_types = type_info::no_reference_types; - static constexpr bool no_duplicates = position::pos == -1 && type_info::no_duplicates; - static constexpr size_t size = type_info::size > sizeof(T) ? type_info::size : sizeof(T&); - static constexpr size_t count = 1 + type_info::count; -}; - -template<> -struct type_info<> { - static constexpr bool no_reference_types = true; - static constexpr bool no_duplicates = true; - static constexpr size_t count = 0; - static constexpr size_t size = 0; -}; - -template -constexpr size_t size( TTag ) -{ - return 0; -} - -template -constexpr size_t size( TTag tag ) -{ - return tag <= 0 ? sizeof(A) : size( --tag ); -} - - class dynamic_storage { char* storage; @@ -206,71 +38,36 @@ public: void release(); }; - - } // namespace impl -template -static const std::array - init_wrappers( Visitor& v, Data d, typename Visitor::result_type(**funcs)(Visitor&,Data) = 0) -{ - return std::array(); -} - -template -static const std::array - init_wrappers( Visitor& v, Data d, typename Visitor::result_type(**funcs)(Visitor&,Data) = 0 ) -{ - std::array result{}; - if( !funcs ) funcs = result.data(); - *funcs++ = [] ( Visitor& v, Data d ) { return v( *reinterpret_cast( d ) ); }; - init_wrappers( v, d, funcs ); - return result; -} - -template -static const std::array - init_const_wrappers( Visitor& v, Data d, typename Visitor::result_type(**funcs)(Visitor&,Data) = 0 ) -{ - return std::array(); -} - -template -static const std::array - init_const_wrappers( Visitor& v, Data d, typename Visitor::result_type(**funcs)(Visitor&,Data) = 0 ) -{ - std::array result{}; - if( !funcs ) funcs = result.data(); - *funcs++ = [] ( Visitor& v, Data d ) { return v( *reinterpret_cast( d ) ); }; - init_const_wrappers( v, d, funcs ); - return result; -} - template class static_variant { public: using tag_type = int64_t; + using list = typelist::list; protected: - static_assert(impl::type_info::no_reference_types, "Reference types are not permitted in static_variant."); - static_assert(impl::type_info::no_duplicates, "static_variant type arguments contain duplicate types."); + static_assert(typelist::length>() == 0, + "Reference types are not permitted in static_variant."); + static_assert(typelist::length>() == typelist::length(), + "static_variant type arguments contain duplicate types."); template - using type_in_typelist = typename std::enable_if::pos != -1, X>::type; // type is in typelist of static_variant. + using type_in_typelist = std::enable_if_t() != -1>; tag_type _tag; impl::dynamic_storage storage; template> void init(const X& x) { - _tag = impl::position::pos; + _tag = typelist::index_of(); storage.alloc( sizeof(X) ); new(storage.data()) X(x); } template> void init(X&& x) { - _tag = impl::position::pos; + _tag = typelist::index_of(); storage.alloc( sizeof(X) ); new(storage.data()) X( std::move(x) ); } @@ -280,26 +77,48 @@ protected: FC_ASSERT( tag >= 0 ); FC_ASSERT( tag < count() ); _tag = tag; - storage.alloc( impl::size( tag ) ); - impl::storage_ops<0, Types...>::con(_tag, storage.data()); + typelist::runtime::dispatch(list(), tag, [this](auto t) { + using T = typename decltype(t)::type; + storage.alloc(sizeof(T)); + new(reinterpret_cast(storage.data())) T(); + }); } void clean() { - impl::storage_ops<0, Types...>::del(_tag, storage.data() ); + typelist::runtime::dispatch(list(), _tag, [data=storage.data()](auto t) { + using T = typename decltype(t)::type; + reinterpret_cast(data)->~T(); + }); storage.release(); } + template + struct import_helper { + static static_variant construct(const T&) { + FC_THROW_EXCEPTION(assert_exception, "Cannot import unsupported type ${T} into static_variant", + ("T", get_typename::name())); + } + static static_variant construct(T&&) { + FC_THROW_EXCEPTION(assert_exception, "Cannot import unsupported type ${T} into static_variant", + ("T", get_typename::name())); + } + }; + template + struct import_helper> { + static static_variant construct(const T& t) { + return static_variant(t); + } + static static_variant construct(T&& t) { + return static_variant(std::move(t)); + } + }; - template - friend struct impl::copy_construct; - template - friend struct impl::move_construct; public: template> struct tag { - static constexpr int value = impl::position::pos; + static const int value = typelist::index_of(); }; struct type_lt { @@ -310,6 +129,25 @@ public: }; using flat_set_type = flat_set; + /// Import the value from a foreign static_variant with types not in this one, and throw if the value is an + /// incompatible type + template + static static_variant import_from(const static_variant& other) { + return typelist::runtime::dispatch(typelist::list(), other.which(), [&other](auto t) { + using other_type = typename decltype(t)::type; + return import_helper::construct(other.template get()); + }); + } + /// Import the value from a foreign static_variant with types not in this one, and throw if the value is an + /// incompatible type + template + static static_variant import_from(static_variant&& other) { + return typelist::runtime::dispatch(typelist::list(), other.which(), [&other](auto t) { + using other_type = typename decltype(t)::type; + return import_helper::construct(std::move(other.template get())); + }); + } + static_variant() { init_from_tag(0); @@ -318,23 +156,41 @@ public: template static_variant( const static_variant& cpy ) { - cpy.visit( impl::copy_construct(*this) ); + typelist::runtime::dispatch(typelist::list(), cpy.which(), [this, &cpy](auto t) mutable { + this->init(cpy.template get()); + }); } static_variant( const static_variant& cpy ) { - cpy.visit( impl::copy_construct(*this) ); + typelist::runtime::dispatch(list(), cpy.which(), [this, &cpy](auto t) mutable { + this->init(cpy.template get()); + }); } static_variant( static_variant&& mv ) { - mv.visit( impl::move_construct(*this) ); + typelist::runtime::dispatch(list(), mv.which(), [this, &mv](auto t) mutable { + this->init(std::move(mv.template get())); + }); + } + + template + static_variant( static_variant&& mv ) + { + typelist::runtime::dispatch(typelist::list(), mv.which(), [this, &mv](auto t) mutable { + this->init(std::move(mv.template get())); + }); } template> static_variant(const X& v) { init(v); } + template> + static_variant(X&& v) { + init(std::move(v)); + } ~static_variant() { clean(); @@ -350,20 +206,24 @@ public: { if( this == &v ) return *this; clean(); - v.visit( impl::copy_construct(*this) ); + typelist::runtime::dispatch(list(), v.which(), [this, &v](auto t)mutable { + this->init(v.template get()); + }); return *this; } static_variant& operator=( static_variant&& v ) { if( this == &v ) return *this; clean(); - v.visit( impl::move_construct(*this) ); + typelist::runtime::dispatch(list(), v.which(), [this, &v](auto t)mutable { + this->init(std::move(v.template get())); + }); return *this; } template> X& get() { - if(_tag == impl::position::pos) { + if(_tag == typelist::index_of()) { return *reinterpret_cast(storage.data()); } else { FC_THROW_EXCEPTION( fc::assert_exception, "static_variant does not contain a value of type ${t}", ("t",fc::get_typename::name()) ); @@ -371,7 +231,7 @@ public: } template> const X& get() const { - if(_tag == impl::position::pos) { + if(_tag == typelist::index_of()) { return *reinterpret_cast(storage.data()); } else { FC_THROW_EXCEPTION( fc::assert_exception, "static_variant does not contain a value of type ${t}", ("t",fc::get_typename::name()) ); @@ -400,36 +260,40 @@ public: template static typename visitor::result_type visit( tag_type tag, visitor& v, void* data ) { - static const auto wrappers = init_wrappers::count,visitor,void*,Types...>( v, data ); FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); - return wrappers[tag]( v, data ); + return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { + return v(*reinterpret_cast(data)); + }); } template static typename visitor::result_type visit( tag_type tag, const visitor& v, void* data ) { - static const auto wrappers = init_wrappers::count,const visitor,void*,Types...>( v, data ); FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); - return wrappers[tag]( v, data ); + return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { + return v(*reinterpret_cast(data)); + }); } template static typename visitor::result_type visit( tag_type tag, visitor& v, const void* data ) { - static const auto wrappers = init_const_wrappers::count,visitor,const void*,Types...>( v, data ); FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); - return wrappers[tag]( v, data ); + return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { + return v(*reinterpret_cast(data)); + }); } template static typename visitor::result_type visit( tag_type tag, const visitor& v, const void* data ) { - static const auto wrappers = init_const_wrappers::count,const visitor,const void*,Types...>( v, data ); FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); - return wrappers[tag]( v, data ); + return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { + return v(*reinterpret_cast(data)); + }); } - static constexpr int count() { return impl::type_info::count; } + static int count() { return typelist::length(); } void set_which( tag_type w ) { FC_ASSERT( w >= 0 ); FC_ASSERT( w < count() ); @@ -442,6 +306,12 @@ public: template bool is_type() const { return _tag == tag::value; } }; +template<> class static_variant<> { +public: + using tag_type = int64_t; + static_variant() { FC_THROW_EXCEPTION(assert_exception, "Cannot create static_variant with no types"); } +}; +template class static_variant> : public static_variant {}; struct from_static_variant { diff --git a/src/network/http/websocket.cpp b/src/network/http/websocket.cpp index 5138fb0..45332f5 100644 --- a/src/network/http/websocket.cpp +++ b/src/network/http/websocket.cpp @@ -300,6 +300,10 @@ namespace fc { namespace http { _server.close( item.first, 0, "server exit" ); if( _closed ) _closed->wait(); +#ifdef TRAVIS_BUILD +#warning Adding 100ms sleep to ~websocket_server_impl() to stabilize Travis tests + fc::usleep(fc::milliseconds(100)); +#endif } typedef std::map > con_map; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 01cf205..5c17ca7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -41,6 +41,7 @@ add_executable( all_tests all_tests.cpp thread/thread_tests.cpp thread/parallel_tests.cpp bloom_test.cpp + reflection_tests.cpp serialization_test.cpp stacktrace_test.cpp time_test.cpp diff --git a/tests/reflection_tests.cpp b/tests/reflection_tests.cpp new file mode 100644 index 0000000..c4e3491 --- /dev/null +++ b/tests/reflection_tests.cpp @@ -0,0 +1,126 @@ +#include + +#include + +#include + +struct reflect_test_base { + int x = 1; + char y = 'a'; +}; +struct reflect_test_derived : reflect_test_base { + double z = 3.14; +}; +struct reflect_layer_1 { reflect_test_base b; int32_t n; }; +struct reflect_layer_2 { reflect_layer_1 l1; reflect_test_derived d; }; +struct reflect_layer_3 { reflect_layer_2 l2; int32_t i; }; + +FC_REFLECT( reflect_test_base, (x)(y) ); +FC_REFLECT_DERIVED( reflect_test_derived, (reflect_test_base), (z) ); +FC_REFLECT( reflect_layer_1, (b)(n) ); +FC_REFLECT( reflect_layer_2, (l1)(d) ); +FC_REFLECT( reflect_layer_3, (l2)(i) ); + +BOOST_AUTO_TEST_SUITE( fc_reflection ) + +BOOST_AUTO_TEST_CASE( reflection_static_tests ) +{ + // These are all compile-time tests, nothing actually happens here at runtime + using base_reflection = fc::reflector; + using derived_reflection = fc::reflector; + static_assert(fc::typelist::length() == 2, ""); + static_assert(fc::typelist::length() == 3, ""); + static_assert(fc::typelist::at::is_derived, ""); + static_assert(std::is_same::field_container, + reflect_test_base>::value, ""); + static_assert(fc::typelist::at::is_derived, ""); + static_assert(std::is_same::field_container, + reflect_test_base>::value, ""); + static_assert(fc::typelist::at::is_derived == false, ""); + static_assert(std::is_same, 0, 1>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, 0, 2>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, 0, 3>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, 1, 3>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, 2, 3>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, 1, 2>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, 1>, + fc::typelist::list>::value, ""); + static_assert(std::is_same, fc::typelist::list<>>::value, ""); + static_assert(std::is_same, + fc::typelist::list>>::value, ""); + static_assert(std::is_same, + fc::typelist::list, + std::integral_constant>>::value, ""); + static_assert(std::is_same, + fc::typelist::list, + std::integral_constant, + std::integral_constant>>::value, ""); + static_assert(std::is_same, fc::typelist::list<>>, + fc::typelist::list<>>::value, ""); + static_assert(std::is_same, fc::typelist::list>, + fc::typelist::list>>::value, ""); + static_assert(std::is_same, fc::typelist::list>, + fc::typelist::list, + fc::typelist::list>>::value, ""); + static_assert(std::is_same>, fc::typelist::list<>>::value, ""); + static_assert(std::is_same>, + fc::typelist::list, int>, + fc::typelist::list, bool>, + fc::typelist::list, char>, + fc::typelist::list, double>> + >::value, ""); +} + +BOOST_AUTO_TEST_CASE( typelist_dispatch_test ) +{ + using list = fc::typelist::list; + auto get_name = [](auto t) -> std::string { return fc::get_typename::name(); }; + BOOST_CHECK_EQUAL(fc::typelist::runtime::dispatch(list(), 0ul, get_name), "float"); + BOOST_CHECK_EQUAL(fc::typelist::runtime::dispatch(list(), 1ul, get_name), "bool"); + BOOST_CHECK_EQUAL(fc::typelist::runtime::dispatch(list(), 2ul, get_name), "char"); +} + +// Helper template to use fc::typelist::at without a comma, for macro friendliness +template struct index_from { template using at = fc::typelist::at; }; +BOOST_AUTO_TEST_CASE( reflection_get_test ) +{ try { + reflect_test_derived derived; + reflect_test_base& base = derived; + + using base_reflector = fc::reflector; + using derived_reflector = fc::reflector; + + BOOST_CHECK(index_from::at<0>::get(base) == 1); + BOOST_CHECK(index_from::at<1>::get(base) == 'a'); + + fc::typelist::at::get(base) = 5; + fc::typelist::at::get(base) = 'q'; + + BOOST_CHECK(index_from::at<0>::get(base) == 5); + BOOST_CHECK(index_from::at<1>::get(base) == 'q'); + + BOOST_CHECK(index_from::at<0>::get(derived) == 5); + BOOST_CHECK(index_from::at<1>::get(derived) == 'q'); + BOOST_CHECK(index_from::at<2>::get(derived) == 3.14); + + fc::typelist::at::get(derived) = 'X'; + + BOOST_CHECK(index_from::at<1>::get(base) == 'X'); + + reflect_layer_3 l3; + BOOST_CHECK(index_from::members>::at<0> + ::reflector::members>::at<0>::reflector::members>::at<0>::reflector::members>::at<1>::get(l3.l2.l1.b) + == 'a'); + BOOST_CHECK(index_from::members>::at<0>::reflector::members> + ::at<1>::reflector::members>::at<1>::get(l3.l2.d) == 'a'); + BOOST_CHECK(index_from::members>::at<0>::reflector::members> + ::at<1>::reflector::members>::at<2>::get(l3.l2.d) == 3.14); +} FC_CAPTURE_LOG_AND_RETHROW( (0) ) } + +BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/serialization_test.cpp b/tests/serialization_test.cpp index 1e0165c..ccfe8d2 100644 --- a/tests/serialization_test.cpp +++ b/tests/serialization_test.cpp @@ -35,7 +35,6 @@ namespace fc { namespace test { inline bool operator < ( const item& a, const item& b ) { return ( std::tie( a.level, a.w ) < std::tie( b.level, b.w ) ); } - } } // namespace fc::test FC_REFLECT( fc::test::item_wrapper, (v) ); From 94cb1858b8dec8b85d3045d04d8a34c8e0ea6b34 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Thu, 29 Aug 2019 13:49:49 -0500 Subject: [PATCH 050/117] Fix constexprs, unused code --- include/fc/reflect/reflect.hpp | 8 -------- include/fc/static_variant.hpp | 4 ++-- src/network/http/websocket.cpp | 4 ---- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/include/fc/reflect/reflect.hpp b/include/fc/reflect/reflect.hpp index 348477a..1801471 100644 --- a/include/fc/reflect/reflect.hpp +++ b/include/fc/reflect/reflect.hpp @@ -375,11 +375,3 @@ namespace fc { \ template<> struct get_typename { static const char* name() { return BOOST_PP_STRINGIZE(TYPE); } }; \ } -// vvv These are preserved to merge more smoothly vvv -#define FC_REFLECT_BASE_MEMBER_COUNT( r, OP, elem ) \ - OP fc::reflector::total_member_count - -#define FC_REFLECT_MEMBER_COUNT( r, OP, elem ) \ - OP 1 -// ^^^ These can be removed after updating graphene/protocol/types.hpp ^^^ - diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index d284963..757ebb3 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -118,7 +118,7 @@ public: template> struct tag { - static const int value = typelist::index_of(); + static constexpr int value = typelist::index_of(); }; struct type_lt { @@ -293,7 +293,7 @@ public: }); } - static int count() { return typelist::length(); } + static constexpr int count() { return typelist::length(); } void set_which( tag_type w ) { FC_ASSERT( w >= 0 ); FC_ASSERT( w < count() ); diff --git a/src/network/http/websocket.cpp b/src/network/http/websocket.cpp index 45332f5..5138fb0 100644 --- a/src/network/http/websocket.cpp +++ b/src/network/http/websocket.cpp @@ -300,10 +300,6 @@ namespace fc { namespace http { _server.close( item.first, 0, "server exit" ); if( _closed ) _closed->wait(); -#ifdef TRAVIS_BUILD -#warning Adding 100ms sleep to ~websocket_server_impl() to stabilize Travis tests - fc::usleep(fc::milliseconds(100)); -#endif } typedef std::map > con_map; From 292584ca59dded65edf7b679b3aaa498ed028849 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Fri, 30 Aug 2019 14:34:43 -0500 Subject: [PATCH 051/117] Add static_variant::operator== For real this time :) --- include/fc/static_variant.hpp | 8 ++++++++ tests/variant_test.cpp | 7 ++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 757ebb3..5c3695f 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -221,6 +221,14 @@ public: return *this; } + friend bool operator==( const static_variant& a, const static_variant& b ) { + if (a.which() != b.which()) + return false; + return typelist::runtime::dispatch(list(), a.which(), [&a, &b](auto t) { + return a.get() == b.get(); + }); + } + template> X& get() { if(_tag == typelist::index_of()) { diff --git a/tests/variant_test.cpp b/tests/variant_test.cpp index 474e5ae..96e62b5 100644 --- a/tests/variant_test.cpp +++ b/tests/variant_test.cpp @@ -182,10 +182,7 @@ BOOST_AUTO_TEST_CASE( nested_objects_test ) from_variant( v, sv1, nested_levels + 2 ); - auto sv_equal = [](const fc::static_variant& v1, const fc::static_variant& v2) { - return v1.get() == v2.get(); - }; - BOOST_CHECK( sv_equal(sv, sv1) ); + BOOST_CHECK( sv == sv1 ); // both log and dump should never throw BOOST_TEST_MESSAGE( "========== About to log static_variant. ==========" ); @@ -218,7 +215,7 @@ BOOST_AUTO_TEST_CASE( nested_objects_test ) from_variant( v, vec1, nested_levels + 3 ); - BOOST_CHECK( std::equal(vec.begin(), vec.end(), vec1.begin(), sv_equal) ); + BOOST_CHECK( vec == vec1 ); // both log and dump should never throw BOOST_TEST_MESSAGE( "========== About to log vector. ==========" ); From 77a82903fcf98f5b3b2d99932fc1db995bce937a Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 1 Sep 2019 15:17:59 +0200 Subject: [PATCH 052/117] Fix core #314 - Use windows default CAs for tls client connections --- src/network/http/websocket.cpp | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/network/http/websocket.cpp b/src/network/http/websocket.cpp index 5138fb0..77ff233 100644 --- a/src/network/http/websocket.cpp +++ b/src/network/http/websocket.cpp @@ -20,6 +20,10 @@ #include #include +#if WIN32 +#include +#endif + #ifdef DEFAULT_LOGGER # undef DEFAULT_LOGGER #endif @@ -28,7 +32,33 @@ namespace fc { namespace http { namespace detail { +#if WIN32 + // taken from https://stackoverflow.com/questions/39772878/reliable-way-to-get-root-ca-certificates-on-windows/40710806 + static void add_windows_root_certs(boost::asio::ssl::context &ctx) + { + HCERTSTORE hStore = CertOpenSystemStore( 0, "ROOT" ); + if( hStore == NULL ) + return; + X509_STORE *store = X509_STORE_new(); + PCCERT_CONTEXT pContext = NULL; + while( (pContext = CertEnumCertificatesInStore( hStore, pContext )) != NULL ) + { + X509 *x509 = d2i_X509( NULL, (const unsigned char **)&pContext->pbCertEncoded, + pContext->cbCertEncoded); + if( x509 != NULL ) + { + X509_STORE_add_cert( store, x509 ); + X509_free( x509 ); + } + } + + CertFreeCertificateContext( pContext ); + CertCloseStore( hStore, 0 ); + + SSL_CTX_set_cert_store( ctx.native_handle(), store ); + } +#endif struct asio_with_stub_log : public websocketpp::config::asio { typedef asio_with_stub_log type; @@ -550,7 +580,13 @@ namespace fc { namespace http { return; ctx->set_verify_mode( boost::asio::ssl::verify_peer ); if( ca_filename == "_default" ) + { +#if WIN32 + add_windows_root_certs( *ctx ); +#else ctx->set_default_verify_paths(); +#endif + } else ctx->load_verify_file( ca_filename ); ctx->set_verify_depth(10); From 1699b0ac36bf8fa1ae98f416b0158946fa28e1ee Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Sun, 1 Sep 2019 12:53:01 -0500 Subject: [PATCH 053/117] Fix build on updated G++ --- include/fc/static_variant.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 5c3695f..88069d0 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -225,7 +225,8 @@ public: if (a.which() != b.which()) return false; return typelist::runtime::dispatch(list(), a.which(), [&a, &b](auto t) { - return a.get() == b.get(); + using Value = typename decltype(t)::type; + return a.template get() == b.template get(); }); } From dadfe189d41e70957c658d2eeda15286118bf61f Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Mon, 2 Sep 2019 10:02:51 -0500 Subject: [PATCH 054/117] Add FC_REFLECT_DERIVED_NO_TYPENAME This is moved to FC from graphene/protocol/types.hpp --- include/fc/reflect/reflect.hpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/fc/reflect/reflect.hpp b/include/fc/reflect/reflect.hpp index 1801471..bf68d17 100644 --- a/include/fc/reflect/reflect.hpp +++ b/include/fc/reflect/reflect.hpp @@ -325,6 +325,7 @@ template<> struct reflector {\ namespace member_names { \ BOOST_PP_SEQ_FOR_EACH_I( FC_REFLECT_MEMBER_NAME, TYPE, MEMBERS ) \ } } + #define FC_REFLECT_DERIVED_TEMPLATE( TEMPLATE_ARGS, TYPE, INHERITS, MEMBERS ) \ namespace fc { \ template struct get_typename { \ @@ -352,6 +353,28 @@ namespace member_names { \ BOOST_PP_SEQ_FOR_EACH_I( FC_REFLECT_TEMPLATE_MEMBER_NAME, (TEMPLATE_ARGS)(TYPE), MEMBERS ) \ } } +#define FC_REFLECT_DERIVED_NO_TYPENAME( TYPE, INHERITS, MEMBERS ) \ +namespace fc { \ +template<> struct reflector {\ + typedef TYPE type; \ + typedef std::true_type is_defined; \ + using native_members = \ + typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH_I( FC_CONCAT_MEMBER_REFLECTION, TYPE, MEMBERS ) ::finalize; \ + using inherited_members = \ + typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH( FC_CONCAT_BASE_MEMBER_REFLECTIONS, TYPE, INHERITS ) ::finalize; \ + using members = typename typelist::concat::type; \ + using base_classes = typename typelist::builder<>::type \ + BOOST_PP_SEQ_FOR_EACH( FC_CONCAT_TYPE, x, INHERITS ) ::finalize; \ + enum member_count_enum { \ + local_member_count = typelist::length(), \ + total_member_count = typelist::length() \ + }; \ + FC_REFLECT_DERIVED_IMPL_INLINE( TYPE, INHERITS, MEMBERS ) \ +}; \ +} // fc + /** * @def FC_REFLECT(TYPE,MEMBERS) * @brief Specializes fc::reflector for TYPE From 2e50624b2827e147b93307e41cb242ac5e395f54 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 12 Sep 2019 16:01:09 +0200 Subject: [PATCH 055/117] Check + rotate logs while logging not by scheduled task --- src/log/file_appender.cpp | 52 ++++++++++++--------------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/src/log/file_appender.cpp b/src/log/file_appender.cpp index c2efebf..4f5ab14 100644 --- a/src/log/file_appender.cpp +++ b/src/log/file_appender.cpp @@ -21,15 +21,7 @@ namespace fc { boost::mutex slock; private: - future _rotation_task; - time_point_sec _current_file_start_time; - - time_point_sec get_file_start_time( const time_point_sec& timestamp, const microseconds& interval ) - { - int64_t interval_seconds = interval.to_seconds(); - int64_t file_number = timestamp.sec_since_epoch() / interval_seconds; - return time_point_sec( (uint32_t)(file_number * interval_seconds) ); - } + boost::atomic _current_file_number; public: impl( const config& c) : cfg( c ) @@ -54,22 +46,22 @@ namespace fc { } } - ~impl() - { - try - { - _rotation_task.cancel_and_wait("file_appender is destructing"); - } - catch( ... ) - { - } - } - void rotate_files( bool initializing = false ) { - FC_ASSERT( cfg.rotate ); + if( !cfg.rotate ) return; + + int64_t interval_seconds = cfg.rotation_interval.to_seconds(); fc::time_point now = time_point::now(); - fc::time_point_sec start_time = get_file_start_time( now, cfg.rotation_interval ); + int64_t new_file_number = now.sec_since_epoch() / interval_seconds; + if( initializing ) + _current_file_number.store( new_file_number ); + else + { + int64_t prev_file_number = _current_file_number.load(); + if( prev_file_number >= new_file_number ) return; + if( !_current_file_number.compare_exchange_weak( prev_file_number, new_file_number ) ) return; + } + fc::time_point_sec start_time = time_point_sec( (uint32_t)(new_file_number * interval_seconds) ); string timestamp_string = start_time.to_non_delimited_iso_string(); fc::path link_filename = cfg.filename; fc::path log_filename = link_filename.parent_path() / (link_filename.filename().string() + "." + timestamp_string); @@ -79,14 +71,6 @@ namespace fc { if( !initializing ) { - if( start_time <= _current_file_start_time ) - { - _rotation_task = schedule( [this]() { rotate_files(); }, - _current_file_start_time + cfg.rotation_interval.to_seconds(), - "rotate_files(2)" ); - return; - } - out.flush(); out.close(); } @@ -127,11 +111,6 @@ namespace fc { { } } - - _current_file_start_time = start_time; - _rotation_task = schedule( [this]() { rotate_files(); }, - _current_file_start_time + cfg.rotation_interval.to_seconds(), - "rotate_files(3)" ); } }; @@ -151,8 +130,9 @@ namespace fc { // MS THREAD METHOD MESSAGE \t\t\t File:Line void file_appender::log( const log_message& m ) { + my->rotate_files(); + std::stringstream line; - //line << (m.get_context().get_timestamp().time_since_epoch().count() % (1000ll*1000ll*60ll*60))/1000 <<"ms "; line << string(m.get_context().get_timestamp()) << " "; line << std::setw( 21 ) << (m.get_context().get_thread_name().substr(0,9) + string(":") + m.get_context().get_task_name()).c_str() << " "; From 5cd9f7d6311f2e3ea9cf37eb4bf30ec8509e798d Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 15 Sep 2019 14:09:44 +0200 Subject: [PATCH 056/117] Move log file deletion into separate task --- src/log/file_appender.cpp | 42 +++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/log/file_appender.cpp b/src/log/file_appender.cpp index 4f5ab14..3d8c26d 100644 --- a/src/log/file_appender.cpp +++ b/src/log/file_appender.cpp @@ -21,6 +21,7 @@ namespace fc { boost::mutex slock; private: + future _deletion_task; boost::atomic _current_file_number; public: @@ -36,6 +37,7 @@ namespace fc { FC_ASSERT( cfg.rotation_limit >= cfg.rotation_interval ); rotate_files( true ); + delete_files(); } else { out.open( cfg.filename, std::ios_base::out | std::ios_base::app); } @@ -46,6 +48,17 @@ namespace fc { } } + ~impl() + { + try + { + _deletion_task.cancel_and_wait("file_appender is destructing"); + } + catch( ... ) + { + } + } + void rotate_files( bool initializing = false ) { if( !cfg.rotate ) return; @@ -78,29 +91,35 @@ namespace fc { out.open( log_filename, std::ios_base::out | std::ios_base::app ); create_hard_link(log_filename, link_filename); } + } + void delete_files() + { /* Delete old log files */ - fc::time_point limit_time = now - cfg.rotation_limit; + auto current_file = _current_file_number.load(); + int64_t interval_seconds = cfg.rotation_interval.to_seconds(); + fc::time_point_sec start_time = time_point_sec( (uint32_t)(current_file * interval_seconds) ); + fc::time_point limit_time = time_point::now() - cfg.rotation_limit; + fc::path link_filename = cfg.filename; string link_filename_string = link_filename.filename().string(); directory_iterator itr(link_filename.parent_path()); + string timestamp_string = start_time.to_non_delimited_iso_string(); for( ; itr != directory_iterator(); itr++ ) { try { string current_filename = itr->filename().string(); - if (current_filename.compare(0, link_filename_string.size(), link_filename_string) != 0 || - current_filename.size() <= link_filename_string.size() + 1) - continue; + if( current_filename.compare(0, link_filename_string.size(), link_filename_string) != 0 + || current_filename.size() <= link_filename_string.size() + 1 ) + continue; string current_timestamp_str = current_filename.substr(link_filename_string.size() + 1, timestamp_string.size()); fc::time_point_sec current_timestamp = fc::time_point_sec::from_iso_string( current_timestamp_str ); - if( current_timestamp < start_time ) + if( current_timestamp < start_time + && ( current_timestamp < limit_time || file_size( current_filename ) <= 0 ) ) { - if( current_timestamp < limit_time || file_size( current_filename ) <= 0 ) - { - remove_all( *itr ); - continue; - } + remove_all( *itr ); + continue; } } catch (const fc::canceled_exception&) @@ -111,6 +130,9 @@ namespace fc { { } } + _deletion_task = schedule( [this]() { delete_files(); }, + start_time + cfg.rotation_interval.to_seconds(), + "delete_files(3)" ); } }; From f6fd6a7cf73882788549f39927de6d091228876f Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 15 Sep 2019 14:18:57 +0200 Subject: [PATCH 057/117] Avoid re-computing seconds --- src/log/file_appender.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/log/file_appender.cpp b/src/log/file_appender.cpp index 3d8c26d..633f097 100644 --- a/src/log/file_appender.cpp +++ b/src/log/file_appender.cpp @@ -23,9 +23,10 @@ namespace fc { private: future _deletion_task; boost::atomic _current_file_number; + const int64_t _interval_seconds; public: - impl( const config& c) : cfg( c ) + impl( const config& c) : cfg( c ), _interval_seconds( cfg.rotation_interval.to_seconds() ) { try { @@ -63,9 +64,8 @@ namespace fc { { if( !cfg.rotate ) return; - int64_t interval_seconds = cfg.rotation_interval.to_seconds(); fc::time_point now = time_point::now(); - int64_t new_file_number = now.sec_since_epoch() / interval_seconds; + int64_t new_file_number = now.sec_since_epoch() / _interval_seconds; if( initializing ) _current_file_number.store( new_file_number ); else @@ -74,7 +74,7 @@ namespace fc { if( prev_file_number >= new_file_number ) return; if( !_current_file_number.compare_exchange_weak( prev_file_number, new_file_number ) ) return; } - fc::time_point_sec start_time = time_point_sec( (uint32_t)(new_file_number * interval_seconds) ); + fc::time_point_sec start_time = time_point_sec( (uint32_t)(new_file_number * _interval_seconds) ); string timestamp_string = start_time.to_non_delimited_iso_string(); fc::path link_filename = cfg.filename; fc::path log_filename = link_filename.parent_path() / (link_filename.filename().string() + "." + timestamp_string); @@ -97,8 +97,7 @@ namespace fc { { /* Delete old log files */ auto current_file = _current_file_number.load(); - int64_t interval_seconds = cfg.rotation_interval.to_seconds(); - fc::time_point_sec start_time = time_point_sec( (uint32_t)(current_file * interval_seconds) ); + fc::time_point_sec start_time = time_point_sec( (uint32_t)(current_file * _interval_seconds) ); fc::time_point limit_time = time_point::now() - cfg.rotation_limit; fc::path link_filename = cfg.filename; string link_filename_string = link_filename.filename().string(); @@ -130,8 +129,7 @@ namespace fc { { } } - _deletion_task = schedule( [this]() { delete_files(); }, - start_time + cfg.rotation_interval.to_seconds(), + _deletion_task = schedule( [this]() { delete_files(); }, start_time + _interval_seconds, "delete_files(3)" ); } }; From f4866b777ef20dd13216a5d60480e070ebba9dc2 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 16 Sep 2019 11:59:58 +0200 Subject: [PATCH 058/117] Move helper classes into fc::detail --- src/crypto/base58.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/crypto/base58.cpp b/src/crypto/base58.cpp index 929f387..cbe67a5 100644 --- a/src/crypto/base58.cpp +++ b/src/crypto/base58.cpp @@ -28,6 +28,8 @@ #include #include +namespace fc { namespace detail { + /** Errors thrown by the bignum class */ class bignum_error : public std::runtime_error { @@ -605,11 +607,10 @@ inline bool DecodeBase58(const std::string& str, std::vector& vch return DecodeBase58(str.c_str(), vchRet); } - -namespace fc { +} // detail std::string to_base58( const char* d, size_t s ) { - return EncodeBase58( (const unsigned char*)d, (const unsigned char*)d+s ).c_str(); + return fc::detail::EncodeBase58( (const unsigned char*)d, (const unsigned char*)d+s ).c_str(); } std::string to_base58( const std::vector& d ) @@ -620,8 +621,9 @@ std::string to_base58( const std::vector& d ) } std::vector from_base58( const std::string& base58_str ) { std::vector out; - if( !DecodeBase58( base58_str.c_str(), out ) ) { - FC_THROW_EXCEPTION( parse_error_exception, "Unable to decode base58 string ${base58_str}", ("base58_str",base58_str) ); + if( !fc::detail::DecodeBase58( base58_str.c_str(), out ) ) { + FC_THROW_EXCEPTION( parse_error_exception, "Unable to decode base58 string ${base58_str}", + ("base58_str",base58_str) ); } return std::vector((const char*)out.data(), ((const char*)out.data())+out.size() ); } @@ -629,10 +631,10 @@ std::vector from_base58( const std::string& base58_str ) { * @return the number of bytes decoded */ size_t from_base58( const std::string& base58_str, char* out_data, size_t out_data_len ) { - //slog( "%s", base58_str.c_str() ); std::vector out; - if( !DecodeBase58( base58_str.c_str(), out ) ) { - FC_THROW_EXCEPTION( parse_error_exception, "Unable to decode base58 string ${base58_str}", ("base58_str",base58_str) ); + if( !fc::detail::DecodeBase58( base58_str.c_str(), out ) ) { + FC_THROW_EXCEPTION( parse_error_exception, "Unable to decode base58 string ${base58_str}", + ("base58_str",base58_str) ); } FC_ASSERT( out.size() <= out_data_len ); if (!out.empty()) { @@ -640,6 +642,7 @@ size_t from_base58( const std::string& base58_str, char* out_data, size_t out_da } return out.size(); } -} + +} // fc #endif From 8c9f7151e1cefb02abb478dd759983a50455b16f Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 16 Sep 2019 12:03:59 +0200 Subject: [PATCH 059/117] Moved stuff into fc::test namespace --- tests/api_tests.cpp | 36 +++++++-------- tests/io/tcp_test.cpp | 24 +++++----- tests/thread/parallel_tests.cpp | 79 ++++++++++++++++++--------------- 3 files changed, 74 insertions(+), 65 deletions(-) diff --git a/tests/api_tests.cpp b/tests/api_tests.cpp index ef42b8d..50421a0 100644 --- a/tests/api_tests.cpp +++ b/tests/api_tests.cpp @@ -6,6 +6,8 @@ #include #include +namespace fc { namespace test { + class calculator { public: @@ -15,9 +17,6 @@ class calculator void on_result2( const std::function& cb, int test ); }; -FC_API( calculator, (add)(sub)(on_result)(on_result2) ) - - class login_api { public: @@ -29,8 +28,6 @@ class login_api fc::optional> calc; std::set test( const std::string&, const std::string& ) { return std::set(); } }; -FC_API( login_api, (get_calc)(test) ); - class optionals_api { @@ -44,9 +41,6 @@ public: return fc::json::to_string(fc::variants{{first,2}, {second, 2}, {third, 2}}); } }; -FC_API( optionals_api, (foo)(bar) ); - -using namespace fc; class some_calculator { @@ -58,6 +52,12 @@ class some_calculator std::function _cb; }; +}} // fc::test + +FC_API( fc::test::calculator, (add)(sub)(on_result)(on_result2) ) +FC_API( fc::test::login_api, (get_calc)(test) ); +FC_API( fc::test::optionals_api, (foo)(bar) ); + using namespace fc::http; using namespace fc::rpc; @@ -67,14 +67,14 @@ BOOST_AUTO_TEST_SUITE(api_tests) BOOST_AUTO_TEST_CASE(login_test) { try { - fc::api calc_api( std::make_shared() ); + fc::api calc_api( std::make_shared() ); auto server = std::make_shared(); server->on_connection([&]( const websocket_connection_ptr& c ){ auto wsc = std::make_shared(c, MAX_DEPTH); - auto login = std::make_shared(); + auto login = std::make_shared(); login->calc = calc_api; - wsc->register_api(fc::api(login)); + wsc->register_api(fc::api(login)); c->set_session_data( wsc ); }); @@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(login_test) { auto con = client->connect( "ws://localhost:" + std::to_string(listen_port) ); server->stop_listening(); auto apic = std::make_shared(con, MAX_DEPTH); - auto remote_login_api = apic->get_remote_api(); + auto remote_login_api = apic->get_remote_api(); auto remote_calc = remote_login_api->get_calc(); bool remote_triggered = false; remote_calc->on_result( [&remote_triggered]( uint32_t r ) { remote_triggered = true; } ); @@ -103,8 +103,8 @@ BOOST_AUTO_TEST_CASE(login_test) { BOOST_AUTO_TEST_CASE(optionals_test) { try { - auto optionals = std::make_shared(); - fc::api oapi(optionals); + auto optionals = std::make_shared(); + fc::api oapi(optionals); BOOST_CHECK_EQUAL(oapi->foo("a"), "[\"a\",null,null]"); BOOST_CHECK_EQUAL(oapi->foo("a", "b"), "[\"a\",\"b\",null]"); BOOST_CHECK_EQUAL(oapi->foo("a", "b", "c"), "[\"a\",\"b\",\"c\"]"); @@ -119,7 +119,7 @@ BOOST_AUTO_TEST_CASE(optionals_test) { auto server = std::make_shared(); server->on_connection([&]( const websocket_connection_ptr& c ){ auto wsc = std::make_shared(c, MAX_DEPTH); - wsc->register_api(fc::api(optionals)); + wsc->register_api(fc::api(optionals)); c->set_session_data( wsc ); }); @@ -130,7 +130,7 @@ BOOST_AUTO_TEST_CASE(optionals_test) { auto client = std::make_shared(); auto con = client->connect( "ws://localhost:" + std::to_string(listen_port) ); auto apic = std::make_shared(con, MAX_DEPTH); - auto remote_optionals = apic->get_remote_api(); + auto remote_optionals = apic->get_remote_api(); BOOST_CHECK_EQUAL(remote_optionals->foo("a"), "[\"a\",null,null]"); BOOST_CHECK_EQUAL(remote_optionals->foo("a", "b"), "[\"a\",\"b\",null]"); @@ -145,8 +145,8 @@ BOOST_AUTO_TEST_CASE(optionals_test) { auto client2 = std::make_shared(); auto con2 = client2->connect( "ws://localhost:" + std::to_string(listen_port) ); - string response; - con2->on_message_handler([&](const std::string& s){ + std::string response; + con2->on_message_handler([&response](const std::string& s){ response = s; }); diff --git a/tests/io/tcp_test.cpp b/tests/io/tcp_test.cpp index 0a43975..9d25bfd 100644 --- a/tests/io/tcp_test.cpp +++ b/tests/io/tcp_test.cpp @@ -3,6 +3,16 @@ #include #include +namespace fc { namespace test { + +class my_io_class : public fc::asio::default_io_service_scope +{ +public: + static void reset_num_threads() { fc::asio::default_io_service_scope::num_io_threads = 0; } +}; + +}} // fc::test + BOOST_AUTO_TEST_SUITE(tcp_tests) /*** @@ -15,23 +25,17 @@ BOOST_AUTO_TEST_CASE(tcpconstructor_test) fc::tcp_socket socket; } -class my_io_class : public fc::asio::default_io_service_scope -{ -public: - static void reset_num_threads() { fc::asio::default_io_service_scope::num_io_threads = 0; } -}; - /*** * Test the control of number of threads from outside */ BOOST_AUTO_TEST_CASE( number_threads_test ) { // to erase leftovers from previous tests - my_io_class::reset_num_threads(); + fc::test::my_io_class::reset_num_threads(); fc::asio::default_io_service_scope::set_num_threads(12); - my_io_class my_class; + fc::test::my_io_class my_class; BOOST_CHECK_EQUAL( 12, my_class.get_num_threads() ); } @@ -42,9 +46,9 @@ BOOST_AUTO_TEST_CASE( number_threads_test ) BOOST_AUTO_TEST_CASE( default_number_threads_test ) { // to erase leftovers from previous tests - my_io_class::reset_num_threads(); + fc::test::my_io_class::reset_num_threads(); - my_io_class my_class; + fc::test::my_io_class my_class; fc::asio::default_io_service(); diff --git a/tests/thread/parallel_tests.cpp b/tests/thread/parallel_tests.cpp index 14dcb4d..730027d 100644 --- a/tests/thread/parallel_tests.cpp +++ b/tests/thread/parallel_tests.cpp @@ -35,6 +35,8 @@ #include +namespace fc { namespace test { + struct thread_config { thread_config() { for( int i = 0; i < boost::unit_test::framework::master_test_suite().argc - 1; ++i ) @@ -42,13 +44,51 @@ struct thread_config { { uint16_t threads = atoi(boost::unit_test::framework::master_test_suite().argv[++i]); std::cout << "Using " << threads << " pool threads\n"; - fc::asio::default_io_service_scope::set_num_threads(threads); + asio::default_io_service_scope::set_num_threads(threads); } } }; -BOOST_GLOBAL_FIXTURE( thread_config ); +const std::string TEXT = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"$%&/()=?,.-#+´{[]}`*'_:;<>|"; +template +class hash_test { + public: + std::string _hashname = get_typename::name(); + + void run_single_threaded() { + const std::string first = Hash::hash(TEXT).str(); + time_point start = time_point::now(); + for( int i = 0; i < 1000; i++ ) + BOOST_CHECK_EQUAL( first, Hash::hash(TEXT).str() ); + time_point end = time_point::now(); + ilog( "${c} single-threaded ${h}'s in ${t}µs", ("c",1000)("h",_hashname)("t",end-start) ); + } + + void run_multi_threaded() { + const std::string first = Hash::hash(TEXT).str(); + std::vector> results; + results.reserve( 10000 ); + time_point start = time_point::now(); + for( int i = 0; i < 10000; i++ ) + results.push_back( do_parallel( [] () { return Hash::hash(TEXT).str(); } ) ); + for( auto& result: results ) + BOOST_CHECK_EQUAL( first, result.wait() ); + time_point end = time_point::now(); + ilog( "${c} multi-threaded ${h}'s in ${t}µs", ("c",10000)("h",_hashname)("t",end-start) ); + } + + void run() { + run_single_threaded(); + run_multi_threaded(); + } +}; + +}} // fc::test + +using namespace fc::test; + +BOOST_GLOBAL_FIXTURE( thread_config ); BOOST_AUTO_TEST_SUITE(parallel_tests) @@ -96,41 +136,6 @@ BOOST_AUTO_TEST_CASE( do_something_parallel ) } } -const std::string TEXT = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"$%&/()=?,.-#+´{[]}`*'_:;<>|"; - -template -class hash_test { - public: - std::string _hashname = fc::get_typename::name(); - - void run_single_threaded() { - const std::string first = Hash::hash(TEXT).str(); - fc::time_point start = fc::time_point::now(); - for( int i = 0; i < 1000; i++ ) - BOOST_CHECK_EQUAL( first, Hash::hash(TEXT).str() ); - fc::time_point end = fc::time_point::now(); - ilog( "${c} single-threaded ${h}'s in ${t}µs", ("c",1000)("h",_hashname)("t",end-start) ); - } - - void run_multi_threaded() { - const std::string first = Hash::hash(TEXT).str(); - std::vector> results; - results.reserve( 10000 ); - fc::time_point start = fc::time_point::now(); - for( int i = 0; i < 10000; i++ ) - results.push_back( fc::do_parallel( [] () { return Hash::hash(TEXT).str(); } ) ); - for( auto& result: results ) - BOOST_CHECK_EQUAL( first, result.wait() ); - fc::time_point end = fc::time_point::now(); - ilog( "${c} multi-threaded ${h}'s in ${t}µs", ("c",10000)("h",_hashname)("t",end-start) ); - } - - void run() { - run_single_threaded(); - run_multi_threaded(); - } -}; - BOOST_AUTO_TEST_CASE( hash_parallel ) { hash_test().run(); From 7b98c69c3bb24a5ad75689b519f96e7e0334755f Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 16 Sep 2019 14:38:45 +0200 Subject: [PATCH 060/117] Delete copy constructor + copy assignment in openssl type wrappers --- include/fc/crypto/openssl.hpp | 27 ++++++++++++++------------- src/crypto/dh.cpp | 9 +++------ src/crypto/openssl.cpp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/include/fc/crypto/openssl.hpp b/include/fc/crypto/openssl.hpp index af883d6..70b7e7b 100644 --- a/include/fc/crypto/openssl.hpp +++ b/include/fc/crypto/openssl.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include #include #include @@ -21,6 +22,8 @@ namespace fc struct ssl_wrapper { ssl_wrapper(ssl_type* obj):obj(obj) {} + ssl_wrapper( ssl_wrapper& copy ) = delete; + ssl_wrapper& operator=( ssl_wrapper& copy ) = delete; operator ssl_type*() { return obj; } operator const ssl_type*() const { return obj; } @@ -30,23 +33,21 @@ namespace fc ssl_type* obj; }; - #define SSL_TYPE(name, ssl_type, free_func) \ + #define SSL_TYPE_DECL(name, ssl_type) \ struct name : public ssl_wrapper \ { \ - name(ssl_type* obj=nullptr) \ - : ssl_wrapper(obj) {} \ - ~name() \ - { \ - if( obj != nullptr ) \ - free_func(obj); \ - } \ + name( ssl_type* obj=nullptr ); \ + name( name&& move ); \ + ~name(); \ + name& operator=( name&& move ); \ }; - SSL_TYPE(ec_group, EC_GROUP, EC_GROUP_free) - SSL_TYPE(ec_point, EC_POINT, EC_POINT_free) - SSL_TYPE(ecdsa_sig, ECDSA_SIG, ECDSA_SIG_free) - SSL_TYPE(bn_ctx, BN_CTX, BN_CTX_free) - SSL_TYPE(evp_cipher_ctx, EVP_CIPHER_CTX, EVP_CIPHER_CTX_free ) + SSL_TYPE_DECL(ec_group, EC_GROUP) + SSL_TYPE_DECL(ec_point, EC_POINT) + SSL_TYPE_DECL(ecdsa_sig, ECDSA_SIG) + SSL_TYPE_DECL(bn_ctx, BN_CTX) + SSL_TYPE_DECL(evp_cipher_ctx, EVP_CIPHER_CTX) + SSL_TYPE_DECL(ssl_dh, DH) /** allocates a bignum by default.. */ struct ssl_bignum : public ssl_wrapper diff --git a/src/crypto/dh.cpp b/src/crypto/dh.cpp index c95c774..fbb3077 100644 --- a/src/crypto/dh.cpp +++ b/src/crypto/dh.cpp @@ -1,12 +1,9 @@ #include -#include #if OPENSSL_VERSION_NUMBER >= 0x10100000L #endif namespace fc { - SSL_TYPE(ssl_dh, DH, DH_free) - static bool validate( const ssl_dh& dh, bool& valid ) { int check; DH_check(dh,&check); @@ -36,7 +33,7 @@ namespace fc { { if( !p.size() ) return valid = false; - ssl_dh dh = DH_new(); + ssl_dh dh(DH_new()); #if OPENSSL_VERSION_NUMBER >= 0x10100000L const auto bn_p = BN_bin2bn( (unsigned char*)&p.front(), p.size(), NULL ); const auto bn_g = BN_bin2bn( (unsigned char*)&g, 1, NULL ); @@ -52,7 +49,7 @@ namespace fc { { if( !p.size() ) return valid = false; - ssl_dh dh = DH_new(); + ssl_dh dh(DH_new()); #if OPENSSL_VERSION_NUMBER >= 0x10100000L const auto bn_p = BN_bin2bn( (unsigned char*)&p.front(), p.size(), NULL ); const auto bn_g = BN_bin2bn( (unsigned char*)&g, 1, NULL ); @@ -90,7 +87,7 @@ namespace fc { return true; } bool diffie_hellman::compute_shared_key( const char* buf, uint32_t s ) { - ssl_dh dh = DH_new(); + ssl_dh dh(DH_new()); #if OPENSSL_VERSION_NUMBER >= 0x10100000L auto bn_p = BN_bin2bn( (unsigned char*)&p.front(), p.size(), NULL ); auto bn_pub_key = BN_bin2bn( (unsigned char*)&pub_key.front(), pub_key.size(), NULL ); diff --git a/src/crypto/openssl.cpp b/src/crypto/openssl.cpp index e4c0e88..92b35d9 100644 --- a/src/crypto/openssl.cpp +++ b/src/crypto/openssl.cpp @@ -63,4 +63,34 @@ namespace fc static openssl_scope ossl; return 0; } + + #define SSL_TYPE_IMPL(name, ssl_type, free_func) \ + name::name( ssl_type* obj ) : ssl_wrapper(obj) {} \ + name::name( name&& move ) : ssl_wrapper( move.obj ) \ + { \ + move.obj = nullptr; \ + } \ + name::~name() \ + { \ + if( obj != nullptr ) \ + free_func(obj); \ + } \ + name& name::operator=( name&& move ) \ + { \ + if( this != &move ) \ + { \ + if( obj != nullptr ) \ + free_func(obj); \ + obj = move.obj; \ + move.obj = nullptr; \ + } \ + return *this; \ + } + + SSL_TYPE_IMPL(ec_group, EC_GROUP, EC_GROUP_free) + SSL_TYPE_IMPL(ec_point, EC_POINT, EC_POINT_free) + SSL_TYPE_IMPL(ecdsa_sig, ECDSA_SIG, ECDSA_SIG_free) + SSL_TYPE_IMPL(bn_ctx, BN_CTX, BN_CTX_free) + SSL_TYPE_IMPL(evp_cipher_ctx, EVP_CIPHER_CTX, EVP_CIPHER_CTX_free ) + SSL_TYPE_IMPL(ssl_dh, DH, DH_free) } From 2b3611fa9559950fcf8c33a18e7a0849fdb0793e Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 16 Sep 2019 14:44:55 +0200 Subject: [PATCH 061/117] Delete copy constructor + copy assignment in tcp_socket --- include/fc/network/tcp_socket.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/fc/network/tcp_socket.hpp b/include/fc/network/tcp_socket.hpp index 320d45c..6e69f80 100644 --- a/include/fc/network/tcp_socket.hpp +++ b/include/fc/network/tcp_socket.hpp @@ -12,7 +12,9 @@ namespace fc { { public: tcp_socket(); + tcp_socket( tcp_socket& copy ) = delete; ~tcp_socket(); + tcp_socket& operator=( tcp_socket& copy ) = delete; void connect_to( const fc::ip::endpoint& remote_endpoint ); void bind( const fc::ip::endpoint& local_endpoint ); From e168b6400b461f2953aa062b9eb6fe2bb4495125 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 17 Sep 2019 13:46:02 +0200 Subject: [PATCH 062/117] Avoid time calculation when not rotating --- src/log/file_appender.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/log/file_appender.cpp b/src/log/file_appender.cpp index 633f097..aec6bec 100644 --- a/src/log/file_appender.cpp +++ b/src/log/file_appender.cpp @@ -24,6 +24,7 @@ namespace fc { future _deletion_task; boost::atomic _current_file_number; const int64_t _interval_seconds; + time_point _next_file_time; public: impl( const config& c) : cfg( c ), _interval_seconds( cfg.rotation_interval.to_seconds() ) @@ -65,6 +66,8 @@ namespace fc { if( !cfg.rotate ) return; fc::time_point now = time_point::now(); + if( now < _next_file_time ) return; + int64_t new_file_number = now.sec_since_epoch() / _interval_seconds; if( initializing ) _current_file_number.store( new_file_number ); @@ -75,6 +78,7 @@ namespace fc { if( !_current_file_number.compare_exchange_weak( prev_file_number, new_file_number ) ) return; } fc::time_point_sec start_time = time_point_sec( (uint32_t)(new_file_number * _interval_seconds) ); + _next_file_time = start_time + _interval_seconds; string timestamp_string = start_time.to_non_delimited_iso_string(); fc::path link_filename = cfg.filename; fc::path log_filename = link_filename.parent_path() / (link_filename.filename().string() + "." + timestamp_string); From d729816b06651ccde50940c92db729cf9fb4c61e Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 18 Sep 2019 12:51:17 +0200 Subject: [PATCH 063/117] Changes to avoid conflict in following cherry-pick --- src/exception.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/exception.cpp b/src/exception.cpp index d3fadbb..cc93009 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -182,11 +182,11 @@ namespace fc */ string exception::to_detail_string( log_level ll )const { - fc::stringstream ss; + std::stringstream ss; ss << variant(my->_code).as_string() <<" " << my->_name << ": " <_what<<"\n"; for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ) { - ss << itr->get_message() <<"\n"; + ss << itr->get_message() <<"\n"; //fc::format_string( itr->get_format(), itr->get_data() ) <<"\n"; try { ss << " " << json::to_string( itr->get_data() )<<"\n"; @@ -207,12 +207,12 @@ namespace fc */ string exception::to_string( log_level ll )const { - fc::stringstream ss; - ss << what() << ":"; + std::stringstream ss; + ss << what() << " (" << variant(my->_code).as_string() <<")\n"; for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ++itr ) { - if( itr->get_format().size() ) - ss << " " << fc::format_string( itr->get_format(), itr->get_data() ); + ss << fc::format_string( itr->get_format(), itr->get_data() ) << "\n"; + // ss << " " << itr->get_context().to_string() <<"\n"; } return ss.str(); } From 2eb047a6f4d61704478376a88f12205fe12dde69 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Tue, 22 May 2018 10:59:42 -0400 Subject: [PATCH 064/117] Add exception handling to to_string and to_detail_string --- src/exception.cpp | 48 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/exception.cpp b/src/exception.cpp index cc93009..bc72783 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -183,9 +183,17 @@ namespace fc string exception::to_detail_string( log_level ll )const { std::stringstream ss; - ss << variant(my->_code).as_string() <<" " << my->_name << ": " <_what<<"\n"; - for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ) - { + try { + try { + ss << variant( my->_code ).as_string(); + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_detail_string."; + } + ss << " " << my->_name << ": " << my->_what << "\n"; + for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ) { + try { ss << itr->get_message() <<"\n"; //fc::format_string( itr->get_format(), itr->get_data() ) <<"\n"; try { @@ -197,8 +205,18 @@ namespace fc } ss << " " << itr->get_context().to_string(); ++itr; + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_detail_string."; + } if( itr != my->_elog.end() ) ss<<"\n"; } + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_detail_string.\n"; + } return ss.str(); } @@ -208,13 +226,31 @@ namespace fc string exception::to_string( log_level ll )const { std::stringstream ss; - ss << what() << " (" << variant(my->_code).as_string() <<")\n"; - for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ++itr ) - { + try { + ss << my->_what; + try { + ss << " (" << variant( my->_code ).as_string() << ")\n"; + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_string.\n"; + } + for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ++itr ) { + try { ss << fc::format_string( itr->get_format(), itr->get_data() ) << "\n"; // ss << " " << itr->get_context().to_string() <<"\n"; + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_string.\n"; + } } return ss.str(); + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_string.\n"; + } } [[noreturn]] void exception_factory::rethrow( const exception& e )const From 3583ee613887698d695e1159d6e6a839bdb25cf7 Mon Sep 17 00:00:00 2001 From: Spartucus Date: Wed, 30 May 2018 17:56:20 +0800 Subject: [PATCH 065/117] Fix non-void function return value Since last catch insert exception string to `ss`, it should returns. --- src/exception.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/exception.cpp b/src/exception.cpp index bc72783..8814f53 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -251,6 +251,7 @@ namespace fc } catch( ... ) { ss << "<- exception in to_string.\n"; } + return ss.str(); } [[noreturn]] void exception_factory::rethrow( const exception& e )const From 5b8a7c281c35ec57bd080d55dad120ddc901fee9 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 18 Sep 2019 13:04:24 +0200 Subject: [PATCH 066/117] Partial revert "Changes to avoid conflict in following cherry-pick" This reverts commit d729816b06651ccde50940c92db729cf9fb4c61e. --- src/exception.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/exception.cpp b/src/exception.cpp index 8814f53..81cc585 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -194,7 +194,7 @@ namespace fc ss << " " << my->_name << ": " << my->_what << "\n"; for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ) { try { - ss << itr->get_message() <<"\n"; //fc::format_string( itr->get_format(), itr->get_data() ) <<"\n"; + ss << itr->get_message() <<"\n"; try { ss << " " << json::to_string( itr->get_data() )<<"\n"; @@ -227,18 +227,11 @@ namespace fc { std::stringstream ss; try { - ss << my->_what; - try { - ss << " (" << variant( my->_code ).as_string() << ")\n"; - } catch( std::bad_alloc& ) { - throw; - } catch( ... ) { - ss << "<- exception in to_string.\n"; - } + ss << what() << ":"; for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ++itr ) { + if( itr->get_format().size() ) try { - ss << fc::format_string( itr->get_format(), itr->get_data() ) << "\n"; - // ss << " " << itr->get_context().to_string() <<"\n"; + ss << " " << fc::format_string( itr->get_format(), itr->get_data() ); } catch( std::bad_alloc& ) { throw; } catch( ... ) { From 164f1f68e62432b32b1838a6e662cdf8a57f1536 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 18 Sep 2019 13:06:46 +0200 Subject: [PATCH 067/117] Whitespace fixes --- src/exception.cpp | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/exception.cpp b/src/exception.cpp index 81cc585..bd04f8e 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -192,26 +192,27 @@ namespace fc ss << "<- exception in to_detail_string."; } ss << " " << my->_name << ": " << my->_what << "\n"; - for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ) { + for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ) + { try { - ss << itr->get_message() <<"\n"; - try - { - ss << " " << json::to_string( itr->get_data() )<<"\n"; - } - catch( const fc::assert_exception& e ) - { - ss << "ERROR: Failed to convert log data to string!\n"; - } - ss << " " << itr->get_context().to_string(); - ++itr; + ss << itr->get_message() <<"\n"; + try + { + ss << " " << json::to_string( itr->get_data() )<<"\n"; + } + catch( const fc::assert_exception& e ) + { + ss << "ERROR: Failed to convert log data to string!\n"; + } + ss << " " << itr->get_context().to_string(); + ++itr; } catch( std::bad_alloc& ) { throw; } catch( ... ) { ss << "<- exception in to_detail_string."; } - if( itr != my->_elog.end() ) ss<<"\n"; - } + if( itr != my->_elog.end() ) ss<<"\n"; + } } catch( std::bad_alloc& ) { throw; } catch( ... ) { @@ -230,14 +231,14 @@ namespace fc ss << what() << ":"; for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ++itr ) { if( itr->get_format().size() ) - try { - ss << " " << fc::format_string( itr->get_format(), itr->get_data() ); - } catch( std::bad_alloc& ) { - throw; - } catch( ... ) { - ss << "<- exception in to_string.\n"; - } - } + try { + ss << " " << fc::format_string( itr->get_format(), itr->get_data() ); + } catch( std::bad_alloc& ) { + throw; + } catch( ... ) { + ss << "<- exception in to_string.\n"; + } + } return ss.str(); } catch( std::bad_alloc& ) { throw; From 20c16882235de2d5f6a366252fea6a889d417e76 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 18 Sep 2019 13:07:01 +0200 Subject: [PATCH 068/117] Removed superfluous return --- src/exception.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/exception.cpp b/src/exception.cpp index bd04f8e..01d2615 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -239,7 +239,6 @@ namespace fc ss << "<- exception in to_string.\n"; } } - return ss.str(); } catch( std::bad_alloc& ) { throw; } catch( ... ) { From cd69d13348da2c4d8f4caf8a275b25141bbec2e6 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 16 Sep 2019 21:02:25 +0200 Subject: [PATCH 069/117] Replaced spin_yield_lock with atomics --- include/fc/thread/future.hpp | 19 ++++---- include/fc/thread/task.hpp | 2 + src/thread/future.cpp | 88 ++++++++++++++---------------------- 3 files changed, 46 insertions(+), 63 deletions(-) diff --git a/include/fc/thread/future.hpp b/include/fc/thread/future.hpp index 4e98c3d..c0db411 100644 --- a/include/fc/thread/future.hpp +++ b/include/fc/thread/future.hpp @@ -3,9 +3,9 @@ #include #include #include -#include -#include +#include +#include //#define FC_TASK_NAMES_ARE_MANDATORY 1 #ifdef FC_TASK_NAMES_ARE_MANDATORY @@ -77,23 +77,22 @@ namespace fc { void _wait( const microseconds& timeout_us ); void _wait_until( const time_point& timeout_us ); - void _enqueue_thread(); - void _dequeue_thread(); void _notify(); - void _set_timeout(); void _set_value(const void* v); void _on_complete( detail::completion_handler* c ); private: + void _enqueue_thread(); + void _dequeue_thread(); + friend class thread; friend struct context; friend class thread_d; - bool _ready; - mutable spin_yield_lock _spin_yield; - thread* _blocked_thread; - unsigned _blocked_fiber_count; + std::atomic _ready; + std::atomic _blocked_thread; + std::atomic _blocked_fiber_count; time_point _timeout; fc::exception_ptr _exceptp; bool _canceled; @@ -103,7 +102,7 @@ namespace fc { private: #endif const char* _desc; - detail::completion_handler* _compl; + std::atomic _compl; }; template diff --git a/include/fc/thread/task.hpp b/include/fc/thread/task.hpp index f7c2ec5..92e1b48 100644 --- a/include/fc/thread/task.hpp +++ b/include/fc/thread/task.hpp @@ -4,6 +4,8 @@ #include #include +#include + namespace fc { struct context; class spin_lock; diff --git a/src/thread/future.cpp b/src/thread/future.cpp index c9dbffa..811378c 100644 --- a/src/thread/future.cpp +++ b/src/thread/future.cpp @@ -6,7 +6,6 @@ #include - namespace fc { promise_base::promise_base( const char* desc ) @@ -22,6 +21,8 @@ namespace fc { _compl(nullptr) { } + promise_base::~promise_base() { } + const char* promise_base::get_desc()const{ return _desc; } @@ -34,16 +35,14 @@ namespace fc { #endif } bool promise_base::ready()const { - return _ready; + return _ready.load(); } bool promise_base::error()const { - { synchronized(_spin_yield) - return _exceptp != nullptr; - } + return std::atomic_load( &_exceptp ) != nullptr; } void promise_base::set_exception( const fc::exception_ptr& e ){ - _exceptp = e; + std::atomic_store( &_exceptp, e ); _set_value(nullptr); } @@ -54,16 +53,17 @@ namespace fc { _wait_until( time_point::now() + timeout_us ); } void promise_base::_wait_until( const time_point& timeout_us ){ - { synchronized(_spin_yield) - if( _ready ) { - if( _exceptp ) - _exceptp->dynamic_rethrow_exception(); - return; - } - _enqueue_thread(); + if( _ready.load() ) { + fc::exception_ptr ex = std::atomic_load( &_exceptp ); + if( ex ) + ex->dynamic_rethrow_exception(); + return; } - std::exception_ptr e; + _enqueue_thread(); + // Need to check _ready again to avoid a race condition. + if( _ready.load() ) return _wait_until( timeout_us ); // this will simply return or throw _exceptp + std::exception_ptr e; // // Create shared_ptr to take ownership of this; i.e. this will // be deleted when p_this goes out of scope. Consequently, @@ -71,9 +71,7 @@ namespace fc { // before we're done reading/writing instance variables! // See https://github.com/cryptonomex/graphene/issues/597 // - ptr p_this = shared_from_this(); - try { // @@ -94,61 +92,45 @@ namespace fc { if( e ) std::rethrow_exception(e); - if( _ready ) - { - if( _exceptp ) - _exceptp->dynamic_rethrow_exception(); - return; - } + if( _ready.load() ) return _wait_until( timeout_us ); // this will simply return or throw _exceptp + FC_THROW_EXCEPTION( timeout_exception, "" ); } void promise_base::_enqueue_thread(){ - ++_blocked_fiber_count; + _blocked_fiber_count.fetch_add( 1 ); + thread* blocked_thread = _blocked_thread.load(); // only one thread can wait on a promise at any given time - assert(!_blocked_thread || - _blocked_thread == &thread::current()); - _blocked_thread = &thread::current(); + do + assert( !blocked_thread || blocked_thread == &thread::current() ); + while( !_blocked_thread.compare_exchange_weak( blocked_thread, &thread::current() ) ); } void promise_base::_dequeue_thread(){ - synchronized(_spin_yield) - if (!--_blocked_fiber_count) - _blocked_thread = nullptr; + if( _blocked_fiber_count.fetch_add( -1 ) == 1 ) + _blocked_thread.store( nullptr ); } void promise_base::_notify(){ // copy _blocked_thread into a local so that if the thread unblocks (e.g., // because of a timeout) before we get a chance to notify it, we won't be // calling notify on a null pointer - thread* blocked_thread; - { synchronized(_spin_yield) - blocked_thread = _blocked_thread; - } + thread* blocked_thread = _blocked_thread.load(); if( blocked_thread ) blocked_thread->notify( shared_from_this() ); } - promise_base::~promise_base() { } - void promise_base::_set_timeout(){ - if( _ready ) - return; - set_exception( std::make_shared() ); - } + void promise_base::_set_value(const void* s){ - // slog( "%p == %d", &_ready, int(_ready)); -// BOOST_ASSERT( !_ready ); - { synchronized(_spin_yield) - if (_ready) //don't allow promise to be set more than once + bool ready = false; + if( !_ready.compare_exchange_strong( ready, true ) ) //don't allow promise to be set more than once return; - _ready = true; - } - _notify(); - if( nullptr != _compl ) { - _compl->on_complete(s,_exceptp); - } + _notify(); + auto* hdl = _compl.load(); + if( nullptr != hdl ) + hdl->on_complete( s, std::atomic_load( &_exceptp ) ); } + void promise_base::_on_complete( detail::completion_handler* c ) { - { synchronized(_spin_yield) - delete _compl; - _compl = c; - } + auto* hdl = _compl.load(); + while( !_compl.compare_exchange_weak( hdl, c ) ); + delete hdl; } } From 201b4b33f02dd2930f70635f050600f0b7502243 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 16 Sep 2019 21:02:50 +0200 Subject: [PATCH 070/117] Print stacktrace when yielding within an exception handler --- src/thread/thread_d.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index 77e8fb7..c81ba1c 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -1,12 +1,14 @@ #include +#include #include #include #include "context.hpp" #include #include #include + +#include #include -//#include namespace fc { struct sleep_priority_less { @@ -390,7 +392,8 @@ namespace fc { /* NB: At least on Win64, this only catches a yield while in the body of * a catch block; it fails to catch a yield while unwinding the stack, which * is probably just as likely to cause crashes */ - assert(std::current_exception() == std::exception_ptr()); + if( std::current_exception() != std::exception_ptr() ) + print_stacktrace( std::cerr ); check_for_timeouts(); if( !current ) From ef52b3903679c2e67fdc09e82c9f4fa33aa26cb3 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 17 Sep 2019 08:04:23 +0200 Subject: [PATCH 071/117] Preserve crash in debug mode --- src/thread/thread_d.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index c81ba1c..214c2f0 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -393,7 +393,10 @@ namespace fc { * a catch block; it fails to catch a yield while unwinding the stack, which * is probably just as likely to cause crashes */ if( std::current_exception() != std::exception_ptr() ) + { print_stacktrace( std::cerr ); + assert( std::current_exception() != std::exception_ptr() ); + } check_for_timeouts(); if( !current ) From eb42ebb528770b992b41d9c9ef04ba7e22ff459d Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 17 Sep 2019 08:04:50 +0200 Subject: [PATCH 072/117] Add log message --- src/thread/thread_d.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index 214c2f0..88c8d45 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -394,6 +394,7 @@ namespace fc { * is probably just as likely to cause crashes */ if( std::current_exception() != std::exception_ptr() ) { + elog( "Thread ${name} yielded in exception handler!", ("name",thread::current().name()) ); print_stacktrace( std::cerr ); assert( std::current_exception() != std::exception_ptr() ); } From 4ce37756306c84263f8097f6d8881beaa7c9629d Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 17 Sep 2019 08:06:58 +0200 Subject: [PATCH 073/117] Clean up before returning --- src/thread/future.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/thread/future.cpp b/src/thread/future.cpp index 811378c..b4779dd 100644 --- a/src/thread/future.cpp +++ b/src/thread/future.cpp @@ -61,7 +61,11 @@ namespace fc { } _enqueue_thread(); // Need to check _ready again to avoid a race condition. - if( _ready.load() ) return _wait_until( timeout_us ); // this will simply return or throw _exceptp + if( _ready.load() ) + { + _dequeue_thread(); + return _wait_until( timeout_us ); // this will simply return or throw _exceptp + } std::exception_ptr e; // From 9077892d873868f2e4a7c8493d903ade82911f59 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 17 Sep 2019 16:11:09 +0200 Subject: [PATCH 074/117] Log stacktrace instead of writing to stderr --- src/thread/thread_d.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index 88c8d45..2f06d00 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include namespace fc { @@ -394,8 +394,10 @@ namespace fc { * is probably just as likely to cause crashes */ if( std::current_exception() != std::exception_ptr() ) { - elog( "Thread ${name} yielded in exception handler!", ("name",thread::current().name()) ); - print_stacktrace( std::cerr ); + std::stringstream stacktrace; + print_stacktrace( stacktrace ); + elog( "Thread ${name} yielded in exception handler!\n${trace}", + ("name",thread::current().name())("trace",stacktrace.str()) ); assert( std::current_exception() != std::exception_ptr() ); } From 2cc32d79ba9422e1eed93c6ef540ca9db14dd9a9 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 17 Sep 2019 18:13:12 +0200 Subject: [PATCH 075/117] Fixed assert --- src/thread/thread_d.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index 2f06d00..7209485 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -398,7 +398,7 @@ namespace fc { print_stacktrace( stacktrace ); elog( "Thread ${name} yielded in exception handler!\n${trace}", ("name",thread::current().name())("trace",stacktrace.str()) ); - assert( std::current_exception() != std::exception_ptr() ); + assert( std::current_exception() == std::exception_ptr() ); } check_for_timeouts(); From 253c1d56b9dd4049e080f5112144a471e04461dc Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 20 Sep 2019 09:27:44 +0200 Subject: [PATCH 076/117] Added test for zero-initialized arrays --- tests/CMakeLists.txt | 1 + tests/crypto/array_initialization_test.cpp | 67 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 tests/crypto/array_initialization_test.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 01cf205..6a3e474 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -26,6 +26,7 @@ target_link_libraries( ecc_test fc ) add_executable( all_tests all_tests.cpp compress/compress.cpp crypto/aes_test.cpp + crypto/array_initialization_test.cpp crypto/base_n_tests.cpp crypto/bigint_test.cpp crypto/blind.cpp diff --git a/tests/crypto/array_initialization_test.cpp b/tests/crypto/array_initialization_test.cpp new file mode 100644 index 0000000..a8d2724 --- /dev/null +++ b/tests/crypto/array_initialization_test.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include + +#include +#include + +#include + +static void check_null_key() +{ + fc::ecc::public_key_data key1; + fc::ecc::public_key_data key2; + unsigned char zeroes[33]; + static_assert( key1.size() == sizeof(zeroes), "Wrong array size!" ); + memset( zeroes, 0, sizeof(zeroes) ); + BOOST_CHECK( !memcmp( key1.data(), zeroes, sizeof(zeroes) ) ); + BOOST_CHECK( !memcmp( key2.data(), zeroes, sizeof(zeroes) ) ); + + // now "pollute" the keys for the next invocation + key1 = fc::ecc::private_key::generate().get_public_key(); + for( unsigned char c = 0; c < key2.size(); c++ ) + { + key2[c] = c ^ 17; + zeroes[c] = c ^ 47; + } + + // ...and use them to prevent the compiler from optimizing the pollution away. + wlog( "Key1: ${k}", ("k",fc::ecc::public_key::to_base58(key1)) ); + wlog( "Key2: ${k}", ("k",fc::ecc::public_key::to_base58(key2)) ); +} + +BOOST_AUTO_TEST_SUITE(fc_crypto) + +BOOST_AUTO_TEST_CASE(array_init_test) +{ + check_null_key(); + check_null_key(); + { + char junk[128]; + fc::rand_bytes( junk, sizeof(junk) ); + } + check_null_key(); +} + +BOOST_AUTO_TEST_SUITE_END() From afc0e0070001ca230778c7eea6b0085fd4979645 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 19 Sep 2019 16:08:19 +0200 Subject: [PATCH 077/117] Added zero_initialized_array template to restore functionality of fc::array --- include/fc/container/zeroed_array.hpp | 72 +++++++++++++++++++++++++++ include/fc/crypto/elliptic.hpp | 19 +++---- src/crypto/elliptic_common.cpp | 2 +- src/crypto/elliptic_secp256k1.cpp | 2 +- 4 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 include/fc/container/zeroed_array.hpp diff --git a/include/fc/container/zeroed_array.hpp b/include/fc/container/zeroed_array.hpp new file mode 100644 index 0000000..a51abec --- /dev/null +++ b/include/fc/container/zeroed_array.hpp @@ -0,0 +1,72 @@ +#pragma once +/* + * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include + +namespace fc { + + template< typename T, size_t N > + class zero_initialized_array; + + template< size_t N > + class zero_initialized_array< unsigned char, N > : public std::array< unsigned char, N > { + public: + zero_initialized_array() : std::array< unsigned char, N >() { } + }; + + template + struct get_typename< zero_initialized_array > + { + static const char* name() + { + static std::string _name = std::string("zero_initialized_array<") + + std::string(fc::get_typename::name()) + + "," + fc::to_string(N) + ">"; + return _name.c_str(); + } + }; + + class variant; + template + void to_variant( const zero_initialized_array& bi, variant& v, uint32_t max_depth = 1 ) + { + to_variant( static_cast&>( bi ), v, max_depth ); + } + template + void from_variant( const variant& v, zero_initialized_array& bi, uint32_t max_depth = 1 ) + { + from_variant( v, static_cast&>( bi ), max_depth ); + } + + namespace raw { + template + inline void pack( Stream& s, const zero_initialized_array& v, uint32_t _max_depth ) { + pack( s, static_cast&>( v ), _max_depth ); + } + template + inline void unpack( Stream& s, zero_initialized_array& v, uint32_t _max_depth ) { try { + unpack( s, static_cast&>( v ), _max_depth ); + } FC_RETHROW_EXCEPTIONS( warn, "zero_initialized_array", ("length",N) ) } + } +} diff --git a/include/fc/crypto/elliptic.hpp b/include/fc/crypto/elliptic.hpp index 3784299..e47dee6 100644 --- a/include/fc/crypto/elliptic.hpp +++ b/include/fc/crypto/elliptic.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -17,15 +18,15 @@ namespace fc { class private_key_impl; } - typedef fc::sha256 blind_factor_type; - typedef std::array commitment_type; - typedef std::array public_key_data; - typedef fc::sha256 private_key_secret; - typedef std::array public_key_point_data; ///< the full non-compressed version of the ECC point - typedef std::array signature; - typedef std::array compact_signature; - typedef std::vector range_proof_type; - typedef std::array extended_key_data; + typedef fc::sha256 blind_factor_type; + typedef zero_initialized_array commitment_type; + typedef zero_initialized_array public_key_data; + typedef fc::sha256 private_key_secret; + typedef zero_initialized_array public_key_point_data; ///< the full non-compressed version of the ECC point + typedef zero_initialized_array signature; + typedef zero_initialized_array compact_signature; + typedef std::vector range_proof_type; + typedef zero_initialized_array extended_key_data; /** * @class public_key diff --git a/src/crypto/elliptic_common.cpp b/src/crypto/elliptic_common.cpp index dd89c3a..2ed84a8 100644 --- a/src/crypto/elliptic_common.cpp +++ b/src/crypto/elliptic_common.cpp @@ -19,7 +19,7 @@ namespace fc { namespace ecc { namespace detail { - typedef std::array chr37; + typedef zero_initialized_array chr37; fc::sha256 _left( const fc::sha512& v ) { diff --git a/src/crypto/elliptic_secp256k1.cpp b/src/crypto/elliptic_secp256k1.cpp index b180d44..477077e 100644 --- a/src/crypto/elliptic_secp256k1.cpp +++ b/src/crypto/elliptic_secp256k1.cpp @@ -53,7 +53,7 @@ namespace fc { namespace ecc { public_key_data _key; }; - typedef std::array chr37; + typedef zero_initialized_array chr37; chr37 _derive_message( const public_key_data& key, int i ); fc::sha256 _left( const fc::sha512& v ); fc::sha256 _right( const fc::sha512& v ); From ed479c8c3eb4907958e908cf11f997d839e4e02f Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 20 Sep 2019 08:42:39 +0200 Subject: [PATCH 078/117] Reformatting --- include/fc/container/zeroed_array.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/fc/container/zeroed_array.hpp b/include/fc/container/zeroed_array.hpp index a51abec..0f91a0f 100644 --- a/include/fc/container/zeroed_array.hpp +++ b/include/fc/container/zeroed_array.hpp @@ -1,4 +1,3 @@ -#pragma once /* * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors * @@ -22,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#pragma once #include namespace fc { @@ -65,8 +65,10 @@ namespace fc { pack( s, static_cast&>( v ), _max_depth ); } template - inline void unpack( Stream& s, zero_initialized_array& v, uint32_t _max_depth ) { try { - unpack( s, static_cast&>( v ), _max_depth ); - } FC_RETHROW_EXCEPTIONS( warn, "zero_initialized_array", ("length",N) ) } + inline void unpack( Stream& s, zero_initialized_array& v, uint32_t _max_depth ) { + try { + unpack( s, static_cast&>( v ), _max_depth ); + } FC_RETHROW_EXCEPTIONS( warn, "zero_initialized_array", ("length",N) ) + } } } From ec77b4943c2cfb9fca052f56d610454b7ad2bcd4 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 22 Sep 2019 10:03:29 +0200 Subject: [PATCH 079/117] Added std::tuple_size for master compatibility --- include/fc/container/zeroed_array.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/fc/container/zeroed_array.hpp b/include/fc/container/zeroed_array.hpp index 0f91a0f..df1d530 100644 --- a/include/fc/container/zeroed_array.hpp +++ b/include/fc/container/zeroed_array.hpp @@ -72,3 +72,9 @@ namespace fc { } } } + +namespace std { + template<> + template< typename T, size_t N > + class tuple_size< fc::zero_initialized_array< T, N > > : public tuple_size< array< T, N > > {}; +} From 4bdab0bb0a474483984ea7d5b98feeaefef7a5bc Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 24 Sep 2019 17:24:38 +0200 Subject: [PATCH 080/117] Removed checks for obsolete boost version numbers --- src/thread/context.hpp | 58 +++-------------------------------------- src/thread/thread_d.hpp | 12 ++------- 2 files changed, 5 insertions(+), 65 deletions(-) diff --git a/src/thread/context.hpp b/src/thread/context.hpp index 51450cc..0c85103 100644 --- a/src/thread/context.hpp +++ b/src/thread/context.hpp @@ -19,11 +19,11 @@ namespace bc = boost::context::detail; namespace bco = boost::coroutines; typedef bco::stack_allocator stack_allocator; -#elif BOOST_VERSION >= 105400 +#else # include namespace bc = boost::context; namespace bco = boost::coroutines; -# if BOOST_VERSION >= 105600 && !defined(NDEBUG) +# if !defined(NDEBUG) # include # include typedef bco::protected_stack_allocator stack_allocator; @@ -32,16 +32,7 @@ typedef bco::stack_allocator stack_allocator; # endif -#elif BOOST_VERSION >= 105300 - #include - namespace bc = boost::context; - namespace bco = boost::coroutines; -#elif BOOST_VERSION >= 105200 - namespace bc = boost::context; -#else - namespace bc = boost::ctx; - namespace bco = boost::coroutine; -#endif +#endif // BOOST_VERSION >= 106100 namespace fc { class thread; @@ -55,10 +46,7 @@ namespace fc { */ struct context { typedef fc::context* ptr; - -#if BOOST_VERSION >= 105400 bco::stack_context stack_ctx; -#endif #if BOOST_VERSION >= 106100 using context_fn = void (*)(bc::transfer_t); @@ -81,32 +69,13 @@ namespace fc { cur_task(0), context_posted_num(0) { -#if BOOST_VERSION >= 105600 size_t stack_size = FC_CONTEXT_STACK_SIZE; alloc.allocate(stack_ctx, stack_size); my_context = bc::make_fcontext( stack_ctx.sp, stack_ctx.size, sf); -#elif BOOST_VERSION >= 105400 - size_t stack_size = FC_CONTEXT_STACK_SIZE; - alloc.allocate(stack_ctx, stack_size); - my_context = bc::make_fcontext( stack_ctx.sp, stack_ctx.size, sf); -#elif BOOST_VERSION >= 105300 - size_t stack_size = FC_CONTEXT_STACK_SIZE; - void* stackptr = alloc.allocate(stack_size); - my_context = bc::make_fcontext( stackptr, stack_size, sf); -#else - size_t stack_size = FC_CONTEXT_STACK_SIZE; - my_context.fc_stack.base = alloc.allocate( stack_size ); - my_context.fc_stack.limit = static_cast( my_context.fc_stack.base) - stack_size; - make_fcontext( &my_context, sf ); -#endif } context( fc::thread* t) : -#if BOOST_VERSION >= 105600 my_context(nullptr), -#elif BOOST_VERSION >= 105300 - my_context(new bc::fcontext_t), -#endif caller_context(0), stack_alloc(0), next_blocked(0), @@ -123,23 +92,8 @@ namespace fc { {} ~context() { -#if BOOST_VERSION >= 105600 if(stack_alloc) stack_alloc->deallocate( stack_ctx ); -#elif BOOST_VERSION >= 105400 - if(stack_alloc) - stack_alloc->deallocate( stack_ctx ); - else - delete my_context; -#elif BOOST_VERSION >= 105300 - if(stack_alloc) - stack_alloc->deallocate( my_context->fc_stack.sp, FC_CONTEXT_STACK_SIZE); - else - delete my_context; -#else - if(stack_alloc) - stack_alloc->deallocate( my_context.fc_stack.base, FC_CONTEXT_STACK_SIZE ); -#endif } void reinitialize() @@ -225,13 +179,7 @@ namespace fc { bool is_complete()const { return complete; } - - -#if BOOST_VERSION >= 105300 && BOOST_VERSION < 105600 - bc::fcontext_t* my_context; -#else bc::fcontext_t my_context; -#endif fc::context* caller_context; stack_allocator* stack_alloc; priority prio; diff --git a/src/thread/thread_d.hpp b/src/thread/thread_d.hpp index 7209485..a28aa30 100644 --- a/src/thread/thread_d.hpp +++ b/src/thread/thread_d.hpp @@ -433,12 +433,8 @@ namespace fc { auto p = context_pair{nullptr, prev}; auto t = bc::jump_fcontext( next->my_context, &p ); static_cast(t.data)->second->my_context = t.fctx; -#elif BOOST_VERSION >= 105600 - bc::jump_fcontext( &prev->my_context, next->my_context, 0 ); -#elif BOOST_VERSION >= 105300 - bc::jump_fcontext( prev->my_context, next->my_context, 0 ); #else - bc::jump_fcontext( &prev->my_context, &next->my_context, 0 ); + bc::jump_fcontext( &prev->my_context, next->my_context, 0 ); #endif BOOST_ASSERT( current ); BOOST_ASSERT( current == prev ); @@ -479,12 +475,8 @@ namespace fc { auto p = context_pair{this, prev}; auto t = bc::jump_fcontext( next->my_context, &p ); static_cast(t.data)->second->my_context = t.fctx; -#elif BOOST_VERSION >= 105600 - bc::jump_fcontext( &prev->my_context, next->my_context, (intptr_t)this ); -#elif BOOST_VERSION >= 105300 - bc::jump_fcontext( prev->my_context, next->my_context, (intptr_t)this ); #else - bc::jump_fcontext( &prev->my_context, &next->my_context, (intptr_t)this ); + bc::jump_fcontext( &prev->my_context, next->my_context, (intptr_t)this ); #endif BOOST_ASSERT( current ); BOOST_ASSERT( current == prev ); From 6e22341d9f44665b81248bd0fcc2d50394c6a59a Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Fri, 1 Nov 2019 15:14:46 -0500 Subject: [PATCH 081/117] Fix warning in zeroed_array.hpp Only one template declaration is needed here, I think. Clang gives many, many warnings over it. --- include/fc/container/zeroed_array.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/include/fc/container/zeroed_array.hpp b/include/fc/container/zeroed_array.hpp index df1d530..14bd116 100644 --- a/include/fc/container/zeroed_array.hpp +++ b/include/fc/container/zeroed_array.hpp @@ -74,7 +74,6 @@ namespace fc { } namespace std { - template<> template< typename T, size_t N > class tuple_size< fc::zero_initialized_array< T, N > > : public tuple_size< array< T, N > > {}; } From 1d59bb3d47cd06dda5b91c536bdada22a7a3db4c Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 8 Mar 2018 15:59:03 +0100 Subject: [PATCH 082/117] Updated bloom_filter.hpp from https://github.com/ArashPartow/bloom/blob/c89c2912c445dd5c0afe3d819ca012a6c6639e4e/bloom_filter.hpp --- include/fc/bloom_filter.hpp | 228 ++++++++++++++++++++++-------------- 1 file changed, 140 insertions(+), 88 deletions(-) diff --git a/include/fc/bloom_filter.hpp b/include/fc/bloom_filter.hpp index 940dfbd..a99f69d 100644 --- a/include/fc/bloom_filter.hpp +++ b/include/fc/bloom_filter.hpp @@ -1,5 +1,3 @@ -#pragma once - /* ********************************************************************* * * @@ -11,16 +9,20 @@ * * * Copyright notice: * * Free use of the Open Bloom Filter Library is permitted under the * - * guidelines and in accordance with the most current version of the * - * Common Public License. * - * http://www.opensource.org/licenses/cpl1.0.php * + * guidelines and in accordance with the MIT License. * + * http://www.opensource.org/licenses/MIT * * * ********************************************************************* */ + +#ifndef INCLUDE_BLOOM_FILTER_HPP +#define INCLUDE_BLOOM_FILTER_HPP + #include #include #include +#include #include #include #include @@ -32,6 +34,7 @@ namespace fc { static constexpr std::size_t bits_per_char = 0x08; // 8 bits in 1 char(unsigned) + static const unsigned char bit_mask[bits_per_char] = { 0x01, //00000001 0x02, //00000010 @@ -87,22 +90,22 @@ public: (0xFFFFFFFFFFFFFFFFULL == random_seed); } - //Allowed min/max size of the bloom filter in bits + // Allowable min/max size of the bloom filter in bits unsigned long long int minimum_size; unsigned long long int maximum_size; - //Allowed min/max number of hash functions + // Allowable min/max number of hash functions unsigned int minimum_number_of_hashes; unsigned int maximum_number_of_hashes; - //The approximate number of elements to be inserted - //into the bloom filter, should be within one order - //of magnitude. The default is 10000. + // The approximate number of elements to be inserted + // into the bloom filter, should be within one order + // of magnitude. The default is 10000. unsigned long long int projected_element_count; - //The approximate false positive probability expected - //from the bloom filter. The default is the reciprocal - //of the projected_element_count. + // The approximate false positive probability expected + // from the bloom filter. The default is assumed to be + // the reciprocal of the projected_element_count. double false_positive_probability; unsigned long long int random_seed; @@ -133,28 +136,32 @@ public: if (!(*this)) return false; - double min_m = std::numeric_limits::infinity(); - double min_k = 0.0; - double curr_m = 0.0; - double k = 1.0; + double min_m = std::numeric_limits::infinity(); + double min_k = 0.0; + double k = 1.0; while (k < 1000.0) { - double numerator = (- k * projected_element_count); - double denominator = std::log(1.0 - std::pow(false_positive_probability, 1.0 / k)); - curr_m = numerator / denominator; + const double numerator = (- k * projected_element_count); + const double denominator = std::log(1.0 - std::pow(false_positive_probability, 1.0 / k)); + + const double curr_m = numerator / denominator; + if (curr_m < min_m) { min_m = curr_m; min_k = k; } + k += 1.0; } optimal_parameters_t& optp = optimal_parameters; optp.number_of_hashes = static_cast(min_k); + optp.table_size = static_cast(min_m); + optp.table_size += (((optp.table_size % bits_per_char) != 0) ? (bits_per_char - (optp.table_size % bits_per_char)) : 0); if (optp.number_of_hashes < minimum_number_of_hashes) @@ -178,15 +185,15 @@ protected: typedef unsigned int bloom_type; typedef unsigned char cell_type; + typedef std::vector table_type; public: bloom_filter() : salt_count_(0), table_size_(0), - raw_table_size_(0), projected_element_count_(0), - inserted_element_count_(0), + inserted_element_count_ (0), random_seed_(0), desired_false_positive_probability_(0.0) {} @@ -199,12 +206,10 @@ public: { salt_count_ = p.optimal_parameters.number_of_hashes; table_size_ = p.optimal_parameters.table_size; - generate_unique_salt(); - raw_table_size_ = table_size_ / bits_per_char; - bit_table_.resize( static_cast(raw_table_size_) ); - //bit_table_ = new cell_type[static_cast(raw_table_size_)]; - std::fill_n(bit_table_.data(),raw_table_size_,0x00); + generate_unique_salt(); + + bit_table_.resize(table_size_ / bits_per_char, static_cast(0x00)); } bloom_filter(const bloom_filter& filter) @@ -217,15 +222,15 @@ public: if (this != &f) { return - (salt_count_ == f.salt_count_) && - (table_size_ == f.table_size_) && - (raw_table_size_ == f.raw_table_size_) && - (projected_element_count_ == f.projected_element_count_) && - (inserted_element_count_ == f.inserted_element_count_) && - (random_seed_ == f.random_seed_) && + (salt_count_ == f.salt_count_ ) && + (table_size_ == f.table_size_ ) && + (bit_table_.size() == f.bit_table_.size() ) && + (projected_element_count_ == f.projected_element_count_ ) && + (inserted_element_count_ == f.inserted_element_count_ ) && + (random_seed_ == f.random_seed_ ) && (desired_false_positive_probability_ == f.desired_false_positive_probability_) && - (salt_ == f.salt_) && - std::equal(f.bit_table_.data(),f.bit_table_.data() + raw_table_size_,bit_table_.data()); + (salt_ == f.salt_ ) && + (bit_table_ == f.bit_table_ ) ; } else return true; @@ -242,21 +247,22 @@ public: { salt_count_ = f.salt_count_; table_size_ = f.table_size_; - raw_table_size_ = f.raw_table_size_; + bit_table_ = f.bit_table_; + salt_ = f.salt_; + projected_element_count_ = f.projected_element_count_; - inserted_element_count_ = f.inserted_element_count_; + inserted_element_count_ = f.inserted_element_count_; + random_seed_ = f.random_seed_; + desired_false_positive_probability_ = f.desired_false_positive_probability_; - bit_table_.resize( raw_table_size_ ); - std::copy(f.bit_table_.data(),f.bit_table_.data() + raw_table_size_,bit_table_.data()); - salt_ = f.salt_; } + return *this; } virtual ~bloom_filter() - { - } + {} inline bool operator!() const { @@ -265,23 +271,26 @@ public: inline void clear() { - std::fill_n(bit_table_.data(),raw_table_size_,0x00); + std::fill(bit_table_.begin(), bit_table_.end(), static_cast(0x00)); inserted_element_count_ = 0; } inline void insert(const unsigned char* key_begin, const std::size_t& length) { std::size_t bit_index = 0; - std::size_t bit = 0; + std::size_t bit = 0; + for (std::size_t i = 0; i < salt_.size(); ++i) { - compute_indices(hash_ap(key_begin,length,salt_[i]),bit_index,bit); + compute_indices(hash_ap(key_begin, length, salt_[i]), bit_index, bit); + bit_table_[bit_index / bits_per_char] |= bit_mask[bit]; } + ++inserted_element_count_; } - template + template inline void insert(const T& t) { // Note: T must be a C++ POD type. @@ -290,7 +299,7 @@ public: inline void insert(const std::string& key) { - insert(reinterpret_cast(key.c_str()),key.size()); + insert(reinterpret_cast(key.data()),key.size()); } inline void insert(const char* data, const std::size_t& length) @@ -298,10 +307,11 @@ public: insert(reinterpret_cast(data),length); } - template + template inline void insert(const InputIterator begin, const InputIterator end) { InputIterator itr = begin; + while (end != itr) { insert(*(itr++)); @@ -311,19 +321,22 @@ public: inline virtual bool contains(const unsigned char* key_begin, const std::size_t length) const { std::size_t bit_index = 0; - std::size_t bit = 0; + std::size_t bit = 0; + for (std::size_t i = 0; i < salt_.size(); ++i) { - compute_indices(hash_ap(key_begin,length,salt_[i]),bit_index,bit); + compute_indices(hash_ap(key_begin, length, salt_[i]), bit_index, bit); + if ((bit_table_[bit_index / bits_per_char] & bit_mask[bit]) != bit_mask[bit]) { return false; } } + return true; } - template + template inline bool contains(const T& t) const { return contains(reinterpret_cast(&t),static_cast(sizeof(T))); @@ -339,33 +352,39 @@ public: return contains(reinterpret_cast(data),length); } - template + template inline InputIterator contains_all(const InputIterator begin, const InputIterator end) const { InputIterator itr = begin; + while (end != itr) { if (!contains(*itr)) { return itr; } + ++itr; } + return end; } - template + template inline InputIterator contains_none(const InputIterator begin, const InputIterator end) const { InputIterator itr = begin; + while (end != itr) { if (contains(*itr)) { return itr; } + ++itr; } + return end; } @@ -374,7 +393,7 @@ public: return table_size_; } - inline std::size_t element_count() const + inline unsigned long long int element_count() const { return inserted_element_count_; } @@ -395,16 +414,17 @@ public: { /* intersection */ if ( - (salt_count_ == f.salt_count_) && - (table_size_ == f.table_size_) && - (random_seed_ == f.random_seed_) + (salt_count_ == f.salt_count_ ) && + (table_size_ == f.table_size_ ) && + (random_seed_ == f.random_seed_) ) { - for (std::size_t i = 0; i < raw_table_size_; ++i) + for (std::size_t i = 0; i < bit_table_.size(); ++i) { bit_table_[i] &= f.bit_table_[i]; } } + return *this; } @@ -412,16 +432,17 @@ public: { /* union */ if ( - (salt_count_ == f.salt_count_) && - (table_size_ == f.table_size_) && - (random_seed_ == f.random_seed_) + (salt_count_ == f.salt_count_ ) && + (table_size_ == f.table_size_ ) && + (random_seed_ == f.random_seed_) ) { - for (std::size_t i = 0; i < raw_table_size_; ++i) + for (std::size_t i = 0; i < bit_table_.size(); ++i) { bit_table_[i] |= f.bit_table_[i]; } } + return *this; } @@ -429,16 +450,17 @@ public: { /* difference */ if ( - (salt_count_ == f.salt_count_) && - (table_size_ == f.table_size_) && - (random_seed_ == f.random_seed_) + (salt_count_ == f.salt_count_ ) && + (table_size_ == f.table_size_ ) && + (random_seed_ == f.random_seed_) ) { - for (std::size_t i = 0; i < raw_table_size_; ++i) + for (std::size_t i = 0; i < bit_table_.size(); ++i) { bit_table_[i] ^= f.bit_table_[i]; } } + return *this; } @@ -457,7 +479,7 @@ protected: inline virtual void compute_indices(const bloom_type& hash, std::size_t& bit_index, std::size_t& bit) const { bit_index = hash % table_size_; - bit = bit_index % bits_per_char; + bit = bit_index % bits_per_char; } void generate_unique_salt() @@ -469,6 +491,7 @@ protected: hash function with different values seems to be adequate. */ const unsigned int predef_salt_count = 128; + static const bloom_type predef_salt[predef_salt_count] = { 0xAAAAAAAA, 0x55555555, 0x33333333, 0xCCCCCCCC, @@ -510,25 +533,31 @@ protected: std::copy(predef_salt, predef_salt + salt_count_, std::back_inserter(salt_)); - for (unsigned int i = 0; i < salt_.size(); ++i) - { + + for (std::size_t i = 0; i < salt_.size(); ++i) + { /* - Note: - This is done to integrate the user defined random seed, - so as to allow for the generation of unique bloom filter - instances. + Note: + This is done to integrate the user defined random seed, + so as to allow for the generation of unique bloom filter + instances. */ salt_[i] = salt_[i] * salt_[(i + 3) % salt_.size()] + static_cast(random_seed_); - } + } } else { - std::copy(predef_salt,predef_salt + predef_salt_count,std::back_inserter(salt_)); + std::copy(predef_salt, predef_salt + predef_salt_count, std::back_inserter(salt_)); + srand(static_cast(random_seed_)); + while (salt_.size() < salt_count_) { bloom_type current_salt = static_cast(rand()) * static_cast(rand()); - if (0 == current_salt) continue; + + if (0 == current_salt) + continue; + if (salt_.end() == std::find(salt_.begin(), salt_.end(), current_salt)) { salt_.push_back(current_salt); @@ -540,57 +569,71 @@ protected: inline bloom_type hash_ap(const unsigned char* begin, std::size_t remaining_length, bloom_type hash) const { const unsigned char* itr = begin; - unsigned int loop = 0; + unsigned int loop = 0; + while (remaining_length >= 8) { const unsigned int& i1 = *(reinterpret_cast(itr)); itr += sizeof(unsigned int); const unsigned int& i2 = *(reinterpret_cast(itr)); itr += sizeof(unsigned int); + hash ^= (hash << 7) ^ i1 * (hash >> 3) ^ (~((hash << 11) + (i2 ^ (hash >> 5)))); + remaining_length -= 8; } + if (remaining_length) { if (remaining_length >= 4) { const unsigned int& i = *(reinterpret_cast(itr)); + if (loop & 0x01) hash ^= (hash << 7) ^ i * (hash >> 3); else hash ^= (~((hash << 11) + (i ^ (hash >> 5)))); + ++loop; + remaining_length -= 4; + itr += sizeof(unsigned int); } + if (remaining_length >= 2) { const unsigned short& i = *(reinterpret_cast(itr)); + if (loop & 0x01) hash ^= (hash << 7) ^ i * (hash >> 3); else hash ^= (~((hash << 11) + (i ^ (hash >> 5)))); + ++loop; + remaining_length -= 2; + itr += sizeof(unsigned short); } + if (remaining_length) { hash += ((*itr) ^ (hash * 0xA5A5A5A5)) + loop; } } + return hash; } -public: - std::vector salt_; - std::vector bit_table_; - unsigned int salt_count_; - unsigned long long int table_size_; - unsigned long long int raw_table_size_; - unsigned long long int projected_element_count_; - unsigned int inserted_element_count_; - unsigned long long int random_seed_; - double desired_false_positive_probability_; + public: + std::vector salt_; + std::vector bit_table_; + unsigned int salt_count_; + unsigned long long int table_size_; + unsigned long long int projected_element_count_; + unsigned long long int inserted_element_count_; + unsigned long long int random_seed_; + double desired_false_positive_probability_; }; inline bloom_filter operator & (const bloom_filter& a, const bloom_filter& b) @@ -617,12 +660,21 @@ inline bloom_filter operator ^ (const bloom_filter& a, const bloom_filter& b) } // namespace fc +FC_REFLECT( fc::bloom_filter, (salt_)(bit_table_)(salt_count_)(table_size_)(projected_element_count_) + (inserted_element_count_)(random_seed_)(desired_false_positive_probability_) ) +FC_REFLECT( fc::bloom_parameters::optimal_parameters_t, (number_of_hashes)(table_size) ) +FC_REFLECT( fc::bloom_parameters, (minimum_size)(maximum_size)(minimum_number_of_hashes) + (maximum_number_of_hashes)(projected_element_count) + (false_positive_probability)(random_seed)(optimal_parameters) ) + +#endif + /* Note 1: If it can be guaranteed that bits_per_char will be of the form 2^n then the following optimization can be used: - hash_table[bit_index >> n] |= bit_mask[bit_index & (bits_per_char - 1)]; + bit_table_[bit_index >> n] |= bit_mask[bit_index & (bits_per_char - 1)]; Note 2: For performance reasons where possible when allocating memory it should From 7e07bc4514c25dfbad777b55cd42068d017de122 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 2 Nov 2019 19:46:36 +0100 Subject: [PATCH 083/117] Get rid of most extra cmake modules --- CMakeLists.txt | 6 +- CMakeModules/ArgumentParser.cmake | 74 ------ CMakeModules/FindVLD.cmake | 123 --------- CMakeModules/ParseLibraryList.cmake | 79 ------ CMakeModules/SetupTargetMacros.cmake | 369 --------------------------- CMakeModules/UseLibraryMacros.cmake | 72 ------ CMakeModules/VersionMacros.cmake | 244 ------------------ 7 files changed, 1 insertion(+), 966 deletions(-) delete mode 100644 CMakeModules/ArgumentParser.cmake delete mode 100644 CMakeModules/FindVLD.cmake delete mode 100644 CMakeModules/ParseLibraryList.cmake delete mode 100644 CMakeModules/SetupTargetMacros.cmake delete mode 100644 CMakeModules/UseLibraryMacros.cmake delete mode 100644 CMakeModules/VersionMacros.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index fb52534..092d74d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,8 +21,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/GitVersionGen") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") INCLUDE(GetPrerequisites) -INCLUDE( VersionMacros ) -INCLUDE( SetupTargetMacros ) INCLUDE(GetGitRevisionDescription) INCLUDE(CheckLibraryExists) @@ -159,8 +157,6 @@ ENDIF( LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB ) find_package(OpenSSL REQUIRED) -option( UNITY_BUILD OFF ) - set( fc_sources src/popcount.cpp src/variant.cpp @@ -243,7 +239,7 @@ list(APPEND sources ${fc_headers}) add_subdirectory( vendor/websocketpp EXCLUDE_FROM_ALL ) -setup_library( fc SOURCES ${sources} LIBRARY_TYPE STATIC ) +add_library( fc ${sources} ) install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include ) # begin editline stuff diff --git a/CMakeModules/ArgumentParser.cmake b/CMakeModules/ArgumentParser.cmake deleted file mode 100644 index a6eb49b..0000000 --- a/CMakeModules/ArgumentParser.cmake +++ /dev/null @@ -1,74 +0,0 @@ -# This module defines the ARGUMENT_PARSER macro for parsing macro arguments. - -# ARGUMENT_PARSER Macro -# This macro parses a mixed list of arguments and headers into lists and boolean -# variables. The output lists and boolean variables are stored using -# tolower( header ) variable names. All non-header arguments will be added to -# the output list that corresponds to the header that they follow (or to the -# default list if no header has been parsed yet). If a boolean header is passed, -# then its corresponding output variable is set to YES. -# -# Usage: -# ARGUMENT_PARSER( default_list lists bools ARGN ) -# -# Parameters: -# default_list The name of the variable that list values should be added -# to before any list headers have been reached. You may -# pass "" to disregard premature list values. -# lists The list headers (semicolon-separated string). -# bools The boolean headers (semicolon-separated string). -# ARGN The arguments to parse. -MACRO( ARGUMENT_PARSER default_list lists bools ) - - # Start using the default list. - SET( dest "${default_list}" ) - IF( NOT dest ) - SET( dest tmp ) - ENDIF( NOT dest ) - - # Clear all of the lists. - FOREACH( list_itr ${lists} ) - STRING( TOLOWER ${list_itr} lower ) - SET( ${lower} "" ) - ENDFOREACH( list_itr ) - - # Set all boolean variables to NO. - FOREACH( bool_itr ${bools} ) - STRING( TOLOWER ${bool_itr} lower ) - SET( ${lower} NO ) - ENDFOREACH( bool_itr ) - - # For all arguments. - FOREACH( arg_itr ${ARGN} ) - - SET( done NO ) - - # For each of the list headers, if the current argument matches a list - # header, then set the destination to the header. - FOREACH( list_itr ${lists} ) - IF( ${arg_itr} STREQUAL ${list_itr} ) - STRING( TOLOWER ${arg_itr} lower ) - SET( dest ${lower} ) - SET( done YES ) - ENDIF( ${arg_itr} STREQUAL ${list_itr} ) - ENDFOREACH( list_itr ) - - # For each of the boolean headers, if the current argument matches a - # boolean header, then set the boolean variable to true. - FOREACH( bool_itr ${bools} ) - IF( ${arg_itr} STREQUAL ${bool_itr} ) - STRING( TOLOWER ${arg_itr} lower ) - SET( ${lower} YES ) - SET( done YES ) - ENDIF( ${arg_itr} STREQUAL ${bool_itr} ) - ENDFOREACH( bool_itr ) - - # If the current argument is not a header, then add it to the current - # destination list. - IF( NOT done ) - SET( ${dest} ${${dest}} ${arg_itr} ) - ENDIF( NOT done ) - - ENDFOREACH( arg_itr ) - -ENDMACRO( ARGUMENT_PARSER ) diff --git a/CMakeModules/FindVLD.cmake b/CMakeModules/FindVLD.cmake deleted file mode 100644 index 716625c..0000000 --- a/CMakeModules/FindVLD.cmake +++ /dev/null @@ -1,123 +0,0 @@ -# Module for locating Visual Leak Detector. -# -# Customizable variables: -# VLD_ROOT_DIR -# This variable points to the Visual Leak Detector root directory. By -# default, the module looks for the installation directory by examining the -# Program Files/Program Files (x86) folders and the VLDROOT environment -# variable. -# -# Read-only variables: -# VLD_FOUND -# Indicates that the library has been found. -# -# VLD_INCLUDE_DIRS -# Points to the Visual Leak Detector include directory. -# -# VLD_LIBRARY_DIRS -# Points to the Visual Leak Detector directory that contains the libraries. -# The content of this variable can be passed to link_directories. -# -# VLD_LIBRARIES -# Points to the Visual Leak Detector libraries that can be passed to -# target_link_libararies. -# -# -# Copyright (c) 2012 Sergiu Dotenco -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -INCLUDE (FindPackageHandleStandardArgs) - -SET (_VLD_POSSIBLE_LIB_SUFFIXES lib) - -# Version 2.0 uses vld_x86 and vld_x64 instead of simply vld as library names -IF (CMAKE_SIZEOF_VOID_P EQUAL 4) - LIST (APPEND _VLD_POSSIBLE_LIB_SUFFIXES lib/Win32) -ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 8) - LIST (APPEND _VLD_POSSIBLE_LIB_SUFFIXES lib/Win64) -ENDIF (CMAKE_SIZEOF_VOID_P EQUAL 4) - -FIND_PATH (VLD_ROOT_DIR - NAMES include/vld.h - PATHS ENV VLDROOT - "$ENV{PROGRAMFILES}/Visual Leak Detector" - "$ENV{PROGRAMFILES(X86)}/Visual Leak Detector" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Visual Leak Detector;InstallLocation]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Visual Leak Detector;InstallLocation]" - DOC "VLD root directory") - -FIND_PATH (VLD_INCLUDE_DIR - NAMES vld.h - HINTS ${VLD_ROOT_DIR} - PATH_SUFFIXES include - DOC "VLD include directory") - -FIND_LIBRARY (VLD_LIBRARY_DEBUG - NAMES vld - HINTS ${VLD_ROOT_DIR} - PATH_SUFFIXES ${_VLD_POSSIBLE_LIB_SUFFIXES} - DOC "VLD debug library") - -IF (VLD_ROOT_DIR) - SET (_VLD_VERSION_FILE ${VLD_ROOT_DIR}/CHANGES.txt) - - IF (EXISTS ${_VLD_VERSION_FILE}) - SET (_VLD_VERSION_REGEX - "Visual Leak Detector \\(VLD\\) Version (([0-9]+)\\.([0-9]+)([a-z]|(.([0-9]+)))?)") - FILE (STRINGS ${_VLD_VERSION_FILE} _VLD_VERSION_TMP REGEX - ${_VLD_VERSION_REGEX}) - - STRING (REGEX REPLACE ${_VLD_VERSION_REGEX} "\\1" _VLD_VERSION_TMP - "${_VLD_VERSION_TMP}") - - STRING (REGEX REPLACE "([0-9]+).([0-9]+).*" "\\1" VLD_VERSION_MAJOR - "${_VLD_VERSION_TMP}") - STRING (REGEX REPLACE "([0-9]+).([0-9]+).*" "\\2" VLD_VERSION_MINOR - "${_VLD_VERSION_TMP}") - - SET (VLD_VERSION ${VLD_VERSION_MAJOR}.${VLD_VERSION_MINOR}) - - IF ("${_VLD_VERSION_TMP}" MATCHES "^([0-9]+).([0-9]+).([0-9]+)$") - # major.minor.patch version numbering scheme - STRING (REGEX REPLACE "([0-9]+).([0-9]+).([0-9]+)" "\\3" - VLD_VERSION_PATCH "${_VLD_VERSION_TMP}") - SET (VLD_VERSION "${VLD_VERSION}.${VLD_VERSION_PATCH}") - SET (VLD_VERSION_COUNT 3) - ELSE ("${_VLD_VERSION_TMP}" MATCHES "^([0-9]+).([0-9]+).([0-9]+)$") - # major.minor version numbering scheme. The trailing letter is ignored. - SET (VLD_VERSION_COUNT 2) - ENDIF ("${_VLD_VERSION_TMP}" MATCHES "^([0-9]+).([0-9]+).([0-9]+)$") - ENDIF (EXISTS ${_VLD_VERSION_FILE}) -ENDIF (VLD_ROOT_DIR) - -IF (VLD_LIBRARY_DEBUG) - SET (VLD_LIBRARY debug ${VLD_LIBRARY_DEBUG} CACHE DOC "VLD library") - GET_FILENAME_COMPONENT (_VLD_LIBRARY_DIR ${VLD_LIBRARY_DEBUG} PATH) - SET (VLD_LIBRARY_DIR ${_VLD_LIBRARY_DIR} CACHE PATH "VLD library directory") -ENDIF (VLD_LIBRARY_DEBUG) - -SET (VLD_INCLUDE_DIRS ${VLD_INCLUDE_DIR}) -SET (VLD_LIBRARY_DIRS ${VLD_LIBRARY_DIR}) -SET (VLD_LIBRARIES ${VLD_LIBRARY}) - -MARK_AS_ADVANCED (VLD_INCLUDE_DIR VLD_LIBRARY_DIR VLD_LIBRARY_DEBUG VLD_LIBRARY) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS (VLD REQUIRED_VARS VLD_ROOT_DIR - VLD_INCLUDE_DIR VLD_LIBRARY VERSION_VAR VLD_VERSION) diff --git a/CMakeModules/ParseLibraryList.cmake b/CMakeModules/ParseLibraryList.cmake deleted file mode 100644 index e559b9d..0000000 --- a/CMakeModules/ParseLibraryList.cmake +++ /dev/null @@ -1,79 +0,0 @@ -# -*- mode: cmake -*- - -# -# Shamelessly stolen from MSTK who shamelessly stole from Amanzi open source code https://software.lanl.gov/ascem/trac) -# -# PARSE_LIBRARY_LIST( -# DEBUG -# OPT -# GENERAL ) - -# CMake module -include(CMakeParseArguments) - -function(PARSE_LIBRARY_LIST) - - # Macro: _print_usage - macro(_print_usage) - message("PARSE_LIBRARY_LIST \n" - " FOUND \n" - " DEBUG \n" - " OPT \n" - " GENERAL \n" - "lib_list string to parse\n" - "FOUND flag to indicate if keywords were found\n" - "DEBUG variable containing debug libraries\n" - "OPT variable containing optimized libraries\n" - "GENERAL variable containing debug libraries\n") - - endmacro() - - # Read in args - cmake_parse_arguments(PARSE_ARGS "" "FOUND;DEBUG;OPT;GENERAL" "" ${ARGN}) - set(_parse_list "${PARSE_ARGS_UNPARSED_ARGUMENTS}") - if ( (NOT PARSE_ARGS_FOUND) OR - (NOT PARSE_ARGS_DEBUG) OR - (NOT PARSE_ARGS_OPT) OR - (NOT PARSE_ARGS_GENERAL) OR - (NOT _parse_list ) - ) - _print_usage() - message(FATAL_ERROR "Invalid arguments") - endif() - - # Now split the list - set(_debug_libs "") - set(_opt_libs "") - set(_gen_libs "") - foreach( item ${_parse_list} ) - if( ${item} MATCHES debug OR - ${item} MATCHES optimized OR - ${item} MATCHES general ) - - if( ${item} STREQUAL "debug" ) - set( mylist "_debug_libs" ) - elseif( ${item} STREQUAL "optimized" ) - set( mylist "_opt_libs" ) - elseif( ${item} STREQUAL "general" ) - set( mylist "_gen_libs" ) - endif() - else() - list( APPEND ${mylist} ${item} ) - endif() - endforeach() - - - # Now set output vairables - set(${PARSE_ARGS_DEBUG} "${_debug_libs}" PARENT_SCOPE) - set(${PARSE_ARGS_OPT} "${_opt_libs}" PARENT_SCOPE) - set(${PARSE_ARGS_GENERAL} "${_gen_libs}" PARENT_SCOPE) - - # If any of the lib lists are defined set flag to TRUE - if ( (_debug_libs) OR (_opt_libs) OR (_gen_libs) ) - set(${PARSE_ARGS_FOUND} TRUE PARENT_SCOPE) - else() - set(${PARSE_ARGS_FOUND} FALSE PARENT_SCOPE) - endif() - -endfunction(PARSE_LIBRARY_LIST) - diff --git a/CMakeModules/SetupTargetMacros.cmake b/CMakeModules/SetupTargetMacros.cmake deleted file mode 100644 index 776ed7d..0000000 --- a/CMakeModules/SetupTargetMacros.cmake +++ /dev/null @@ -1,369 +0,0 @@ -# This module defines several macros that are useful for setting up library, -# plugin, and executable targets. - - -INCLUDE( ArgumentParser ) - -function(enable_unity_build UB_SUFFIX SOURCE_VARIABLE_NAME) - set(files ${${SOURCE_VARIABLE_NAME}}) - # Generate a unique filename for the unity build translation unit - set(unit_build_file ${CMAKE_CURRENT_BINARY_DIR}/ub_${UB_SUFFIX}.cpp) - # Exclude all translation units from compilation - set_source_files_properties(${files} PROPERTIES HEADER_FILE_ONLY true) - # Open the ub file - FILE(WRITE ${unit_build_file} "// Unity Build generated by CMake\n") - # Add include statement for each translation unit - foreach(source_file ${files} ) - FILE( APPEND ${unit_build_file} "#include <${CMAKE_CURRENT_SOURCE_DIR}/${source_file}>\n") - endforeach(source_file) - # Complement list of translation units with the name of ub - set(${SOURCE_VARIABLE_NAME} ${${SOURCE_VARIABLE_NAME}} ${unit_build_file} PARENT_SCOPE) -endfunction(enable_unity_build) - -# SETUP_LIBRARY Macro -# Sets up to build a library target. The macro uses the following global -# variables to define default values (you may change these variables to change -# the defaults: -# DEFAULT_HEADER_INSTALL_DIR -# DEFAULT_LIBRARY_INSTALL_DIR -# -# Usage: -# SETUP_LIBRARY( target -# SOURCES source1 [source2...] -# MOC_HEADERS header1 [header2...] -# LIBRARIES library1 [library2...] -# INSTALL_HEADERS header1 [header2...] -# HEADER_INSTALL_DIR dir -# LIBRARY_INSTALL_DIR dir -# DEBUG_POSTFIX string -# LIBRARY_TYPE string -# AUTO_INSTALL_HEADERS -# DONT_INSTALL_LIBRARY ) -# -# Parameters: -# target The target library. -# SOURCES Follow with the sources to compile. -# MOC_HEADERS Follow with the headers to moc (Requires Qt). -# LIBRARIES Follow with the libraries to link. -# INSTALL_HEADERS Follow with the headers to install. -# HEADER_INSTALL_DIR Follow with the directory to install the headers -# in (${DEFAULT_HEADER_INSTALL_DIR} by default). -# LIBRARY_INSTALL_DIR Follow with the directory to install the library -# in (${DEFAULT_LIBRARY_INSTALL_DIR} by default). -# DEBUG_POSTFIX Follow with the postfix to use when building in -# debug mode (${CMAKE_DEBUG_POSTFIX} by default). -# LIBRARY_TYPE Follow with the type of library to build: SHARED, -# STATIC, or MODULE (if not passed, then the -# behavior is defined by BUILD_SHARED_LIBS). -# AUTO_INSTALL_HEADERS If passed, all *.h files in the current directory -# will be installed. -# DONT_INSTALL_LIBRARY If passed, the library will not be installed. -MACRO( SETUP_LIBRARY target ) - - # Setup the list headers. - SET( list_headers - SOURCES - MOC_HEADERS - LIBRARIES - INSTALL_HEADERS - HEADER_INSTALL_DIR - LIBRARY_INSTALL_DIR - DEBUG_POSTFIX - LIBRARY_TYPE - ) - - # Setup the boolean headers. - SET( bool_headers - AUTO_INSTALL_HEADERS - DONT_INSTALL_LIBRARY - ) - - # Parse the arguments into variables. - ARGUMENT_PARSER( "" "${list_headers}" "${bool_headers}" ${ARGN} ) - - # Set the default values for the header_install_dir, library_install_dir, - # and debug_postfix. - IF( NOT "${ARGN}" MATCHES "(^|;)HEADER_INSTALL_DIR($|;)" ) - SET( header_install_dir ${DEFAULT_HEADER_INSTALL_DIR} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)HEADER_INSTALL_DIR($|;)" ) - - IF( NOT "${ARGN}" MATCHES "(^|;)LIBRARY_INSTALL_DIR($|;)" ) - SET( library_install_dir ${DEFAULT_LIBRARY_INSTALL_DIR} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)LIBRARY_INSTALL_DIR($|;)" ) - - IF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" ) - SET( debug_postfix ${CMAKE_DEBUG_POSTFIX} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" ) - - # Configure the header_install_dir and library_install_dir so that ${target} - # may be used in them. Setting target to itself is REQUIRED for the - # configuration to work. - SET( target "${target}" ) - STRING( CONFIGURE "${header_install_dir}" header_install_dir ) - STRING( CONFIGURE "${library_install_dir}" library_install_dir ) - - # Setup the library_type. - IF( NOT library_type ) - SET( library_type STATIC ) - IF( BUILD_SHARED_LIBS ) - SET( library_type SHARED ) - ENDIF( BUILD_SHARED_LIBS ) - ENDIF( NOT library_type ) - - # Clear the moc_sources. - SET( moc_sources "" ) - - # If Qt is being used... - IF( QT_FOUND AND QT_LIBRARIES ) - # Setup QT to build a shared library. - IF( library_type MATCHES SHARED ) - ADD_DEFINITIONS( -DQT_SHARED ) - ENDIF( library_type MATCHES SHARED ) - - # Setup the moc sources. - IF( moc_headers ) - QT4_WRAP_CPP( moc_sources ${moc_headers} ) - ENDIF( moc_headers ) - ENDIF( QT_FOUND AND QT_LIBRARIES ) - - # Fatal error if moc_headers given but moc_sources not created. - IF( moc_headers AND NOT moc_sources ) - MESSAGE( FATAL_ERROR "Calling SETUP_LIBRARY() with MOC_HEADERS failed. " - "Make sure that you included \${QT_USE_FILE} prior to calling " - "SETUP_LIBRARY()." ) - ENDIF( moc_headers AND NOT moc_sources ) - - - IF( UNITY_BUILD ) - enable_unity_build( ${target} sources ) - ENDIF( UNITY_BUILD ) - - # Add the library. - ADD_LIBRARY( "${target}" ${library_type} ${sources} ${moc_sources} ) - - # Setup the debug_postfix. - SET_TARGET_PROPERTIES ( "${target}" PROPERTIES - DEBUG_POSTFIX "${debug_postfix}" ) - - # Link in the dependency libraries. - TARGET_LINK_LIBRARIES( "${target}" ${libraries} ) - - # If auto_install_headers, then set the headers to all .h files in the - # directory. - IF( auto_install_headers ) - FILE( GLOB install_headers *.h ) - ENDIF( auto_install_headers ) - - # Install the headers. - IF( install_headers ) - INSTALL( FILES ${install_headers} DESTINATION "${header_install_dir}" ) - ENDIF( install_headers ) - - # Install the library. - IF( NOT dont_install_library ) - INSTALL( TARGETS "${target}" - LIBRARY DESTINATION "${library_install_dir}" - ARCHIVE DESTINATION "${library_install_dir}" ) - ENDIF( NOT dont_install_library ) - -ENDMACRO( SETUP_LIBRARY ) - - -# SETUP_MODULE Macro -# Sets up to build a module (also setup as a Qt plugin if using Qt). A module is -# built as a shared library; however, modules are typically loaded dynamically -# rather than linked against. Therefore, this macro does not install header -# files and uses its own default install directory. The macro uses the following -# global variables to define default values (you may change these variables to -# change the defaults: -# DEFAULT_MODULE_INSTALL_DIR -# -# Usage: -# SETUP_MODULE( target -# SOURCES source1 [source2...] -# MOC_HEADERS header1 [header2...] -# LIBRARIES library1 [library2...] -# MODULE_INSTALL_DIR dir -# DEBUG_POSTFIX string -# DONT_INSTALL_MODULE ) -# -# Parameters: -# target The target module (built as a shared library). -# SOURCES Follow with the sources to compile. -# MOC_HEADERS Follow with the headers to moc (Requires Qt). -# LIBRARIES Follow with the libraries to link. -# MODULE_INSTALL_DIR Follow with the directory to install the module in -# (${DEFAULT_MODULE_INSTALL_DIR} by default). -# DEBUG_POSTFIX Follow with the postfix to use when building in -# debug mode (${CMAKE_DEBUG_POSTFIX} by default). -# DONT_INSTALL_MODULE If passed, the module will not be installed. -MACRO( SETUP_MODULE target ) - - # Setup the list headers. - SET( list_headers - SOURCES - MOC_HEADERS - LIBRARIES - MODULE_INSTALL_DIR - DEBUG_POSTFIX - ) - - # Setup the boolean headers. - SET( bool_headers - DONT_INSTALL_MODULE - ) - - # Parse the arguments into variables. - ARGUMENT_PARSER( "" "${list_headers}" "${bool_headers}" ${ARGN} ) - - # Set the default values for the module_install_dir and debug postfix. - IF( NOT "${ARGN}" MATCHES "(^|;)MODULE_INSTALL_DIR($|;)" ) - SET( module_install_dir ${DEFAULT_MODULE_INSTALL_DIR} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)MODULE_INSTALL_DIR($|;)" ) - - IF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" ) - SET( debug_postfix ${CMAKE_DEBUG_POSTFIX} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" ) - - # Configure the module_install_dir so that ${target} may be used in it. - # Setting target to itself is REQUIRED for the configuration to work. - SET( target "${target}" ) - STRING( CONFIGURE "${module_install_dir}" module_install_dir ) - - # Clear the moc_sources. - SET( moc_sources "" ) - - # If Qt is being used... - IF( QT_FOUND AND QT_LIBRARIES ) - ADD_DEFINITIONS( -DQT_PLUGIN ) - - # Setup the moc sources. - IF( moc_headers ) - QT4_WRAP_CPP( moc_sources ${moc_headers} ) - ENDIF( moc_headers ) - ENDIF( QT_FOUND AND QT_LIBRARIES ) - - # Fatal error if moc_headers given but moc_sources not created. - IF( moc_headers AND NOT moc_sources ) - MESSAGE( FATAL_ERROR "Calling SETUP_MODULE() with MOC_HEADERS failed. " - "Make sure that you included \${QT_USE_FILE} prior to calling " - "SETUP_MODULE()." ) - ENDIF( moc_headers AND NOT moc_sources ) - - # Add the module (built as a shared library). - ADD_LIBRARY( "${target}" SHARED ${sources} ${moc_sources} ) - - # Setup the debug postfix. - SET_TARGET_PROPERTIES ( "${target}" PROPERTIES - DEBUG_POSTFIX "${debug_postfix}" ) - - # Link in the dependency libraries. - TARGET_LINK_LIBRARIES( "${target}" ${libraries} ) - - # Install the module. - IF( NOT dont_install_module ) - INSTALL( TARGETS "${target}" - LIBRARY DESTINATION "${module_install_dir}" ) - ENDIF( NOT dont_install_module ) - -ENDMACRO( SETUP_MODULE ) - - -# SETUP_EXECUTABLE Macro -# Sets up to build an executable target. The macro uses the following global -# variables to define default values (you may change these variables to change -# the defaults: -# DEFAULT_EXECUTABLE_INSTALL_DIR -# -# Usage: -# SETUP_EXECUTABLE( target -# SOURCES source1 [source2...] -# MOC_HEADERS header1 [header2...] -# LIBRARIES library1 [library2...] -# EXECUTABLE_INSTALL_DIR dir -# DEBUG_POSTFIX string -# DONT_INSTALL_EXECUTABLE ) -# -# Parameters: -# target The target executable. -# SOURCES Follow with the sources to compile. -# MOC_HEADERS Follow with the headers to moc (Requires Qt). -# LIBRARIES Follow with the libraries to link. -# EXECUTABLE_INSTALL_DIR Follow with the directory to install the -# executable in -# (${DEFAULT_EXECUTABLE_INSTALL_DIR} by default). -# DEBUG_POSTFIX Follow with the postfix to use when building in -# debug mode (${CMAKE_DEBUG_POSTFIX} by -# default). -# DONT_INSTALL_EXECUTABLE If passed, the executable will not be -# installed. -MACRO( SETUP_EXECUTABLE target ) - - # Setup the list headers. - SET( list_headers - SOURCES - MOC_HEADERS - LIBRARIES - EXECUTABLE_INSTALL_DIR - DEBUG_POSTFIX - ) - - # Setup the boolean headers. - SET( bool_headers - DONT_INSTALL_EXECUTABLE - ) - - # Parse the arguments into variables. - ARGUMENT_PARSER( "" "${list_headers}" "${bool_headers}" ${ARGN} ) - - # Set the default values for the executable_install_dir and debug postfix. - IF( NOT "${ARGN}" MATCHES "(^|;)EXECUTABLE_INSTALL_DIR($|;)" ) - SET( executable_install_dir ${DEFAULT_EXECUTABLE_INSTALL_DIR} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)EXECUTABLE_INSTALL_DIR($|;)" ) - - IF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" ) - SET( debug_postfix ${CMAKE_DEBUG_POSTFIX} ) - ENDIF( NOT "${ARGN}" MATCHES "(^|;)DEBUG_POSTFIX($|;)" ) - - # Configure the executable_install_dir so that ${target} may be used in it. - # Setting target to itself is REQUIRED for the configuration to work. - SET( target "${target}" ) - STRING( CONFIGURE "${executable_install_dir}" executable_install_dir ) - - # Clear the moc_sources. - SET( moc_sources "" ) - - # If Qt is being used... - IF( QT_FOUND AND QT_LIBRARIES ) - ADD_DEFINITIONS( -DQT_SHARED ) - - # Setup the moc sources. - IF( moc_headers ) - QT4_WRAP_CPP( moc_sources ${moc_headers} ) - ENDIF( moc_headers ) - ENDIF( QT_FOUND AND QT_LIBRARIES ) - - # Fatal error if moc_headers given but moc_sources not created. - IF( moc_headers AND NOT moc_sources ) - MESSAGE( FATAL_ERROR "Calling SETUP_EXECUTABLE() with MOC_HEADERS failed. " - "Make sure that you included \${QT_USE_FILE} prior to calling " - "SETUP_EXECUTABLE()." ) - ENDIF( moc_headers AND NOT moc_sources ) - - # Add the executable. - ADD_EXECUTABLE( "${target}" ${sources} ${moc_sources} ) - - # Setup the debug postfix. - SET_TARGET_PROPERTIES ( "${target}" PROPERTIES - DEBUG_POSTFIX "${debug_postfix}" ) - - # Link in the dependency libraries. - TARGET_LINK_LIBRARIES( "${target}" ${libraries} ) - - # Install the executable. - IF( NOT dont_install_executable ) - INSTALL( TARGETS "${target}" RUNTIME DESTINATION - "${executable_install_dir}" ) - ENDIF( NOT dont_install_executable ) - -ENDMACRO( SETUP_EXECUTABLE ) diff --git a/CMakeModules/UseLibraryMacros.cmake b/CMakeModules/UseLibraryMacros.cmake deleted file mode 100644 index ed4ccd7..0000000 --- a/CMakeModules/UseLibraryMacros.cmake +++ /dev/null @@ -1,72 +0,0 @@ -# This module defines macros that are useful for using libraries in a build. The -# macros in this module are typically used along with the FindDependencyMacros. - -# ADD_LIBRARY_TO_LIST Macro -# Adds a library to a list of libraries if it is found. Otherwise, reports an -# error. -# -# Usage: -# ADD_LIBRARY_TO_LIST( libraries found lib lib_name ) -# -# Parameters: -# libraries The list of libraries to add the library to. -# found Whether or not the library to add was found. -# lib The library to add to the list. -# lib_name The name of the library to add to the list. -MACRO( ADD_LIBRARY_TO_LIST libraries found lib lib_name ) - - # Setting found to itself is necessary for the conditional to work. - SET( found ${found} ) - - # IF found, then add the library to the list, else report an error. - IF( found ) - LIST( REMOVE_ITEM ${libraries} ${lib} ) - SET( ${libraries} ${${libraries}} ${lib} ) - ENDIF( found ) - IF( NOT found ) - MESSAGE( "Using ${lib_name} failed." ) - ENDIF( NOT found ) - -ENDMACRO( ADD_LIBRARY_TO_LIST ) - - -# USE_LIBRARY_GLOBALS Macro -# If ${prefix}_USE_${LIB} is true, then ${prefix}_${LIB}_LIBRARY will be added -# to ${prefix}_LIBRARIES (assuming the library was correctly found). All of the -# dependencies will also be added to ${prefix}_LIBRARIES. -# -# Usage: -# USE_LIBRARY_GLOBALS( prefix lib -# DEPS dependency1 [dependency2...] ) -# -# Parameters: -# prefix The prefix for the global variables. -# lib The library to try to use. -# DEPS Follow with the list of dependencies that should be added with -# the given library. -MACRO( USE_LIBRARY_GLOBALS prefix lib ) - - STRING( TOUPPER ${lib} upper ) - - # If the library should be used... - IF( ${prefix}_USE_${upper} ) - - # Parse the arguments into variables. - ARGUMENT_PARSER( "" "DEPS" "" ${ARGN} ) - - # Add the library to the list. - ADD_LIBRARY_TO_LIST( ${prefix}_LIBRARIES "${${prefix}_${upper}_FOUND}" - "${${prefix}_${upper}_LIBRARY}" ${lib} ) - - # For each of the library's dependencies. - FOREACH( dep_itr ${deps} ) - STRING( TOUPPER ${dep_itr} upper ) - - # Add the dependency to the list. - ADD_LIBRARY_TO_LIST( ${prefix}_LIBRARIES - "${${prefix}_${upper}_FOUND}" - "${${prefix}_${upper}_LIBRARY}" ${dep_itr} ) - ENDFOREACH( dep_itr ) - ENDIF( ${prefix}_USE_${upper} ) - -ENDMACRO( USE_LIBRARY_GLOBALS ) diff --git a/CMakeModules/VersionMacros.cmake b/CMakeModules/VersionMacros.cmake deleted file mode 100644 index 6dd32c2..0000000 --- a/CMakeModules/VersionMacros.cmake +++ /dev/null @@ -1,244 +0,0 @@ -# This module defines several macros that are useful for handling version -# information. These macros work for version strings of format "#.#.#" -# representing major, minor, and patch integer components. - - -INCLUDE( ArgumentParser ) - - -# PARSE_VERSION_STR Macro -# This macro parses the version string information from a string. The macro -# parses the string for the given definitions followed by whitespace (or by ':' -# or '"' characters) and then version information. For example, passing -# "MyVersion" as a definition would properly retrieve the version from a string -# "containing the line "def MyVersion: 1.2.3". -# -# Usage: -# PARSE_VERSION_STR( version string definition [definition2...] ) -# -# Parameters: -# version The variable to store the version string in. -# string The string to parse. -# definition The definition(s) that may preceed the version string -# information. -MACRO( PARSE_VERSION_STR version string ) - - # Parse the arguments into variables. - ARGUMENT_PARSER( definitions "" "" ${ARGN} ) - - # For each of the given definitions... - FOREACH( def_itr ${definitions} ) - # If the version has not been found, then attempt to parse it. - IF( NOT ${version} ) - # Parse the version string. - STRING( REGEX MATCH "${def_itr}[ \t\":]+[0-9]+(.[0-9]+)?(.[0-9]+)?" - ${version} ${string} ) - - STRING( REGEX MATCH "[0-9]+(.[0-9]+)?(.[0-9]+)?" ${version} - "${${version}}" ) - - CORRECT_VERSION_STR( ${version} "${${version}}" ) - ENDIF( NOT ${version} ) - ENDFOREACH( def_itr ) - -ENDMACRO( PARSE_VERSION_STR ) - - -# PARSE_VERSION_INT Macro -# This macro parses the version integer component information from a string. The -# macro parses the string for the given definitions followed by whitespace (or -# by ':' or '"' characters) and then version information. For example, passing -# "MyVersionMajor" as a definition would properly retrieve the version from a -# string "containing the line "def MyVersionMajor: 1". -# -# Usage: -# PARSE_VERSION_INT( version string definition [definition2...] ) -# -# Parameters: -# version The variable to store the version integer component in. -# string The string to parse. -# definition The definition(s) that may preceed the version integer -# component information. -MACRO( PARSE_VERSION_INT version string ) - - # Parse the arguments into variables. - ARGUMENT_PARSER( definitions "" "" ${ARGN} ) - - # For each of the given definitions... - FOREACH( def_itr ${definitions} ) - # If the version has not been found, then attempt to parse it. - IF( NOT ${version} ) - # Parse the version string. - STRING( REGEX MATCH "${def_itr}[ \t\":]+[0-9]+" ${version} - ${string} ) - - STRING( REGEX MATCH "[0-9]+" ${version} "${${version}}" ) - ENDIF( NOT ${version} ) - ENDFOREACH( def_itr ) - -ENDMACRO( PARSE_VERSION_INT ) - - -# VERSION_STR_TO_INTS Macro -# This macro converts a version string into its three integer components. -# -# Usage: -# VERSION_STR_TO_INTS( major minor patch version ) -# -# Parameters: -# major The variable to store the major integer component in. -# minor The variable to store the minor integer component in. -# patch The variable to store the patch integer component in. -# version The version string to convert ("#.#.#" format). -MACRO( VERSION_STR_TO_INTS major minor patch version ) - - STRING( REGEX REPLACE "([0-9]+).[0-9]+.[0-9]+" "\\1" ${major} ${version} ) - STRING( REGEX REPLACE "[0-9]+.([0-9]+).[0-9]+" "\\1" ${minor} ${version} ) - STRING( REGEX REPLACE "[0-9]+.[0-9]+.([0-9]+)" "\\1" ${patch} ${version} ) - -ENDMACRO( VERSION_STR_TO_INTS ) - - -# VERSION_INTS_TO_STR Macro -# This macro converts three version integer components into a version string. -# -# Usage: -# VERSION_INTS_TO_STR( version major minor patch ) -# -# Parameters: -# version The variable to store the version string in. -# major The major version integer. -# minor The minor version integer. -# patch The patch version integer. -MACRO( VERSION_INTS_TO_STR version major minor patch ) - - SET( ${version} "${major}.${minor}.${patch}" ) - CORRECT_VERSION_STR( ${version} ${${version}} ) - -ENDMACRO( VERSION_INTS_TO_STR version major minor patch ) - - -# COMPARE_VERSION_STR Macro -# This macro compares two version strings to each other. The macro sets the -# result variable to -1 if lhs < rhs, 0 if lhs == rhs, and 1 if lhs > rhs. -# -# Usage: -# COMPARE_VERSION_STR( result lhs rhs ) -# -# Parameters: -# result The variable to store the result of the comparison in. -# lhs The version of the left hand side ("#.#.#" format). -# rhs The version of the right hand side ("#.#.#" format). -MACRO( COMPARE_VERSION_STR result lhs rhs ) - - VERSION_STR_TO_INTS( lhs_major lhs_minor lhs_patch ${lhs} ) - VERSION_STR_TO_INTS( rhs_major rhs_minor rhs_patch ${rhs} ) - - COMPARE_VERSION_INTS( ${result} - ${lhs_major} ${lhs_minor} ${lhs_patch} - ${rhs_major} ${rhs_minor} ${rhs_patch} ) - -ENDMACRO( COMPARE_VERSION_STR result lhs rhs ) - - -# COMPARE_VERSION_INTS Macro -# This macro compares two versions to each other using their integer components. -# The macro sets the result variable to -1 if lhs < rhs, 0 if lhs == rhs, and 1 -# if lhs > rhs. -# -# Usage: -# COMPARE_VERSION_INTS( result -# lhs_major lhs_minor lhs_patch -# rhs_major rhs_minor rhs_patch ) -# -# Parameters: -# result The variable to store the result of the comparison in. -# lhs_major The major integer component for the left hand side. -# lhs_minor The minor integer component for the left hand side. -# lhs_patch The patch integer component for the left hand side. -# rhs_major The major integer component for the right hand side. -# rhs_minor The minor integer component for the right hand side. -# rhs_patch The patch integer component for the right hand side. -MACRO( COMPARE_VERSION_INTS result lhs_major lhs_minor lhs_patch - rhs_major rhs_minor rhs_patch ) - - SET( ${result} 0 ) - IF( NOT ${result} AND ${lhs_major} LESS ${rhs_major} ) - SET( ${result} -1 ) - ENDIF( NOT ${result} AND ${lhs_major} LESS ${rhs_major} ) - IF( NOT ${result} AND ${lhs_major} GREATER ${rhs_major} ) - SET( ${result} 1 ) - ENDIF( NOT ${result} AND ${lhs_major} GREATER ${rhs_major} ) - - IF( NOT ${result} AND ${lhs_minor} LESS ${rhs_minor} ) - SET( ${result} -1 ) - ENDIF( NOT ${result} AND ${lhs_minor} LESS ${rhs_minor} ) - IF( NOT ${result} AND ${lhs_minor} GREATER ${rhs_minor} ) - SET( ${result} 1 ) - ENDIF( NOT ${result} AND ${lhs_minor} GREATER ${rhs_minor} ) - - IF( NOT ${result} AND ${lhs_patch} LESS ${rhs_patch} ) - SET( ${result} -1 ) - ENDIF( NOT ${result} AND ${lhs_patch} LESS ${rhs_patch} ) - IF( NOT ${result} AND ${lhs_patch} GREATER ${rhs_patch} ) - SET( ${result} 1 ) - ENDIF( NOT ${result} AND ${lhs_patch} GREATER ${rhs_patch} ) - -ENDMACRO( COMPARE_VERSION_INTS result lhs_major lhs_minor lhs_patch - rhs_major rhs_minor rhs_patch ) - - -# CORRECT_VERSION_STR Macro -# This macro corrects the version_str and stores the result in the version -# variable. If the version_str contains a version string in "#" or "#.#" format, -# then ".0" will be appended to the string to convert it to "#.#.#" format. If -# the version_str is invalid, then version will be set to "". -# -# Usage: -# CORRECT_VERSION_STR( version version_str ) -# -# Parameters: -# version The variable to store the corrected version string in. -# version_str The version string to correct. -MACRO( CORRECT_VERSION_STR version version_str ) - - SET( ${version} "${version_str}" ) - - # Add ".0" to the end of the version string in case a full "#.#.#" string - # was not given. - FOREACH( itr RANGE 2 ) - IF( NOT ${version} MATCHES "[0-9]+.[0-9]+.[0-9]+" ) - SET( ${version} "${${version}}.0" ) - ENDIF( NOT ${version} MATCHES "[0-9]+.[0-9]+.[0-9]+" ) - ENDFOREACH( itr ) - - # If the version string is not correct, then set it to "". - IF( NOT ${version} MATCHES "^[0-9]+.[0-9]+.[0-9]+$" ) - SET( ${version} "" ) - ENDIF( NOT ${version} MATCHES "^[0-9]+.[0-9]+.[0-9]+$" ) - -ENDMACRO( CORRECT_VERSION_STR ) - - - -# CORRECT_VERSION_Int Macro -# This macro corrects the version_int and stores the result in the version -# variable. If the version_int is invalid, then version will be set to "". -# -# Usage: -# CORRECT_VERSION_Int( version version_int ) -# -# Parameters: -# version The variable to store the corrected version integer -# component in. -# version_INT The version integer component to correct. -MACRO( CORRECT_VERSION_INT version version_int ) - - SET( ${version} "${version_int}" ) - - # If the version is not an integer, then set it to "". - IF( NOT ${version} MATCHES "^[0-9]+$" ) - SET( ${version} "" ) - ENDIF( NOT ${version} MATCHES "^[0-9]+$" ) - -ENDMACRO( CORRECT_VERSION_INT ) From cdbe88199637af4826da03ec241aaa701f89c787 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Wed, 6 Nov 2019 15:49:16 +0100 Subject: [PATCH 084/117] Removed unused reflection --- include/fc/bloom_filter.hpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/include/fc/bloom_filter.hpp b/include/fc/bloom_filter.hpp index a99f69d..c040ab0 100644 --- a/include/fc/bloom_filter.hpp +++ b/include/fc/bloom_filter.hpp @@ -28,11 +28,8 @@ #include #include -#include - namespace fc { - static constexpr std::size_t bits_per_char = 0x08; // 8 bits in 1 char(unsigned) static const unsigned char bit_mask[bits_per_char] = { @@ -660,15 +657,9 @@ inline bloom_filter operator ^ (const bloom_filter& a, const bloom_filter& b) } // namespace fc -FC_REFLECT( fc::bloom_filter, (salt_)(bit_table_)(salt_count_)(table_size_)(projected_element_count_) - (inserted_element_count_)(random_seed_)(desired_false_positive_probability_) ) -FC_REFLECT( fc::bloom_parameters::optimal_parameters_t, (number_of_hashes)(table_size) ) -FC_REFLECT( fc::bloom_parameters, (minimum_size)(maximum_size)(minimum_number_of_hashes) - (maximum_number_of_hashes)(projected_element_count) - (false_positive_probability)(random_seed)(optimal_parameters) ) - #endif + /* Note 1: If it can be guaranteed that bits_per_char will be of the form 2^n then From 2ae775bdb3d9434a6599a60412963d1cb5b049f0 Mon Sep 17 00:00:00 2001 From: oxarbitrage Date: Sun, 18 Feb 2018 13:05:59 -0300 Subject: [PATCH 085/117] add license mit --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1a421df --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 bitshares-fc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 35b3c0336ca0569d6879de23fe6bdb5d18441dd6 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 1 Mar 2018 08:54:35 +0100 Subject: [PATCH 086/117] Document licensing and history --- README.LICENSE | 67 +++++++++++++++++++++++++++ licenses/Boost_License-1.0.txt | 23 +++++++++ licenses/CMake-License.txt | 27 +++++++++++ licenses/COPYING-CMAKE-SCRIPTS | 22 +++++++++ licenses/Cyo_License.txt | 27 +++++++++++ licenses/MIT_Thrift_LICENSE.md | 23 +++++++++ licenses/MIT_X11_LICENSE.md | 17 +++++++ licenses/MIT_old.md | 9 ++++ licenses/UDT_License.txt | 32 +++++++++++++ licenses/ZLIB_LICENSE.md | 17 +++++++ licenses/editline-license.txt | 18 +++++++ licenses/fc-relicense-permission.png | Bin 0 -> 377246 bytes 12 files changed, 282 insertions(+) create mode 100644 README.LICENSE create mode 100644 licenses/Boost_License-1.0.txt create mode 100644 licenses/CMake-License.txt create mode 100644 licenses/COPYING-CMAKE-SCRIPTS create mode 100644 licenses/Cyo_License.txt create mode 100644 licenses/MIT_Thrift_LICENSE.md create mode 100644 licenses/MIT_X11_LICENSE.md create mode 100644 licenses/MIT_old.md create mode 100644 licenses/UDT_License.txt create mode 100644 licenses/ZLIB_LICENSE.md create mode 100644 licenses/editline-license.txt create mode 100644 licenses/fc-relicense-permission.png diff --git a/README.LICENSE b/README.LICENSE new file mode 100644 index 0000000..b2b7aba --- /dev/null +++ b/README.LICENSE @@ -0,0 +1,67 @@ +NOTE: + +The source code of this software was originally released by Dan Larimer without +an explicit license. According to a forum post, his intent was apparently to +publish his code as public domain: + +https://bitsharestalk.org/index.php?topic=8571.msg142379#msg142379 +> Re: Software license? +> Reply #2 on: 2014-10-31, 14:17:04 +> +> Stuff we write has no restrictions except those imposed on it by 3rd party dependencies. + +Additionally, this software package incorporates various pieces of code licensed +under the BSD or MIT licenses and their variants. This adds the additional +requirement of mentioning the respective authors and licenses in binary +distributions as well. Obviously, these licenses must also be kept in the +source. + +On 2018-02-18, Dan has kindly given us permission to relicense (see +licenses/fc-relicense-permission.png) this library under the terms of the MIT +license (see LICENSE). + + +The following additional terms have to be published along with binaries +of this software. Some of these may be used in the form of dynamically linked +libraries distributed separately, most notably libudt. In that case, +the respective licenses do not apply to the binary of this software. +Also, some of the files are only used for building binaries of this software, +without becoming an actual part of those binaries. Their respective licenses +also do not apply to the binaries. + +src/utf8 is copyright Nemanja Trifunovic and covered by the +MIT license (Thrift variant). See licenses/MIT_Thrift_LICENSE.md. + +src/crypto/base58.cpp is copyright Satoshi Nakamoto and +The Bitcoin Developers and is covered by the MIT/X11 license. +See licenses/MIT_X11_LICENSE.md. + +src/crypto/base64.cpp is copyright René Nyffenegger and covered by +the zlib/libpng license. See licenses/ZLIB_LICENSE.md. + +src/crypto/city.cpp and libraries/fc/include/fc/crypto/city.hpp are +copyright Google, Inc. and covered by the MIT/X11 license. +See licenses/MIT_X11_LICENSE.md. + +src/uint128.cpp is copyright Evan Teran and covered by the MIT +license (old style, no advertising). See licenses/MIT_old.md. + +GitVersionGen/GetGitRevisionDescription.cmake is copyright +Iowa State University and covered by the Boost Software License. +See licenses/Boost_License-1.0.txt. + +CMakeModules/FindBoost.cmake is copyright Kitware, Inc., Andreas Schneider, +Wengo, Mike Jackson, Andreas Pakulat and Philip Lowman and covered by the BSD license +(3-clause). See licenses/CMake_License.txt. + +CMakeModules/FindWt.cmake is copyright Pau Garcia i Quiles and covered by the +BSD license (3-clause). See licenses/COPYING-CMAKE-SCRIPTS. + +vendor/udt4 is copyright University of Illinois and covered by the BSD license +(3-clause). See licenses/UDT_License.txt. + +vendor/cyoencode-1.0.2 is copyright Graham Bull and covered by the BSD license +(2-clause). See licenses/Cyo_License.txt. + +vendor/editline is copyright Simmule Turner and Rich Salz and covered by a +BSD-like license. See licenses/editline.txt. diff --git a/licenses/Boost_License-1.0.txt b/licenses/Boost_License-1.0.txt new file mode 100644 index 0000000..36b7cd9 --- /dev/null +++ b/licenses/Boost_License-1.0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/licenses/CMake-License.txt b/licenses/CMake-License.txt new file mode 100644 index 0000000..3b8ece2 --- /dev/null +++ b/licenses/CMake-License.txt @@ -0,0 +1,27 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the names of Kitware, Inc., the Insight Software Consortium, + nor the names of their contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/COPYING-CMAKE-SCRIPTS b/licenses/COPYING-CMAKE-SCRIPTS new file mode 100644 index 0000000..4b41776 --- /dev/null +++ b/licenses/COPYING-CMAKE-SCRIPTS @@ -0,0 +1,22 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/Cyo_License.txt b/licenses/Cyo_License.txt new file mode 100644 index 0000000..4e10e73 --- /dev/null +++ b/licenses/Cyo_License.txt @@ -0,0 +1,27 @@ +All the files in this library are covered under the terms of the Berkeley +Software Distribution (BSD) License: + +Copyright (c) 2009-2012, Graham Bull. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/licenses/MIT_Thrift_LICENSE.md b/licenses/MIT_Thrift_LICENSE.md new file mode 100644 index 0000000..efc0574 --- /dev/null +++ b/licenses/MIT_Thrift_LICENSE.md @@ -0,0 +1,23 @@ +// Copyright 2006 Nemanja Trifunovic + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/licenses/MIT_X11_LICENSE.md b/licenses/MIT_X11_LICENSE.md new file mode 100644 index 0000000..89de354 --- /dev/null +++ b/licenses/MIT_X11_LICENSE.md @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/licenses/MIT_old.md b/licenses/MIT_old.md new file mode 100644 index 0000000..1d287fd --- /dev/null +++ b/licenses/MIT_old.md @@ -0,0 +1,9 @@ +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided +that the above copyright notice appears in all copies and that both the +copyright notice and this permission notice appear in supporting +documentation, and that the same name not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. We make no representations about the +suitability this software for any purpose. It is provided "as is" +without express or implied warranty. diff --git a/licenses/UDT_License.txt b/licenses/UDT_License.txt new file mode 100644 index 0000000..eec89df --- /dev/null +++ b/licenses/UDT_License.txt @@ -0,0 +1,32 @@ +Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the + above copyright notice, this list of conditions + and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the University of Illinois + nor the names of its contributors may be used to + endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/ZLIB_LICENSE.md b/licenses/ZLIB_LICENSE.md new file mode 100644 index 0000000..2dee6ed --- /dev/null +++ b/licenses/ZLIB_LICENSE.md @@ -0,0 +1,17 @@ +This source code is provided 'as-is', without any express or implied +warranty. In no event will the author be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this source code must not be misrepresented; you must not +claim that you wrote the original source code. If you use this source code +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original source code. + +3. This notice may not be removed or altered from any source distribution. diff --git a/licenses/editline-license.txt b/licenses/editline-license.txt new file mode 100644 index 0000000..1c0d909 --- /dev/null +++ b/licenses/editline-license.txt @@ -0,0 +1,18 @@ + Copyright 1992,1993 Simmule Turner and Rich Salz + All rights reserved. + + This software is not subject to any license of the American Telephone + and Telegraph Company or of the Regents of the University of California. + + Permission is granted to anyone to use this software for any purpose on + any computer system, and to alter it and redistribute it freely, subject + to the following restrictions: + 1. The authors are not responsible for the consequences of use of this + software, no matter how awful, even if they arise from flaws in it. + 2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. Since few users ever read sources, + credits must appear in the documentation. + 3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. Since few users + ever read sources, credits must appear in the documentation. + 4. This notice may not be removed or altered. diff --git a/licenses/fc-relicense-permission.png b/licenses/fc-relicense-permission.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2d5454df7d26267942cff5fb043691b90dd11a GIT binary patch literal 377246 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 literal 0 HcmV?d00001 From 9c3428096a2b7c3026a4e0a2883f511f38ab72ac Mon Sep 17 00:00:00 2001 From: abitmore Date: Wed, 7 Mar 2018 09:21:28 -0500 Subject: [PATCH 087/117] Update copyright notice --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 1a421df..f775075 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 bitshares-fc +Copyright (c) 2013-2018 Daniel Larimer and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 8c9b8a95f5dd60a13f045cac80655ec7027d413a Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 2 Nov 2019 19:13:27 +0100 Subject: [PATCH 088/117] Updated license file --- LICENSE | 21 -- LICENSE.md | 50 +++++ README.LICENSE | 67 ------ licenses/Apache.txt | 311 +++++++++++++++++++++++++++ licenses/CMake-License.txt | 27 --- licenses/Cyo_License.txt | 27 --- licenses/MIT_old.md | 9 - licenses/UDT_License.txt | 32 --- licenses/editline-license.txt | 18 -- licenses/fc-relicense-permission.png | Bin 377246 -> 0 bytes 10 files changed, 361 insertions(+), 201 deletions(-) delete mode 100644 LICENSE create mode 100644 LICENSE.md delete mode 100644 README.LICENSE create mode 100644 licenses/Apache.txt delete mode 100644 licenses/CMake-License.txt delete mode 100644 licenses/Cyo_License.txt delete mode 100644 licenses/MIT_old.md delete mode 100644 licenses/UDT_License.txt delete mode 100644 licenses/editline-license.txt delete mode 100644 licenses/fc-relicense-permission.png diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f775075..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2013-2018 Daniel Larimer and contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..1e2bd60 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,50 @@ +The following license only applies to code that was contributed to this repository under the regime of BitShares worker proposals and/or BitShares delegate workers. Other code may be licensed indirectly by our "sister" repositories https://github.com/EOSIO/fc and https://github.com/bytemaster/fc/tree/phoenix . + +Furthermore, this repository includes code from third party authors. See the list at the end of this file. + +---- + +Copyright (c) 2018-2019 BitShares Blockchain Foundation and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---- + +The following terms apply to third-party code included here. Most have to be published along with binaries of this software. +Some of the files are only used for building binaries of this software, without becoming an actual part of those binaries. Their respective licenses also do not apply to the binaries. + +include/bloom_filter.hpp is copyright Arash Partow and covered by the MIT license. See http://www.opensource.org/licenses/MIT . + +src/utf8 is copyright Nemanja Trifunovic and covered by the MIT license (Thrift variant). See licenses/MIT_Thrift_LICENSE.md. + +src/crypto/base58.cpp is copyright Satoshi Nakamoto and The Bitcoin Developers and is covered by the MIT/X11 license. See licenses/MIT_X11_LICENSE.md. + +src/crypto/base64.cpp is copyright René Nyffenegger and covered by the zlib/libpng license. See licenses/ZLIB_LICENSE.md. + +src/crypto/city.cpp and libraries/fc/include/fc/crypto/city.hpp are copyright Google, Inc. and covered by the MIT/X11 license. See licenses/MIT_X11_LICENSE.md. + +CMakeModules/CheckLibcxxAtomic.cmake was taken from the LLVM repository and is licensed under the Apache-2.0 license. See licenses/Apache.txt . + +GitVersionGen/GetGitRevisionDescription.cmake is copyright Iowa State University and covered by the Boost Software License. See licenses/Boost_License-1.0.txt. + +vendor/editline is copyright Simmule Turner and Rich Salz and covered by a BSD-like license. See vendor/editline/LICENSE. + +vendor/secp256k1-zkp is copyright Pieter Wuille and covered by the MIT/X11 license. See vendor/secp256k1-zkp/COPYING. + +vendor/websocketpp is copyright Peter Thorson and covered by a 3-clause BSD-license. It also includes code from 4th-party authors with various copyrights, see vendor/websocketpp/COPYING. diff --git a/README.LICENSE b/README.LICENSE deleted file mode 100644 index b2b7aba..0000000 --- a/README.LICENSE +++ /dev/null @@ -1,67 +0,0 @@ -NOTE: - -The source code of this software was originally released by Dan Larimer without -an explicit license. According to a forum post, his intent was apparently to -publish his code as public domain: - -https://bitsharestalk.org/index.php?topic=8571.msg142379#msg142379 -> Re: Software license? -> Reply #2 on: 2014-10-31, 14:17:04 -> -> Stuff we write has no restrictions except those imposed on it by 3rd party dependencies. - -Additionally, this software package incorporates various pieces of code licensed -under the BSD or MIT licenses and their variants. This adds the additional -requirement of mentioning the respective authors and licenses in binary -distributions as well. Obviously, these licenses must also be kept in the -source. - -On 2018-02-18, Dan has kindly given us permission to relicense (see -licenses/fc-relicense-permission.png) this library under the terms of the MIT -license (see LICENSE). - - -The following additional terms have to be published along with binaries -of this software. Some of these may be used in the form of dynamically linked -libraries distributed separately, most notably libudt. In that case, -the respective licenses do not apply to the binary of this software. -Also, some of the files are only used for building binaries of this software, -without becoming an actual part of those binaries. Their respective licenses -also do not apply to the binaries. - -src/utf8 is copyright Nemanja Trifunovic and covered by the -MIT license (Thrift variant). See licenses/MIT_Thrift_LICENSE.md. - -src/crypto/base58.cpp is copyright Satoshi Nakamoto and -The Bitcoin Developers and is covered by the MIT/X11 license. -See licenses/MIT_X11_LICENSE.md. - -src/crypto/base64.cpp is copyright René Nyffenegger and covered by -the zlib/libpng license. See licenses/ZLIB_LICENSE.md. - -src/crypto/city.cpp and libraries/fc/include/fc/crypto/city.hpp are -copyright Google, Inc. and covered by the MIT/X11 license. -See licenses/MIT_X11_LICENSE.md. - -src/uint128.cpp is copyright Evan Teran and covered by the MIT -license (old style, no advertising). See licenses/MIT_old.md. - -GitVersionGen/GetGitRevisionDescription.cmake is copyright -Iowa State University and covered by the Boost Software License. -See licenses/Boost_License-1.0.txt. - -CMakeModules/FindBoost.cmake is copyright Kitware, Inc., Andreas Schneider, -Wengo, Mike Jackson, Andreas Pakulat and Philip Lowman and covered by the BSD license -(3-clause). See licenses/CMake_License.txt. - -CMakeModules/FindWt.cmake is copyright Pau Garcia i Quiles and covered by the -BSD license (3-clause). See licenses/COPYING-CMAKE-SCRIPTS. - -vendor/udt4 is copyright University of Illinois and covered by the BSD license -(3-clause). See licenses/UDT_License.txt. - -vendor/cyoencode-1.0.2 is copyright Graham Bull and covered by the BSD license -(2-clause). See licenses/Cyo_License.txt. - -vendor/editline is copyright Simmule Turner and Rich Salz and covered by a -BSD-like license. See licenses/editline.txt. diff --git a/licenses/Apache.txt b/licenses/Apache.txt new file mode 100644 index 0000000..e159d28 --- /dev/null +++ b/licenses/Apache.txt @@ -0,0 +1,311 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== + +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/licenses/CMake-License.txt b/licenses/CMake-License.txt deleted file mode 100644 index 3b8ece2..0000000 --- a/licenses/CMake-License.txt +++ /dev/null @@ -1,27 +0,0 @@ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the names of Kitware, Inc., the Insight Software Consortium, - nor the names of their contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/Cyo_License.txt b/licenses/Cyo_License.txt deleted file mode 100644 index 4e10e73..0000000 --- a/licenses/Cyo_License.txt +++ /dev/null @@ -1,27 +0,0 @@ -All the files in this library are covered under the terms of the Berkeley -Software Distribution (BSD) License: - -Copyright (c) 2009-2012, Graham Bull. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/licenses/MIT_old.md b/licenses/MIT_old.md deleted file mode 100644 index 1d287fd..0000000 --- a/licenses/MIT_old.md +++ /dev/null @@ -1,9 +0,0 @@ -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, provided -that the above copyright notice appears in all copies and that both the -copyright notice and this permission notice appear in supporting -documentation, and that the same name not be used in advertising or -publicity pertaining to distribution of the software without specific, -written prior permission. We make no representations about the -suitability this software for any purpose. It is provided "as is" -without express or implied warranty. diff --git a/licenses/UDT_License.txt b/licenses/UDT_License.txt deleted file mode 100644 index eec89df..0000000 --- a/licenses/UDT_License.txt +++ /dev/null @@ -1,32 +0,0 @@ -Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the - above copyright notice, this list of conditions - and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the University of Illinois - nor the names of its contributors may be used to - endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/editline-license.txt b/licenses/editline-license.txt deleted file mode 100644 index 1c0d909..0000000 --- a/licenses/editline-license.txt +++ /dev/null @@ -1,18 +0,0 @@ - Copyright 1992,1993 Simmule Turner and Rich Salz - All rights reserved. - - This software is not subject to any license of the American Telephone - and Telegraph Company or of the Regents of the University of California. - - Permission is granted to anyone to use this software for any purpose on - any computer system, and to alter it and redistribute it freely, subject - to the following restrictions: - 1. The authors are not responsible for the consequences of use of this - software, no matter how awful, even if they arise from flaws in it. - 2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. Since few users ever read sources, - credits must appear in the documentation. - 3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. Since few users - ever read sources, credits must appear in the documentation. - 4. This notice may not be removed or altered. diff --git a/licenses/fc-relicense-permission.png b/licenses/fc-relicense-permission.png deleted file mode 100644 index 8e2d5454df7d26267942cff5fb043691b90dd11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377246 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 From 0633515d7be9fe3cf3fa71b2dcc0aff8219bf9fa Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 2 Nov 2019 19:13:40 +0100 Subject: [PATCH 089/117] Fixed stacktrace license --- include/fc/stacktrace.hpp | 28 +++++++++++++++++++++++----- src/stacktrace.cpp | 27 ++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/include/fc/stacktrace.hpp b/include/fc/stacktrace.hpp index 1918b0c..843e5c3 100644 --- a/include/fc/stacktrace.hpp +++ b/include/fc/stacktrace.hpp @@ -1,8 +1,26 @@ -// stacktrace.h (c) 2008, Timo Bingmann from http://idlebox.net/ -// published under the WTFPL v2.0 - -// Downloaded from http://panthema.net/2008/0901-stacktrace-demangled/ -// and modified for C++ and FC by Steemit, Inc. +/* + * Copyright (c) 2018 BitShares Blockchain Foundation, and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ #pragma once diff --git a/src/stacktrace.cpp b/src/stacktrace.cpp index 910b48f..e2d3a96 100644 --- a/src/stacktrace.cpp +++ b/src/stacktrace.cpp @@ -1,6 +1,27 @@ -// -// A stacktrace handler for bitshares -// +/* + * Copyright (c) 2018-2019 BitShares Blockchain Foundation, and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + #include #include From ca43b6c6df082cfcd211b3e5c182860ea2687edd Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 2 Nov 2019 20:23:29 +0100 Subject: [PATCH 090/117] License clarification --- LICENSE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LICENSE.md b/LICENSE.md index 1e2bd60..77a4d2c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,7 @@ The following license only applies to code that was contributed to this repository under the regime of BitShares worker proposals and/or BitShares delegate workers. Other code may be licensed indirectly by our "sister" repositories https://github.com/EOSIO/fc and https://github.com/bytemaster/fc/tree/phoenix . +All subsequent contributions to this repository are licensed by their respective authors under this same license as well, unless explicitly stated otherwise. + Furthermore, this repository includes code from third party authors. See the list at the end of this file. ---- From 61f16df040e0b515d5bd412dabf50392b08bcf61 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Thu, 7 Nov 2019 13:18:49 +0100 Subject: [PATCH 091/117] Replaced "regime" --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 77a4d2c..cc2417d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -The following license only applies to code that was contributed to this repository under the regime of BitShares worker proposals and/or BitShares delegate workers. Other code may be licensed indirectly by our "sister" repositories https://github.com/EOSIO/fc and https://github.com/bytemaster/fc/tree/phoenix . +The following license only applies to code that was contributed to this repository in the context of BitShares worker proposals and/or BitShares-1 delegate workers. Other code may be licensed indirectly by our "sister" repositories https://github.com/EOSIO/fc and https://github.com/bytemaster/fc/tree/phoenix . All subsequent contributions to this repository are licensed by their respective authors under this same license as well, unless explicitly stated otherwise. From 1d028b3c15613fe54fadd626cb4ccb0030ab9630 Mon Sep 17 00:00:00 2001 From: Abit Date: Fri, 8 Nov 2019 12:13:36 +0100 Subject: [PATCH 092/117] Fix potential out-of-bounds access Thanks to Beosin(https://github.com/Lianantech) --- src/network/http/http_connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/http/http_connection.cpp b/src/network/http/http_connection.cpp index a870ff5..29a0f56 100644 --- a/src/network/http/http_connection.cpp +++ b/src/network/http/http_connection.cpp @@ -185,7 +185,7 @@ std::vector
parse_urlencoded_params( const std::string& f ) { std::vector
h(num_args); int arg = 0; for( size_t i = 0; i < f.size(); ++i ) { - while( f[i] != '=' && i < f.size() ) { + while( i < f.size() && f[i] != '=' ) { if( f[i] == '%' ) { h[arg].key += char((fc::from_hex(f[i+1]) << 4) | fc::from_hex(f[i+2])); i += 3; From 0e0bc446517124150bfd95b71763c3624328cd98 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 18 Nov 2019 11:33:29 +0100 Subject: [PATCH 093/117] Added initial workflow --- .github/workflows/build-and-test.yml | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/build-and-test.yml diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 0000000..9639aea --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,60 @@ +on: [ push, pull_request ] +jobs: + test-release: + name: Build and run tests in Release mode + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + with: + submodules: recursive + - name: Configure + run: | + mkdir -p _build + pushd _build + cmake -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ + -D CMAKE_C_COMPILER=gcc \ + -D CMAKE_CXX_COMPILER=g++ \ + .. + popd + - name: Build + run: | + make -C _build + - name: Test + run: | + pushd _build + tests/all_tests + tests/bloom_test ../README.md + tests/ecc_test ../README.md + tests/hmac_test + tests/task_cancel_test + popd + test-debug: + name: Build and run tests in Debug mode + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + with: + submodules: recursive + - name: Configure + run: | + mkdir -p _build + pushd _build + cmake -D CMAKE_BUILD_TYPE=Debug \ + -D CMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ + -D CMAKE_C_COMPILER=gcc \ + -D CMAKE_CXX_COMPILER=g++ \ + .. + popd + - name: Build + run: | + make -C _build + - name: Test + run: | + pushd _build + tests/all_tests + tests/bloom_test ../README.md + tests/ecc_test ../README.md + tests/hmac_test + tests/task_cancel_test + popd From 453345cedf87b655f853590d5870d209f02b9528 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 18 Nov 2019 11:40:49 +0100 Subject: [PATCH 094/117] Install boost --- .github/workflows/build-and-test.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 9639aea..889fede 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -4,6 +4,20 @@ jobs: name: Build and run tests in Release mode runs-on: ubuntu-latest steps: + - name: Install dependencies + run: | + sudo apt-get install -y \ + libboost-thread-dev \ + libboost-iostreams-dev \ + libboost-date-time-dev \ + libboost-system-dev \ + libboost-filesystem-dev \ + libboost-program-options-dev \ + libboost-chrono-dev \ + libboost-test-dev \ + libboost-context-dev \ + libboost-regex-dev \ + libboost-coroutine-dev - uses: actions/checkout@v1 with: submodules: recursive @@ -33,6 +47,20 @@ jobs: name: Build and run tests in Debug mode runs-on: ubuntu-latest steps: + - name: Install dependencies + run: | + sudo apt-get install -y \ + libboost-thread-dev \ + libboost-iostreams-dev \ + libboost-date-time-dev \ + libboost-system-dev \ + libboost-filesystem-dev \ + libboost-program-options-dev \ + libboost-chrono-dev \ + libboost-test-dev \ + libboost-context-dev \ + libboost-regex-dev \ + libboost-coroutine-dev - uses: actions/checkout@v1 with: submodules: recursive From 540a99670bf146b8eebb2f735d9ab96aa61ec657 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 18 Nov 2019 12:08:41 +0100 Subject: [PATCH 095/117] Build and run in parallel --- .github/workflows/build-and-test.yml | 34 +++++++++++++++------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 889fede..8608b63 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -7,6 +7,7 @@ jobs: - name: Install dependencies run: | sudo apt-get install -y \ + parallel \ libboost-thread-dev \ libboost-iostreams-dev \ libboost-date-time-dev \ @@ -33,16 +34,16 @@ jobs: popd - name: Build run: | - make -C _build + make -j 2 -C _build - name: Test run: | - pushd _build - tests/all_tests - tests/bloom_test ../README.md - tests/ecc_test ../README.md - tests/hmac_test - tests/task_cancel_test - popd + parallel echo Running {}\; sh -c "_build/tests/{}" <<_EOT_ + all_tests + bloom_test README.md + ecc_test README.md + hmac_test + task_cancel_test + _EOT_ test-debug: name: Build and run tests in Debug mode runs-on: ubuntu-latest @@ -50,6 +51,7 @@ jobs: - name: Install dependencies run: | sudo apt-get install -y \ + parallel \ libboost-thread-dev \ libboost-iostreams-dev \ libboost-date-time-dev \ @@ -76,13 +78,13 @@ jobs: popd - name: Build run: | - make -C _build + make -j 2 -C _build - name: Test run: | - pushd _build - tests/all_tests - tests/bloom_test ../README.md - tests/ecc_test ../README.md - tests/hmac_test - tests/task_cancel_test - popd + parallel echo Running {}\; sh -c "_build/tests/{}" <<_EOT_ + all_tests + bloom_test README.md + ecc_test README.md + hmac_test + task_cancel_test + _EOT_ From f7f64ee1fd23b0cf98e7e12d787c3dbeedc81e3c Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 18 Nov 2019 12:09:18 +0100 Subject: [PATCH 096/117] Add ccache --- .github/workflows/build-and-test.yml | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 8608b63..56b1cd4 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -1,4 +1,7 @@ on: [ push, pull_request ] +env: + CCACHE_COMPRESS: exists means true + CCACHE_SLOPPINESS: include_file_ctime,include_file_mtime,time_macros jobs: test-release: name: Build and run tests in Release mode @@ -7,6 +10,7 @@ jobs: - name: Install dependencies run: | sudo apt-get install -y \ + ccache \ parallel \ libboost-thread-dev \ libboost-iostreams-dev \ @@ -29,11 +33,24 @@ jobs: cmake -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ -D CMAKE_C_COMPILER=gcc \ + -D CMAKE_C_COMPILER_LAUNCHER=ccache \ -D CMAKE_CXX_COMPILER=g++ \ + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ .. popd + - name: Load Cache + uses: actions/cache@v1 + with: + path: ccache + key: ccache-release-${{ github.ref }}-${{ github.sha }} + restore-keys: | + ccache-release-${{ github.ref }}- + ccache-release- + ccache- - name: Build run: | + export CCACHE_DIR="$GITHUB_WORKSPACE/ccache" + mkdir -p "$CCACHE_DIR" make -j 2 -C _build - name: Test run: | @@ -51,6 +68,7 @@ jobs: - name: Install dependencies run: | sudo apt-get install -y \ + ccache \ parallel \ libboost-thread-dev \ libboost-iostreams-dev \ @@ -73,11 +91,24 @@ jobs: cmake -D CMAKE_BUILD_TYPE=Debug \ -D CMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ -D CMAKE_C_COMPILER=gcc \ + -D CMAKE_C_COMPILER_LAUNCHER=ccache \ -D CMAKE_CXX_COMPILER=g++ \ + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ .. popd + - name: Load Cache + uses: actions/cache@v1 + with: + path: ccache + key: ccache-debug-${{ github.ref }}-${{ github.sha }} + restore-keys: | + ccache-debug-${{ github.ref }}- + ccache-debug- + ccache- - name: Build run: | + export CCACHE_DIR="$GITHUB_WORKSPACE/ccache" + mkdir -p "$CCACHE_DIR" make -j 2 -C _build - name: Test run: | From 005aa69c0a97edcc9e8eb887f8b4be8e090b8299 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 18 Nov 2019 14:03:07 +0100 Subject: [PATCH 097/117] Attempt to fix tests --- .github/workflows/build-and-test.yml | 4 ++-- tests/crypto/dh_test.cpp | 2 +- tests/stacktrace_test.cpp | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 56b1cd4..c346f5e 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -56,7 +56,7 @@ jobs: run: | parallel echo Running {}\; sh -c "_build/tests/{}" <<_EOT_ all_tests - bloom_test README.md + bloom_test -- README.md ecc_test README.md hmac_test task_cancel_test @@ -114,7 +114,7 @@ jobs: run: | parallel echo Running {}\; sh -c "_build/tests/{}" <<_EOT_ all_tests - bloom_test README.md + bloom_test -- README.md ecc_test README.md hmac_test task_cancel_test diff --git a/tests/crypto/dh_test.cpp b/tests/crypto/dh_test.cpp index bc38cc4..a6d9d25 100644 --- a/tests/crypto/dh_test.cpp +++ b/tests/crypto/dh_test.cpp @@ -50,7 +50,7 @@ BOOST_AUTO_TEST_CASE(dh_test) alice.p.clear(); alice.p.push_back(100); alice.p.push_back(2); BOOST_CHECK( !alice.validate() ); alice.p = bob.p; - alice.g = 9; + alice.g = 1; BOOST_CHECK( !alice.validate() ); } diff --git a/tests/stacktrace_test.cpp b/tests/stacktrace_test.cpp index 452a63e..feb5790 100644 --- a/tests/stacktrace_test.cpp +++ b/tests/stacktrace_test.cpp @@ -64,17 +64,18 @@ public: BOOST_AUTO_TEST_CASE(static_variant_depth_test) { int64_t i = 1; - fc::static_variant test(i); + fc::static_variant,std::vector,std::vector, + uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t> test(i); std::string stacktrace = test.visit( _svdt_visitor() ); - //std::cerr << stacktrace << "\n"; + std::cerr << stacktrace << "\n"; std::vector lines; boost::split( lines, stacktrace, boost::is_any_of("\n") ); int count = 0; for( const auto& line : lines ) if( line.find("_svdt_visitor") != std::string::npos ) count++; - BOOST_CHECK_LT( 2, count ); // test.visit(), static_variant::visit, function object, visitor - BOOST_CHECK_GT( 8, count ); // some is implementation-dependent + BOOST_CHECK_LT( 1, count ); // The actual count depends on compiler and optimization settings. + BOOST_CHECK_GT( 10, count ); // It *should* be less than the number of static variant components. } #endif From 7981ab08f5e2046a61df93bd641b7eab6141416b Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 25 Nov 2019 15:03:46 +0100 Subject: [PATCH 098/117] Added badge to README --- .github/workflows/build-and-test.yml | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index c346f5e..3961f9f 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -1,3 +1,4 @@ +name: Github Autobuild on: [ push, pull_request ] env: CCACHE_COMPRESS: exists means true diff --git a/README.md b/README.md index e528ef8..7f38366 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ fc == [![](https://travis-ci.org/bitshares/bitshares-fc.svg?branch=master)](https://travis-ci.org/bitshares/bitshares-fc) +[https://github.com/bitshares/bitshares-fc/workflows/Github%20Autobuild/badge.svg?branch=master](https://github.com/bitshares/bitshares-fc/actions?query=branch%3Amaster) **NOTE:** This fork reverts upstream commit a421e280488385cab26a42153f7ce3c8d5b6281f to avoid changing the BitShares API. From 56d9e4d968930554b7e1c55044678d2862398ea6 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 26 Nov 2019 08:26:16 +0100 Subject: [PATCH 099/117] Fix for OSX build --- include/fc/reflect/typename.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/fc/reflect/typename.hpp b/include/fc/reflect/typename.hpp index 15b8523..23a116b 100644 --- a/include/fc/reflect/typename.hpp +++ b/include/fc/reflect/typename.hpp @@ -18,6 +18,9 @@ namespace fc { namespace ip { class address; } template struct get_typename; +#if defined(__APPLE__) or defined(__OpenBSD__) + template<> struct get_typename { static const char* name() { return "size_t"; } }; +#endif template<> struct get_typename { static const char* name() { return "int32_t"; } }; template<> struct get_typename { static const char* name() { return "int64_t"; } }; template<> struct get_typename { static const char* name() { return "int16_t"; } }; From 6e5fe1f5508d9b328d91ea4517136d2b01b7c5a6 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 29 Nov 2019 17:45:19 +0100 Subject: [PATCH 100/117] Fixed badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f38366..87d504a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ fc == [![](https://travis-ci.org/bitshares/bitshares-fc.svg?branch=master)](https://travis-ci.org/bitshares/bitshares-fc) -[https://github.com/bitshares/bitshares-fc/workflows/Github%20Autobuild/badge.svg?branch=master](https://github.com/bitshares/bitshares-fc/actions?query=branch%3Amaster) +[![](https://github.com/bitshares/bitshares-fc/workflows/Github%20Autobuild/badge.svg?branch=master)](https://github.com/bitshares/bitshares-fc/actions?query=branch%3Amaster) **NOTE:** This fork reverts upstream commit a421e280488385cab26a42153f7ce3c8d5b6281f to avoid changing the BitShares API. From 3b7e67a3dcb8693b017e866eeb36a40008a66713 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 10 Dec 2019 15:41:08 +0100 Subject: [PATCH 101/117] Fixed busy-wait in delete_files --- src/log/file_appender.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/log/file_appender.cpp b/src/log/file_appender.cpp index aec6bec..46b804b 100644 --- a/src/log/file_appender.cpp +++ b/src/log/file_appender.cpp @@ -133,7 +133,9 @@ namespace fc { { } } - _deletion_task = schedule( [this]() { delete_files(); }, start_time + _interval_seconds, + uint64_t next_file = time_point::now().sec_since_epoch() / _interval_seconds + 1; + _deletion_task = schedule( [this]() { delete_files(); }, + fc::time_point_sec( next_file * _interval_seconds), "delete_files(3)" ); } }; From f221ca32106f8847a3fe50d8d0c8f8cf7ed0d1bb Mon Sep 17 00:00:00 2001 From: Abit Date: Mon, 24 Feb 2020 18:00:03 +0100 Subject: [PATCH 102/117] Fix Github auto-build Remove the predefined boost related environment variables. --- .github/workflows/build-and-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 3961f9f..adbe476 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -31,6 +31,7 @@ jobs: run: | mkdir -p _build pushd _build + export -n BOOST_ROOT BOOST_INCLUDEDIR BOOST_LIBRARYDIR cmake -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ -D CMAKE_C_COMPILER=gcc \ @@ -89,6 +90,7 @@ jobs: run: | mkdir -p _build pushd _build + export -n BOOST_ROOT BOOST_INCLUDEDIR BOOST_LIBRARYDIR cmake -D CMAKE_BUILD_TYPE=Debug \ -D CMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON \ -D CMAKE_C_COMPILER=gcc \ From 142b7eb4c6dc4fb1e00cd88183c5ea654ae5849e Mon Sep 17 00:00:00 2001 From: Abit Date: Fri, 21 Feb 2020 12:52:25 +0100 Subject: [PATCH 103/117] Return a user-friendly msg on RPC execution error --- src/rpc/websocket_api.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rpc/websocket_api.cpp b/src/rpc/websocket_api.cpp index da97a9e..10fe081 100644 --- a/src/rpc/websocket_api.cpp +++ b/src/rpc/websocket_api.cpp @@ -221,7 +221,8 @@ response websocket_api_connection::on_request( const variant& var ) catch ( const fc::exception& e ) { if( has_id ) - return response( call.id, error_object{ e.code(), "Execution error", variant( e, _max_conversion_depth ) }, + return response( call.id, error_object{ e.code(), "Execution error: " + e.to_string(), + variant( e, _max_conversion_depth ) }, call.jsonrpc ); } catch ( const std::exception& e ) From cb06e42e800f9c639dab981dd2518098c5828e55 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Tue, 17 Mar 2020 14:42:13 -0500 Subject: [PATCH 104/117] Fix Build This is necessary to build in my environment for both clang and g++ Clang 9.0.1 G++ 9.2.1 Boost 1.72.0 --- include/fc/io/raw.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/fc/io/raw.hpp b/include/fc/io/raw.hpp index 6b0371b..c41cc86 100644 --- a/include/fc/io/raw.hpp +++ b/include/fc/io/raw.hpp @@ -31,7 +31,7 @@ namespace fc { boost::endian::little_uint64_buf_at hilo[2]; hilo[0] = uint128_hi64( v ); hilo[1] = uint128_lo64( v ); - s.write( hilo[0].data(), sizeof(hilo) ); + s.write( (char*)hilo[0].data(), sizeof(hilo) ); } template inline void unpack( Stream& s, uint128_t& v, uint32_t _max_depth ) @@ -731,7 +731,7 @@ namespace fc { void pack( Stream& s, const boost::endian::endian_buffer& v, uint32_t _max_depth ) { FC_ASSERT( _max_depth > 0 ); - s.write( v.data(), sizeof(v) ); + s.write( (char*)v.data(), sizeof(v) ); } template void unpack( Stream& s, boost::endian::endian_buffer& v, uint32_t _max_depth ) From 2b1980a30af96be821bd13137b98d75a576b6122 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Tue, 17 Mar 2020 14:45:31 -0500 Subject: [PATCH 105/117] Fix Build Definitely something strange going on here, as in my environment the value of Boost_UNIT_TEST_FRAMEWORK_LIBRARY is "Boost::unit_test_framework"... So this is my fix, but probably something else should be done. Boost 1.72.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 092d74d..b7210db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -350,7 +350,7 @@ elseif(WIN32 AND MINGW) endif() -IF(NOT Boost_UNIT_TEST_FRAMEWORK_LIBRARY MATCHES "\\.(a|lib)$") +IF(Boost_UNIT_TEST_FRAMEWORK_LIBRARY MATCHES "\\.(so|dll)$") IF(MSVC) add_definitions(/DBOOST_TEST_DYN_LINK) ELSE(MSVC) From 9763d1c1945b1c246d947cae69094e91e5b14e9c Mon Sep 17 00:00:00 2001 From: abitmore Date: Thu, 26 Mar 2020 16:27:59 +0000 Subject: [PATCH 106/117] Update bool serialization Make the logic clearer, to avoid issues on some compilers. Thanks to @pureland and team. --- include/fc/io/raw.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/io/raw.hpp b/include/fc/io/raw.hpp index 6b0371b..ffd1ad5 100644 --- a/include/fc/io/raw.hpp +++ b/include/fc/io/raw.hpp @@ -307,7 +307,7 @@ namespace fc { template inline void pack( Stream& s, const bool& v, uint32_t _max_depth ) { FC_ASSERT( _max_depth > 0 ); - fc::raw::pack( s, uint8_t(v), _max_depth - 1 ); + fc::raw::pack( s, v ? uint8_t(1) : uint8_t(0), _max_depth - 1 ); } template inline void unpack( Stream& s, bool& v, uint32_t _max_depth ) { From cc1103fe454b4aedc161d08869381cc77e397615 Mon Sep 17 00:00:00 2001 From: abitmore Date: Sat, 28 Mar 2020 16:05:03 +0000 Subject: [PATCH 107/117] Fix potential infinity loop Fix exception::to_detail_string(...) --- src/exception.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exception.cpp b/src/exception.cpp index 01d2615..aff58c9 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -205,12 +205,12 @@ namespace fc ss << "ERROR: Failed to convert log data to string!\n"; } ss << " " << itr->get_context().to_string(); - ++itr; } catch( std::bad_alloc& ) { throw; } catch( ... ) { ss << "<- exception in to_detail_string."; } + ++itr; if( itr != my->_elog.end() ) ss<<"\n"; } } catch( std::bad_alloc& ) { From 34ddc2b859a7f40367d9928c09d1fedbaa95f13c Mon Sep 17 00:00:00 2001 From: abitmore Date: Sat, 28 Mar 2020 17:12:43 +0000 Subject: [PATCH 108/117] Update to_variant(size_t) for macOS and OpenBSD Fix to_variant(size_t) for OpenBSD, move implementation for macOS to cpp file --- include/fc/variant.hpp | 4 +--- src/variant.cpp | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index 79d0a04..f0c8f25 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -581,9 +581,7 @@ namespace fc memset( this, 0, sizeof(*this) ); to_variant( val, *this, max_depth ); } - #ifdef __APPLE__ - inline void to_variant( size_t s, variant& v, uint32_t max_depth ) { v = variant(uint64_t(s)); } - #endif + template void to_variant( const std::shared_ptr& var, variant& vo, uint32_t max_depth ) { diff --git a/src/variant.cpp b/src/variant.cpp index eaa12d3..a4d09b1 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -701,9 +701,8 @@ void from_variant( const variant& var, uint128_t& vo, uint32_t max_depth ) #endif } -#if defined(__APPLE__) -#elif defined(__OpenBSD__) - void to_variant( size_t s, variant& v, uint32_t max_depth ) { v = variant( int64_t(s) ); } +#if defined(__APPLE__) or defined(__OpenBSD__) + void to_variant( size_t s, variant& v, uint32_t max_depth ) { v = variant( uint64_t(s) ); } #elif !defined(_WIN32) void to_variant( long long int s, variant& v, uint32_t max_depth ) { v = variant( int64_t(s) ); } void to_variant( unsigned long long int s, variant& v, uint32_t max_depth ) { v = variant( uint64_t(s)); } From 98a16ce397a97a5ff0f950fb2cca29fabb2371f8 Mon Sep 17 00:00:00 2001 From: abitmore Date: Sun, 29 Mar 2020 20:40:16 +0000 Subject: [PATCH 109/117] Replace int with 64-bit types in static_variant --- include/fc/static_variant.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 88069d0..768231a 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -118,7 +118,7 @@ public: template> struct tag { - static constexpr int value = typelist::index_of(); + static constexpr tag_type value = typelist::index_of(); }; struct type_lt { @@ -302,7 +302,7 @@ public: }); } - static constexpr int count() { return typelist::length(); } + static constexpr size_t count() { return typelist::length(); } void set_which( tag_type w ) { FC_ASSERT( w >= 0 ); FC_ASSERT( w < count() ); From ca3e76d226a8d51369d503bb195e72ec42d314a7 Mon Sep 17 00:00:00 2001 From: abitmore Date: Mon, 6 Apr 2020 15:16:12 +0000 Subject: [PATCH 110/117] Fix compiler warnings about static_variant --- include/fc/static_variant.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/fc/static_variant.hpp b/include/fc/static_variant.hpp index 768231a..452b090 100644 --- a/include/fc/static_variant.hpp +++ b/include/fc/static_variant.hpp @@ -75,7 +75,7 @@ protected: void init_from_tag(tag_type tag) { FC_ASSERT( tag >= 0 ); - FC_ASSERT( tag < count() ); + FC_ASSERT( static_cast(tag) < count() ); _tag = tag; typelist::runtime::dispatch(list(), tag, [this](auto t) { using T = typename decltype(t)::type; @@ -269,7 +269,7 @@ public: template static typename visitor::result_type visit( tag_type tag, visitor& v, void* data ) { - FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); + FC_ASSERT( tag >= 0 && static_cast(tag) < count(), "Unsupported type ${tag}!", ("tag",tag) ); return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { return v(*reinterpret_cast(data)); }); @@ -278,7 +278,7 @@ public: template static typename visitor::result_type visit( tag_type tag, const visitor& v, void* data ) { - FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); + FC_ASSERT( tag >= 0 && static_cast(tag) < count(), "Unsupported type ${tag}!", ("tag",tag) ); return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { return v(*reinterpret_cast(data)); }); @@ -287,7 +287,7 @@ public: template static typename visitor::result_type visit( tag_type tag, visitor& v, const void* data ) { - FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); + FC_ASSERT( tag >= 0 && static_cast(tag) < count(), "Unsupported type ${tag}!", ("tag",tag) ); return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { return v(*reinterpret_cast(data)); }); @@ -296,18 +296,18 @@ public: template static typename visitor::result_type visit( tag_type tag, const visitor& v, const void* data ) { - FC_ASSERT( tag >= 0 && tag < count(), "Unsupported type ${tag}!", ("tag",tag) ); + FC_ASSERT( tag >= 0 && static_cast(tag) < count(), "Unsupported type ${tag}!", ("tag",tag) ); return typelist::runtime::dispatch(list(), tag, [&v, data](auto t) { return v(*reinterpret_cast(data)); }); } static constexpr size_t count() { return typelist::length(); } - void set_which( tag_type w ) { - FC_ASSERT( w >= 0 ); - FC_ASSERT( w < count() ); + void set_which( tag_type tag ) { + FC_ASSERT( tag >= 0 ); + FC_ASSERT( static_cast(tag) < count() ); clean(); - init_from_tag(w); + init_from_tag(tag); } tag_type which() const {return _tag;} From 9505342dbf64132f334169edb52f3ce1174167b7 Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 14 Apr 2020 11:25:00 -0500 Subject: [PATCH 111/117] improve hash160 performance --- include/fc/crypto/hash160.hpp | 5 +++-- src/crypto/hash160.cpp | 11 +++-------- tests/stacktrace_test.cpp | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/include/fc/crypto/hash160.hpp b/include/fc/crypto/hash160.hpp index 75604f8..4edb718 100644 --- a/include/fc/crypto/hash160.hpp +++ b/include/fc/crypto/hash160.hpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #pragma once +#include #include #include #include @@ -39,7 +40,7 @@ class hash160 explicit operator string()const; char* data() const; - size_t data_size() const { return 160/8; } + static constexpr size_t data_size() { return 160/8; } static hash160 hash( const char* d, uint32_t dlen ); static hash160 hash( const string& ); @@ -66,7 +67,7 @@ class hash160 private: class impl; fc::fwd my; - std::vector bytes; + SHA256_CTX sha_ctx;; }; template diff --git a/src/crypto/hash160.cpp b/src/crypto/hash160.cpp index 68c4191..9d64503 100644 --- a/src/crypto/hash160.cpp +++ b/src/crypto/hash160.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include #include @@ -55,7 +54,7 @@ class hash160::encoder::impl { }; hash160::encoder::~encoder() {} -hash160::encoder::encoder() {} +hash160::encoder::encoder() { SHA256_Init(&sha_ctx); } hash160 hash160::hash( const char* d, uint32_t dlen ) { encoder e; @@ -69,15 +68,11 @@ hash160 hash160::hash( const string& s ) { void hash160::encoder::write( const char* d, uint32_t dlen ) { - for(uint32_t i = 0; i < dlen; ++i) - bytes.push_back(d[i]); + SHA256_Update( &sha_ctx, d, dlen); } hash160 hash160::encoder::result() { - // perform the first hashing function - SHA256_CTX sha_ctx; - SHA256_Init(&sha_ctx); - SHA256_Update( &sha_ctx, bytes.data(), bytes.size()); + // finalize the first hash unsigned char sha_hash[SHA256_DIGEST_LENGTH]; SHA256_Final( sha_hash, &sha_ctx ); // perform the second hashing function diff --git a/tests/stacktrace_test.cpp b/tests/stacktrace_test.cpp index 452a63e..ed99542 100644 --- a/tests/stacktrace_test.cpp +++ b/tests/stacktrace_test.cpp @@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE(static_variant_depth_test) for( const auto& line : lines ) if( line.find("_svdt_visitor") != std::string::npos ) count++; BOOST_CHECK_LT( 2, count ); // test.visit(), static_variant::visit, function object, visitor - BOOST_CHECK_GT( 8, count ); // some is implementation-dependent + BOOST_CHECK_GT( 10, count ); // some is implementation-dependent } #endif From 5070d8d2fc8df1730ac3a7e00587a4c43d7c0f17 Mon Sep 17 00:00:00 2001 From: John Jones Date: Wed, 15 Apr 2020 09:20:39 -0500 Subject: [PATCH 112/117] define hash160 reset method --- src/crypto/hash160.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/crypto/hash160.cpp b/src/crypto/hash160.cpp index 9d64503..985f8ad 100644 --- a/src/crypto/hash160.cpp +++ b/src/crypto/hash160.cpp @@ -84,6 +84,11 @@ hash160 hash160::encoder::result() { return h; } +void hash160::encoder::reset() +{ + SHA256_Init(&sha_ctx); +} + hash160 operator << ( const hash160& h1, uint32_t i ) { hash160 result; fc::detail::shift_l( h1.data(), result.data(), result.data_size(), i ); From c554c7e56ddd88bde71cd26bef09c62c2444aec5 Mon Sep 17 00:00:00 2001 From: John Jones Date: Wed, 15 Apr 2020 09:52:18 -0500 Subject: [PATCH 113/117] add impl to hash160 --- include/fc/crypto/hash160.hpp | 6 ++---- src/crypto/hash160.cpp | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/fc/crypto/hash160.hpp b/include/fc/crypto/hash160.hpp index 4edb718..28121bc 100644 --- a/include/fc/crypto/hash160.hpp +++ b/include/fc/crypto/hash160.hpp @@ -22,11 +22,10 @@ * THE SOFTWARE. */ #pragma once -#include #include #include +#include #include -#include namespace fc{ @@ -66,8 +65,7 @@ class hash160 private: class impl; - fc::fwd my; - SHA256_CTX sha_ctx;; + fc::fwd my; }; template diff --git a/src/crypto/hash160.cpp b/src/crypto/hash160.cpp index 985f8ad..3c65e81 100644 --- a/src/crypto/hash160.cpp +++ b/src/crypto/hash160.cpp @@ -23,12 +23,15 @@ */ #include +#include #include +#include #include #include +#include #include #include -#include +#include #include "_digest_common.hpp" namespace fc @@ -48,13 +51,12 @@ hash160::operator string()const { return str(); } char* hash160::data()const { return (char*)&_hash[0]; } -class hash160::encoder::impl { - public: - impl() { } +struct hash160::encoder::impl { + SHA256_CTX ctx; }; hash160::encoder::~encoder() {} -hash160::encoder::encoder() { SHA256_Init(&sha_ctx); } +hash160::encoder::encoder() { SHA256_Init(&my->ctx); } hash160 hash160::hash( const char* d, uint32_t dlen ) { encoder e; @@ -68,13 +70,13 @@ hash160 hash160::hash( const string& s ) { void hash160::encoder::write( const char* d, uint32_t dlen ) { - SHA256_Update( &sha_ctx, d, dlen); + SHA256_Update( &my->ctx, d, dlen); } hash160 hash160::encoder::result() { // finalize the first hash unsigned char sha_hash[SHA256_DIGEST_LENGTH]; - SHA256_Final( sha_hash, &sha_ctx ); + SHA256_Final( sha_hash, &my->ctx ); // perform the second hashing function RIPEMD160_CTX ripe_ctx; RIPEMD160_Init(&ripe_ctx); @@ -86,7 +88,7 @@ hash160 hash160::encoder::result() { void hash160::encoder::reset() { - SHA256_Init(&sha_ctx); + SHA256_Init(&my->ctx); } hash160 operator << ( const hash160& h1, uint32_t i ) { From bc60ea3fa97590503a7d6df674caba758dc23002 Mon Sep 17 00:00:00 2001 From: abitmore Date: Sat, 18 Apr 2020 13:10:26 -0400 Subject: [PATCH 114/117] Update run-parallel-tests.sh to support arguments --- tests/run-parallel-tests.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/run-parallel-tests.sh b/tests/run-parallel-tests.sh index adc3eb2..61bf5be 100755 --- a/tests/run-parallel-tests.sh +++ b/tests/run-parallel-tests.sh @@ -1,7 +1,7 @@ #!/bin/sh -if [ "$#" != 1 ]; then - echo "Usage: $0 " 1>&2 +if [ "$#" -lt 1 ]; then + echo "Usage: $0 [arguments]" 1>&2 exit 1 fi @@ -15,7 +15,7 @@ fi if [ "$BOOST_VERSION" = "" -o "$BOOST_VERSION" -lt 105900 ]; then echo "Boost version '$BOOST_VERSION' - executing tests serially" - "$1" + "$@" else "$1" --list_content 2>&1 \ | grep '\*$' \ @@ -26,5 +26,5 @@ else *) pre="$t"; ;; esac done \ - | parallel echo Running {}\; "$1" -t {} + | parallel echo Running {}\; "$@" -t {} fi From a7bb22a9d1ba76ce6cbf2428accec1bc2750b5c2 Mon Sep 17 00:00:00 2001 From: abitmore Date: Sat, 18 Apr 2020 13:19:17 -0400 Subject: [PATCH 115/117] Show more msgs when testing with Github Actions --- .github/workflows/build-and-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index adbe476..7dfc44a 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -57,7 +57,7 @@ jobs: - name: Test run: | parallel echo Running {}\; sh -c "_build/tests/{}" <<_EOT_ - all_tests + all_tests -l message bloom_test -- README.md ecc_test README.md hmac_test @@ -116,7 +116,7 @@ jobs: - name: Test run: | parallel echo Running {}\; sh -c "_build/tests/{}" <<_EOT_ - all_tests + all_tests -l message bloom_test -- README.md ecc_test README.md hmac_test From 480b17fdcd843a174356ed21f61aeb863b8f7968 Mon Sep 17 00:00:00 2001 From: abitmore Date: Sat, 18 Apr 2020 14:42:12 -0400 Subject: [PATCH 116/117] Show more messages in Travis CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6aca7d5..327d519 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ script: - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS=--coverage -DCMAKE_CXX_FLAGS=--coverage -DBoost_USE_STATIC_LIBS=OFF -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON . - 'which build-wrapper-linux-x86-64 && build-wrapper-linux-x86-64 --out-dir bw-output make -j 2 || make -j 2' - set -o pipefail - - tests/run-parallel-tests.sh tests/all_tests + - tests/run-parallel-tests.sh tests/all_tests -l message - tests/hmac_test 2>&1 | cat - tests/ecc_test README.md 2>&1 | cat - 'find CMakeFiles/fc.dir -type d | while read d; do gcov -o "$d" "${d/CMakeFiles*.dir/./}"/*.cpp; done >/dev/null' From 377f8434784a171213e09ba3a3e0ebd0918f4231 Mon Sep 17 00:00:00 2001 From: Abit Date: Sun, 19 Apr 2020 18:03:37 +0200 Subject: [PATCH 117/117] Fix static_variant_depth_test --- tests/stacktrace_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/stacktrace_test.cpp b/tests/stacktrace_test.cpp index 6dcfb03..cc003d8 100644 --- a/tests/stacktrace_test.cpp +++ b/tests/stacktrace_test.cpp @@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE(static_variant_depth_test) int count = 0; for( const auto& line : lines ) if( line.find("_svdt_visitor") != std::string::npos ) count++; - BOOST_CHECK_LT( 2, count ); // test.visit(), static_variant::visit, function object, visitor. + BOOST_CHECK_LT( 1, count ); // test.visit(), static_variant::visit, function object, visitor. // The actual count depends on compiler and optimization settings. BOOST_CHECK_GT( 10, count ); // It *should* be less than the number of static variant components. // some is implementation-dependent