diff --git a/.cmake-format.yml b/.cmake-format.yml new file mode 100644 index 000000000..16bc533ad --- /dev/null +++ b/.cmake-format.yml @@ -0,0 +1,6 @@ +# CMake format settings +indent_width: 2 # Number of spaces for indentation +continuation_indent_width: 4 # Indentation for continued lines +line_width: 160 # Maximum line width +tab_size: 2 # Tab size (number of spaces per tab) +use_tabs: false # Whether to use tabs instead of spaces diff --git a/.github/workflows/check_cpp_code_style.yml.d b/.github/workflows/check_cpp_code_style.yml.d deleted file mode 100644 index b92849cc1..000000000 --- a/.github/workflows/check_cpp_code_style.yml.d +++ /dev/null @@ -1,18 +0,0 @@ -name: Cpplint -on: - pull_request: - branches: - - develop - push: - branches: - - develop -jobs: - cpplint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - - run: sudo apt install clang-format - - run: find . -type f -not -path "*/dependency/*" -not -path "*/build/*" \( -name "*.h" -or -name "*.cpp" \) | xargs clang-format -i -style="{BasedOnStyle: Google, ColumnLimit: 160}" - - run: pip install cpplint - - run: cpplint --recursive --exclude=include/ccapi_cpp/ccapi_hmac.h --exclude=include/ccapi_cpp/ccapi_date.h --exclude=include/ccapi_cpp/websocketpp_decompress_workaround.h --exclude=*/build --filter -legal/copyright,-whitespace/line_length,-build/c++11,-runtime/references,-build/include_what_you_use,-runtime/int include/**/* example/**/* test/**/* diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5a77a3af5..d26780551 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -241,7 +241,7 @@ jobs: COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake -DBUILD_PYTHON=ON -DBUILD_JAVA=ON - -DBUILD_CSHARP=ON + # -DBUILD_CSHARP=ON # -DBUILD_GO=ON # -DBUILD_JAVASCRIPT=ON -DBUILD_TEST=ON diff --git a/README.md b/README.md index 7e4846f94..8806d84c3 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ * Macros in the compiler command line: * Define service enablement macro such as `CCAPI_ENABLE_SERVICE_MARKET_DATA`, `CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT`, `CCAPI_ENABLE_SERVICE_FIX`, etc. and exchange enablement macros such as `CCAPI_ENABLE_EXCHANGE_COINBASE`, etc. These macros can be found at the top of [`include/ccapi_cpp/ccapi_session.h`](include/ccapi_cpp/ccapi_session.h). * Dependencies: - * boost https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz (notice that its include directory is boost). + * boost https://archives.boost.io/release/1.80.0/source/boost_1_80_0.tar.gz (notice that its include directory is boost). * rapidjson https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz (notice that its include directory is rapidjson/include). * If you use FIX API, also need hffix https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz (notice that its include directory is hffix/include). * Include directory for this library: @@ -277,7 +277,7 @@ Received an event: ] Bye ``` -* Request operation types: `GET_INSTRUMENT`, `GET_INSTRUMENTS`, `GET_RECENT_TRADES`, `GET_HISTORICAL_TRADES`, `GET_RECENT_CANDLESTICKS`, `GET_HISTORICAL_CANDLESTICKS`, `GET_RECENT_AGG_TRADES`, `GET_HISTORICAL_AGG_TRADES`(only applicable to binance family: https://binance-docs.github.io/apidocs/spot/en/#compressed-aggregate-trades-list), ``. +* Request operation types: `GET_SERVER_TIME`, `GET_INSTRUMENT`, `GET_INSTRUMENTS`, `GET_BBOS`, `GET_RECENT_TRADES`, `GET_HISTORICAL_TRADES`, `GET_RECENT_CANDLESTICKS`, `GET_HISTORICAL_CANDLESTICKS`, `GET_RECENT_AGG_TRADES`, `GET_HISTORICAL_AGG_TRADES`(only applicable to binance family: https://binance-docs.github.io/apidocs/spot/en/#compressed-aggregate-trades-list), ``. * Request parameter names: `LIMIT`, `INSTRUMENT_TYPE`, `CANDLESTICK_INTERVAL_SECONDS`, `START_TIME_SECONDS`, `END_TIME_SECONDS`, `START_TRADE_ID`, `END_TRADE_ID`, `START_AGG_TRADE_ID`, `END_AGG_TRADE_ID`. Instead of these convenient names you can also choose to use arbitrary parameter names and they will be passed to the exchange's native API. See [this example](example/src/market_data_advanced_request/main.cpp). * Message's `time` represents the exchange's reported timestamp. Its `timeReceived` represents the library's receiving timestamp. `time` can be retrieved by `getTime` method and `timeReceived` can be retrieved by `getTimeReceived` method. (For non-C++, please use `getTimeUnix` and `getTimeReceivedUnix` methods or `getTimeISO` and `getTimeReceivedISO` methods). diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index e510809f5..3bd7e967a 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -9,7 +9,7 @@ if(NOT APPLE AND NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() set(OPENSSL_USE_STATIC_LIBS TRUE) -if (WIN32) +if(WIN32) set(CMAKE_BUILD_TYPE "Release") endif() if(NOT CMAKE_BUILD_TYPE) @@ -21,54 +21,58 @@ message(STATUS "CCAPI_PROJECT_DIR: ${CCAPI_PROJECT_DIR}") if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) message(STATUS "use boost beast websocket") if(NOT BOOST_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(boost - URL https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") + include(ExternalProject) + ExternalProject_Add( + boost + URL https://archives.boost.io/release/1.80.0/source/boost_1_80_0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") else() - add_library(boost INTERFACE) + add_library(boost INTERFACE) endif() if(NOT RAPIDJSON_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(rapidjson - URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") + include(ExternalProject) + ExternalProject_Add( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") else() - add_library(rapidjson INTERFACE) + add_library(rapidjson INTERFACE) endif() - include_directories(${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories(${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} + ${RAPIDJSON_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) else() message(STATUS "use websocketpp") add_compile_definitions(CCAPI_LEGACY_USE_WEBSOCKETPP) set(RAPIDJSON_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/rapidjson/include) set(WEBSOCKETPP_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/websocketpp) set(BOOST_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/boost) - include_directories(${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} + ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) endif() set(APP_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/app/include) find_package(OpenSSL REQUIRED) include_directories(${APP_INCLUDE_DIR}) set(ADDITIONAL_LINK_LIBRARIES "") -if (WIN32) +if(WIN32) set(ADDITIONAL_LINK_LIBRARIES ws2_32) endif() link_libraries(OpenSSL::Crypto OpenSSL::SSL ${ADDITIONAL_LINK_LIBRARIES}) add_compile_options(-Wno-deprecated -Wno-nonnull -Wno-deprecated-declarations) -# If you encountered segmentation fault at run-time, comment out the following line. -if (CMAKE_BUILD_TYPE STREQUAL "Release") +# If you encountered segmentation fault at run-time, comment out the following +# line. +if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() @@ -106,7 +110,8 @@ add_compile_definitions(CCAPI_ENABLE_EXCHANGE_MEXC) find_package(ZLIB REQUIRED) link_libraries(ZLIB::ZLIB) -# If backtesting, you may want to comment out the following line to improve run-time speed. +# If backtesting, you may want to comment out the following line to improve +# run-time speed. add_compile_definitions(CCAPI_APP_ENABLE_LOG_INFO) # If uncommented, the program will print out more information. @@ -114,11 +119,15 @@ add_compile_definitions(CCAPI_APP_ENABLE_LOG_INFO) # If you have custom logics and want to reuse part of class EventHandlerBase. # add_compile_definitions(CCAPI_APP_USE_CUSTOM_EVENT_HANDLER) -# get_filename_component(CUSTOM_EVENT_HANDLER_DIRECTORY ${CUSTOM_EVENT_HANDLER_PATH} DIRECTORY) +# get_filename_component(CUSTOM_EVENT_HANDLER_DIRECTORY +# ${CUSTOM_EVENT_HANDLER_PATH} DIRECTORY) # include_directories(${CUSTOM_EVENT_HANDLER_DIRECTORY}) -# If you have custom logics and need to repeatedly rebuild for backtesting, you may want to comment out the following line to improve build-time speed. If so, make sure to -# provide additional environment variables BASE_ASSET_OVERRIDE, QUOTE_ASSET_OVERRIDE, ORDER_PRICE_INCREMENT_OVERRIDE, and ORDER_QUANTITY_INCREMENT_OVERRIDE at run time. +# If you have custom logics and need to repeatedly rebuild for backtesting, you +# may want to comment out the following line to improve build-time speed. If so, +# make sure to provide additional environment variables BASE_ASSET_OVERRIDE, +# QUOTE_ASSET_OVERRIDE, ORDER_PRICE_INCREMENT_OVERRIDE, and +# ORDER_QUANTITY_INCREMENT_OVERRIDE at run time. # add_compile_definitions(CCAPI_APP_IS_BACKTEST) add_subdirectory(src/spot_market_making) diff --git a/binding/CMakeLists.txt b/binding/CMakeLists.txt index 2b6cd4b15..3ab930e3f 100644 --- a/binding/CMakeLists.txt +++ b/binding/CMakeLists.txt @@ -1,13 +1,15 @@ cmake_minimum_required(VERSION 3.17) set(NAME binding) -set(BUILD_VERSION "1.0.0" CACHE STRING "User-specified build version") +set(BUILD_VERSION + "1.0.0" + CACHE STRING "User-specified build version") message(STATUS "BUILD_VERSION: ${BUILD_VERSION}") project(${NAME} LANGUAGES CXX) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}") if(POLICY CMP0122) -cmake_policy(SET CMP0122 NEW) + cmake_policy(SET CMP0122 NEW) endif() # Apple: Don't modify install_name when touching RPATH. @@ -25,8 +27,8 @@ if(POLICY CMP0076) cmake_policy(SET CMP0076 NEW) endif() -# option() honors normal variables. -# see: https://cmake.org/cmake/help/git-stage/policy/CMP0077.html +# option() honors normal variables. see: +# https://cmake.org/cmake/help/git-stage/policy/CMP0077.html if(POLICY CMP0077) cmake_policy(SET CMP0077 NEW) endif() @@ -43,9 +45,12 @@ endif() # Force default build type to Release if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING - "Choose the type of build, options are: Debug, Release (default), RelWithDebInfo and MinSizeRel." - FORCE) + set(CMAKE_BUILD_TYPE + "Release" + CACHE + STRING + "Choose the type of build, options are: Debug, Release (default), RelWithDebInfo and MinSizeRel." + FORCE) endif() message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") @@ -54,25 +59,33 @@ include(GNUInstallDirs) if(UNIX) option(BUILD_SHARED_LIBS "Build shared libraries(.so or .dyld)." ON) message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}") - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) # for multi-config build system (e.g. Xcode, ninja Multi-Config) foreach(OUTPUTCONFIG IN LISTS CMAKE_CONFIGURATION_TYPES) string(TOUPPER ${OUTPUTCONFIG_UPPER} OUTPUTCONFIG) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR}) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} + ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} + ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR}) endforeach() else() # Currently Only support static build for windows set(BUILD_SHARED_LIBS OFF) message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) # for multi-config builds (e.g. msvc) foreach(OUTPUTCONFIG IN LISTS CMAKE_CONFIGURATION_TYPES) string(TOUPPER ${OUTPUTCONFIG_UPPER} OUTPUTCONFIG) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR}) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} + ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} + ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR}) endforeach() endif() @@ -85,54 +98,57 @@ message(STATUS "CCAPI_PROJECT_DIR: ${CCAPI_PROJECT_DIR}") find_package(OpenSSL REQUIRED) message(STATUS "OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}") message(STATUS "OPENSSL_CRYPTO_LIBRARY: ${OPENSSL_CRYPTO_LIBRARY}") -get_filename_component(OPENSSL_CRYPTO_LIBRARY_DIR ${OPENSSL_CRYPTO_LIBRARY} DIRECTORY) +get_filename_component(OPENSSL_CRYPTO_LIBRARY_DIR ${OPENSSL_CRYPTO_LIBRARY} + DIRECTORY) message(STATUS "OPENSSL_SSL_LIBRARY: ${OPENSSL_SSL_LIBRARY}") get_filename_component(OPENSSL_SSL_LIBRARY_DIR ${OPENSSL_SSL_LIBRARY} DIRECTORY) if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) message(STATUS "use boost beast websocket") if(NOT BOOST_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(boost - URL https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") + include(ExternalProject) + ExternalProject_Add( + boost + URL https://archives.boost.io/release/1.80.0/source/boost_1_80_0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") else() - add_library(boost INTERFACE) + add_library(boost INTERFACE) endif() if(NOT RAPIDJSON_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(rapidjson - URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") + include(ExternalProject) + ExternalProject_Add( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") else() - add_library(rapidjson INTERFACE) + add_library(rapidjson INTERFACE) endif() if(NOT HFFIX_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(hffix - URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") + include(ExternalProject) + ExternalProject_Add( + hffix + URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") else() - add_library(hffix INTERFACE) + add_library(hffix INTERFACE) endif() - include_directories(${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} + ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) else() message(STATUS "use websocketpp") add_compile_definitions(CCAPI_LEGACY_USE_WEBSOCKETPP) @@ -140,7 +156,10 @@ else() set(WEBSOCKETPP_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/websocketpp) set(BOOST_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/boost) set(HFFIX_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/hffix/include) - include_directories(${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} + ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR}) endif() link_libraries(OpenSSL::Crypto OpenSSL::SSL) @@ -243,18 +262,19 @@ endif() set(LANG_LIST "python" "java" "csharp" "go" "javascript") foreach(LANG IN LISTS LANG_LIST) - string(TOUPPER ${LANG} LANG_UPPER) - option(BUILD_${LANG_UPPER} "Build ${LANG} library" OFF) - message(STATUS "Build ${LANG_UPPER}: ${BUILD_${LANG_UPPER}}") - if(BUILD_${LANG_UPPER}) - if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${LANG}/swig_interface_ccapi_language_specific.i") - file(READ ${LANG}/swig_interface_ccapi_language_specific.i SWIG_INTERFACE_CCAPI_LANGUAGE_SPECIFIC) - endif() - configure_file( - swig_interface.i.in - ${CMAKE_BINARY_DIR}/${LANG}/swig_interface.i - @ONLY) - set(SWIG_INTERFACE ${CMAKE_BINARY_DIR}/${LANG}/swig_interface.i) - add_subdirectory(${LANG}) + string(TOUPPER ${LANG} LANG_UPPER) + option(BUILD_${LANG_UPPER} "Build ${LANG} library" OFF) + message(STATUS "Build ${LANG_UPPER}: ${BUILD_${LANG_UPPER}}") + if(BUILD_${LANG_UPPER}) + if(EXISTS + "${CMAKE_CURRENT_SOURCE_DIR}/${LANG}/swig_interface_ccapi_language_specific.i" + ) + file(READ ${LANG}/swig_interface_ccapi_language_specific.i + SWIG_INTERFACE_CCAPI_LANGUAGE_SPECIFIC) endif() + configure_file(swig_interface.i.in + ${CMAKE_BINARY_DIR}/${LANG}/swig_interface.i @ONLY) + set(SWIG_INTERFACE ${CMAKE_BINARY_DIR}/${LANG}/swig_interface.i) + add_subdirectory(${LANG}) + endif() endforeach() diff --git a/binding/csharp/CMakeLists.txt b/binding/csharp/CMakeLists.txt index 70e372572..e75a8cba0 100644 --- a/binding/csharp/CMakeLists.txt +++ b/binding/csharp/CMakeLists.txt @@ -3,9 +3,10 @@ project(${NAME}) set(SWIG_TARGET_NAME ccapi_${NAME}) if(NOT DOTNET_BUILD_CONFIGURATION) - set(DOTNET_BUILD_CONFIGURATION "Release" CACHE STRING - "Choose the type of build, options are: Debug, Release." - FORCE) + set(DOTNET_BUILD_CONFIGURATION + "Release" + CACHE STRING "Choose the type of build, options are: Debug, Release." + FORCE) endif() message(STATUS "DOTNET_BUILD_CONFIGURATION: ${DOTNET_BUILD_CONFIGURATION}") @@ -20,65 +21,84 @@ endif() execute_process( COMMAND ${DOTNET_EXECUTABLE} --version OUTPUT_VARIABLE DOTNET_EXECUTABLE_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) + OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Dotnet version: ${DOTNET_EXECUTABLE_VERSION}") set(CSHARP_NAMESPACE "ccapi") set_property(SOURCE ${SWIG_INTERFACE} PROPERTY CPLUSPLUS ON) -set_property(SOURCE ${SWIG_INTERFACE} PROPERTY COMPILE_OPTIONS "-namespace;${CSHARP_NAMESPACE};-dllimport;${SWIG_TARGET_NAME}.so") +set_property( + SOURCE ${SWIG_INTERFACE} + PROPERTY COMPILE_OPTIONS + "-namespace;${CSHARP_NAMESPACE};-dllimport;${SWIG_TARGET_NAME}.so") -swig_add_library(${SWIG_TARGET_NAME} - LANGUAGE csharp - OUTPUT_DIR ${CMAKE_BINARY_DIR}/csharp/${SWIG_TARGET_NAME} -SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER}) +swig_add_library( + ${SWIG_TARGET_NAME} + LANGUAGE csharp OUTPUT_DIR ${CMAKE_BINARY_DIR}/csharp/${SWIG_TARGET_NAME} + SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER}) if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) add_dependencies(${SWIG_TARGET_NAME} boost rapidjson hffix) endif() set(PACKAGING_DIR packaging) -set(PACKAGING_DIR_FULL ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) +set(PACKAGING_DIR_FULL + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) file(MAKE_DIRECTORY ${PACKAGING_DIR_FULL}) set(SRC_DIR_FULL ${CMAKE_CURRENT_BINARY_DIR}/src) file(MAKE_DIRECTORY ${SRC_DIR_FULL}) -configure_file( - ccapi.csproj.in - ${SRC_DIR_FULL}/ccapi.csproj - @ONLY) +configure_file(ccapi.csproj.in ${SRC_DIR_FULL}/ccapi.csproj @ONLY) set(CSHARP_PACKAGING_TARGET_NAME csharp_${PACKAGING_DIR}) -add_custom_target(${CSHARP_PACKAGING_TARGET_NAME} ALL - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/*.cs ${SRC_DIR_FULL} - COMMAND ${DOTNET_EXECUTABLE} build -c ${DOTNET_BUILD_CONFIGURATION} -o ${PACKAGING_DIR_FULL} ccapi.csproj - COMMAND ${CMAKE_COMMAND} -E copy $ ${PACKAGING_DIR_FULL} - WORKING_DIRECTORY ${SRC_DIR_FULL} -) +add_custom_target( + ${CSHARP_PACKAGING_TARGET_NAME} ALL + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/*.cs ${SRC_DIR_FULL} + COMMAND ${DOTNET_EXECUTABLE} build -c ${DOTNET_BUILD_CONFIGURATION} -o + ${PACKAGING_DIR_FULL} ccapi.csproj + COMMAND ${CMAKE_COMMAND} -E copy $ + ${PACKAGING_DIR_FULL} + WORKING_DIRECTORY ${SRC_DIR_FULL}) add_dependencies(${CSHARP_PACKAGING_TARGET_NAME} ${SWIG_TARGET_NAME}) # Test if(BUILD_TEST) set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test) file(COPY example DESTINATION ${TEST_DIR}) - set(SUBDIRECTORY_LIST "enable_library_logging" "execution_management_simple_request" "execution_management_simple_subscription" "fix_simple" "handle_exception" "market_data_multiple_subscription" "market_data_simple_request" "market_data_simple_subscription") + set(SUBDIRECTORY_LIST + "enable_library_logging" + "execution_management_simple_request" + "execution_management_simple_subscription" + "fix_simple" + "handle_exception" + "market_data_multiple_subscription" + "market_data_simple_request" + "market_data_simple_subscription") foreach(SUBDIRECTORY IN LISTS SUBDIRECTORY_LIST) set(CSHARP_TEST_TARGET_NAME csharp_test_${SUBDIRECTORY}) - add_custom_target(${CSHARP_TEST_TARGET_NAME} ALL + add_custom_target( + ${CSHARP_TEST_TARGET_NAME} ALL COMMAND ${DOTNET_EXECUTABLE} clean - COMMAND ${DOTNET_EXECUTABLE} build --property:CcapiLibraryPath=${PACKAGING_DIR_FULL}/ccapi.dll -c ${DOTNET_BUILD_CONFIGURATION} - WORKING_DIRECTORY ${TEST_DIR}/example/${SUBDIRECTORY} - ) + COMMAND + ${DOTNET_EXECUTABLE} build + --property:CcapiLibraryPath=${PACKAGING_DIR_FULL}/ccapi.dll -c + ${DOTNET_BUILD_CONFIGURATION} + WORKING_DIRECTORY ${TEST_DIR}/example/${SUBDIRECTORY}) add_dependencies(${CSHARP_TEST_TARGET_NAME} ${CSHARP_PACKAGING_TARGET_NAME}) endforeach() file(COPY test DESTINATION ${TEST_DIR}) set(CSHARP_TEST_TARGET_NAME csharp_test_test) - add_custom_target(${CSHARP_TEST_TARGET_NAME} ALL - COMMAND ${DOTNET_EXECUTABLE} clean - COMMAND ${DOTNET_EXECUTABLE} build --property:CcapiLibraryPath=${PACKAGING_DIR_FULL}/ccapi.dll -c ${DOTNET_BUILD_CONFIGURATION} - WORKING_DIRECTORY ${TEST_DIR}/test - ) - add_dependencies(${CSHARP_TEST_TARGET_NAME} ${CSHARP_PACKAGING_TARGET_NAME}) - add_test(NAME csharp_test - COMMAND env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PACKAGING_DIR_FULL} ${DOTNET_EXECUTABLE} run -c ${DOTNET_BUILD_CONFIGURATION} --no-build - WORKING_DIRECTORY ${TEST_DIR}/test) + add_custom_target( + ${CSHARP_TEST_TARGET_NAME} ALL + COMMAND ${DOTNET_EXECUTABLE} clean + COMMAND + ${DOTNET_EXECUTABLE} build + --property:CcapiLibraryPath=${PACKAGING_DIR_FULL}/ccapi.dll -c + ${DOTNET_BUILD_CONFIGURATION} + WORKING_DIRECTORY ${TEST_DIR}/test) + add_dependencies(${CSHARP_TEST_TARGET_NAME} ${CSHARP_PACKAGING_TARGET_NAME}) + add_test( + NAME csharp_test + COMMAND env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PACKAGING_DIR_FULL} + ${DOTNET_EXECUTABLE} run -c ${DOTNET_BUILD_CONFIGURATION} --no-build + WORKING_DIRECTORY ${TEST_DIR}/test) endif() diff --git a/binding/go/CMakeLists.txt b/binding/go/CMakeLists.txt index 0d9fed37e..b580648e0 100644 --- a/binding/go/CMakeLists.txt +++ b/binding/go/CMakeLists.txt @@ -13,22 +13,23 @@ endif() execute_process( COMMAND ${GO_EXECUTABLE} version OUTPUT_VARIABLE GO_EXECUTABLE_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) + OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Go version: ${GO_EXECUTABLE_VERSION}") set(GO_PACKAGE "ccapi") file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}) -add_custom_target(${SWIG_TARGET_NAME} ALL - COMMAND ${SWIG_EXECUTABLE} -outcurrentdir -c++ -go -intgosize 64 -package ${GO_PACKAGE} -I${CCAPI_PROJECT_DIR}/include ${SWIG_INTERFACE} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME} -) +add_custom_target( + ${SWIG_TARGET_NAME} ALL + COMMAND ${SWIG_EXECUTABLE} -outcurrentdir -c++ -go -intgosize 64 -package + ${GO_PACKAGE} -I${CCAPI_PROJECT_DIR}/include ${SWIG_INTERFACE} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}) add_dependencies(${SWIG_TARGET_NAME} boost rapidjson hffix) set(PACKAGING_DIR packaging) -set(PACKAGING_DIR_FULL ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) +set(PACKAGING_DIR_FULL + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) file(MAKE_DIRECTORY ${PACKAGING_DIR_FULL}) set(GO_PACKAGING_TARGET_NAME ${LANG}_${PACKAGING_DIR}) @@ -37,93 +38,147 @@ file(WRITE ${COMPILER_OPTIONS_FILE_PATH} "") set(CGO_CXXFLAGS_LIST "") list(APPEND CGO_CXXFLAGS_LIST -std=c++17 -fPIC -Wno-deprecated-declarations) if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") -list(APPEND CGO_CXXFLAGS_LIST -g) + list(APPEND CGO_CXXFLAGS_LIST -g) else() -list(APPEND CGO_CXXFLAGS_LIST -O3 -DNDEBUG) + list(APPEND CGO_CXXFLAGS_LIST -O3 -DNDEBUG) endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") -list(APPEND CGO_CXXFLAGS_LIST -pthread) + list(APPEND CGO_CXXFLAGS_LIST -pthread) endif() -list(APPEND CGO_CXXFLAGS_LIST -I${CCAPI_PROJECT_DIR}/include -I${BOOST_INCLUDE_DIR} -I${RAPIDJSON_INCLUDE_DIR} -I${HFFIX_INCLUDE_DIR} -I${OPENSSL_INCLUDE_DIR}) -list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_SERVICE_MARKET_DATA -DCCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT -DCCAPI_ENABLE_SERVICE_FIX -DCCAPI_ENABLE_EXCHANGE_COINBASE -DCCAPI_ENABLE_EXCHANGE_GEMINI -DCCAPI_ENABLE_EXCHANGE_KRAKEN -DCCAPI_ENABLE_EXCHANGE_KRAKEN_FUTURES -DCCAPI_ENABLE_EXCHANGE_BITSTAMP -DCCAPI_ENABLE_EXCHANGE_BITFINEX -DCCAPI_ENABLE_EXCHANGE_BITMEX -DCCAPI_ENABLE_EXCHANGE_BINANCE_US -DCCAPI_ENABLE_EXCHANGE_BINANCE -DCCAPI_ENABLE_EXCHANGE_BINANCE_MARGIN -DCCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES -DCCAPI_ENABLE_EXCHANGE_BINANCE_COIN_FUTURES -DCCAPI_ENABLE_EXCHANGE_HUOBI -DCCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP -DCCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP -DCCAPI_ENABLE_EXCHANGE_OKX -DCCAPI_ENABLE_EXCHANGE_ERISX -DCCAPI_ENABLE_EXCHANGE_KUCOIN -DCCAPI_ENABLE_EXCHANGE_KUCOIN_FUTURES -DCCAPI_ENABLE_EXCHANGE_DERIBIT -DCCAPI_ENABLE_EXCHANGE_GATEIO -DCCAPI_ENABLE_EXCHANGE_GATEIO_PERPETUAL_FUTURES -DCCAPI_ENABLE_EXCHANGE_CRYPTOCOM -DCCAPI_ENABLE_EXCHANGE_BYBIT -DCCAPI_ENABLE_EXCHANGE_BYBIT_DERIVATIVES -DCCAPI_ENABLE_EXCHANGE_ASCENDEX -DCCAPI_ENABLE_EXCHANGE_BITGET -DCCAPI_ENABLE_EXCHANGE_BITGET_FUTURES -DCCAPI_ENABLE_EXCHANGE_BITMART -DCCAPI_ENABLE_EXCHANGE_MEXC -DCCAPI_ENABLE_EXCHANGE_MEXC_FUTURES -DCCAPI_ENABLE_EXCHANGE_WHITEBIT) +list( + APPEND + CGO_CXXFLAGS_LIST + -I${CCAPI_PROJECT_DIR}/include + -I${BOOST_INCLUDE_DIR} + -I${RAPIDJSON_INCLUDE_DIR} + -I${HFFIX_INCLUDE_DIR} + -I${OPENSSL_INCLUDE_DIR}) +list( + APPEND + CGO_CXXFLAGS_LIST + -DCCAPI_ENABLE_SERVICE_MARKET_DATA + -DCCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT + -DCCAPI_ENABLE_SERVICE_FIX + -DCCAPI_ENABLE_EXCHANGE_COINBASE + -DCCAPI_ENABLE_EXCHANGE_GEMINI + -DCCAPI_ENABLE_EXCHANGE_KRAKEN + -DCCAPI_ENABLE_EXCHANGE_KRAKEN_FUTURES + -DCCAPI_ENABLE_EXCHANGE_BITSTAMP + -DCCAPI_ENABLE_EXCHANGE_BITFINEX + -DCCAPI_ENABLE_EXCHANGE_BITMEX + -DCCAPI_ENABLE_EXCHANGE_BINANCE_US + -DCCAPI_ENABLE_EXCHANGE_BINANCE + -DCCAPI_ENABLE_EXCHANGE_BINANCE_MARGIN + -DCCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES + -DCCAPI_ENABLE_EXCHANGE_BINANCE_COIN_FUTURES + -DCCAPI_ENABLE_EXCHANGE_HUOBI + -DCCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP + -DCCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP + -DCCAPI_ENABLE_EXCHANGE_OKX + -DCCAPI_ENABLE_EXCHANGE_ERISX + -DCCAPI_ENABLE_EXCHANGE_KUCOIN + -DCCAPI_ENABLE_EXCHANGE_KUCOIN_FUTURES + -DCCAPI_ENABLE_EXCHANGE_DERIBIT + -DCCAPI_ENABLE_EXCHANGE_GATEIO + -DCCAPI_ENABLE_EXCHANGE_GATEIO_PERPETUAL_FUTURES + -DCCAPI_ENABLE_EXCHANGE_CRYPTOCOM + -DCCAPI_ENABLE_EXCHANGE_BYBIT + -DCCAPI_ENABLE_EXCHANGE_BYBIT_DERIVATIVES + -DCCAPI_ENABLE_EXCHANGE_ASCENDEX + -DCCAPI_ENABLE_EXCHANGE_BITGET + -DCCAPI_ENABLE_EXCHANGE_BITGET_FUTURES + -DCCAPI_ENABLE_EXCHANGE_BITMART + -DCCAPI_ENABLE_EXCHANGE_MEXC + -DCCAPI_ENABLE_EXCHANGE_MEXC_FUTURES + -DCCAPI_ENABLE_EXCHANGE_WHITEBIT) if(CCAPI_ENABLE_LOG_ERROR) -list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_ERROR) + list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_ERROR) endif() if(CCAPI_ENABLE_LOG_WARN) -list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_WARN) + list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_WARN) endif() if(CCAPI_ENABLE_LOG_INFO) -list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_INFO) + list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_INFO) endif() if(CCAPI_ENABLE_LOG_DEBUG) -list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_DEBUG) + list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_DEBUG) endif() if(CCAPI_ENABLE_LOG_TRACE) -list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_TRACE) + list(APPEND CGO_CXXFLAGS_LIST -DCCAPI_ENABLE_LOG_TRACE) endif() list(JOIN CGO_CXXFLAGS_LIST " " CGO_CXXFLAGS) message(STATUS "CGO_CXXFLAGS: ${CGO_CXXFLAGS}") -file(APPEND ${COMPILER_OPTIONS_FILE_PATH} "export CGO_CXXFLAGS='${CGO_CXXFLAGS}'\n\n") +file(APPEND ${COMPILER_OPTIONS_FILE_PATH} + "export CGO_CXXFLAGS='${CGO_CXXFLAGS}'\n\n") set(CGO_LDFLAGS_LIST "") if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") -list(APPEND CGO_LDFLAGS_LIST -g) + list(APPEND CGO_LDFLAGS_LIST -g) endif() -list(APPEND CGO_LDFLAGS_LIST -L${OPENSSL_CRYPTO_LIBRARY_DIR} -L${OPENSSL_SSL_LIBRARY_DIR} -lcrypto -lssl) +list(APPEND CGO_LDFLAGS_LIST -L${OPENSSL_CRYPTO_LIBRARY_DIR} + -L${OPENSSL_SSL_LIBRARY_DIR} -lcrypto -lssl) foreach(ZLIB_LIBRARY IN LISTS ZLIB_LIBRARIES) get_filename_component(ZLIB_LIBRARY_DIR ${ZLIB_LIBRARY} DIRECTORY) list(APPEND CGO_LDFLAGS_LIST -L${ZLIB_LIBRARY_DIR} -lz) endforeach() list(JOIN CGO_LDFLAGS_LIST " " CGO_LDFLAGS) message(STATUS "CGO_LDFLAGS: ${CGO_LDFLAGS}") -file(APPEND ${COMPILER_OPTIONS_FILE_PATH} "export CGO_LDFLAGS='${CGO_LDFLAGS}'\n") +file(APPEND ${COMPILER_OPTIONS_FILE_PATH} + "export CGO_LDFLAGS='${CGO_LDFLAGS}'\n") -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in - ${PACKAGING_DIR_FULL}/go.mod -@ONLY) -add_custom_target(${GO_PACKAGING_TARGET_NAME} ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME} ${PACKAGING_DIR_FULL} - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in ${PACKAGING_DIR_FULL} - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/ccapi_logger.cpp ${PACKAGING_DIR_FULL} - WORKING_DIRECTORY ${PACKAGING_DIR_FULL} -) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in + ${PACKAGING_DIR_FULL}/go.mod @ONLY) +add_custom_target( + ${GO_PACKAGING_TARGET_NAME} ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME} ${PACKAGING_DIR_FULL} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in + ${PACKAGING_DIR_FULL} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/ccapi_logger.cpp + ${PACKAGING_DIR_FULL} + WORKING_DIRECTORY ${PACKAGING_DIR_FULL}) add_dependencies(${GO_PACKAGING_TARGET_NAME} ${SWIG_TARGET_NAME}) # Test if(BUILD_TEST) set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test) file(COPY example DESTINATION ${TEST_DIR}) - set(SUBDIRECTORY_LIST "enable_library_logging" "execution_management_simple_request" "execution_management_simple_subscription" "fix_simple" "handle_exception" "market_data_multiple_subscription" "market_data_simple_request" "market_data_simple_subscription") - file(READ ${PACKAGING_DIR_FULL}/export_compiler_options.sh EXPORT_COMPILER_OPTIONS) + set(SUBDIRECTORY_LIST + "enable_library_logging" + "execution_management_simple_request" + "execution_management_simple_subscription" + "fix_simple" + "handle_exception" + "market_data_multiple_subscription" + "market_data_simple_request" + "market_data_simple_subscription") + file(READ ${PACKAGING_DIR_FULL}/export_compiler_options.sh + EXPORT_COMPILER_OPTIONS) string(APPEND EXPORT_COMPILER_OPTIONS "${GO_EXECUTABLE} build .") file(WRITE ${PACKAGING_DIR_FULL}/build.sh "${EXPORT_COMPILER_OPTIONS}") foreach(SUBDIRECTORY IN LISTS SUBDIRECTORY_LIST) set(GO_TEST_TARGET_NAME go_test_${SUBDIRECTORY}) set(GO_TEST_BUILD_DIRECTORY ${TEST_DIR}/example/${SUBDIRECTORY}) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in_2 - ${GO_TEST_BUILD_DIRECTORY}/go.mod - @ONLY) - add_custom_target(${GO_TEST_TARGET_NAME} ALL + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in_2 + ${GO_TEST_BUILD_DIRECTORY}/go.mod @ONLY) + add_custom_target( + ${GO_TEST_TARGET_NAME} ALL COMMAND bash ${PACKAGING_DIR_FULL}/build.sh - WORKING_DIRECTORY ${GO_TEST_BUILD_DIRECTORY} - ) + WORKING_DIRECTORY ${GO_TEST_BUILD_DIRECTORY}) add_dependencies(${GO_TEST_TARGET_NAME} ${GO_PACKAGING_TARGET_NAME}) endforeach() file(COPY test DESTINATION ${TEST_DIR}) set(GO_TEST_TARGET_NAME go_test_test) - set(GO_TEST_BUILD_DIRECTORY ${TEST_DIR}/test) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in_2 - ${GO_TEST_BUILD_DIRECTORY}/go.mod - @ONLY) - add_custom_target(${GO_TEST_TARGET_NAME} ALL - COMMAND bash ${PACKAGING_DIR_FULL}/build.sh - WORKING_DIRECTORY ${GO_TEST_BUILD_DIRECTORY} - ) - add_dependencies(${GO_TEST_TARGET_NAME} ${GO_PACKAGING_TARGET_NAME}) - add_test(NAME go_test + set(GO_TEST_BUILD_DIRECTORY ${TEST_DIR}/test) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/go.mod.in_2 + ${GO_TEST_BUILD_DIRECTORY}/go.mod @ONLY) + add_custom_target( + ${GO_TEST_TARGET_NAME} ALL + COMMAND bash ${PACKAGING_DIR_FULL}/build.sh + WORKING_DIRECTORY ${GO_TEST_BUILD_DIRECTORY}) + add_dependencies(${GO_TEST_TARGET_NAME} ${GO_PACKAGING_TARGET_NAME}) + add_test( + NAME go_test COMMAND ${GO_TEST_BUILD_DIRECTORY}/main - WORKING_DIRECTORY ${GO_TEST_BUILD_DIRECTORY}) + WORKING_DIRECTORY ${GO_TEST_BUILD_DIRECTORY}) endif() diff --git a/binding/java/CMakeLists.txt b/binding/java/CMakeLists.txt index 2436b70aa..8a6dbdd00 100644 --- a/binding/java/CMakeLists.txt +++ b/binding/java/CMakeLists.txt @@ -3,7 +3,10 @@ project(${NAME}) set(SWIG_TARGET_NAME ccapi_${NAME}) # Find Java and JNI -find_package(Java COMPONENTS Development REQUIRED) +find_package( + Java + COMPONENTS Development + REQUIRED) message(STATUS "Java_VERSION: ${Java_VERSION}") message(STATUS "Java_JAVA_EXECUTABLE: ${Java_JAVA_EXECUTABLE}") find_package(JNI REQUIRED) @@ -18,61 +21,76 @@ set(JAVA_ARTIFACT "ccapi") set(JAVA_PACKAGE "${JAVA_GROUP}.${JAVA_ARTIFACT}") set_property(SOURCE ${SWIG_INTERFACE} PROPERTY CPLUSPLUS ON) -set_property(SOURCE ${SWIG_INTERFACE} PROPERTY COMPILE_OPTIONS "-package;${JAVA_PACKAGE};-doxygen") +set_property(SOURCE ${SWIG_INTERFACE} + PROPERTY COMPILE_OPTIONS "-package;${JAVA_PACKAGE};-doxygen") -swig_add_library(${SWIG_TARGET_NAME} - LANGUAGE java - OUTPUT_DIR ${CMAKE_BINARY_DIR}/java/${SWIG_TARGET_NAME} -SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER}) +swig_add_library( + ${SWIG_TARGET_NAME} + LANGUAGE java OUTPUT_DIR ${CMAKE_BINARY_DIR}/java/${SWIG_TARGET_NAME} + SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER}) if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) add_dependencies(${SWIG_TARGET_NAME} boost rapidjson hffix) endif() -set_property(TARGET ${SWIG_TARGET_NAME} PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) -target_include_directories(${SWIG_TARGET_NAME} - PRIVATE - ${JNI_INCLUDE_DIRS} -) +set_property(TARGET ${SWIG_TARGET_NAME} + PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) +target_include_directories(${SWIG_TARGET_NAME} PRIVATE ${JNI_INCLUDE_DIRS}) set(PACKAGING_DIR packaging) -set(PACKAGING_DIR_FULL ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) +set(PACKAGING_DIR_FULL + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) file(MAKE_DIRECTORY ${PACKAGING_DIR_FULL}) set(JAVA_PACKAGING_TARGET_NAME java_${PACKAGING_DIR}) -add_custom_target(${JAVA_PACKAGING_TARGET_NAME} ALL - COMMAND ${Java_JAVAC_EXECUTABLE} -d ${PACKAGING_DIR_FULL} ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/*.java - COMMAND ${Java_JAR_EXECUTABLE} cf ${JAVA_ARTIFACT}-${BUILD_VERSION}.jar ${JAVA_DOMAIN_EXTENSION}/${JAVA_DOMAIN_NAME}/${JAVA_ARTIFACT}/** - COMMAND ${CMAKE_COMMAND} -E copy $ ${PACKAGING_DIR_FULL} - WORKING_DIRECTORY ${PACKAGING_DIR_FULL} -) +add_custom_target( + ${JAVA_PACKAGING_TARGET_NAME} ALL + COMMAND ${Java_JAVAC_EXECUTABLE} -d ${PACKAGING_DIR_FULL} + ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/*.java + COMMAND ${Java_JAR_EXECUTABLE} cf ${JAVA_ARTIFACT}-${BUILD_VERSION}.jar + ${JAVA_DOMAIN_EXTENSION}/${JAVA_DOMAIN_NAME}/${JAVA_ARTIFACT}/** + COMMAND ${CMAKE_COMMAND} -E copy $ + ${PACKAGING_DIR_FULL} + WORKING_DIRECTORY ${PACKAGING_DIR_FULL}) add_dependencies(${JAVA_PACKAGING_TARGET_NAME} ${SWIG_TARGET_NAME}) # Test if(BUILD_TEST) set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test) file(COPY example DESTINATION ${TEST_DIR}) - set(SUBDIRECTORY_LIST "enable_library_logging" "execution_management_simple_request" "execution_management_simple_subscription" "fix_simple" "handle_exception" "market_data_multiple_subscription" "market_data_simple_request" "market_data_simple_subscription") + set(SUBDIRECTORY_LIST + "enable_library_logging" + "execution_management_simple_request" + "execution_management_simple_subscription" + "fix_simple" + "handle_exception" + "market_data_multiple_subscription" + "market_data_simple_request" + "market_data_simple_subscription") foreach(SUBDIRECTORY IN LISTS SUBDIRECTORY_LIST) set(JAVA_TEST_TARGET_NAME java_test_${SUBDIRECTORY}) set(JAVA_TEST_BUILD_DIRECTORY ${TEST_DIR}/example/${SUBDIRECTORY}/build) file(MAKE_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) - add_custom_target(${JAVA_TEST_TARGET_NAME} ALL + add_custom_target( + ${JAVA_TEST_TARGET_NAME} ALL COMMAND ${CMAKE_COMMAND} -E rm -rf * - COMMAND ${Java_JAVAC_EXECUTABLE} -cp ${PACKAGING_DIR_FULL}/ccapi-${BUILD_VERSION}.jar -d . ../Main.java - WORKING_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY} - ) + COMMAND ${Java_JAVAC_EXECUTABLE} -cp + ${PACKAGING_DIR_FULL}/ccapi-${BUILD_VERSION}.jar -d . ../Main.java + WORKING_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) add_dependencies(${JAVA_TEST_TARGET_NAME} ${JAVA_PACKAGING_TARGET_NAME}) endforeach() file(COPY test DESTINATION ${TEST_DIR}) set(JAVA_TEST_TARGET_NAME java_test_test) - set(JAVA_TEST_BUILD_DIRECTORY ${TEST_DIR}/test/build) - file(MAKE_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) - add_custom_target(${JAVA_TEST_TARGET_NAME} ALL - COMMAND ${CMAKE_COMMAND} -E rm -rf * - COMMAND ${Java_JAVAC_EXECUTABLE} -cp ${PACKAGING_DIR_FULL}/ccapi-${BUILD_VERSION}.jar -d . ../Main.java - WORKING_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY} - ) - add_dependencies(${JAVA_TEST_TARGET_NAME} ${JAVA_PACKAGING_TARGET_NAME}) - add_test(NAME java_test - COMMAND ${Java_JAVA_EXECUTABLE} -cp ".:${PACKAGING_DIR_FULL}" -Djava.library.path=${PACKAGING_DIR_FULL} Main - WORKING_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) + set(JAVA_TEST_BUILD_DIRECTORY ${TEST_DIR}/test/build) + file(MAKE_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) + add_custom_target( + ${JAVA_TEST_TARGET_NAME} ALL + COMMAND ${CMAKE_COMMAND} -E rm -rf * + COMMAND ${Java_JAVAC_EXECUTABLE} -cp + ${PACKAGING_DIR_FULL}/ccapi-${BUILD_VERSION}.jar -d . ../Main.java + WORKING_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) + add_dependencies(${JAVA_TEST_TARGET_NAME} ${JAVA_PACKAGING_TARGET_NAME}) + add_test( + NAME java_test + COMMAND ${Java_JAVA_EXECUTABLE} -cp ".:${PACKAGING_DIR_FULL}" + -Djava.library.path=${PACKAGING_DIR_FULL} Main + WORKING_DIRECTORY ${JAVA_TEST_BUILD_DIRECTORY}) endif() diff --git a/binding/javascript/CMakeLists.txt b/binding/javascript/CMakeLists.txt index 4348db9b3..d5093c531 100644 --- a/binding/javascript/CMakeLists.txt +++ b/binding/javascript/CMakeLists.txt @@ -13,8 +13,7 @@ endif() execute_process( COMMAND ${NODE_EXECUTABLE} -v OUTPUT_VARIABLE NODE_EXECUTABLE_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) + OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "node version: ${NODE_EXECUTABLE_VERSION}") find_program(NODE_GYP_EXECUTABLE NAMES node-gyp REQUIRED) @@ -27,39 +26,76 @@ endif() execute_process( COMMAND ${NODE_GYP_EXECUTABLE} -v OUTPUT_VARIABLE NODE_GYP_EXECUTABLE_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) + OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "node-gyp version: ${NODE_GYP_EXECUTABLE_VERSION}") file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}) set(BINDING_GYP_CFLAGS_CC_LIST "") set(BINDING_GYP_LDFLAGS_LIST "") set(BINDING_GYP_DEFINES_LIST "") -list(APPEND BINDING_GYP_CFLAGS_CC_LIST -std=c++17 -fPIC -Wno-deprecated-declarations) +list(APPEND BINDING_GYP_CFLAGS_CC_LIST -std=c++17 -fPIC + -Wno-deprecated-declarations) if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") -list(APPEND BINDING_GYP_CFLAGS_CC_LIST -g) -list(APPEND BINDING_GYP_LDFLAGS_LIST -g) + list(APPEND BINDING_GYP_CFLAGS_CC_LIST -g) + list(APPEND BINDING_GYP_LDFLAGS_LIST -g) else() -list(APPEND BINDING_GYP_CFLAGS_CC_LIST -O3 -DNDEBUG) + list(APPEND BINDING_GYP_CFLAGS_CC_LIST -O3 -DNDEBUG) endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") -list(APPEND BINDING_GYP_CFLAGS_CC_LIST -pthread) + list(APPEND BINDING_GYP_CFLAGS_CC_LIST -pthread) endif() -list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_SERVICE_MARKET_DATA CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT CCAPI_ENABLE_SERVICE_FIX CCAPI_ENABLE_EXCHANGE_COINBASE CCAPI_ENABLE_EXCHANGE_GEMINI CCAPI_ENABLE_EXCHANGE_KRAKEN CCAPI_ENABLE_EXCHANGE_KRAKEN_FUTURES CCAPI_ENABLE_EXCHANGE_BITSTAMP CCAPI_ENABLE_EXCHANGE_BITFINEX CCAPI_ENABLE_EXCHANGE_BITMEX CCAPI_ENABLE_EXCHANGE_BINANCE_US CCAPI_ENABLE_EXCHANGE_BINANCE CCAPI_ENABLE_EXCHANGE_BINANCE_MARGIN CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES CCAPI_ENABLE_EXCHANGE_BINANCE_COIN_FUTURES CCAPI_ENABLE_EXCHANGE_HUOBI CCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP CCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP CCAPI_ENABLE_EXCHANGE_OKX CCAPI_ENABLE_EXCHANGE_ERISX CCAPI_ENABLE_EXCHANGE_KUCOIN CCAPI_ENABLE_EXCHANGE_KUCOIN_FUTURES CCAPI_ENABLE_EXCHANGE_DERIBIT CCAPI_ENABLE_EXCHANGE_GATEIO CCAPI_ENABLE_EXCHANGE_GATEIO_PERPETUAL_FUTURES CCAPI_ENABLE_EXCHANGE_CRYPTOCOM CCAPI_ENABLE_EXCHANGE_BYBIT CCAPI_ENABLE_EXCHANGE_BYBIT_DERIVATIVES CCAPI_ENABLE_EXCHANGE_ASCENDEX CCAPI_ENABLE_EXCHANGE_BITGET CCAPI_ENABLE_EXCHANGE_BITGET_FUTURES CCAPI_ENABLE_EXCHANGE_BITMART CCAPI_ENABLE_EXCHANGE_MEXC CCAPI_ENABLE_EXCHANGE_MEXC_FUTURES CCAPI_ENABLE_EXCHANGE_WHITEBIT) +list( + APPEND + BINDING_GYP_DEFINES_LIST + CCAPI_ENABLE_SERVICE_MARKET_DATA + CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT + CCAPI_ENABLE_SERVICE_FIX + CCAPI_ENABLE_EXCHANGE_COINBASE + CCAPI_ENABLE_EXCHANGE_GEMINI + CCAPI_ENABLE_EXCHANGE_KRAKEN + CCAPI_ENABLE_EXCHANGE_KRAKEN_FUTURES + CCAPI_ENABLE_EXCHANGE_BITSTAMP + CCAPI_ENABLE_EXCHANGE_BITFINEX + CCAPI_ENABLE_EXCHANGE_BITMEX + CCAPI_ENABLE_EXCHANGE_BINANCE_US + CCAPI_ENABLE_EXCHANGE_BINANCE + CCAPI_ENABLE_EXCHANGE_BINANCE_MARGIN + CCAPI_ENABLE_EXCHANGE_BINANCE_USDS_FUTURES + CCAPI_ENABLE_EXCHANGE_BINANCE_COIN_FUTURES + CCAPI_ENABLE_EXCHANGE_HUOBI + CCAPI_ENABLE_EXCHANGE_HUOBI_USDT_SWAP + CCAPI_ENABLE_EXCHANGE_HUOBI_COIN_SWAP + CCAPI_ENABLE_EXCHANGE_OKX + CCAPI_ENABLE_EXCHANGE_ERISX + CCAPI_ENABLE_EXCHANGE_KUCOIN + CCAPI_ENABLE_EXCHANGE_KUCOIN_FUTURES + CCAPI_ENABLE_EXCHANGE_DERIBIT + CCAPI_ENABLE_EXCHANGE_GATEIO + CCAPI_ENABLE_EXCHANGE_GATEIO_PERPETUAL_FUTURES + CCAPI_ENABLE_EXCHANGE_CRYPTOCOM + CCAPI_ENABLE_EXCHANGE_BYBIT + CCAPI_ENABLE_EXCHANGE_BYBIT_DERIVATIVES + CCAPI_ENABLE_EXCHANGE_ASCENDEX + CCAPI_ENABLE_EXCHANGE_BITGET + CCAPI_ENABLE_EXCHANGE_BITGET_FUTURES + CCAPI_ENABLE_EXCHANGE_BITMART + CCAPI_ENABLE_EXCHANGE_MEXC + CCAPI_ENABLE_EXCHANGE_MEXC_FUTURES + CCAPI_ENABLE_EXCHANGE_WHITEBIT) if(CCAPI_ENABLE_LOG_ERROR) -list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_ERROR) + list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_ERROR) endif() if(CCAPI_ENABLE_LOG_WARN) -list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_WARN) + list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_WARN) endif() if(CCAPI_ENABLE_LOG_INFO) -list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_INFO) + list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_INFO) endif() if(CCAPI_ENABLE_LOG_DEBUG) -list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_DEBUG) + list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_DEBUG) endif() if(CCAPI_ENABLE_LOG_TRACE) -list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_TRACE) + list(APPEND BINDING_GYP_DEFINES_LIST CCAPI_ENABLE_LOG_TRACE) endif() list(JOIN BINDING_GYP_CFLAGS_CC_LIST "\",\"" BINDING_GYP_CFLAGS_CC) message(STATUS "BINDING_GYP_CFLAGS_CC: ${BINDING_GYP_CFLAGS_CC}") @@ -70,39 +106,42 @@ message(STATUS "BINDING_GYP_DEFINES: ${BINDING_GYP_DEFINES}") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/binding.gyp.in - ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/binding.gyp -@ONLY) + ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/binding.gyp @ONLY) if(NOT NODE_GYP_BUILD_MODE) - set(NODE_GYP_BUILD_MODE "release" CACHE STRING - "Choose the type of build, options are: debug, release." - FORCE) + set(NODE_GYP_BUILD_MODE + "release" + CACHE STRING "Choose the type of build, options are: debug, release." + FORCE) endif() if("${NODE_GYP_BUILD_MODE}" STREQUAL "release") set(NODE_GYP_BUILD_DIR "build/Release") else() -set(NODE_GYP_BUILD_DIR "build/Debug") + set(NODE_GYP_BUILD_DIR "build/Debug") endif() message(STATUS "NODE_GYP_BUILD_MODE: ${NODE_GYP_BUILD_MODE}") -add_custom_target(${SWIG_TARGET_NAME} ALL - COMMAND ${SWIG_EXECUTABLE} -outcurrentdir -c++ -javascript -node -I${CCAPI_PROJECT_DIR}/include ${SWIG_INTERFACE} +add_custom_target( + ${SWIG_TARGET_NAME} ALL + COMMAND ${SWIG_EXECUTABLE} -outcurrentdir -c++ -javascript -node + -I${CCAPI_PROJECT_DIR}/include ${SWIG_INTERFACE} COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/ccapi_logger.cpp . COMMAND ${NODE_GYP_EXECUTABLE} --${NODE_GYP_BUILD_MODE} clean configure build - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME} -) + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}) add_dependencies(${SWIG_TARGET_NAME} boost rapidjson hffix) set(PACKAGING_DIR packaging) -set(PACKAGING_DIR_FULL ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) +set(PACKAGING_DIR_FULL + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) file(MAKE_DIRECTORY ${PACKAGING_DIR_FULL}) set(JAVASCRIPT_PACKAGING_TARGET_NAME ${LANG}_${PACKAGING_DIR}) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/package.json.in - ${PACKAGING_DIR_FULL}/package.json -@ONLY) -add_custom_target(${JAVASCRIPT_PACKAGING_TARGET_NAME} ALL - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/${NODE_GYP_BUILD_DIR}/index.node ${PACKAGING_DIR_FULL} - WORKING_DIRECTORY ${PACKAGING_DIR_FULL} -) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/package.json.in + ${PACKAGING_DIR_FULL}/package.json @ONLY) +add_custom_target( + ${JAVASCRIPT_PACKAGING_TARGET_NAME} ALL + COMMAND + ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/${NODE_GYP_BUILD_DIR}/index.node + ${PACKAGING_DIR_FULL} + WORKING_DIRECTORY ${PACKAGING_DIR_FULL}) add_dependencies(${JAVASCRIPT_PACKAGING_TARGET_NAME} ${SWIG_TARGET_NAME}) # Test @@ -116,15 +155,17 @@ if(BUILD_TEST) endif() file(COPY test DESTINATION ${TEST_DIR}) set(JAVASCRIPT_TEST_TARGET_NAME javascript_test_test) - set(JAVASCRIPT_TEST_BUILD_DIRECTORY ${TEST_DIR}/test) - file(MAKE_DIRECTORY ${JAVASCRIPT_TEST_BUILD_DIRECTORY}) - add_custom_target(${JAVASCRIPT_TEST_TARGET_NAME} ALL - COMMAND ${CMAKE_COMMAND} -E rm -rf node_modules - COMMAND ${NPM_EXECUTABLE} install ${PACKAGING_DIR_FULL} - WORKING_DIRECTORY ${JAVASCRIPT_TEST_BUILD_DIRECTORY} - ) - add_dependencies(${JAVASCRIPT_TEST_TARGET_NAME} ${JAVASCRIPT_PACKAGING_TARGET_NAME}) - add_test(NAME javascript_test + set(JAVASCRIPT_TEST_BUILD_DIRECTORY ${TEST_DIR}/test) + file(MAKE_DIRECTORY ${JAVASCRIPT_TEST_BUILD_DIRECTORY}) + add_custom_target( + ${JAVASCRIPT_TEST_TARGET_NAME} ALL + COMMAND ${CMAKE_COMMAND} -E rm -rf node_modules + COMMAND ${NPM_EXECUTABLE} install ${PACKAGING_DIR_FULL} + WORKING_DIRECTORY ${JAVASCRIPT_TEST_BUILD_DIRECTORY}) + add_dependencies(${JAVASCRIPT_TEST_TARGET_NAME} + ${JAVASCRIPT_PACKAGING_TARGET_NAME}) + add_test( + NAME javascript_test COMMAND ${NODE_EXECUTABLE} index.js - WORKING_DIRECTORY ${JAVASCRIPT_TEST_BUILD_DIRECTORY}) + WORKING_DIRECTORY ${JAVASCRIPT_TEST_BUILD_DIRECTORY}) endif() diff --git a/binding/python/CMakeLists.txt b/binding/python/CMakeLists.txt index e508c0c7a..9933a4ff3 100644 --- a/binding/python/CMakeLists.txt +++ b/binding/python/CMakeLists.txt @@ -6,56 +6,61 @@ set(SWIG_TARGET_NAME ccapi_${NAME}) find_package(Python REQUIRED COMPONENTS Interpreter Development) message(STATUS "Python_VERSION: ${Python_VERSION}") message(STATUS "Python_EXECUTABLE: ${Python_EXECUTABLE}") - if(Python_VERSION VERSION_LESS 3) - message(FATAL_ERROR "Require Python 3") - endif() +if(Python_VERSION VERSION_LESS 3) + message(FATAL_ERROR "Require Python 3") +endif() set_property(SOURCE ${SWIG_INTERFACE} PROPERTY CPLUSPLUS ON) -set_property(SOURCE ${SWIG_INTERFACE} PROPERTY COMPILE_OPTIONS "-py3;-builtin;-threads;-doxygen") -swig_add_library(${SWIG_TARGET_NAME} - LANGUAGE python - OUTPUT_DIR ${CMAKE_BINARY_DIR}/python/${SWIG_TARGET_NAME} -SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER}) +set_property(SOURCE ${SWIG_INTERFACE} + PROPERTY COMPILE_OPTIONS "-py3;-builtin;-threads;-doxygen") +swig_add_library( + ${SWIG_TARGET_NAME} + LANGUAGE python OUTPUT_DIR ${CMAKE_BINARY_DIR}/python/${SWIG_TARGET_NAME} + SOURCES ${SWIG_INTERFACE} ${SOURCE_LOGGER}) if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) add_dependencies(${SWIG_TARGET_NAME} boost rapidjson hffix) endif() -set_property(TARGET ${SWIG_TARGET_NAME} PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) -target_include_directories(${SWIG_TARGET_NAME} - PRIVATE - ${Python_INCLUDE_DIRS} - ) -target_link_libraries(${SWIG_TARGET_NAME} PRIVATE ${Python_LIBRARIES}) +set_property(TARGET ${SWIG_TARGET_NAME} + PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) +target_include_directories(${SWIG_TARGET_NAME} PRIVATE ${Python_INCLUDE_DIRS}) +target_link_libraries(${SWIG_TARGET_NAME} PRIVATE ${Python_LIBRARIES}) -# ####################### +# ############################################################################## # ## Python Packaging ## -# ####################### -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in - ${CMAKE_CURRENT_BINARY_DIR}/setup.py.in - @ONLY) -file(GENERATE +# ############################################################################## +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in + ${CMAKE_CURRENT_BINARY_DIR}/setup.py.in @ONLY) +file( + GENERATE OUTPUT setup.py INPUT ${CMAKE_CURRENT_BINARY_DIR}/setup.py.in) set(PACKAGING_DIR packaging) -set(PACKAGING_DIR_FULL ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) +set(PACKAGING_DIR_FULL + ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGING_DIR}/${BUILD_VERSION}) file(MAKE_DIRECTORY ${PACKAGING_DIR_FULL}) set(PYTHON_PACKAGING_TARGET_NAME python_${PACKAGING_DIR}) -add_custom_target(${PYTHON_PACKAGING_TARGET_NAME} ALL - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/setup.py ${PACKAGING_DIR_FULL} - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/ccapi.py ${PACKAGING_DIR_FULL} - COMMAND ${CMAKE_COMMAND} -E copy $ ${PACKAGING_DIR_FULL} +add_custom_target( + ${PYTHON_PACKAGING_TARGET_NAME} ALL + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/setup.py + ${PACKAGING_DIR_FULL} + COMMAND + ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_TARGET_NAME}/ccapi.py + ${PACKAGING_DIR_FULL} + COMMAND ${CMAKE_COMMAND} -E copy $ + ${PACKAGING_DIR_FULL} COMMAND ${Python_EXECUTABLE} -m pip install --upgrade setuptools wheel COMMAND ${Python_EXECUTABLE} setup.py bdist_wheel COMMAND ${Python_EXECUTABLE} -m pip install --upgrade . - WORKING_DIRECTORY ${PACKAGING_DIR_FULL} -) + WORKING_DIRECTORY ${PACKAGING_DIR_FULL}) add_dependencies(${PYTHON_PACKAGING_TARGET_NAME} ${SWIG_TARGET_NAME}) # Test if(BUILD_TEST) set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test) configure_file(test/main.py ${TEST_DIR}/main.py COPYONLY) - add_test(NAME python_test + add_test( + NAME python_test COMMAND ${Python_EXECUTABLE} main.py - WORKING_DIRECTORY ${TEST_DIR}) + WORKING_DIRECTORY ${TEST_DIR}) endif() diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 6f52262ab..598d7815e 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 17) if(NOT APPLE AND NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() -if (WIN32) +if(WIN32) set(CMAKE_BUILD_TYPE "Release") endif() if(NOT CMAKE_BUILD_TYPE) @@ -17,48 +17,50 @@ message(STATUS "CCAPI_PROJECT_DIR: ${CCAPI_PROJECT_DIR}") if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) message(STATUS "use boost beast websocket") if(NOT BOOST_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(boost - URL https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") + include(ExternalProject) + ExternalProject_Add( + boost + URL https://archives.boost.io/release/1.80.0/source/boost_1_80_0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") else() - add_library(boost INTERFACE) + add_library(boost INTERFACE) endif() if(NOT RAPIDJSON_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(rapidjson - URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") + include(ExternalProject) + ExternalProject_Add( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") else() - add_library(rapidjson INTERFACE) + add_library(rapidjson INTERFACE) endif() if(NOT HFFIX_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(hffix - URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") + include(ExternalProject) + ExternalProject_Add( + hffix + URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") else() - add_library(hffix INTERFACE) + add_library(hffix INTERFACE) endif() - include_directories(${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} + ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) else() message(STATUS "use websocketpp") add_compile_definitions(CCAPI_LEGACY_USE_WEBSOCKETPP) @@ -66,11 +68,14 @@ else() set(WEBSOCKETPP_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/websocketpp) set(BOOST_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/boost) set(HFFIX_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/hffix/include) - include_directories(${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} ${BOOST_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} + ${BOOST_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR}) endif() find_package(OpenSSL REQUIRED) set(ADDITIONAL_LINK_LIBRARIES "") -if (WIN32) +if(WIN32) set(ADDITIONAL_LINK_LIBRARIES ws2_32) endif() link_libraries(OpenSSL::Crypto OpenSSL::SSL ${ADDITIONAL_LINK_LIBRARIES}) diff --git a/format_cmake.sh b/format_cmake.sh new file mode 100755 index 000000000..00722445b --- /dev/null +++ b/format_cmake.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +find . -type f -not -path "*/build/*" \( -name "CMakeLists.txt" -or -name "*.cmake" \) -exec cmake-format -i {} \+ diff --git a/include/ccapi_cpp/ccapi_inflate_stream.h b/include/ccapi_cpp/ccapi_inflate_stream.h index 6a7156730..e28186192 100644 --- a/include/ccapi_cpp/ccapi_inflate_stream.h +++ b/include/ccapi_cpp/ccapi_inflate_stream.h @@ -56,7 +56,7 @@ class InflateStream CCAPI_FINAL { CCAPI_LOGGER_ERROR("decompress error"); return boost::system::error_code(); } - int ret; + this->istate.avail_in = len; this->istate.next_in = const_cast(buf); do { diff --git a/include/ccapi_cpp/ccapi_logger.h b/include/ccapi_cpp/ccapi_logger.h index aad4748b8..24fcda2e5 100644 --- a/include/ccapi_cpp/ccapi_logger.h +++ b/include/ccapi_cpp/ccapi_logger.h @@ -10,7 +10,7 @@ #define CCAPI_LOGGER_THREAD_ID std::this_thread::get_id() #define CCAPI_LOGGER_NOW std::chrono::system_clock::now() #if defined(CCAPI_ENABLE_LOG_FATAL) || defined(CCAPI_ENABLE_LOG_ERROR) || defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || \ - defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) + defined(CCAPI_ENABLE_LOG_DETAIL) || defined(CCAPI_ENABLE_LOG_FINE) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_FATAL(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->fatal(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ @@ -19,8 +19,8 @@ #else #define CCAPI_LOGGER_FATAL(message) throw std::runtime_error(message) #endif -#if defined(CCAPI_ENABLE_LOG_ERROR) || defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DEBUG) || \ - defined(CCAPI_ENABLE_LOG_TRACE) +#if defined(CCAPI_ENABLE_LOG_ERROR) || defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DETAIL) || \ + defined(CCAPI_ENABLE_LOG_FINE) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_ERROR(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->error(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ @@ -28,7 +28,8 @@ #else #define CCAPI_LOGGER_ERROR(message) #endif -#if defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) +#if defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DETAIL) || defined(CCAPI_ENABLE_LOG_FINE) || \ + defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_WARN(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->warn(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ @@ -36,7 +37,8 @@ #else #define CCAPI_LOGGER_WARN(message) #endif -#if defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) +#if defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DETAIL) || defined(CCAPI_ENABLE_LOG_FINE) || defined(CCAPI_ENABLE_LOG_DEBUG) || \ + defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_INFO(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->info(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ @@ -44,6 +46,22 @@ #else #define CCAPI_LOGGER_INFO(message) #endif +#if defined(CCAPI_ENABLE_LOG_DETAIL) || defined(CCAPI_ENABLE_LOG_FINE) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) +#define CCAPI_LOGGER_DETAIL(message) \ + if (::ccapi::Logger::logger) { \ + ::ccapi::Logger::logger->detail(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ + } +#else +#define CCAPI_LOGGER_DETAIL(message) +#endif +#if defined(CCAPI_ENABLE_LOG_FINE) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) +#define CCAPI_LOGGER_FINE(message) \ + if (::ccapi::Logger::logger) { \ + ::ccapi::Logger::logger->fine(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ + } +#else +#define CCAPI_LOGGER_FINE(message) +#endif #if defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_DEBUG(message) \ if (::ccapi::Logger::logger) { \ @@ -84,6 +102,8 @@ class Logger { std::string LOG_SEVERITY_ERROR = "ERROR"; std::string LOG_SEVERITY_WARN = "WARN"; std::string LOG_SEVERITY_INFO = "INFO"; + std::string LOG_SEVERITY_DETAIL = "DETAIL"; + std::string LOG_SEVERITY_FINE = "FINE"; std::string LOG_SEVERITY_DEBUG = "DEBUG"; std::string LOG_SEVERITY_TRACE = "TRACE"; virtual ~Logger() {} @@ -103,6 +123,14 @@ class Logger { const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_INFO, threadId, time, fileName, lineNumber, message); } + void detail(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, + const std::string& message) { + this->logMessagePrivate(LOG_SEVERITY_DETAIL, threadId, time, fileName, lineNumber, message); + } + void fine(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, + const std::string& message) { + this->logMessagePrivate(LOG_SEVERITY_FINE, threadId, time, fileName, lineNumber, message); + } void debug(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_DEBUG, threadId, time, fileName, lineNumber, message); diff --git a/include/ccapi_cpp/ccapi_macro.h b/include/ccapi_cpp/ccapi_macro.h index fe1307b00..a99259dfb 100644 --- a/include/ccapi_cpp/ccapi_macro.h +++ b/include/ccapi_cpp/ccapi_macro.h @@ -504,6 +504,9 @@ #ifndef CCAPI_EM_POSITION_QUANTITY #define CCAPI_EM_POSITION_QUANTITY "QUANTITY" #endif +#ifndef CCAPI_EM_POSITION_ASSET +#define CCAPI_EM_POSITION_ASSET "POSITION_ASSET" +#endif #ifndef CCAPI_EM_POSITION_COST #define CCAPI_EM_POSITION_COST "COST" #endif diff --git a/include/ccapi_cpp/ccapi_message.h b/include/ccapi_cpp/ccapi_message.h index 849ccd7fa..b91e3f120 100644 --- a/include/ccapi_cpp/ccapi_message.h +++ b/include/ccapi_cpp/ccapi_message.h @@ -70,8 +70,10 @@ class Message CCAPI_FINAL { GET_RECENT_CANDLESTICKS, GET_HISTORICAL_CANDLESTICKS, GET_MARKET_DEPTH, + GET_SERVER_TIME, GET_INSTRUMENT, GET_INSTRUMENTS, + GET_BBOS, RESPONSE_ERROR, REQUEST_FAILURE, GENERIC_ERROR, @@ -178,12 +180,18 @@ class Message CCAPI_FINAL { case Type::GET_MARKET_DEPTH: output = "GET_MARKET_DEPTH"; break; + case Type::GET_SERVER_TIME: + output = "GET_SERVER_TIME"; + break; case Type::GET_INSTRUMENT: output = "GET_INSTRUMENT"; break; case Type::GET_INSTRUMENTS: output = "GET_INSTRUMENTS"; break; + case Type::GET_BBOS: + output = "GET_BBOS"; + break; case Type::RESPONSE_ERROR: output = "RESPONSE_ERROR"; break; diff --git a/include/ccapi_cpp/ccapi_request.h b/include/ccapi_cpp/ccapi_request.h index d2e4f14f3..f4f4192ae 100644 --- a/include/ccapi_cpp/ccapi_request.h +++ b/include/ccapi_cpp/ccapi_request.h @@ -37,8 +37,10 @@ class Request CCAPI_FINAL { GET_RECENT_CANDLESTICKS, GET_HISTORICAL_CANDLESTICKS, GET_MARKET_DEPTH, + GET_SERVER_TIME, GET_INSTRUMENT, GET_INSTRUMENTS, + GET_BBOS, CREATE_ORDER = CCAPI_REQUEST_OPERATION_TYPE_EXECUTION_MANAGEMENT_ORDER, CANCEL_ORDER, GET_ORDER, @@ -84,12 +86,18 @@ class Request CCAPI_FINAL { case Operation::GET_MARKET_DEPTH: output = "GET_MARKET_DEPTH"; break; + case Operation::GET_SERVER_TIME: + output = "GET_SERVER_TIME"; + break; case Operation::GET_INSTRUMENT: output = "GET_INSTRUMENT"; break; case Operation::GET_INSTRUMENTS: output = "GET_INSTRUMENTS"; break; + case Operation::GET_BBOS: + output = "GET_BBOS"; + break; case Operation::CREATE_ORDER: output = "CREATE_ORDER"; break; @@ -216,6 +224,7 @@ class Request CCAPI_FINAL { private: #endif + Operation operation; std::string exchange; std::string marginType; std::string instrument; @@ -224,7 +233,6 @@ class Request CCAPI_FINAL { std::string secondaryCorrelationId; std::vector > paramList; std::map credential; - Operation operation; std::vector > > paramListFix; TimePoint timeSent{std::chrono::seconds{0}}; int index{}; diff --git a/include/ccapi_cpp/ccapi_session.h b/include/ccapi_cpp/ccapi_session.h index 0bc7bd494..55c5ad69a 100644 --- a/include/ccapi_cpp/ccapi_session.h +++ b/include/ccapi_cpp/ccapi_session.h @@ -302,7 +302,17 @@ class Session { } virtual void start() { CCAPI_LOGGER_FUNCTION_ENTER; - std::thread t([this]() { this->serviceContextPtr->start(); }); + std::thread t([this]() { + if (this->sessionOptions.cpuCoreIdOpt) { + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + CPU_SET(*this->sessionOptions.cpuCoreIdOpt, &cpuset); + if (pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) != 0) { + CCAPI_LOGGER_ERROR("pthread_setaffinity_np"); + } + } + this->serviceContextPtr->start(); + }); this->t = std::move(t); this->internalEventHandler = std::bind(&Session::onEvent, this, std::placeholders::_1, std::placeholders::_2); #ifdef CCAPI_ENABLE_SERVICE_MARKET_DATA @@ -974,10 +984,10 @@ class Session { EventDispatcher* eventDispatcher{nullptr}; bool useInternalEventDispatcher{}; #endif - ServiceContext* serviceContextPtr{nullptr}; std::map > > serviceByServiceNameExchangeMap; std::thread t; Queue eventQueue; + ServiceContext* serviceContextPtr{nullptr}; std::function* eventQueue)> internalEventHandler; std::map > delayTimerByIdMap; }; diff --git a/include/ccapi_cpp/ccapi_session_options.h b/include/ccapi_cpp/ccapi_session_options.h index 1281a2f97..bd33a4952 100644 --- a/include/ccapi_cpp/ccapi_session_options.h +++ b/include/ccapi_cpp/ccapi_session_options.h @@ -1,5 +1,6 @@ #ifndef INCLUDE_CCAPI_CPP_CCAPI_SESSION_OPTIONS_H_ #define INCLUDE_CCAPI_CPP_CCAPI_SESSION_OPTIONS_H_ +#include #include #include "ccapi_cpp/ccapi_macro.h" @@ -57,6 +58,7 @@ class SessionOptions CCAPI_FINAL { #else long websocketConnectTimeoutMilliseconds{10000}; #endif + std::optional cpuCoreIdOpt; // used to set cpu affinity }; } /* namespace ccapi */ #endif // INCLUDE_CCAPI_CPP_CCAPI_SESSION_OPTIONS_H_ diff --git a/include/ccapi_cpp/ccapi_util_private.h b/include/ccapi_cpp/ccapi_util_private.h index cc8e16653..7d5168a8e 100644 --- a/include/ccapi_cpp/ccapi_util_private.h +++ b/include/ccapi_cpp/ccapi_util_private.h @@ -55,12 +55,12 @@ class UtilString CCAPI_FINAL { output += "."; output += c.substr(c.size() + exponent); } else { -// output = std::string(-exponent - c.size() + 1, '0'); -// output += "."; -// output += c; // use these three code, roundInputBySignificantFigure(0.00123456, 3, 1), output is "000.124" + // output = std::string(-exponent - c.size() + 1, '0'); + // output += "."; + // output += c; // use these three code, roundInputBySignificantFigure(0.00123456, 3, 1), output is "000.124" output = "0."; output += std::string(-exponent - c.size(), '0'); - output += c; // use these three code, roundInputBySignificantFigure(0.00123456, 3, 1), output is "0.00124" + output += c; // use these three code, roundInputBySignificantFigure(0.00123456, 3, 1), output is "0.00124" } return output; } @@ -172,7 +172,7 @@ class UtilString CCAPI_FINAL { case 0: return ""; case 1: - return strings[0]; + return strings.at(0); default: std::ostringstream joined; std::copy(strings.begin(), strings.end() - 1, std::ostream_iterator(joined, delimiter.c_str())); @@ -180,6 +180,10 @@ class UtilString CCAPI_FINAL { return joined.str(); } } + static std::string join(const std::set& strings, const std::string& delimiter) { + std::vector strings_vector(strings.begin(), strings.end()); + return join(strings_vector, delimiter); + } static std::string toUpper(const std::string& input) { std::string output(input); std::transform(output.begin(), output.end(), output.begin(), ::toupper); diff --git a/include/ccapi_cpp/ccapi_ws_connection.h b/include/ccapi_cpp/ccapi_ws_connection.h index 361ded9f6..e6ff63d44 100644 --- a/include/ccapi_cpp/ccapi_ws_connection.h +++ b/include/ccapi_cpp/ccapi_ws_connection.h @@ -182,6 +182,7 @@ class WsConnection CCAPI_FINAL { this->setUrlParts(); } std::string id; + std::string url; std::string group; std::vector subscriptionList; std::vector correlationIdList; @@ -198,7 +199,6 @@ class WsConnection CCAPI_FINAL { #ifndef CCAPI_EXPOSE_INTERNAL private: #endif - std::string url; }; } /* namespace ccapi */ #endif diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h b/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h index c923bf6d3..02f39a565 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_bitget_futures.h @@ -234,18 +234,18 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic elementList.emplace_back(std::move(element)); } } else if (operation == Request::Operation::CANCEL_OPEN_ORDERS) { - const rj::Value& successList = document["data"]["successList"]; - for (const auto& x : successList.GetArray()) { - Element element; - this->extractOrderInfo(element, x, extractionFieldNameMap); - elementList.emplace_back(std::move(element)); - } - const rj::Value& failureList = document["data"]["failureList"]; - for (const auto& x : failureList.GetArray()) { - Element element; - this->extractOrderInfo(element, x, extractionFieldNameMap); - elementList.emplace_back(std::move(element)); - } + const rj::Value& successList = document["data"]["successList"]; + for (const auto& x : successList.GetArray()) { + Element element; + this->extractOrderInfo(element, x, extractionFieldNameMap); + elementList.emplace_back(std::move(element)); + } + const rj::Value& failureList = document["data"]["failureList"]; + for (const auto& x : failureList.GetArray()) { + Element element; + this->extractOrderInfo(element, x, extractionFieldNameMap); + elementList.emplace_back(std::move(element)); + } } } void extractAccountInfoFromRequest(std::vector& elementList, const Request& request, const Request::Operation operation, @@ -346,27 +346,27 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic const auto& instrumentSet = subscription.getInstrumentSet(); const auto& instrumentType = subscription.getInstrumentType(); for (const auto& field : fieldSet) { - if (field == CCAPI_EM_ORDER_UPDATE || field == CCAPI_EM_PRIVATE_TRADE) { - for (const auto& instrument : instrumentSet) { - rj::Value arg(rj::kObjectType); - arg.AddMember("channel", rj::Value("orders", allocator).Move(), allocator); - arg.AddMember("instId", rj::Value(instrument.c_str(), allocator).Move(), allocator); - arg.AddMember("instType", rj::Value(instrumentType.c_str(), allocator).Move(), allocator); - args.PushBack(arg, allocator); - } - } else if (field == CCAPI_EM_POSITION_UPDATE) { - rj::Value arg(rj::kObjectType); - arg.AddMember("channel", rj::Value("positions", allocator).Move(), allocator); - arg.AddMember("instId", rj::Value("default", allocator).Move(), allocator); - arg.AddMember("instType", rj::Value(instrumentType.c_str(), allocator).Move(), allocator); - args.PushBack(arg, allocator); - } else if (field == CCAPI_EM_BALANCE_UPDATE) { - rj::Value arg(rj::kObjectType); - arg.AddMember("channel", rj::Value("account", allocator).Move(), allocator); - arg.AddMember("coin", rj::Value("default", allocator).Move(), allocator); - arg.AddMember("instType", rj::Value(instrumentType.c_str(), allocator).Move(), allocator); - args.PushBack(arg, allocator); + if (field == CCAPI_EM_ORDER_UPDATE || field == CCAPI_EM_PRIVATE_TRADE) { + for (const auto& instrument : instrumentSet) { + rj::Value arg(rj::kObjectType); + arg.AddMember("channel", rj::Value("orders", allocator).Move(), allocator); + arg.AddMember("instId", rj::Value(instrument.c_str(), allocator).Move(), allocator); + arg.AddMember("instType", rj::Value(instrumentType.c_str(), allocator).Move(), allocator); + args.PushBack(arg, allocator); } + } else if (field == CCAPI_EM_POSITION_UPDATE) { + rj::Value arg(rj::kObjectType); + arg.AddMember("channel", rj::Value("positions", allocator).Move(), allocator); + arg.AddMember("instId", rj::Value("default", allocator).Move(), allocator); + arg.AddMember("instType", rj::Value(instrumentType.c_str(), allocator).Move(), allocator); + args.PushBack(arg, allocator); + } else if (field == CCAPI_EM_BALANCE_UPDATE) { + rj::Value arg(rj::kObjectType); + arg.AddMember("channel", rj::Value("account", allocator).Move(), allocator); + arg.AddMember("coin", rj::Value("default", allocator).Move(), allocator); + arg.AddMember("instType", rj::Value(instrumentType.c_str(), allocator).Move(), allocator); + args.PushBack(arg, allocator); + } } document.AddMember("args", args, allocator); rj::StringBuffer stringBufferSubscribe; @@ -436,11 +436,11 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic element.insert(CCAPI_EM_ORDER_LAST_EXECUTED_SIZE, std::string(x["baseVolume"].GetString())); element.insert(CCAPI_EM_ORDER_SIDE, std::string(x["side"].GetString()) == "buy" ? CCAPI_EM_ORDER_SIDE_BUY : CCAPI_EM_ORDER_SIDE_SELL); element.insert(CCAPI_IS_MAKER, std::string(x["tradeScope"].GetString()) == "M" ? "1" : "0"); - element.insert(CCAPI_EM_ORDER_ID, std::string(x["orderId"].GetString())); + element.insert(CCAPI_EM_ORDER_ID, std::string(x["orderId"].GetString())); auto itClientOId = x.FindMember("clientOId"); std::string clientOId = itClientOId != x.MemberEnd() ? itClientOId->value.GetString() : ""; - if(!clientOId.empty()){ - element.insert(CCAPI_EM_CLIENT_ORDER_ID, clientOId); + if (!clientOId.empty()) { + element.insert(CCAPI_EM_CLIENT_ORDER_ID, clientOId); } element.insert(CCAPI_EM_ORDER_INSTRUMENT, instrument); element.insert(CCAPI_EM_ORDER_FEE_QUANTITY, std::string(x["fillFee"].GetString())); @@ -477,7 +477,7 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic messageList.emplace_back(std::move(message)); } } - } else if (channel == "positions"){ + } else if (channel == "positions") { const rj::Value& data = document["data"]; for (const auto& x : data.GetArray()) { auto time = TimePoint(std::chrono::milliseconds(std::stoll(x["uTime"].GetString()))); @@ -497,7 +497,7 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic message.setElementList(elementList); messageList.emplace_back(std::move(message)); } - } else if (channel == "account"){ + } else if (channel == "account") { const rj::Value& data = document["data"]; for (const auto& x : data.GetArray()) { Message message; @@ -512,7 +512,7 @@ class ExecutionManagementServiceBitgetFutures : public ExecutionManagementServic elementList.emplace_back(std::move(element)); message.setElementList(elementList); messageList.emplace_back(std::move(message)); - } + } } } } else if (eventStr == "subscribe") { diff --git a/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h b/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h index 54d7ec97f..cfba49cdb 100644 --- a/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h +++ b/include/ccapi_cpp/service/ccapi_execution_management_service_okx.h @@ -330,6 +330,7 @@ class ExecutionManagementServiceOkx : public ExecutionManagementService { std::string availPos = x["availPos"].GetString(); std::string positionQuantity = availPos.empty() ? x["pos"].GetString() : availPos; element.insert(CCAPI_EM_POSITION_QUANTITY, positionQuantity); + element.insert(CCAPI_EM_POSITION_ASSET, x["posCcy"].GetString()); element.insert(CCAPI_EM_POSITION_ENTRY_PRICE, x["avgPx"].GetString()); element.insert(CCAPI_EM_POSITION_LEVERAGE, x["lever"].GetString()); elementList.emplace_back(std::move(element)); @@ -604,6 +605,7 @@ class ExecutionManagementServiceOkx : public ExecutionManagementService { element.insert(CCAPI_INSTRUMENT, x["instId"].GetString()); element.insert(CCAPI_EM_POSITION_SIDE, x["posSide"].GetString()); element.insert(CCAPI_EM_POSITION_QUANTITY, x["pos"].GetString()); + element.insert(CCAPI_EM_POSITION_ASSET, x["posCcy"].GetString()); element.insert(CCAPI_EM_POSITION_ENTRY_PRICE, x["avgPx"].GetString()); element.insert(CCAPI_EM_UNREALIZED_PNL, x["upl"].GetString()); elementList.emplace_back(std::move(element)); diff --git a/include/ccapi_cpp/service/ccapi_fix_service.h b/include/ccapi_cpp/service/ccapi_fix_service.h index 7fcdae900..694329789 100644 --- a/include/ccapi_cpp/service/ccapi_fix_service.h +++ b/include/ccapi_cpp/service/ccapi_fix_service.h @@ -179,6 +179,7 @@ class FixService : public Service { message.setCorrelationIdList({fixConnectionPtr->subscription.getCorrelationId()}); Element element(true); element.insert(CCAPI_CONNECTION_ID, connectionId); + element.insert(CCAPI_CONNECTION_URL, fixConnectionPtr->url); message.setElementList({element}); event.setMessageList({message}); this->eventHandler(event, nullptr); @@ -229,6 +230,7 @@ class FixService : public Service { Element element(true); auto& connectionId = fixConnectionPtr->id; element.insert(CCAPI_CONNECTION_ID, connectionId); + element.insert(CCAPI_CONNECTION_URL, fixConnectionPtr->url); message.setElementList({element}); event.setMessageList({message}); this->eventHandler(event, nullptr); diff --git a/include/ccapi_cpp/service/ccapi_market_data_service.h b/include/ccapi_cpp/service/ccapi_market_data_service.h index 2eff1bfaa..73b66544a 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service.h @@ -28,8 +28,10 @@ class MarketDataService : public Service { {Request::Operation::GET_RECENT_CANDLESTICKS, Message::Type::GET_RECENT_CANDLESTICKS}, {Request::Operation::GET_HISTORICAL_CANDLESTICKS, Message::Type::GET_HISTORICAL_CANDLESTICKS}, {Request::Operation::GET_MARKET_DEPTH, Message::Type::GET_MARKET_DEPTH}, + {Request::Operation::GET_SERVER_TIME, Message::Type::GET_SERVER_TIME}, {Request::Operation::GET_INSTRUMENT, Message::Type::GET_INSTRUMENT}, {Request::Operation::GET_INSTRUMENTS, Message::Type::GET_INSTRUMENTS}, + {Request::Operation::GET_BBOS, Message::Type::GET_BBOS}, }; CCAPI_LOGGER_FUNCTION_EXIT; } @@ -2004,8 +2006,10 @@ class MarketDataService : public Service { std::string getRecentCandlesticksTarget; std::string getHistoricalCandlesticksTarget; std::string getMarketDepthTarget; + std::string getServerTimeTarget; std::string getInstrumentTarget; std::string getInstrumentsTarget; + std::string getBbosTarget; std::map exchangeJsonPayloadIdByConnectionIdMap; std::map>> exchangeSubscriptionIdListByConnectionIdExchangeJsonPayloadIdMap; // only needed for generic public subscription diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance.h index 50da338c0..2ad648205 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance.h @@ -36,8 +36,10 @@ class MarketDataServiceBinance : public MarketDataServiceBinanceBase { this->getRecentCandlesticksTarget = "/api/v3/klines"; this->getHistoricalCandlesticksTarget = "/api/v3/klines"; this->getMarketDepthTarget = "/api/v3/depth"; + this->getServerTimeTarget = "/api/v3/time"; this->getInstrumentTarget = "/api/v3/exchangeInfo"; this->getInstrumentsTarget = "/api/v3/exchangeInfo"; + this->getBbosTarget = "/api/v3/ticker/bookTicker"; } virtual ~MarketDataServiceBinance() {} }; diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h index 2a556f3ce..7264832ef 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance_base.h @@ -361,6 +361,11 @@ class MarketDataServiceBinanceBase : public MarketDataService { this->appendSymbolId(queryString, symbolId, "symbol"); req.target(target + "?" + queryString); } break; + case Request::Operation::GET_SERVER_TIME: { + req.method(http::verb::get); + auto target = this->getServerTimeTarget; + req.target(target); + } break; case Request::Operation::GET_INSTRUMENT: { req.method(http::verb::get); auto target = this->getInstrumentTarget; @@ -373,6 +378,11 @@ class MarketDataServiceBinanceBase : public MarketDataService { auto target = this->getInstrumentTarget; req.target(target); } break; + case Request::Operation::GET_BBOS: { + req.method(http::verb::get); + auto target = this->getBbosTarget; + req.target(target); + } break; default: this->convertRequestForRestCustom(req, request, now, symbolId, credential); } @@ -463,6 +473,14 @@ class MarketDataServiceBinanceBase : public MarketDataService { } marketDataMessageList.emplace_back(std::move(marketDataMessage)); } break; + case Request::Operation::GET_SERVER_TIME: { + Message message; + message.setTime(UtilTime::makeTimePointMilli(UtilTime::divideMilli(document["serverTime"].GetString()))); + message.setTimeReceived(timeReceived); + message.setType(this->requestOperationToMessageTypeMap.at(request.getOperation())); + message.setCorrelationIdList({request.getCorrelationId()}); + event.addMessages({message}); + } break; case Request::Operation::GET_INSTRUMENT: { Message message; message.setTimeReceived(timeReceived); @@ -492,6 +510,24 @@ class MarketDataServiceBinanceBase : public MarketDataService { message.setCorrelationIdList({request.getCorrelationId()}); event.addMessages({message}); } break; + case Request::Operation::GET_BBOS: { + Message message; + message.setTimeReceived(timeReceived); + message.setType(this->requestOperationToMessageTypeMap.at(request.getOperation())); + std::vector elementList; + for (const auto& x : document.GetArray()) { + Element element; + element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString()); + element.insert(CCAPI_BEST_BID_N_PRICE, x["bidPrice"].GetString()); + element.insert(CCAPI_BEST_BID_N_SIZE, x["bidQty"].GetString()); + element.insert(CCAPI_BEST_ASK_N_PRICE, x["askPrice"].GetString()); + element.insert(CCAPI_BEST_ASK_N_SIZE, x["askQty"].GetString()); + elementList.push_back(element); + } + message.setElementList(elementList); + message.setCorrelationIdList({request.getCorrelationId()}); + event.addMessages({message}); + } break; default: CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE); } diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance_coin_futures.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance_coin_futures.h index dacf03b0b..f66e8c236 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance_coin_futures.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance_coin_futures.h @@ -36,8 +36,10 @@ class MarketDataServiceBinanceCoinFutures : public MarketDataServiceBinanceDeriv this->getRecentCandlesticksTarget = "/dapi/v1/klines"; this->getHistoricalCandlesticksTarget = "/dapi/v1/klines"; this->getMarketDepthTarget = "/dapi/v1/depth"; + this->getServerTimeTarget = "/dapi/v1/time"; this->getInstrumentTarget = "/dapi/v1/exchangeInfo"; this->getInstrumentsTarget = "/dapi/v1/exchangeInfo"; + this->getBbosTarget = "/dapi/v1/ticker/bookTicker"; } virtual ~MarketDataServiceBinanceCoinFutures() {} }; diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance_us.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance_us.h index 3ba268654..6dabc8878 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance_us.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance_us.h @@ -36,8 +36,10 @@ class MarketDataServiceBinanceUs : public MarketDataServiceBinanceBase { this->getRecentCandlesticksTarget = "/api/v3/klines"; this->getHistoricalCandlesticksTarget = "/api/v3/klines"; this->getMarketDepthTarget = "/api/v3/depth"; + this->getServerTimeTarget = "/api/v3/time"; this->getInstrumentTarget = "/api/v3/exchangeInfo"; this->getInstrumentsTarget = "/api/v3/exchangeInfo"; + this->getBbosTarget = "/api/v3/ticker/bookTicker"; } virtual ~MarketDataServiceBinanceUs() {} }; diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_binance_usds_futures.h b/include/ccapi_cpp/service/ccapi_market_data_service_binance_usds_futures.h index e5d42476c..37cdbf320 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_binance_usds_futures.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_binance_usds_futures.h @@ -36,8 +36,10 @@ class MarketDataServiceBinanceUsdsFutures : public MarketDataServiceBinanceDeriv this->getRecentCandlesticksTarget = "/fapi/v1/klines"; this->getHistoricalCandlesticksTarget = "/fapi/v1/klines"; this->getMarketDepthTarget = "/fapi/v1/depth"; + this->getServerTimeTarget = "/fapi/v1/time"; this->getInstrumentTarget = "/fapi/v1/exchangeInfo"; this->getInstrumentsTarget = "/fapi/v1/exchangeInfo"; + this->getBbosTarget = "/fapi/v1/ticker/bookTicker"; } virtual ~MarketDataServiceBinanceUsdsFutures() {} }; diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h b/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h index a06859d14..87238da28 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_bybit.h @@ -19,8 +19,10 @@ class MarketDataServiceBybit : public MarketDataService { this->getRecentCandlesticksTarget = "/v5/market/kline"; this->getHistoricalCandlesticksTarget = "/v5/market/kline"; this->getMarketDepthTarget = "/v5/market/orderbook"; + this->getServerTimeTarget = "/v5/market/time"; this->getInstrumentTarget = "/v5/market/instruments-info"; this->getInstrumentsTarget = "/v5/market/instruments-info"; + this->getBbosTarget = "/v5/market/tickers"; } virtual ~MarketDataServiceBybit() {} #ifndef CCAPI_EXPOSE_INTERNAL @@ -272,6 +274,11 @@ class MarketDataServiceBybit : public MarketDataService { this->appendSymbolId(queryString, symbolId, "symbol"); req.target(target + "?" + queryString); } break; + case Request::Operation::GET_SERVER_TIME: { + req.method(http::verb::get); + auto target = this->getServerTimeTarget; + req.target(target); + } break; case Request::Operation::GET_INSTRUMENT: { req.method(http::verb::get); auto target = this->getInstrumentTarget; @@ -297,6 +304,17 @@ class MarketDataServiceBybit : public MarketDataService { }); req.target(target + "?" + queryString); } break; + case Request::Operation::GET_BBOS: { + req.method(http::verb::get); + auto target = this->getBbosTarget; + std::string queryString; + const std::map param = request.getFirstParamWithDefault(); + this->appendParam(queryString, param, + { + {CCAPI_INSTRUMENT_TYPE, "category"}, + }); + req.target(target + "?" + queryString); + } break; default: this->convertRequestForRestCustom(req, request, now, symbolId, credential); } @@ -379,6 +397,14 @@ class MarketDataServiceBybit : public MarketDataService { } marketDataMessageList.emplace_back(std::move(marketDataMessage)); } break; + case Request::Operation::GET_SERVER_TIME: { + Message message; + message.setTime(UtilTime::makeTimePoint(UtilTime::divideNanoWhole(document["result"]["timeNano"].GetString()))); + message.setTimeReceived(timeReceived); + message.setType(this->requestOperationToMessageTypeMap.at(request.getOperation())); + message.setCorrelationIdList({request.getCorrelationId()}); + event.addMessages({message}); + } break; case Request::Operation::GET_INSTRUMENT: { Message message; message.setTimeReceived(timeReceived); @@ -410,6 +436,24 @@ class MarketDataServiceBybit : public MarketDataService { message.setCorrelationIdList({request.getCorrelationId()}); event.addMessages({message}); } break; + case Request::Operation::GET_BBOS: { + Message message; + message.setTimeReceived(timeReceived); + message.setType(this->requestOperationToMessageTypeMap.at(request.getOperation())); + std::vector elementList; + for (const auto& x : document["result"]["list"].GetArray()) { + Element element; + element.insert(CCAPI_INSTRUMENT, x["symbol"].GetString()); + element.insert(CCAPI_BEST_BID_N_PRICE, x["bid1Price"].GetString()); + element.insert(CCAPI_BEST_BID_N_SIZE, x["bid1Size"].GetString()); + element.insert(CCAPI_BEST_ASK_N_PRICE, x["ask1Price"].GetString()); + element.insert(CCAPI_BEST_ASK_N_SIZE, x["ask1Size"].GetString()); + elementList.push_back(element); + } + message.setElementList(elementList); + message.setCorrelationIdList({request.getCorrelationId()}); + event.addMessages({message}); + } break; default: CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE); } diff --git a/include/ccapi_cpp/service/ccapi_market_data_service_okx.h b/include/ccapi_cpp/service/ccapi_market_data_service_okx.h index 16ed7f4ed..8e6f6cbc8 100644 --- a/include/ccapi_cpp/service/ccapi_market_data_service_okx.h +++ b/include/ccapi_cpp/service/ccapi_market_data_service_okx.h @@ -37,8 +37,10 @@ class MarketDataServiceOkx : public MarketDataService { this->getHistoricalCandlesticksTarget = "/api/v5/market/history-candles"; this->getMarketDepthTarget = "/api/v5/market/books"; this->getRecentTradesTarget = "/api/v5/market/trades"; + this->getServerTimeTarget = "/api/v5/public/time"; this->getInstrumentTarget = "/api/v5/public/instruments"; this->getInstrumentsTarget = "/api/v5/public/instruments"; + this->getBbosTarget = "/api/v5/market/tickers"; } virtual ~MarketDataServiceOkx() {} #ifndef CCAPI_EXPOSE_INTERNAL @@ -367,6 +369,11 @@ class MarketDataServiceOkx : public MarketDataService { this->appendSymbolId(queryString, symbolId, "instId"); req.target(target + "?" + queryString); } break; + case Request::Operation::GET_SERVER_TIME: { + req.method(http::verb::get); + auto target = this->getServerTimeTarget; + req.target(target); + } break; case Request::Operation::GET_INSTRUMENT: { req.method(http::verb::get); auto target = this->getInstrumentTarget; @@ -390,14 +397,27 @@ class MarketDataServiceOkx : public MarketDataService { }); req.target(target + "?" + queryString); } break; + case Request::Operation::GET_BBOS: { + req.method(http::verb::get); + auto target = this->getBbosTarget; + std::string queryString; + const std::map param = request.getFirstParamWithDefault(); + this->appendParam(queryString, param, + { + {CCAPI_INSTRUMENT_TYPE, "instType"}, + }); + req.target(target + "?" + queryString); + } break; default: this->convertRequestForRestCustom(req, request, now, symbolId, credential); } } void extractInstrumentInfo(Element& element, const rj::Value& x) { element.insert(CCAPI_INSTRUMENT, x["instId"].GetString()); - element.insert(CCAPI_BASE_ASSET, x["baseCcy"].GetString()); - element.insert(CCAPI_QUOTE_ASSET, x["quoteCcy"].GetString()); + std::string baseCcy = x["baseCcy"].GetString(); + element.insert(CCAPI_BASE_ASSET, baseCcy.empty() ? UtilString::split(x["instFamily"].GetString(), '-').at(0) : baseCcy); + std::string quoteCcy = x["quoteCcy"].GetString(); + element.insert(CCAPI_QUOTE_ASSET, quoteCcy.empty() ? UtilString::split(x["instFamily"].GetString(), '-').at(1) : quoteCcy); element.insert(CCAPI_ORDER_PRICE_INCREMENT, x["tickSz"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_INCREMENT, x["lotSz"].GetString()); element.insert(CCAPI_ORDER_QUANTITY_MIN, x["minSz"].GetString()); @@ -462,6 +482,14 @@ class MarketDataServiceOkx : public MarketDataService { } marketDataMessageList.emplace_back(std::move(marketDataMessage)); } break; + case Request::Operation::GET_SERVER_TIME: { + Message message; + message.setTime(UtilTime::makeTimePointMilli(UtilTime::divideMilli(document["data"][0]["ts"].GetString()))); + message.setTimeReceived(timeReceived); + message.setType(this->requestOperationToMessageTypeMap.at(request.getOperation())); + message.setCorrelationIdList({request.getCorrelationId()}); + event.addMessages({message}); + } break; case Request::Operation::GET_INSTRUMENT: { Message message; message.setTimeReceived(timeReceived); @@ -491,6 +519,24 @@ class MarketDataServiceOkx : public MarketDataService { message.setCorrelationIdList({request.getCorrelationId()}); event.addMessages({message}); } break; + case Request::Operation::GET_BBOS: { + Message message; + message.setTimeReceived(timeReceived); + message.setType(this->requestOperationToMessageTypeMap.at(request.getOperation())); + std::vector elementList; + for (const auto& x : document["data"].GetArray()) { + Element element; + element.insert(CCAPI_INSTRUMENT, x["instId"].GetString()); + element.insert(CCAPI_BEST_BID_N_PRICE, x["bidPx"].GetString()); + element.insert(CCAPI_BEST_BID_N_SIZE, x["bidSz"].GetString()); + element.insert(CCAPI_BEST_ASK_N_PRICE, x["askPx"].GetString()); + element.insert(CCAPI_BEST_ASK_N_SIZE, x["askSz"].GetString()); + elementList.push_back(element); + } + message.setElementList(elementList); + message.setCorrelationIdList({request.getCorrelationId()}); + event.addMessages({message}); + } break; default: CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE); } diff --git a/include/ccapi_cpp/service/ccapi_service.h b/include/ccapi_cpp/service/ccapi_service.h index 1fe2cec0b..446e4bd71 100644 --- a/include/ccapi_cpp/service/ccapi_service.h +++ b/include/ccapi_cpp/service/ccapi_service.h @@ -479,7 +479,7 @@ class Service : public std::enable_shared_from_this { errorHandler(ec); return; } - beast::ssl_stream& stream = *httpConnectionPtr->streamPtr; + #if defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) { std::ostringstream oss; @@ -1281,7 +1281,7 @@ class Service : public std::enable_shared_from_this { WsConnection& wsConnection = *wsConnectionPtr; wsConnection.status = WsConnection::Status::CONNECTING; CCAPI_LOGGER_DEBUG("connection initialization on id " + wsConnection.id); - std::string url = wsConnection.getUrl(); + std::string url = wsConnection.url; CCAPI_LOGGER_DEBUG("url = " + url); this->startResolveWs(wsConnectionPtr); CCAPI_LOGGER_FUNCTION_EXIT; @@ -1395,22 +1395,22 @@ class Service : public std::enable_shared_from_this { if (ec) { if (ec == beast::error::timeout) { CCAPI_LOGGER_TRACE("timeout, connection closed"); - } else { - CCAPI_LOGGER_TRACE("fail"); - Event event; - event.setType(Event::Type::SESSION_STATUS); - Message message; - message.setTimeReceived(now); - message.setType(Message::Type::SESSION_CONNECTION_DOWN); - message.setCorrelationIdList(wsConnectionPtr->correlationIdList); - Element element(true); - auto& connectionId = wsConnectionPtr->id; - element.insert(CCAPI_CONNECTION_ID, connectionId); - message.setElementList({element}); - event.setMessageList({message}); - this->eventHandler(event, nullptr); - this->onFail(wsConnectionPtr); } + CCAPI_LOGGER_TRACE("fail"); + Event event; + event.setType(Event::Type::SESSION_STATUS); + Message message; + message.setTimeReceived(now); + message.setType(Message::Type::SESSION_CONNECTION_DOWN); + message.setCorrelationIdList(wsConnectionPtr->correlationIdList); + Element element; + auto& connectionId = wsConnectionPtr->id; + element.insert(CCAPI_CONNECTION_ID, connectionId); + element.insert(CCAPI_CONNECTION_URL, wsConnectionPtr->url); + message.setElementList({element}); + event.setMessageList({message}); + this->eventHandler(event, nullptr); + this->onFail(wsConnectionPtr); return; } if (wsConnectionPtr->status != WsConnection::Status::OPEN) { @@ -1431,7 +1431,7 @@ class Service : public std::enable_shared_from_this { WsConnection& wsConnection = *wsConnectionPtr; wsConnection.status = WsConnection::Status::OPEN; CCAPI_LOGGER_INFO("connection " + toString(wsConnection) + " established"); - auto urlBase = UtilString::split(wsConnection.getUrl(), "?").at(0); + auto urlBase = UtilString::split(wsConnection.url, "?").at(0); this->connectNumRetryOnFailByConnectionUrlMap[urlBase] = 0; Event event; event.setType(Event::Type::SESSION_STATUS); @@ -1443,7 +1443,7 @@ class Service : public std::enable_shared_from_this { message.setCorrelationIdList(correlationIdList); Element element; element.insert(CCAPI_CONNECTION_ID, wsConnection.id); - element.insert(CCAPI_CONNECTION_URL, wsConnection.getUrl()); + element.insert(CCAPI_CONNECTION_URL, wsConnection.url); message.setElementList({element}); event.setMessageList({message}); this->eventHandler(event, nullptr); @@ -1490,6 +1490,28 @@ class Service : public std::enable_shared_from_this { } void onWriteWs(std::shared_ptr wsConnectionPtr, const ErrorCode& ec, std::size_t n) { CCAPI_LOGGER_FUNCTION_ENTER; + auto now = UtilTime::now(); + if (ec) { + if (ec == beast::error::timeout) { + CCAPI_LOGGER_TRACE("timeout, connection closed"); + } + CCAPI_LOGGER_TRACE("fail"); + Event event; + event.setType(Event::Type::SESSION_STATUS); + Message message; + message.setTimeReceived(now); + message.setType(Message::Type::SESSION_CONNECTION_DOWN); + message.setCorrelationIdList(wsConnectionPtr->correlationIdList); + Element element; + auto& connectionId = wsConnectionPtr->id; + element.insert(CCAPI_CONNECTION_ID, connectionId); + element.insert(CCAPI_CONNECTION_URL, wsConnectionPtr->url); + message.setElementList({element}); + event.setMessageList({message}); + this->eventHandler(event, nullptr); + this->onFail(wsConnectionPtr); + return; + } auto& connectionId = wsConnectionPtr->id; auto& writeMessageBuffer = this->writeMessageBufferByConnectionIdMap[connectionId]; auto& writeMessageBufferWrittenLength = this->writeMessageBufferWrittenLengthByConnectionIdMap[connectionId]; @@ -1511,7 +1533,7 @@ class Service : public std::enable_shared_from_this { this->onError(Event::Type::SUBSCRIPTION_STATUS, Message::Type::SUBSCRIPTION_FAILURE, "connection " + toString(wsConnection) + " has failed before opening"); WsConnection thisWsConnection = wsConnection; this->wsConnectionByIdMap.erase(thisWsConnection.id); - auto urlBase = UtilString::split(thisWsConnection.getUrl(), "?").at(0); + auto urlBase = UtilString::split(thisWsConnection.url, "?").at(0); long seconds = std::round(UtilAlgorithm::exponentialBackoff(1, 1, 2, std::min(this->connectNumRetryOnFailByConnectionUrlMap[urlBase], 6))); CCAPI_LOGGER_INFO("about to set timer for " + toString(seconds) + " seconds"); if (this->connectRetryOnFailTimerByConnectionIdMap.find(thisWsConnection.id) != this->connectRetryOnFailTimerByConnectionIdMap.end()) { @@ -1603,7 +1625,7 @@ class Service : public std::enable_shared_from_this { message.setType(Message::Type::SESSION_CONNECTION_DOWN); Element element; element.insert(CCAPI_CONNECTION_ID, wsConnection.id); - element.insert(CCAPI_CONNECTION_URL, wsConnection.getUrl()); + element.insert(CCAPI_CONNECTION_URL, wsConnection.url); element.insert(CCAPI_REASON, reason); message.setElementList({element}); std::vector correlationIdList; diff --git a/include/ccapi_cpp/service/ccapi_service_context.h b/include/ccapi_cpp/service/ccapi_service_context.h index 589e68882..03553fabc 100644 --- a/include/ccapi_cpp/service/ccapi_service_context.h +++ b/include/ccapi_cpp/service/ccapi_service_context.h @@ -6,6 +6,7 @@ #include "websocketpp/common/connection_hdl.hpp" #include "websocketpp/config/asio_client.hpp" #include "websocketpp/config/boost_config.hpp" + namespace wspp = websocketpp; namespace ccapi { /** @@ -69,6 +70,7 @@ class ServiceContext CCAPI_FINAL { } /* namespace ccapi */ #else +#include "boost/asio/ssl.hpp" #include "ccapi_cpp/ccapi_logger.h" namespace ccapi { /** diff --git a/performance/CMakeLists.txt b/performance/CMakeLists.txt index 184bf5940..cc9305cc5 100644 --- a/performance/CMakeLists.txt +++ b/performance/CMakeLists.txt @@ -5,18 +5,21 @@ set(CMAKE_CXX_STANDARD 17) if(NOT APPLE AND NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() -if (WIN32) +if(WIN32) set(CMAKE_BUILD_TYPE "Release") endif() # Force default build type to Release if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING - "Choose the type of build, options are: Debug, Release (default), RelWithDebInfo and MinSizeRel." - FORCE) + set(CMAKE_BUILD_TYPE + "Release" + CACHE + STRING + "Choose the type of build, options are: Debug, Release (default), RelWithDebInfo and MinSizeRel." + FORCE) endif() message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") set(OPENSSL_USE_STATIC_LIBS TRUE) -if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug") +if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug") message(STATUS "Enable performance tuning") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() @@ -25,48 +28,50 @@ message(STATUS "CCAPI_PROJECT_DIR: ${CCAPI_PROJECT_DIR}") if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) message(STATUS "use boost beast websocket") if(NOT BOOST_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(boost - URL https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") + include(ExternalProject) + ExternalProject_Add( + boost + URL https://archives.boost.io/release/1.80.0/source/boost_1_80_0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") else() - add_library(boost INTERFACE) + add_library(boost INTERFACE) endif() if(NOT RAPIDJSON_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(rapidjson - URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") + include(ExternalProject) + ExternalProject_Add( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") else() - add_library(rapidjson INTERFACE) + add_library(rapidjson INTERFACE) endif() if(NOT HFFIX_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(hffix - URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") + include(ExternalProject) + ExternalProject_Add( + hffix + URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") else() - add_library(hffix INTERFACE) + add_library(hffix INTERFACE) endif() - include_directories(${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} + ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) else() message(STATUS "use websocketpp") add_compile_definitions(CCAPI_LEGACY_USE_WEBSOCKETPP) @@ -74,11 +79,14 @@ else() set(WEBSOCKETPP_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/websocketpp) set(BOOST_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/boost) set(HFFIX_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/hffix/include) - include_directories(${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} + ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR}) endif() find_package(OpenSSL REQUIRED) set(ADDITIONAL_LINK_LIBRARIES "") -if (WIN32) +if(WIN32) set(ADDITIONAL_LINK_LIBRARIES ws2_32) endif() link_libraries(OpenSSL::Crypto OpenSSL::SSL ${ADDITIONAL_LINK_LIBRARIES}) diff --git a/performance/src/rest_vs_fix/CMakeLists.txt b/performance/src/rest_vs_fix/CMakeLists.txt index 8f78c5018..d161cf157 100644 --- a/performance/src/rest_vs_fix/CMakeLists.txt +++ b/performance/src/rest_vs_fix/CMakeLists.txt @@ -3,8 +3,11 @@ project(${NAME}) add_compile_definitions(CCAPI_ENABLE_SERVICE_EXECUTION_MANAGEMENT) add_compile_definitions(CCAPI_ENABLE_SERVICE_FIX) add_compile_definitions(CCAPI_ENABLE_EXCHANGE_COINBASE) -add_compile_definitions(CCAPI_COINBASE_URL_REST_BASE="https://api-public.sandbox.pro.coinbase.com") -add_compile_definitions(CCAPI_COINBASE_URL_FIX_BASE="tcp+ssl://fix-public.sandbox.pro.coinbase.com:4198") +add_compile_definitions( + CCAPI_COINBASE_URL_REST_BASE="https://api-public.sandbox.pro.coinbase.com") +add_compile_definitions( + CCAPI_COINBASE_URL_FIX_BASE="tcp+ssl://fix-public.sandbox.pro.coinbase.com:4198" +) add_executable(${NAME} main.cpp) if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) add_dependencies(${NAME} boost rapidjson hffix) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2b204194a..f5f4a34d1 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 17) if(NOT APPLE AND NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() -if (WIN32) +if(WIN32) set(CMAKE_BUILD_TYPE "Release") endif() if(NOT CMAKE_BUILD_TYPE) @@ -17,48 +17,50 @@ message(STATUS "CCAPI_PROJECT_DIR: ${CCAPI_PROJECT_DIR}") if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) message(STATUS "use boost beast websocket") if(NOT BOOST_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(boost - URL https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") + include(ExternalProject) + ExternalProject_Add( + boost + URL https://archives.boost.io/release/1.80.0/source/boost_1_80_0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/boost" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(BOOST_INCLUDE_DIR "${CMAKE_BINARY_DIR}/boost") else() - add_library(boost INTERFACE) + add_library(boost INTERFACE) endif() if(NOT RAPIDJSON_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(rapidjson - URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") + include(ExternalProject) + ExternalProject_Add( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/rapidjson" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(RAPIDJSON_INCLUDE_DIR "${CMAKE_BINARY_DIR}/rapidjson/include") else() - add_library(rapidjson INTERFACE) + add_library(rapidjson INTERFACE) endif() if(NOT HFFIX_INCLUDE_DIR) - include(ExternalProject) - ExternalProject_Add(hffix - URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz - SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") + include(ExternalProject) + ExternalProject_Add( + hffix + URL https://github.com/jamesdbrock/hffix/archive/refs/tags/v1.3.0.tar.gz + SOURCE_DIR "${CMAKE_BINARY_DIR}/hffix" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") + set(HFFIX_INCLUDE_DIR "${CMAKE_BINARY_DIR}/hffix/include") else() - add_library(hffix INTERFACE) + add_library(hffix INTERFACE) endif() - include_directories(${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} + ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) else() message(STATUS "use websocketpp") add_compile_definitions(CCAPI_LEGACY_USE_WEBSOCKETPP) @@ -66,19 +68,22 @@ else() set(WEBSOCKETPP_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/websocketpp) set(BOOST_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/boost) set(HFFIX_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/hffix/include) - include_directories(${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) + include_directories( + ${CCAPI_PROJECT_DIR}/include ${WEBSOCKETPP_INCLUDE_DIR} + ${BOOST_INCLUDE_DIR} ${RAPIDJSON_INCLUDE_DIR} ${HFFIX_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR}) endif() find_package(OpenSSL REQUIRED) -if (WIN32) +if(WIN32) set(ADDITIONAL_LINK_LIBRARIES ws2_32) endif() link_libraries(OpenSSL::Crypto OpenSSL::SSL ${ADDITIONAL_LINK_LIBRARIES}) set(SOURCE_LOGGER ${CCAPI_PROJECT_DIR}/test/ccapi_logger.cpp) add_compile_options(-Wno-deprecated -Wno-nonnull -Wno-deprecated-declarations) if(BUILD_TEST_BUILD) - add_subdirectory(test_build) + add_subdirectory(test_build) endif() if(BUILD_TEST_UNIT) - enable_testing() - add_subdirectory(test_unit) + enable_testing() + add_subdirectory(test_unit) endif() diff --git a/test/test_build/CMakeLists.txt b/test/test_build/CMakeLists.txt index c172f8350..f58a1aabb 100644 --- a/test/test_build/CMakeLists.txt +++ b/test/test_build/CMakeLists.txt @@ -2,35 +2,99 @@ set(NAME build_test) project(${NAME}) add_compile_definitions(CCAPI_ENABLE_LOG_TRACE) set(SERVICE_LIST "MARKET_DATA" "EXECUTION_MANAGEMENT" "FIX") -set(MARKET_DATA_EXCHANGE_LIST "COINBASE" "GEMINI" "KRAKEN" "KRAKEN_FUTURES" "BITSTAMP" "BITFINEX" "BITMEX" "BINANCE_US" "BINANCE" "BINANCE_USDS_FUTURES" "BINANCE_COIN_FUTURES" "HUOBI" "HUOBI_USDT_SWAP" "HUOBI_COIN_SWAP" "OKX" "ERISX" "KUCOIN" "KUCOIN_FUTURES" "DERIBIT" "GATEIO" "GATEIO_PERPETUAL_FUTURES" "CRYPTOCOM" "ASCENDEX" "BYBIT" "BITGET" "BITGET_FUTURES" "BITMART" "MEXC" "MEXC_FUTURES" "WHITEBIT") -set(EXECUTION_MANAGEMENT_EXCHANGE_LIST "COINBASE" "GEMINI" "KRAKEN" "KRAKEN_FUTURES" "BITSTAMP" "BITFINEX" "BITMEX" "BINANCE_US" "BINANCE" "BINANCE_USDS_FUTURES" "BINANCE_COIN_FUTURES" "HUOBI" "HUOBI_USDT_SWAP" "HUOBI_COIN_SWAP" "OKX" "ERISX" "KUCOIN" "KUCOIN_FUTURES" "DERIBIT" "GATEIO" "GATEIO_PERPETUAL_FUTURES" "CRYPTOCOM" "ASCENDEX" "BYBIT" "BITGET" "BITGET_FUTURES" "BITMART" "MEXC" "WHITEBIT") +set(MARKET_DATA_EXCHANGE_LIST + "COINBASE" + "GEMINI" + "KRAKEN" + "KRAKEN_FUTURES" + "BITSTAMP" + "BITFINEX" + "BITMEX" + "BINANCE_US" + "BINANCE" + "BINANCE_USDS_FUTURES" + "BINANCE_COIN_FUTURES" + "HUOBI" + "HUOBI_USDT_SWAP" + "HUOBI_COIN_SWAP" + "OKX" + "ERISX" + "KUCOIN" + "KUCOIN_FUTURES" + "DERIBIT" + "GATEIO" + "GATEIO_PERPETUAL_FUTURES" + "CRYPTOCOM" + "ASCENDEX" + "BYBIT" + "BITGET" + "BITGET_FUTURES" + "BITMART" + "MEXC" + "MEXC_FUTURES" + "WHITEBIT") +set(EXECUTION_MANAGEMENT_EXCHANGE_LIST + "COINBASE" + "GEMINI" + "KRAKEN" + "KRAKEN_FUTURES" + "BITSTAMP" + "BITFINEX" + "BITMEX" + "BINANCE_US" + "BINANCE" + "BINANCE_USDS_FUTURES" + "BINANCE_COIN_FUTURES" + "HUOBI" + "HUOBI_USDT_SWAP" + "HUOBI_COIN_SWAP" + "OKX" + "ERISX" + "KUCOIN" + "KUCOIN_FUTURES" + "DERIBIT" + "GATEIO" + "GATEIO_PERPETUAL_FUTURES" + "CRYPTOCOM" + "ASCENDEX" + "BYBIT" + "BITGET" + "BITGET_FUTURES" + "BITMART" + "MEXC" + "WHITEBIT") set(FIX_EXCHANGE_LIST "COINBASE" "GEMINI") set(HFFIX_INCLUDE_DIR ${CCAPI_PROJECT_DIR}/dependency/hffix/include) foreach(SERVICE IN LISTS SERVICE_LIST) - message(STATUS "SERVICE=${SERVICE}") - if("${SERVICE}" STREQUAL "MARKET_DATA") - set(EXCHANGE_LIST ${MARKET_DATA_EXCHANGE_LIST}) - elseif("${SERVICE}" STREQUAL "EXECUTION_MANAGEMENT") - set(EXCHANGE_LIST ${EXECUTION_MANAGEMENT_EXCHANGE_LIST}) - elseif("${SERVICE}" STREQUAL "FIX") - set(EXCHANGE_LIST ${FIX_EXCHANGE_LIST}) + message(STATUS "SERVICE=${SERVICE}") + if("${SERVICE}" STREQUAL "MARKET_DATA") + set(EXCHANGE_LIST ${MARKET_DATA_EXCHANGE_LIST}) + elseif("${SERVICE}" STREQUAL "EXECUTION_MANAGEMENT") + set(EXCHANGE_LIST ${EXECUTION_MANAGEMENT_EXCHANGE_LIST}) + elseif("${SERVICE}" STREQUAL "FIX") + set(EXCHANGE_LIST ${FIX_EXCHANGE_LIST}) + endif() + foreach(EXCHANGE IN LISTS EXCHANGE_LIST) + message(STATUS "EXCHANGE=${EXCHANGE}") + set(CCAPI_CPP_TARGET_NAME "${SERVICE}__${EXCHANGE}") + add_executable("${CCAPI_CPP_TARGET_NAME}" ${SOURCE_LOGGER} test.cpp) + if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) + add_dependencies("${CCAPI_CPP_TARGET_NAME}" boost rapidjson hffix) endif() - foreach(EXCHANGE IN LISTS EXCHANGE_LIST) - message(STATUS "EXCHANGE=${EXCHANGE}") - set(CCAPI_CPP_TARGET_NAME "${SERVICE}__${EXCHANGE}") - add_executable("${CCAPI_CPP_TARGET_NAME}" ${SOURCE_LOGGER} test.cpp) - if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) - add_dependencies("${CCAPI_CPP_TARGET_NAME}" boost rapidjson hffix) - endif() - target_compile_definitions("${CCAPI_CPP_TARGET_NAME}" PRIVATE "CCAPI_ENABLE_SERVICE_${SERVICE}" "CCAPI_ENABLE_EXCHANGE_${EXCHANGE}") - if("${SERVICE}" STREQUAL "FIX") - message(STATUS "need hffix") - target_include_directories("${CCAPI_CPP_TARGET_NAME}" PRIVATE ${HFFIX_INCLUDE_DIR}) - endif() - if("${EXCHANGE}" MATCHES "^HUOBI" OR "${EXCHANGE}" MATCHES "^OKX" OR "${EXCHANGE}" MATCHES "^BITMART") - message(STATUS "need zlib") - find_package(ZLIB REQUIRED) - target_link_libraries("${CCAPI_CPP_TARGET_NAME}" PRIVATE ZLIB::ZLIB) - endif() - endforeach() + target_compile_definitions( + "${CCAPI_CPP_TARGET_NAME}" PRIVATE "CCAPI_ENABLE_SERVICE_${SERVICE}" + "CCAPI_ENABLE_EXCHANGE_${EXCHANGE}") + if("${SERVICE}" STREQUAL "FIX") + message(STATUS "need hffix") + target_include_directories("${CCAPI_CPP_TARGET_NAME}" + PRIVATE ${HFFIX_INCLUDE_DIR}) + endif() + if("${EXCHANGE}" MATCHES "^HUOBI" + OR "${EXCHANGE}" MATCHES "^OKX" + OR "${EXCHANGE}" MATCHES "^BITMART") + message(STATUS "need zlib") + find_package(ZLIB REQUIRED) + target_link_libraries("${CCAPI_CPP_TARGET_NAME}" PRIVATE ZLIB::ZLIB) + endif() + endforeach() endforeach() diff --git a/test/test_unit/CMakeLists.txt b/test/test_unit/CMakeLists.txt index a4e3683cf..f9eb58584 100644 --- a/test/test_unit/CMakeLists.txt +++ b/test/test_unit/CMakeLists.txt @@ -3,34 +3,36 @@ project(${NAME}) # Download and unpack googletest at configure time configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . +execute_process( + COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download ) + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download) if(result) message(FATAL_ERROR "CMake step for googletest failed: ${result}") endif() -execute_process(COMMAND ${CMAKE_COMMAND} --build . +execute_process( + COMMAND ${CMAKE_COMMAND} --build . RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download ) + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download) if(result) message(FATAL_ERROR "Build step for googletest failed: ${result}") endif() -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +# Prevent overriding the parent project's compiler/linker settings on Windows +set(gtest_force_shared_crt + ON + CACHE BOOL "" FORCE) -# Add googletest directly to our build. This defines -# the gtest and gtest_main targets. +# Add googletest directly to our build. This defines the gtest and gtest_main +# targets. add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src - ${CMAKE_CURRENT_BINARY_DIR}/googletest-build - EXCLUDE_FROM_ALL) + ${CMAKE_CURRENT_BINARY_DIR}/googletest-build EXCLUDE_FROM_ALL) -# The gtest/gtest_main targets carry header search path -# dependencies automatically when using CMake 2.8.11 or -# later. Otherwise we have to add them here ourselves. -if (CMAKE_VERSION VERSION_LESS 2.8.11) - include_directories("${gtest_SOURCE_DIR}/include") +# The gtest/gtest_main targets carry header search path dependencies +# automatically when using CMake 2.8.11 or later. Otherwise we have to add them +# here ourselves. +if(CMAKE_VERSION VERSION_LESS 2.8.11) + include_directories("${gtest_SOURCE_DIR}/include") endif() # find_package(GTest REQUIRED CONFIG) include(GoogleTest) diff --git a/test/test_unit/src/app/CMakeLists.txt b/test/test_unit/src/app/CMakeLists.txt index 5237695bd..598d4a996 100644 --- a/test/test_unit/src/app/CMakeLists.txt +++ b/test/test_unit/src/app/CMakeLists.txt @@ -1,7 +1,13 @@ set(NAME app) project(${NAME}) -add_executable(${NAME} ${SOURCE_LOGGER} common_test.cpp historical_market_data_event_processor_test.cpp) +add_executable(${NAME} ${SOURCE_LOGGER} common_test.cpp + historical_market_data_event_processor_test.cpp) if(NOT CCAPI_LEGACY_USE_WEBSOCKETPP) add_dependencies(${NAME} boost rapidjson) endif() -gtest_discover_tests(${NAME} PROPERTIES ENVIRONMENT "HISTORICAL_MARKET_DATA_EVENT_PROCESSOR_TEST=gemini,btc,usd,2021-07-01,2021-07-03,${CCAPI_PROJECT_DIR}/test/test_unit/data/historical_market_data") +gtest_discover_tests( + ${NAME} + PROPERTIES + ENVIRONMENT + "HISTORICAL_MARKET_DATA_EVENT_PROCESSOR_TEST=gemini,btc,usd,2021-07-01,2021-07-03,${CCAPI_PROJECT_DIR}/test/test_unit/data/historical_market_data" +)