diff --git a/.cmake-format b/.cmake-format new file mode 100644 index 00000000..bec68f36 --- /dev/null +++ b/.cmake-format @@ -0,0 +1,53 @@ +# notes for additional commands +# +# nargs: '*' to allow multiple arguments +# kwargs: &fookwargs to definite keyword arguments +# kwargs: *fookwargs to use the same keyword arguments as fookwargs +# NAME: 1 to allow single keyword arguments +# NAME: + to allow multiple keyword arguments +# NAME: * to allow multiple keyword arguments +# spelling: FOO to use foo to FOO spelling + +parse: + additional_commands: + FetchContent_Declare: + pargs: + nargs: '*' + flags: [] + kwargs: + GIT_TAG: 1 + GITHUB_REPOSITORY: 1 + GITLAB_REPOSITORY: 1 + GIT_REPOSITORY: 1 + SVN_REPOSITORY: 1 + SVN_REVISION: 1 + URL: 1 + URL_HASH: 1 + URL_MD5: 1 + FIND_PACKAGE_ARGS: + + FetchContent_MakeAvailable: + pargs: + nargs: '*' + flags: [] + execute_process: + pargs: + nargs: '*' + flags: [] + kwargs: + COMMAND: + + WORKING_DIRECTORY: 1 + set_target_properties: + pargs: + nargs: '*' + flags: [] + kwargs: + PROPERTIES: + + IMPORTED_LOCATION: 1 + INTERFACE_INCLUDE_DIRECTORIES: 1 +format: + tab_size: 2 + line_width: 120 + autosort: true + dangle_parens: true + max_subgroups_hwrap: 2 + max_pargs_hwrap: 3 \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f926c6cd..c17f2550 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,20 +14,18 @@ jobs: fail-fast: false steps: - - name: Checkout Trantor source code - uses: actions/checkout@v2 - with: - submodules: true - fetch-depth: 0 + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - name: (Linux) Install dependencies - run: | - # Installing packages might fail as the github image becomes outdated - sudo apt update - sudo apt install dos2unix clang-format + - name: (Linux) Install dependencies + run: | + # Installing packages might fail as the github image becomes outdated + sudo apt update + sudo apt install dos2unix clang-format + pip install cmake-format - - name: Lint - if: matrix.os == 'ubuntu-20.04' - working-directory: ${{env.GITHUB_WORKSPACE}} - shell: bash - run: ./format.sh && git diff --exit-code + - name: Lint + run: ./format.sh && git diff --exit-code diff --git a/.github/workflows/macos-clang.yml b/.github/workflows/macos-clang.yml index 14bf313f..e0f1592f 100644 --- a/.github/workflows/macos-clang.yml +++ b/.github/workflows/macos-clang.yml @@ -8,64 +8,70 @@ on: jobs: build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + name: "${{matrix.link}}-${{matrix.build-type}}-TLS:${{matrix.tls-provider}}" runs-on: macos-latest + env: + shared: ${{matrix.link == 'SHARED' && 'ON' || 'OFF'}} strategy: fail-fast: false matrix: - link: [ 'STATIC', 'SHARED' ] - # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - build-type: ['Debug', 'Release'] - tls-provider: ['', 'openssl', 'botan'] + link: ["STATIC", "SHARED"] + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto) + tls-provider: ["none", "openssl", "botan-3"] steps: - - name: Install dependencies - # botan v3 - run: | - brew install botan spdlog + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - name: Install gtest - run: | - wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz - tar xf v1.13.0.tar.gz - cd googletest-1.13.0 - cmake . - make && sudo make install + - name: Install dependencies + shell: bash + working-directory: ${{env.GITHUB_WORKSPACE}} + run: | + sh deps.macos-12.sh - - name: Checkout Trantor source code - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 + - name: Configure Cmake [ BUILD_DEPENDENCIES OFF | SPDLOG OFF | C-ARES OFF ] + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DBUILD_DEPENDENCIES=OFF \ + -DTRANTOR_USE_SPDLOG=OFF \ + -DTRANTOR_USE_C-ARES=OFF \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Create build directory - run: | - mkdir build + - name: Build + working-directory: ./build + run: | + make -j - - name: Create Build Environment & Configure Cmake - shell: bash - working-directory: ./build - run: | - [[ ${{ matrix.link }} == "SHARED" ]] && shared="ON" || shared="OFF" - cmake .. \ - -DTRANTOR_USE_TLS=${{matrix.tls-provider}} \ - -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ - -DBUILD_SHARED_LIBS=$shared \ - -DCMAKE_INSTALL_PREFIX=../install \ - -DUSE_SPDLOG=ON \ - -DBUILD_TESTING=ON \ + - name: Test + working-directory: ./build + run: | + make test - - name: Build - shell: bash - working-directory: ./build - # Execute the build. You can specify a specific target with "--target " - run: | - sudo make && sudo make install + - name: Configure Cmake [ BUILD_DEPENDENCIES OFF | SPDLOG ON | C-ARES ON ] + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DBUILD_DEPENDENCIES=OFF \ + -DTRANTOR_USE_SPDLOG=ON \ + -DTRANTOR_USE_C-ARES=ON \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Test - working-directory: ./build - shell: bash - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: | - make test + - name: Build + working-directory: ./build + run: | + make -j + + - name: Test + working-directory: ./build + run: | + make test diff --git a/.github/workflows/rockylinux-gcc.yml b/.github/workflows/rockylinux-gcc.yml index 85de8c26..4b08b33f 100644 --- a/.github/workflows/rockylinux-gcc.yml +++ b/.github/workflows/rockylinux-gcc.yml @@ -8,81 +8,75 @@ on: jobs: build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + name: "${{matrix.link}}-${{matrix.build-type}}-TLS:${{matrix.tls-provider}}" runs-on: ubuntu-latest - container: + env: + shared: ${{matrix.link == 'SHARED' && 'ON' || 'OFF'}} + container: image: rockylinux:9.3 options: --user root strategy: fail-fast: false matrix: - link: [ 'STATIC', 'SHARED' ] - # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - build-type: ['Debug', 'Release'] - # TODO: ubuntu botan is v2, v2 support is removed - # tls-provider: ['', 'openssl', 'botan'] - tls-provider: ['', 'openssl'] + link: ["STATIC", "SHARED"] + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto) + tls-provider: ["none", "openssl"] steps: - - name: Install dependencies - run: | - dnf install gcc-c++ cmake git wget -y + - name: Install build dependencies + run: | + dnf install git cmake gcc gcc-c++ -y - - name: Install dependencies - spdlog - run: | - git clone https://github.com/gabime/spdlog.git - cd spdlog && mkdir build && cd build - cmake .. && make -j + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - name: Install dependencies - OpenSSL - if: matrix.tls-provider == 'openssl' - run: | - dnf install openssl-devel -y - - - name: Install gtest - run: | - wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz - tar xf v1.13.0.tar.gz - cd googletest-1.13.0 - cmake . - make -j && make install + - name: Install dependencies + run: | + sh ./deps.rockylinux-9.sh - - name: Checkout Trantor source code - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 + - name: Configure Cmake [ BUILD_DEPENDENCIES OFF | SPDLOG OFF | C-ARES OFF ] + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DBUILD_DEPENDENCIES=OFF \ + -DTRANTOR_USE_SPDLOG=OFF \ + -DTRANTOR_USE_C-ARES=OFF \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Create build directory - run: | - mkdir build + - name: Build + working-directory: ./build + run: | + make -j - - name: Create Build Environment & Configure Cmake - shell: bash - working-directory: ./build - if: ${{matrix.link}} == "SHARED" - run: | - [[ ${{ matrix.link }} == "SHARED" ]] && shared="ON" || shared="OFF" - cmake .. \ - -DTRANTOR_USE_TLS=${{matrix.tls-provider}} \ - -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ - -DBUILD_SHARED_LIBS=$shared \ - -DCMAKE_INSTALL_PREFIX=../install \ - -DUSE_SPDLOG=ON \ - -DBUILD_TESTING=ON + - name: Test + working-directory: ./build + run: | + make test - - name: Build - shell: bash - working-directory: ./build - # Execute the build. You can specify a specific target with "--target " - run: | - make && make install + - name: Configure Cmake [ BUILD_DEPENDENCIES OFF | SPDLOG ON | C-ARES ON ] + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DBUILD_DEPENDENCIES=OFF \ + -DTRANTOR_USE_SPDLOG=ON \ + -DTRANTOR_USE_C-ARES=ON \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Test - working-directory: ./build - shell: bash - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: | - make test + - name: Build + working-directory: ./build + run: | + make -j + - name: Test + working-directory: ./build + run: | + make test diff --git a/.github/workflows/ubuntu-gcc.yml b/.github/workflows/ubuntu-gcc.yml index 04b47ff7..16cc4cd5 100644 --- a/.github/workflows/ubuntu-gcc.yml +++ b/.github/workflows/ubuntu-gcc.yml @@ -8,74 +8,68 @@ on: jobs: build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + name: "${{matrix.link}}-${{matrix.build-type}}-TLS:${{matrix.tls-provider}}" runs-on: ubuntu-latest + env: + shared: ${{matrix.link == 'SHARED' && 'ON' || 'OFF'}} strategy: fail-fast: false matrix: - link: [ 'STATIC', 'SHARED' ] - # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - build-type: ['Debug', 'Release'] - # TODO: ubuntu botan is v2, v2 support is removed - # tls-provider: ['', 'openssl', 'botan'] - tls-provider: ['', 'openssl'] + link: ["STATIC", "SHARED"] + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto) + tls-provider: ["none", "openssl"] steps: - - name: Install dependencies - run: | - # Installing packages might fail as the github image becomes outdated - sudo apt update - sudo apt install libspdlog-dev libfmt-dev + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - name: Install dependencies - OpenSSL - if: matrix.tls-provider == 'openssl' - run: | - sudo apt install openssl libssl-dev - - - name: Install gtest - run: | - wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz - tar xf v1.13.0.tar.gz - cd googletest-1.13.0 - cmake . - make -j && sudo make install + - name: Install dependencies + run: | + sh ./deps.ubuntu-20.04.sh - - name: Checkout Trantor source code - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 + - name: Configure Cmake [ BUILD_DEPENDENCIES OFF | SPDLOG OFF | C-ARES OFF ] + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DBUILD_DEPENDENCIES=OFF \ + -DTRANTOR_USE_SPDLOG=OFF \ + -DTRANTOR_USE_C-ARES=OFF \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Create build directory - run: | - mkdir build + - name: Build + working-directory: ./build + run: | + make -j - - name: Create Build Environment & Configure Cmake - shell: bash - working-directory: ./build - if: ${{matrix.link}} == "SHARED" - run: | - [[ ${{ matrix.link }} == "SHARED" ]] && shared="ON" || shared="OFF" - cmake .. \ - -DTRANTOR_USE_TLS=${{matrix.tls-provider}} \ - -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ - -DBUILD_SHARED_LIBS=$shared \ - -DCMAKE_INSTALL_PREFIX=../install \ - -DUSE_SPDLOG=ON \ - -DBUILD_TESTING=ON + - name: Test + working-directory: ./build + run: | + make test - - name: Build - shell: bash - working-directory: ./build - # Execute the build. You can specify a specific target with "--target " - run: | - sudo make && sudo make install + - name: Configure Cmake [ BUILD_DEPENDENCIES OFF | SPDLOG ON | C-ARES ON ] + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DBUILD_DEPENDENCIES=OFF \ + -DTRANTOR_USE_SPDLOG=ON \ + -DTRANTOR_USE_C-ARES=ON \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Test - working-directory: ./build - shell: bash - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: | - make test + - name: Build + working-directory: ./build + run: | + make -j + - name: Test + working-directory: ./build + run: | + make test diff --git a/.github/workflows/windows-msvc.yml b/.github/workflows/windows-msvc.yml index 238374a0..073bc4ce 100644 --- a/.github/workflows/windows-msvc.yml +++ b/.github/workflows/windows-msvc.yml @@ -7,18 +7,20 @@ on: workflow_dispatch: jobs: - build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + ############################################################################################################### + vcpkg-build: + name: "${{matrix.link}}-${{matrix.build-type}}-TLS:${{matrix.tls-provider}}-vcpkg" runs-on: windows-latest + env: + shared: ${{matrix.link == 'SHARED' && 'ON' || 'OFF'}} strategy: fail-fast: false matrix: - link: [ 'STATIC', 'SHARED' ] - # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - build-type: ['Debug', 'Release'] - # TODO: conan botan is v2, v2 support is removed - # tls-provider: ['', 'openssl', 'botan'] - tls-provider: ['', 'openssl'] + link: ["STATIC", "SHARED"] + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto) + tls-provider: ["none", "openssl", "botan-3"] steps: - name: Checkout Trantor source code @@ -26,37 +28,167 @@ jobs: with: submodules: false - - name: Create build directory - working-directory: ${{env.GITHUB_WORKSPACE}} + # This step let nmake/ninja could work + - name: Setup MSVC-DEV-CMD + uses: ilammy/msvc-dev-cmd@v1 + + - uses: actions/cache@v4 + id: vcpkg-cache + with: + path: | + ~/AppData/Local/vcpkg/archives + c:/vcpkg/downloads + c:/vcpkg/buildtrees + c:/vcpkg/packages + d:/a/trantor/trantor/vcpkg-installed + key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} + + - name: Install vcpkg packages + if: steps.vcpkg-cache.outputs.cache-hit != 'true' + run: | + pwsh ./deps.windows.vcpkg.ps1 + + - name: Configure Cmake [ vcpkg | SPDLOG OFF | C-ARES OFF ] + # multi config build using --config to switch Release|Debug run: | - mkdir build + cmake -B build -S . ` + -DCMAKE_TOOLCHAIN_FILE="c:/vcpkg/scripts/buildsystems/vcpkg.cmake" ` + -DBUILD_SHARED_LIBS=$shared ` + -DBUILD_DEPENDENCIES=OFF ` + -DTRANTOR_USE_SPDLOG=OFF ` + -DTRANTOR_USE_C-ARES=OFF ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=ON ` + -DCMAKE_POLICY_DEFAULT_CMP0091=NEW ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 + + - name: Build + working-directory: ./build + # multi config build using --config to switch Release|Debug + run: | + cmake --build . --config ${{matrix.build-type}} --target ALL_BUILD + + - name: Test + working-directory: ./build + run: | + ctest + + - name: Configure Cmake [ vcpkg | SPDLOG ON | C-ARES ON ] + # multi config build using --config to switch Release|Debug + run: | + cmake -B build -S . ` + -DCMAKE_TOOLCHAIN_FILE="c:/vcpkg/scripts/buildsystems/vcpkg.cmake" ` + -DBUILD_SHARED_LIBS=$shared ` + -DBUILD_DEPENDENCIES=OFF ` + -DTRANTOR_USE_SPDLOG=ON ` + -DTRANTOR_USE_C-ARES=ON ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=ON ` + -DCMAKE_POLICY_DEFAULT_CMP0091=NEW ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 + + - name: Build + working-directory: ./build + # multi config build using --config to switch Release|Debug + run: | + cmake --build . --config ${{matrix.build-type}} --target ALL_BUILD + + - name: Test + working-directory: ./build + run: | + ctest + + ############################################################################################################### + conan-build: + name: "${{matrix.link}}-${{matrix.build-type}}-TLS:${{matrix.tls-provider}}-conan" + runs-on: windows-latest + env: + shared: ${{matrix.link == 'SHARED' && 'ON' || 'OFF'}} + strategy: + fail-fast: false + matrix: + link: ["STATIC", "SHARED"] + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto) + tls-provider: ["none", "openssl"] + + steps: + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: false + + # This step let nmake/ninja could work + - name: Setup MSVC-DEV-CMD + uses: ilammy/msvc-dev-cmd@v1 + + - uses: actions/cache@v4 + id: conan-cache + with: + path: | + ~\AppData\Local\pip\Cache + ~\.conan2 + key: ${{ runner.os }}-conan-${{ hashFiles('conanfile.txt') }} - name: Install conan packages - shell: bash + run: | + pwsh deps.windows.conan.ps1 + + - name: Configure Cmake [ conan | SPDLOG OFF | C-ARES OFF ] + # multi config build using --config to switch Release|Debug + run: | + cmake -B build -S . ` + -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" ` + -DBUILD_SHARED_LIBS=$shared ` + -DBUILD_DEPENDENCIES=OFF ` + -DTRANTOR_USE_SPDLOG=OFF ` + -DTRANTOR_USE_C-ARES=OFF ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=ON ` + -DCMAKE_POLICY_DEFAULT_CMP0091=NEW ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 + + - name: Build working-directory: ./build + # multi config build using --config to switch Release|Debug run: | - pip install conan - conan profile detect --force - conan install .. --output-folder=. --build=missing --settings=build_type=${{matrix.build-type}} --settings=compiler="msvc" --settings=compiler.version=193 + cmake --build . --config ${{matrix.build-type}} --target ALL_BUILD - - name: Create Build Environment & Configure Cmake - shell: bash + - name: Test working-directory: ./build - # -DBUILD_TESTING=ON Removed, - # Due to unittest by GTest in windows runner will comes out 'error MSB3073' run: | - [[ ${{ matrix.link }} == "SHARED" ]] && shared="ON" || shared="OFF" - cmake .. -G "Visual Studio 17 2022" -T host=x64 -A x64 \ - -DTRANTOR_USE_TLS=${{matrix.tls-provider}} \ - -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ - -DBUILD_SHARED_LIBS=$shared \ - -DCMAKE_INSTALL_PREFIX=../install \ - -DUSE_SPDLOG=ON \ - -DCMAKE_POLICY_DEFAULT_CMP0091=NEW + ctest + + - name: Clean build folder + run: | + Remove-Item -Recurse -Force build + + - name: Install conan packages + run: | + pwsh deps.windows.conan.ps1 + + - name: Configure Cmake [ conan | SPDLOG ON | C-ARES ON ] + # multi config build using --config to switch Release|Debug + run: | + cmake -B build -S . ` + -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" ` + -DBUILD_SHARED_LIBS=$shared ` + -DBUILD_DEPENDENCIES=OFF ` + -DTRANTOR_USE_SPDLOG=ON ` + -DTRANTOR_USE_C-ARES=ON ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=ON ` + -DCMAKE_POLICY_DEFAULT_CMP0091=NEW ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 - name: Build working-directory: ./build - shell: bash # multi config build using --config to switch Release|Debug run: | - cmake --build . --config ${{matrix.build-type}} --parallel + cmake --build . --config ${{matrix.build-type}} --target ALL_BUILD + + - name: Test + working-directory: ./build + run: | + ctest diff --git a/.gitignore b/.gitignore index a237028b..29c9c782 100755 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ .idea -build -cmake-build-debug .vscode .vs -CMakeSettings.json .cache +build +cmake-build-debug +CMakeSettings.json +CMakeUserPresets.json +vcpkg_installled diff --git a/CMakeLists.txt b/CMakeLists.txt index 07c61b9d..e3d92aa1 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,411 +1,190 @@ -cmake_minimum_required(VERSION 3.5) +# CMake version < 3.14, could not use option BUILD_DEPENDENCIES +cmake_minimum_required(VERSION 3.10) project(trantor) +add_library(${PROJECT_NAME}) -option(BUILD_DOC "Build Doxygen documentation" OFF) -option(BUILD_C-ARES "Build C-ARES" ON) -option(BUILD_TESTING "Build tests" OFF) -option(BUILD_SHARED_LIBS "Build trantor as a shared lib" OFF) -option(TRANTOR_USE_TLS "TLS provider for trantor. Valid options are 'openssl', 'botan' or '' (let the build scripr decide)" "") -option(USE_SPDLOG "Allow using the spdlog logging library" OFF) - -list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/) +# C++ standard +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 14) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD_REQUIRED ON) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_EXTENSIONS OFF) +# Build options +option(BUILD_SHARED_LIBS "Build Trantor as a shared lib" OFF) +option(BUILD_TESTING "Build tests" OFF) +option(BUILD_DOC "Build Doxygen documentation" OFF) +option(TRANTOR_USE_SPDLOG "Allow using the spdlog logging library" ON) +option(TRANTOR_USE_C-ARES "Allow using C-ARES" ON) +set(TRANTOR_TLS_PROVIDER + "auto" + CACHE STRING "TLS(Transport Layer Security) provider for trantor. Valid options are + 'none', 'openssl', 'botan-3', 'auto'." +) + +# Version set(TRANTOR_MAJOR_VERSION 1) set(TRANTOR_MINOR_VERSION 5) set(TRANTOR_PATCH_VERSION 17) -set(TRANTOR_VERSION - ${TRANTOR_MAJOR_VERSION}.${TRANTOR_MINOR_VERSION}.${TRANTOR_PATCH_VERSION}) - -include(GNUInstallDirs) -# Offer the user the choice of overriding the installation directories -set(INSTALL_BIN_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for binaries") -set(INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries") -set(INSTALL_INCLUDE_DIR - ${CMAKE_INSTALL_INCLUDEDIR} - CACHE PATH "Installation directory for header files") -set(DEF_INSTALL_TRANTOR_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/Trantor) -set(INSTALL_TRANTOR_CMAKE_DIR - ${DEF_INSTALL_TRANTOR_CMAKE_DIR} - CACHE PATH "Installation directory for cmake files") - -add_library(${PROJECT_NAME}) +set(TRANTOR_VERSION ${TRANTOR_MAJOR_VERSION}.${TRANTOR_MINOR_VERSION}.${TRANTOR_PATCH_VERSION}) if(BUILD_SHARED_LIBS) - list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES - "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}" isSystemDir) - if("${isSystemDir}" STREQUAL "-1") - set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}") - endif("${isSystemDir}" STREQUAL "-1") - set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${TRANTOR_VERSION} - SOVERSION ${TRANTOR_MAJOR_VERSION}) - if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) - # Ignore MSVC C4251 and C4275 warning of exporting std objects with no dll export - # We export class to facilitate maintenance, thus if you compile - # drogon on windows as a shared library, you will need to use - # exact same compiler for drogon and your app. - target_compile_options(${PROJECT_NAME} PUBLIC /wd4251 /wd4275) - endif() -endif(BUILD_SHARED_LIBS) - -# Tells Visual Studio 2017 (15.7+) and newer to correctly set the value of the standard __cplusplus macro, -# instead of leaving it to 199711L and settings the effective c++ version in _MSVC_LANG -# Dropping support for older versions of VS would allow to only rely on __cplusplus -if(MSVC AND MSVC_VERSION GREATER_EQUAL 1914) - add_compile_options(/Zc:__cplusplus) -endif(MSVC AND MSVC_VERSION GREATER_EQUAL 1914) - -if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND CMAKE_CXX_COMPILER_ID MATCHES Clang|GNU) - target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Werror) -endif() - -if(${CMAKE_SYSTEM_NAME} STREQUAL "Haiku") - target_link_libraries(${PROJECT_NAME} PRIVATE network) + set_target_properties( + ${PROJECT_NAME} + PROPERTIES VERSION + ${TRANTOR_VERSION} + SOVERSION + ${TRANTOR_MAJOR_VERSION} + ) endif() -include(GenerateExportHeader) -generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h) - -# include directories -target_include_directories( - ${PROJECT_NAME} - PUBLIC $ - $ - $ - PRIVATE ${PROJECT_SOURCE_DIR} - ${PROJECT_SOURCE_DIR}/trantor/utils - ${PROJECT_SOURCE_DIR}/trantor/net - ${PROJECT_SOURCE_DIR}/trantor/net/inner - $) +# CMake modules +list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/) -if(MINGW) - target_compile_definitions( - ${PROJECT_NAME} - PUBLIC -D_WIN32_WINNT=0x0601) -endif(MINGW) +# Common settings +include(cmake/SetBuildOutput.cmake) +include(cmake/SetSystemAndCompiler.cmake) +include(cmake/SetThreads.cmake) +include(cmake/TestAtomic.cmake) +# Sources and headers set(TRANTOR_SOURCES - trantor/utils/AsyncFileLogger.cc - trantor/utils/ConcurrentTaskQueue.cc - trantor/utils/Date.cc - trantor/utils/LogStream.cc - trantor/utils/Logger.cc - trantor/utils/MsgBuffer.cc - trantor/utils/SerialTaskQueue.cc - trantor/utils/TimingWheel.cc - trantor/utils/Utilities.cc + # cmake-format: sortable + trantor/net/Channel.cc trantor/net/EventLoop.cc trantor/net/EventLoopThread.cc trantor/net/EventLoopThreadPool.cc trantor/net/InetAddress.cc - trantor/net/TcpClient.cc - trantor/net/TcpServer.cc - trantor/net/Channel.cc trantor/net/inner/Acceptor.cc + trantor/net/inner/AsyncStreamBufferNode.cc trantor/net/inner/Connector.cc + trantor/net/inner/MemBufferNode.cc trantor/net/inner/Poller.cc + trantor/net/inner/poller/EpollPoller.cc + trantor/net/inner/poller/KQueue.cc + trantor/net/inner/poller/PollPoller.cc trantor/net/inner/Socket.cc - trantor/net/inner/MemBufferNode.cc trantor/net/inner/StreamBufferNode.cc - trantor/net/inner/AsyncStreamBufferNode.cc trantor/net/inner/TcpConnectionImpl.cc trantor/net/inner/Timer.cc trantor/net/inner/TimerQueue.cc - trantor/net/inner/poller/EpollPoller.cc - trantor/net/inner/poller/KQueue.cc - trantor/net/inner/poller/PollPoller.cc) -set(private_headers + trantor/net/TcpClient.cc + trantor/net/TcpServer.cc + trantor/utils/AsyncFileLogger.cc + trantor/utils/ConcurrentTaskQueue.cc + trantor/utils/Date.cc + trantor/utils/Logger.cc + trantor/utils/LogStream.cc + trantor/utils/MsgBuffer.cc + trantor/utils/SerialTaskQueue.cc + trantor/utils/TimingWheel.cc + trantor/utils/Utilities.cc +) +set(PRIVATE_HEADERS + # cmake-format: sortable trantor/net/inner/Acceptor.h trantor/net/inner/Connector.h trantor/net/inner/Poller.h + trantor/net/inner/poller/EpollPoller.h + trantor/net/inner/poller/KQueue.h + trantor/net/inner/poller/PollPoller.h trantor/net/inner/Socket.h trantor/net/inner/TcpConnectionImpl.h trantor/net/inner/Timer.h trantor/net/inner/TimerQueue.h - trantor/net/inner/poller/EpollPoller.h - trantor/net/inner/poller/KQueue.h - trantor/net/inner/poller/PollPoller.h) +) if(WIN32) - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - third_party/wepoll/Wepoll.c - trantor/utils/WindowsSupport.cc - trantor/net/inner/FileBufferNodeWin.cc) - set(private_headers - ${private_headers} - third_party/wepoll/Wepoll.h - trantor/utils/WindowsSupport.h) -else(WIN32) - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - trantor/net/inner/FileBufferNodeUnix.cc) -endif(WIN32) - -# Somehow the default value of TRANTOR_USE_TLS is OFF -if(TRANTOR_USE_TLS STREQUAL OFF) - set(TRANTOR_USE_TLS "") -endif() -set(VALID_TLS_PROVIDERS "openssl" "botan" "none") -list(FIND VALID_TLS_PROVIDERS "${TRANTOR_USE_TLS}" PREFERED_TLS_IDX) -if(PREFERED_TLS_IDX EQUAL -1 AND NOT TRANTOR_USE_TLS STREQUAL "") - message(FATAL_ERROR "Invalid TLS provider: ${TRANTOR_USE_TLS}\n" - "Valid TLS providers are: ${VALID_TLS_PROVIDERS}") -endif() - -set(TRANTOR_TLS_PROVIDER "None") -if(TRANTOR_USE_TLS STREQUAL "openssl" OR TRANTOR_USE_TLS STREQUAL "") - find_package(OpenSSL) - if(OpenSSL_FOUND) - target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OPENSSL) - set(TRANTOR_TLS_PROVIDER "OpenSSL") - - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - trantor/net/inner/tlsprovider/OpenSSLProvider.cc - trantor/utils/crypto/openssl.cc) - elseif(TRANTOR_USE_TLS STREQUAL "openssl") - message(FATAL_ERROR "Requested OpenSSL TLS provider but OpenSSL was not found") - endif() -endif() - -if(TRANTOR_TLS_PROVIDER STREQUAL "None" - AND (TRANTOR_USE_TLS STREQUAL "botan" OR TRANTOR_USE_TLS STREQUAL "")) - find_package(Botan) - if(Botan_FOUND) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BOTAN) - target_link_libraries(${PROJECT_NAME} PRIVATE Botan::Botan) - set(TRANTOR_TLS_PROVIDER "Botan") - - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - trantor/net/inner/tlsprovider/BotanTLSProvider.cc - trantor/utils/crypto/botan.cc) - elseif(TRANTOR_USE_TLS STREQUAL "botan") - message(FATAL_ERROR "Requested Botan TLS provider but Botan was not found") - endif() -endif() - -if(TRANTOR_TLS_PROVIDER STREQUAL "None") - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - trantor/utils/crypto/sha3.cc - trantor/utils/crypto/md5.cc - trantor/utils/crypto/sha1.cc - trantor/utils/crypto/sha256.cc - trantor/utils/crypto/blake2.cc) - set(private_headers - ${private_headers} - trantor/utils/crypto/sha3.h - trantor/utils/crypto/md5.h - trantor/utils/crypto/sha1.h - trantor/utils/crypto/sha256.h) -endif() - -message(STATUS "Trantor using SSL library: ${TRANTOR_TLS_PROVIDER}") -target_compile_definitions(${PROJECT_NAME} PRIVATE TRANTOR_TLS_PROVIDER=${TRANTOR_TLS_PROVIDER}) - -set(HAVE_SPDLOG NO) -if(USE_SPDLOG) - find_package(spdlog CONFIG) - if(spdlog_FOUND) - message(STATUS "spdlog found!") - set(HAVE_SPDLOG TRUE) - endif(spdlog_FOUND) -endif(USE_SPDLOG) -if(HAVE_SPDLOG) - target_link_libraries(${PROJECT_NAME} PUBLIC spdlog::spdlog_header_only) - target_compile_definitions(${PROJECT_NAME} PUBLIC TRANTOR_SPDLOG_SUPPORT SPDLOG_FMT_EXTERNAL FMT_HEADER_ONLY) -endif(HAVE_SPDLOG) - -set(HAVE_C-ARES NO) -if (BUILD_C-ARES) - find_package(c-ares) - if(c-ares_FOUND) - message(STATUS "c-ares found!") - set(HAVE_C-ARES TRUE) - endif() -endif () - -if(HAVE_C-ARES) - if (NOT BUILD_SHARED_LIBS) - target_compile_definitions(${PROJECT_NAME} PRIVATE CARES_STATICLIB) - endif () - target_link_libraries(${PROJECT_NAME} PRIVATE c-ares_lib) - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - trantor/net/inner/AresResolver.cc) - set(private_headers - ${private_headers} - trantor/net/inner/AresResolver.h) - if(APPLE) - target_link_libraries(${PROJECT_NAME} PRIVATE resolv) - elseif(WIN32) - target_link_libraries(${PROJECT_NAME} PRIVATE iphlpapi) - endif() + list( + APPEND + TRANTOR_SOURCES + # cmake-format: sortable + third_party/wepoll/Wepoll.c + trantor/utils/WindowsSupport.cc + trantor/net/inner/FileBufferNodeWin.cc + ) + list( + APPEND + PRIVATE_HEADERS + # cmake-format: sortable + third_party/wepoll/Wepoll.h + trantor/utils/WindowsSupport.h + ) else() - set(TRANTOR_SOURCES - ${TRANTOR_SOURCES} - trantor/net/inner/NormalResolver.cc) - set(private_headers - ${private_headers} - trantor/net/inner/NormalResolver.h) -endif() - -find_package(Threads) -target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads) -if(WIN32) - target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 rpcrt4) - if(OpenSSL_FOUND) - target_link_libraries(${PROJECT_NAME} PRIVATE crypt32 secur32) - endif(OpenSSL_FOUND) -else(WIN32) - target_link_libraries(${PROJECT_NAME} PRIVATE pthread $<$:socket>) -endif(WIN32) - -file(WRITE ${CMAKE_BINARY_DIR}/test_atomic.cpp - "#include \n" - "int main() { std::atomic i(0); i++; return 0; }\n") -try_compile(ATOMIC_WITHOUT_LINKING ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/test_atomic.cpp) -if (NOT ATOMIC_WITHOUT_LINKING) - target_link_libraries(${PROJECT_NAME} PUBLIC atomic) -endif () -file(REMOVE ${CMAKE_BINARY_DIR}/test_atomic.cpp) - -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 14) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD_REQUIRED ON) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_EXTENSIONS OFF) -set_target_properties(${PROJECT_NAME} PROPERTIES EXPORT_NAME Trantor) - -if(BUILD_TESTING) - add_subdirectory(trantor/tests) - find_package(GTest) - if(GTest_FOUND) - enable_testing() - add_subdirectory(trantor/unittests) - endif() + list(APPEND TRANTOR_SOURCES trantor/net/inner/FileBufferNodeUnix.cc) endif() -set(public_net_headers +set(PUBLIC_NET_HEADERS + # cmake-format: sortable + trantor/net/AsyncStream.h + trantor/net/callbacks.h + trantor/net/Certificate.h + trantor/net/Channel.h trantor/net/EventLoop.h trantor/net/EventLoopThread.h trantor/net/EventLoopThreadPool.h trantor/net/InetAddress.h + trantor/net/Resolver.h trantor/net/TcpClient.h trantor/net/TcpConnection.h trantor/net/TcpServer.h - trantor/net/AsyncStream.h - trantor/net/callbacks.h - trantor/net/Resolver.h - trantor/net/Channel.h - trantor/net/Certificate.h - trantor/net/TLSPolicy.h) + trantor/net/TLSPolicy.h +) -set(public_utils_headers +set(PUBLIC_UTILS_HEADERS + # cmake-format: sortable trantor/utils/AsyncFileLogger.h trantor/utils/ConcurrentTaskQueue.h trantor/utils/Date.h trantor/utils/Funcs.h trantor/utils/LockFreeQueue.h - trantor/utils/LogStream.h trantor/utils/Logger.h + trantor/utils/LogStream.h trantor/utils/MsgBuffer.h trantor/utils/NonCopyable.h trantor/utils/ObjectPool.h trantor/utils/SerialTaskQueue.h trantor/utils/TaskQueue.h trantor/utils/TimingWheel.h - trantor/utils/Utilities.h) - -target_sources(${PROJECT_NAME} PRIVATE - ${TRANTOR_SOURCES} - ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h - ${public_net_headers} - ${public_utils_headers} - ${private_headers}) - -source_group("Public API" - FILES - ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h - ${public_net_headers} - ${public_utils_headers}) + trantor/utils/Utilities.h +) -source_group("Private Headers" - FILES - ${private_headers}) +# Build Dependencies +include(cmake/SetInstallDirs.cmake) -install(TARGETS trantor - # IMPORTANT: Add the trantor library to the "export-set" - EXPORT TrantorTargets - RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin - ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib - LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h - DESTINATION ${INSTALL_INCLUDE_DIR}/trantor) -install(FILES ${public_net_headers} - DESTINATION ${INSTALL_INCLUDE_DIR}/trantor/net) -install(FILES ${public_utils_headers} - DESTINATION ${INSTALL_INCLUDE_DIR}/trantor/utils) +# Set options +include(cmake/SetCAres.cmake) +include(cmake/SetSpdlog.cmake) +include(cmake/SetTlsProvider.cmake) +include(cmake/SetTesting.cmake) -include(CMakePackageConfigHelpers) -# ... for the install tree -configure_package_config_file( - cmake/templates/TrantorConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TrantorConfig.cmake - INSTALL_DESTINATION - ${INSTALL_TRANTOR_CMAKE_DIR}) +# Export header +include(cmake/SetExportHeader.cmake) -# version -write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake - VERSION ${TRANTOR_VERSION} - COMPATIBILITY SameMajorVersion) +# Group sources +source_group("Public API" FILES ${PUBLIC_NET_HEADERS} ${PUBLIC_UTILS_HEADERS} ${TRANTOR_EXPORT_HEADER}) +source_group("Private Headers" FILES ${PRIVATE_HEADERS}) -# Install the TrantorConfig.cmake and TrantorConfigVersion.cmake -install( - FILES - "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TrantorConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/Findc-ares.cmake" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindBotan.cmake" - DESTINATION "${INSTALL_TRANTOR_CMAKE_DIR}" - COMPONENT dev) - -# Install the export set for use with the install-tree -install(EXPORT TrantorTargets - DESTINATION "${INSTALL_TRANTOR_CMAKE_DIR}" - NAMESPACE Trantor:: - COMPONENT dev) - -# Doxygen documentation -find_package(Doxygen OPTIONAL_COMPONENTS dot dia) -if(DOXYGEN_FOUND) - set(DOXYGEN_PROJECT_BRIEF "Non-blocking I/O cross-platform TCP network library, using C++14") - set(DOXYGEN_OUTPUT_DIRECTORY docs/${PROJECT_NAME}) - set(DOXYGEN_GENERATE_LATEX NO) - set(DOXYGEN_BUILTIN_STL_SUPPORT YES) - set(DOXYGEN_USE_MDFILE_AS_MAINPAGE README.md) - set(DOXYGEN_STRIP_FROM_INC_PATH ${PROJECT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR}/exports) - if (WIN32) - set(DOXYGEN_PREDEFINED _WIN32) - endif(WIN32) - doxygen_add_docs(doc_${PROJECT_NAME} - README.md - ChangeLog.md - ${public_net_headers} - ${public_utils_headers} - COMMENT "Generate documentation") - if(NOT TARGET doc) - add_custom_target(doc) - endif() - add_dependencies(doc doc_${PROJECT_NAME}) - if (BUILD_DOC) - add_dependencies(${PROJECT_NAME} doc_${PROJECT_NAME}) - # Don't install twice, so limit to Debug (assume developer) - install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/${PROJECT_NAME} - TYPE DOC - CONFIGURATIONS Debug) - endif(BUILD_DOC) -endif(DOXYGEN_FOUND) +# Target sources +target_sources( + ${PROJECT_NAME} + PRIVATE ${TRANTOR_SOURCES} + ${PRIVATE_HEADERS} + ${PUBLIC_NET_HEADERS} + ${PUBLIC_UTILS_HEADERS} + ${TRANTOR_EXPORT_HEADER} +) + +# Target include directories +target_include_directories( + ${PROJECT_NAME} + PUBLIC $ $ + $ + PRIVATE ${PROJECT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/trantor/utils + ${PROJECT_SOURCE_DIR}/trantor/net + ${PROJECT_SOURCE_DIR}/trantor/net/inner + $ +) +# Set additional +include(cmake/SetDoxygen.cmake) +include(cmake/SetPackageConfig.cmake) +include(cmake/SetInstall.cmake) diff --git a/README.md b/README.md index 4a0f0c43..896108e5 100755 --- a/README.md +++ b/README.md @@ -32,6 +32,18 @@ cmake -B build -H. cd build make -j ``` +#### Building options + +Trantor provides some building options, you can enable or disable them by setting the corresponding variables to `ON` or `OFF` in the cmake command line, cmake file etc... + +| Option name | Description | Default value | +| :--- | :--- | :--- | +| BUILD_SHARED_LIBS | Build Trantor as a shared lib | OFF | +| BUILD_TESTING | Build tests | OFF | +| BUILD_DOC | Build Doxygen documentation | OFF | +| TRANTOR_USE_SPDLOG | Allow using the spdlog logging library | ON | +| TRANTOR_USE_C-ARES | Allow using C-ARES | ON | +| TRANTOR_TLS_PROVIDER | TLS provider for trantor. Valid options are 'none', 'openssl', 'botan-3', 'auto'. | auto | ## Licensing Trantor - A non-blocking I/O based TCP network library, using C++14. diff --git a/cmake/SetBuildOutput.cmake b/cmake/SetBuildOutput.cmake new file mode 100644 index 00000000..b9da7b5c --- /dev/null +++ b/cmake/SetBuildOutput.cmake @@ -0,0 +1,23 @@ +# Set build output path, this is mainly for Windows, to solve the test/unittests running 0x000135 problems +macro(set_standard_build_output Tgt) + if(WIN32) + set_target_properties(${Tgt} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set_target_properties(${Tgt} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set_target_properties(${Tgt} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + endif() +endmacro() + +# copy dll, this is mainly for Windows, to solve the test/unittests running 0x000135 problems +macro(copy_dlls_to_standard_build_output SPath) + if(WIN32) + if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") + endif() + + file(GLOB_RECURSE dlls ${SPath}/*.dll) + foreach(dll ${dlls}) + message(STATUS "copying ${dll} to ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") + file(COPY ${dll} DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}) + endforeach() + endif() +endmacro() diff --git a/cmake/SetCAres.cmake b/cmake/SetCAres.cmake new file mode 100644 index 00000000..4fac65ef --- /dev/null +++ b/cmake/SetCAres.cmake @@ -0,0 +1,36 @@ +# set normal resolver +macro(set_normal_resolver) + list(APPEND TRANTOR_SOURCES trantor/net/inner/NormalResolver.cc) + list(APPEND PRIVATE_HEADERS trantor/net/inner/NormalResolver.h) +endmacro() + +# set cares resolver +macro(set_cares_resolver) + if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(${PROJECT_NAME} PRIVATE CARES_STATICLIB) + endif() + + target_link_libraries(${PROJECT_NAME} PRIVATE c-ares::cares) + + if(APPLE) + target_link_libraries(${PROJECT_NAME} PRIVATE resolv) + elseif(WIN32) + target_link_libraries(${PROJECT_NAME} PRIVATE Iphlpapi) + endif() + + list(APPEND TRANTOR_SOURCES trantor/net/inner/AresResolver.cc) + list(APPEND PRIVATE_HEADERS trantor/net/inner/AresResolver.h) +endmacro() + +# ###################################################################################################################### +message(STATUS "Setting c-ares: ${TRANTOR_USE_C-ARES}") + +if(TRANTOR_USE_C-ARES) + if(NOT BUILD_DEPENDENCIES) + find_package(c-ares REQUIRED) + endif() + + set_cares_resolver() +else() + set_normal_resolver() +endif() diff --git a/cmake/SetDoxygen.cmake b/cmake/SetDoxygen.cmake new file mode 100644 index 00000000..440eba4f --- /dev/null +++ b/cmake/SetDoxygen.cmake @@ -0,0 +1,28 @@ +message(STATUS "Setting Doxygen documentation: ${BUILD_DOC}") + +if(BUILD_DOC) + if(WIN32) + set(DOXYGEN_PREDEFINED _WIN32) + endif(WIN32) + + find_package(Doxygen OPTIONAL_COMPONENTS dot dia) + if(DOXYGEN_FOUND) + set(DOXYGEN_PROJECT_BRIEF "Non-blocking I/O cross-platform TCP network library, using C++14") + set(DOXYGEN_OUTPUT_DIRECTORY docs/${PROJECT_NAME}) + set(DOXYGEN_GENERATE_LATEX NO) + set(DOXYGEN_BUILTIN_STL_SUPPORT YES) + set(DOXYGEN_USE_MDFILE_AS_MAINPAGE README.md) + set(DOXYGEN_STRIP_FROM_INC_PATH ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/exports) + + doxygen_add_docs( + doc_${PROJECT_NAME} + README.md + ChangeLog.md + ${public_net_headers} + ${public_utils_headers} + COMMENT "Generate documentation" + ) + add_dependencies(${PROJECT_NAME} doc_${PROJECT_NAME}) + endif() + +endif(BUILD_DOC) diff --git a/cmake/SetExportHeader.cmake b/cmake/SetExportHeader.cmake new file mode 100644 index 00000000..5cb990c7 --- /dev/null +++ b/cmake/SetExportHeader.cmake @@ -0,0 +1,4 @@ +include(GenerateExportHeader) +set(TRANTOR_EXPORT_HEADER ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h) +generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${TRANTOR_EXPORT_HEADER}) +set_target_properties(${PROJECT_NAME} PROPERTIES EXPORT_NAME Trantor) diff --git a/cmake/SetInstall.cmake b/cmake/SetInstall.cmake new file mode 100644 index 00000000..aa00f42b --- /dev/null +++ b/cmake/SetInstall.cmake @@ -0,0 +1,43 @@ +message(STATUS "Setting Install") + +# Install target Output Artifacts and associated files +install( + TARGETS trantor + # IMPORTANT: Add the trantor library to the "export-set", + # ⚠️To actually install the export file itself, call install(EXPORT), + EXPORT TrantorTargets + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib +) +# Install a CMake file exporting targets for dependent projects +install( + EXPORT TrantorTargets + DESTINATION "${INSTALL_TRANTOR_CMAKE_DIR}" + NAMESPACE Trantor:: + COMPONENT dev +) + +# Install header files +install(FILES ${public_net_headers} DESTINATION ${INSTALL_INCLUDE_DIR}/trantor/net) +install(FILES ${public_utils_headers} DESTINATION ${INSTALL_INCLUDE_DIR}/trantor/utils) +install(FILES ${trantor_export_header} DESTINATION ${INSTALL_INCLUDE_DIR}/trantor) + +# Install the package configuration and package version file and cmake module files +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TrantorConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/Findc-ares.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindBotan.cmake" + DESTINATION "${INSTALL_TRANTOR_CMAKE_DIR}" + COMPONENT dev +) + +# Install the documentation. Don't install twice, so limit to Debug (assume developer) +if(BUILD_DOC) + install( + DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs/${PROJECT_NAME} + TYPE DOC + CONFIGURATIONS Debug + ) +endif() diff --git a/cmake/SetInstallDirs.cmake b/cmake/SetInstallDirs.cmake new file mode 100644 index 00000000..0074926a --- /dev/null +++ b/cmake/SetInstallDirs.cmake @@ -0,0 +1,29 @@ +message(STATUS "Setting Install Dirs") + +include(GNUInstallDirs) +# Offer the user the choice of overriding the installation directories +set(INSTALL_BIN_DIR + ${CMAKE_INSTALL_BINDIR} + CACHE PATH "Installation directory for binaries" +) +set(INSTALL_LIB_DIR + ${CMAKE_INSTALL_LIBDIR} + CACHE PATH "Installation directory for libraries" +) +set(INSTALL_INCLUDE_DIR + ${CMAKE_INSTALL_INCLUDEDIR} + CACHE PATH "Installation directory for header files" +) +set(INSTALL_TRANTOR_CMAKE_DIR + ${CMAKE_INSTALL_LIBDIR}/cmake/Trantor + CACHE PATH "Installation directory for cmake files" +) +if(BUILD_SHARED_LIBS + AND (NOT + "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}" + IN_LIST + CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES + ) +) + set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}") +endif() diff --git a/cmake/SetPackageConfig.cmake b/cmake/SetPackageConfig.cmake new file mode 100644 index 00000000..0b8c0b60 --- /dev/null +++ b/cmake/SetPackageConfig.cmake @@ -0,0 +1,15 @@ +message(STATUS "Setting Package config") + +include(CMakePackageConfigHelpers) +# Generating a Package Configuration File +configure_package_config_file( + cmake/templates/TrantorConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TrantorConfig.cmake + INSTALL_DESTINATION ${INSTALL_TRANTOR_CMAKE_DIR} +) + +# Generating a Package Version File +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake + VERSION ${TRANTOR_VERSION} + COMPATIBILITY SameMajorVersion +) diff --git a/cmake/SetSpdlog.cmake b/cmake/SetSpdlog.cmake new file mode 100644 index 00000000..a61b443e --- /dev/null +++ b/cmake/SetSpdlog.cmake @@ -0,0 +1,19 @@ +message(STATUS "Setting for spdlog: ${TRANTOR_USE_SPDLOG}") + +if(TRANTOR_USE_SPDLOG) + target_compile_definitions(${PROJECT_NAME} PUBLIC TRANTOR_SPDLOG_SUPPORT) + + if(BUILD_DEPENDENCIES) + target_include_directories( + ${PROJECT_NAME} + PRIVATE + PUBLIC $ $ + ) + + else() + find_package(spdlog REQUIRED) + + target_link_libraries(${PROJECT_NAME} PUBLIC spdlog::spdlog) + target_compile_definitions(${PROJECT_NAME} PUBLIC TRANTOR_SPDLOG_SUPPORT SPDLOG_FMT_EXTERNAL SPDLOG_FMT_EXTERNAL_HO) + endif() +endif() diff --git a/cmake/SetSystemAndCompiler.cmake b/cmake/SetSystemAndCompiler.cmake new file mode 100644 index 00000000..eca2b062 --- /dev/null +++ b/cmake/SetSystemAndCompiler.cmake @@ -0,0 +1,59 @@ +# Compiler and System settings +message( + STATUS "Setting System and Compiler: ${CMAKE_SYSTEM_NAME} - ${CMAKE_CXX_COMPILER_ID} - ${CMAKE_CXX_COMPILER_VERSION}" +) + +# MSVC +if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + # Ignore MSVC C4251 and C4275 warning of exporting std objects with no dll export We export class to facilitate + # maintenance, thus if you compile drogon on windows as a shared library, you will need to use exact same compiler for + # drogon and your app. + if(BUILD_SHARED_LIBS) + target_compile_options(${PROJECT_NAME} PUBLIC /wd4251 /wd4275) + endif() + + # Tells Visual Studio 2017 (15.7+) and newer to correctly set the value of the standard __cplusplus macro, instead of + # leaving it to 199711L and settings the effective c++ version in _MSVC_LANG Dropping support for older versions of VS + # would allow to only rely on __cplusplus + if(MSVC_VERSION GREATER_EQUAL 1914) + add_compile_options(/Zc:__cplusplus) + endif() + + # Ignore C4996 warning + target_compile_options(${PROJECT_NAME} PUBLIC /wd4996) +endif() + +# Clang|GNU not windows +if(CMAKE_CXX_COMPILER_ID MATCHES Clang|GNU) + if(NOT + ${CMAKE_SYSTEM_NAME} + STREQUAL + "Windows" + ) + + # openssl has some problems with -Werror + if(BUILD_DEPENDENCIES AND TRANTOR_TLS_PROVIDER STREQUAL "openssl") + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wno-unused-parameter) + else() + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Werror) + endif() + + endif() +endif() + +# MinGW +if(MINGW) + target_compile_definitions(${PROJECT_NAME} PUBLIC -D_WIN32_WINNT=0x0601) +endif() + +# Haiku +if(${CMAKE_SYSTEM_NAME} STREQUAL "Haiku") + target_link_libraries(${PROJECT_NAME} PRIVATE network) +endif() + +# Socket +if(WIN32) + target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 Rpcrt4) +else() + target_link_libraries(${PROJECT_NAME} PRIVATE pthread $<$:socket>) +endif() diff --git a/cmake/SetTesting.cmake b/cmake/SetTesting.cmake new file mode 100644 index 00000000..5f447921 --- /dev/null +++ b/cmake/SetTesting.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + message(STATUS "Setting Testing") + # tests + add_subdirectory(trantor/tests) + # unittests + enable_testing() + add_subdirectory(trantor/unittests) +endif() diff --git a/cmake/SetThreads.cmake b/cmake/SetThreads.cmake new file mode 100644 index 00000000..a0542f91 --- /dev/null +++ b/cmake/SetThreads.cmake @@ -0,0 +1,4 @@ +message(STATUS "Setting Threads") + +find_package(Threads) +target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads) diff --git a/cmake/SetTlsProvider.cmake b/cmake/SetTlsProvider.cmake new file mode 100644 index 00000000..92f685c1 --- /dev/null +++ b/cmake/SetTlsProvider.cmake @@ -0,0 +1,120 @@ +macro(set_crypto) + message(STATUS "Trantor using SSL library: None") + target_compile_definitions(${PROJECT_NAME} PRIVATE TRANTOR_TLS_PROVIDER="None") + + list( + APPEND + TRANTOR_SOURCES + trantor/utils/crypto/md5.cc + trantor/utils/crypto/sha1.cc + trantor/utils/crypto/sha256.cc + trantor/utils/crypto/sha3.cc + trantor/utils/crypto/blake2.cc + ) + list( + APPEND + PRIVATE_HEADERS + trantor/utils/crypto/md5.h + trantor/utils/crypto/sha1.h + trantor/utils/crypto/sha256.h + trantor/utils/crypto/sha3.h + trantor/utils/crypto/blake2.h + ) + +endmacro() + +macro(set_openssl) + message(STATUS "Trantor using SSL library: openssl") + + target_compile_definitions(${PROJECT_NAME} PRIVATE TRANTOR_TLS_PROVIDER="OpenSSL") + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OPENSSL) + + target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) + + if(WIN32) + target_link_libraries(${PROJECT_NAME} PRIVATE Crypt32 Secur32) + endif() + + list( + APPEND + TRANTOR_SOURCES + trantor/net/inner/tlsprovider/OpenSSLProvider.cc + trantor/utils/crypto/openssl.cc + ) + +endmacro() + +macro(set_botan) + message(STATUS "Trantor using SSL library: botan") + target_compile_definitions(${PROJECT_NAME} PRIVATE TRANTOR_TLS_PROVIDER="Botan") + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BOTAN) + + # conan target is different, always lower case + if(TARGET botan::botan) + target_link_libraries(${PROJECT_NAME} PRIVATE botan::botan) + target_compile_features(botan::botan INTERFACE cxx_std_20) + else() + target_link_libraries(${PROJECT_NAME} PRIVATE Botan::Botan) + endif() + + list( + APPEND + TRANTOR_SOURCES + trantor/net/inner/tlsprovider/BotanTLSProvider.cc + trantor/utils/crypto/botan.cc + ) + +endmacro() + +# ###################################################################################################################### +# Set TLS provider +message(STATUS "Setting TLS: ${TRANTOR_USE_TLS} TRANTOR_TLS_PROVIDER: ${TRANTOR_TLS_PROVIDER}") + +# Checking valid TLS providers +set(VALID_TLS_PROVIDERS + "none" + "openssl" + "botan-3" + "auto" +) +if(NOT + "${TRANTOR_TLS_PROVIDER}" + IN_LIST + VALID_TLS_PROVIDERS +) + message(FATAL_ERROR "Invalid TLS provider: ${TRANTOR_TLS_PROVIDER}\n" + "Valid TLS providers are: ${VALID_TLS_PROVIDERS}" + ) +endif() + +if(TRANTOR_TLS_PROVIDER STREQUAL "openssl") # openssl + find_package(OpenSSL REQUIRED) + set_openssl() + +elseif(TRANTOR_TLS_PROVIDER STREQUAL "botan-3") # botan 3 + find_package(Botan 3 REQUIRED) + + set_botan() + +elseif(TRANTOR_TLS_PROVIDER STREQUAL "none") # none + set_crypto() + +elseif(TRANTOR_TLS_PROVIDER STREQUAL "auto") # auto + find_package(OpenSSL) + + if(OPENSSL_FOUND) + set_openssl() + else() + find_package(Botan 3) + + if(BOTAN_FOUND) + set_botan() + else() + set_crypto() + endif() # botan 3 + + endif() # openssl + +else() # none + set_crypto() +endif() diff --git a/cmake/TestAtomic.cmake b/cmake/TestAtomic.cmake new file mode 100644 index 00000000..3497a5ca --- /dev/null +++ b/cmake/TestAtomic.cmake @@ -0,0 +1,12 @@ +message(STATUS "Testing Atomic compilation") + +file(WRITE ${CMAKE_BINARY_DIR}/test_atomic.cpp "#include \n" + "int main() { std::atomic i(0); i++; return 0; }\n" +) +try_compile(ATOMIC_WITHOUT_LINKING ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/test_atomic.cpp) + +if(NOT ATOMIC_WITHOUT_LINKING) + target_link_libraries(${PROJECT_NAME} PUBLIC atomic) +endif() + +file(REMOVE ${CMAKE_BINARY_DIR}/test_atomic.cpp) diff --git a/cmake/templates/TrantorConfig.cmake.in b/cmake/templates/TrantorConfig.cmake.in index 61007bdd..e9422ed9 100644 --- a/cmake/templates/TrantorConfig.cmake.in +++ b/cmake/templates/TrantorConfig.cmake.in @@ -1,3 +1,4 @@ +#[[ # - Config file for the Trantor package # It defines the following variables # TRANTOR_INCLUDE_DIRS - include directories for Trantor @@ -5,6 +6,7 @@ # Trantor_FOUND # This module defines the following IMPORTED target: # Trantor::Trantor +#]] @PACKAGE_INIT@ diff --git a/cmake_modules/FindBotan.cmake b/cmake_modules/FindBotan.cmake index b4b002ca..bd9c4551 100644 --- a/cmake_modules/FindBotan.cmake +++ b/cmake_modules/FindBotan.cmake @@ -1,30 +1,40 @@ -function(find_botan_pkgconfig package_name botan_ver) - if (TARGET Botan::Botan) +function(find_botan_pkgconfig package_name) + if(TARGET Botan::Botan) return() - endif () + endif() - pkg_check_modules(Botan QUIET IMPORTED_TARGET ${package_name}) - if (TARGET PkgConfig::Botan) + pkg_check_modules( + Botan + QUIET + IMPORTED_TARGET + GLOBAL + ${package_name} + ) + if(TARGET PkgConfig::Botan) add_library(Botan::Botan ALIAS PkgConfig::Botan) - if(botan_ver EQUAL 3) + if(${Botan_FIND_VERSION} EQUAL 3) target_compile_features(PkgConfig::Botan INTERFACE cxx_std_20) endif() - endif () + endif() endfunction() -function(find_botan_search package_name botan_ver) - if (TARGET Botan::Botan) - return() - endif () - find_path(Botan_INCLUDE_DIRS NAMES botan/botan.h - PATH_SUFFIXES ${package_name} - DOC "The Botan include directory") - - find_library(Botan_LIBRARIES NAMES botan ${package_name} - DOC "The Botan library") +function(find_botan_search package_name) + # botan2 have botan.h, but botan3 does not, botan3 using auto_rng.h instead + find_path( + Botan_INCLUDE_DIRS + NAMES botan/botan.h botan/auto_rng.h + HINTS ${BOTAN_ROOT_DIR}/include + PATH_SUFFIXES ${package_name} + DOC "The Botan include directory" + ) - mark_as_advanced(Botan_INCLUDE_DIRS Botan_LIBRARIES) + find_library( + Botan_LIBRARIES + NAMES botan ${package_name} + HINTS ${BOTAN_ROOT_DIR}/lib + DOC "The Botan library" + ) add_library(Botan::Botan IMPORTED UNKNOWN) set_target_properties( @@ -33,29 +43,32 @@ function(find_botan_search package_name botan_ver) IMPORTED_LOCATION "${Botan_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${Botan_INCLUDE_DIRS}" ) - if(botan_ver EQUAL 3) + if(${Botan_FIND_VERSION} EQUAL 3) target_compile_features(Botan::Botan INTERFACE cxx_std_20) endif() - if (WIN32) + if(WIN32) target_compile_definitions(Botan::Botan INTERFACE -DNOMINMAX=1) - endif () + endif() endfunction() +# ###################################################################################################################### +# Using find_package with verion: find_package(Botan 3) or find_package(Botan 2) +if(NOT DEFINED Botan_FIND_VERSION) + message(FATAL_ERROR "Must specify Botan version: find_package(Botan 3) or find_package(Botan 2)") +endif() -find_package(PkgConfig) -if(NOT WIN32 AND PKG_CONFIG_FOUND) - # find_botan_pkgconfig(botan-2 2) - find_botan_pkgconfig(botan-3 3) +if(NOT WIN32) + find_package(PkgConfig) + if(PKG_CONFIG_FOUND) + find_botan_pkgconfig(botan-${Botan_FIND_VERSION}) + endif() endif() if(NOT TARGET Botan::Botan) - # find_botan_search(botan-2 2) - find_botan_search(botan-3 3) + find_botan_search(botan-${Botan_FIND_VERSION}) endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args( - Botan - REQUIRED_VARS Botan_LIBRARIES Botan_INCLUDE_DIRS -) +find_package_handle_standard_args(Botan REQUIRED_VARS Botan_LIBRARIES Botan_INCLUDE_DIRS) +mark_as_advanced(Botan_INCLUDE_DIRS Botan_LIBRARIES) diff --git a/cmake_modules/Findc-ares.cmake b/cmake_modules/Findc-ares.cmake index 98821437..082ec0aa 100644 --- a/cmake_modules/Findc-ares.cmake +++ b/cmake_modules/Findc-ares.cmake @@ -1,27 +1,29 @@ -# Try to find c-ares library Once done this will define +#[[ Try to find c-ares library Once done this will define # -# c-ares_FOUND - system has c-ares -# C-ARES_INCLUDE_DIRS - The c-ares include directory +# c-ares_FOUND - system has c-ares +# C-ARES_INCLUDE_DIRS - The c-ares include directory # C-ARES_LIBRARIES - Link these to use c-ares -# c-ares_lib - Imported Targets +# c-ares - Imported Targets # # Copyright (c) 2020 antao -# +#]] -find_path(C-ARES_INCLUDE_DIRS ares.h) +find_path(C-ARES_INCLUDE_DIRS NAMES ares.h) find_library(C-ARES_LIBRARIES NAMES cares) if(C-ARES_INCLUDE_DIRS AND C-ARES_LIBRARIES) - add_library(c-ares_lib INTERFACE IMPORTED) - set_target_properties(c-ares_lib - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${C-ARES_INCLUDE_DIRS}" - INTERFACE_LINK_LIBRARIES - "${C-ARES_LIBRARIES}") + add_library(c-ares::cares INTERFACE IMPORTED) + set_target_properties( + c-ares::cares + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${C-ARES_INCLUDE_DIRS}" INTERFACE_LINK_LIBRARIES "${C-ARES_LIBRARIES}" + ) endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(c-ares - DEFAULT_MSG - C-ARES_INCLUDE_DIRS - C-ARES_LIBRARIES) +find_package_handle_standard_args( + c-ares + DEFAULT_MSG + C-ARES_INCLUDE_DIRS + C-ARES_LIBRARIES +) mark_as_advanced(C-ARES_INCLUDE_DIRS C-ARES_LIBRARIES) diff --git a/conanfile.txt b/conanfile.txt index 2e6dc442..5f4f8970 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,10 +1,12 @@ [requires] -gtest/1.10.0 -openssl/1.1.1t -#c-ares/1.17.1 -spdlog/1.12.0 +spdlog/1.13.0 +c-ares/1.26.0 +gtest/1.14.0 +openssl/3.2.0 +#botan/3.2.0 [generators] +CMakeDeps CMakeToolchain [options] diff --git a/deps.macos-12.sh b/deps.macos-12.sh new file mode 100644 index 00000000..e633698c --- /dev/null +++ b/deps.macos-12.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# This script is used to install dependencies on MacOS 12.0 or newer +# TODO: botan v3, botan@3.3.0 build failed, if newer version work, turn on brew update +# brew update +brew install googletest spdlog c-ares openssl@3 botan \ No newline at end of file diff --git a/deps.rockylinux-9.sh b/deps.rockylinux-9.sh new file mode 100644 index 00000000..b3a8cc02 --- /dev/null +++ b/deps.rockylinux-9.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +# This script is used to install dependencies on RockyLinux 9 or newer +dnf install epel-release -y +dnf update +dnf install gtest-devel spdlog-devel fmt-devel c-ares-devel openssl-devel -y diff --git a/deps.ubuntu-20.04.sh b/deps.ubuntu-20.04.sh new file mode 100644 index 00000000..3cbc8c23 --- /dev/null +++ b/deps.ubuntu-20.04.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# This script is used to install dependencies on Ubuntu 20.04 or newer + +# Installing packages might fail as the github image becomes outdated +sudo apt update +sudo apt install libgtest-dev libspdlog-dev libfmt-dev libc-ares-dev openssl libssl-dev -y diff --git a/deps.windows.conan.ps1 b/deps.windows.conan.ps1 new file mode 100644 index 00000000..b34d961c --- /dev/null +++ b/deps.windows.conan.ps1 @@ -0,0 +1,22 @@ +# This script is used for windows VS2022 + +# If not found python +if (!(Get-Command python -ErrorAction SilentlyContinue)){ + Write-Host -ForegroundColor:Red "Install python first !!!" + exit +} + +# If not found conan,Install conan +if (!(Get-Command conan -ErrorAction SilentlyContinue)){ + pip install conan +} + +conan profile detect --force + +# Install Release +conan install . --output-folder=build --build=missing ` +--settings=build_type=Release --settings=compiler="msvc" --settings=compiler.version=193 --settings=compiler.runtime="dynamic" --settings=compiler.cppstd=14 + +# Install Debug +conan install . --output-folder=build --build=missing ` +--settings=build_type=Debug --settings=compiler="msvc" --settings=compiler.version=193 --settings=compiler.runtime="dynamic" --settings=compiler.cppstd=14 diff --git a/deps.windows.vcpkg.ps1 b/deps.windows.vcpkg.ps1 new file mode 100644 index 00000000..350cf695 --- /dev/null +++ b/deps.windows.vcpkg.ps1 @@ -0,0 +1,31 @@ +# This script is used for windows VS2022 + +$current_path= (Get-Location).path + +# If not found vckpkg,Install vcpkg +if (!(Get-Command vcpkg -ErrorAction SilentlyContinue)) { + Write-Host -ForegroundColor:Yellow "If it is the first time to install vcpkg, it may take several minutes. Please wait..." + + cd c:\ + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + .\bootstrap-vcpkg.bat + + $path = [Environment]::GetEnvironmentVariable('Path', 'Machine') + $newpath = 'c:\vcpkg;' + $path + [Environment]::SetEnvironmentVariable('Path', $newpath, 'Machine') + [Environment]::SetEnvironmentVariable('VCPKG_ROOT', 'c:\vcpkg', 'Machine') +} + +if (!(Get-Command vcpkg -ErrorAction SilentlyContinue)) { + Write-Host -ForegroundColor:Red "Install vcpkg failed !!!" + +} else { +cd $current_path +# update baseline +# --add-initial-baseline +vcpkg x-update-baseline +vcpkg install + +Write-Host -ForegroundColor:Green "Now, you can use CMake by -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake" +} \ No newline at end of file diff --git a/format.sh b/format.sh index a1bde595..9510d04b 100755 --- a/format.sh +++ b/format.sh @@ -4,3 +4,9 @@ clang-format --version find trantor -name *.h -o -name *.cc -exec dos2unix {} \; find trantor -name *.h -o -name *.cc|xargs clang-format -i -style=file + +cmake-format --version +find . -maxdepth 1 -name CMakeLists.txt|xargs cmake-format -i +find trantor -name CMakeLists.txt|xargs cmake-format -i +find cmake -name *.cmake -o -name *.cmake.in|xargs cmake-format -i +find cmake_modules -name *.cmake -o -name *.cmake.in|xargs cmake-format -i \ No newline at end of file diff --git a/trantor/net/TLSPolicy.h b/trantor/net/TLSPolicy.h index 87756a34..e59aca03 100644 --- a/trantor/net/TLSPolicy.h +++ b/trantor/net/TLSPolicy.h @@ -67,7 +67,7 @@ struct TRANTOR_EXPORT TLSPolicy final /** * @brief enables the use of the old TLS protocol (old meaning < TLS 1.2). - * TLS providres may not support old protocols even if this option is set + * TLS providers may not support old protocols even if this option is set */ TLSPolicy &setUseOldTLS(bool useOldTLS) { @@ -79,7 +79,7 @@ struct TRANTOR_EXPORT TLSPolicy final * @brief set the list of protocols to be used for ALPN. * * @note for servers, it selects matching protocol against the client's - * list. And the first matching protocol supplide in the parameter will be + * list. And the first matching protocol supplied in the parameter will be * selected. If no matching protocol is found, the connection will be * closed. * diff --git a/trantor/tests/CMakeLists.txt b/trantor/tests/CMakeLists.txt index 93e0bbe4..189e03f6 100644 --- a/trantor/tests/CMakeLists.txt +++ b/trantor/tests/CMakeLists.txt @@ -1,59 +1,76 @@ -add_executable(ssl_server_test SSLServerTest.cc) -add_executable(ssl_client_test SSLClientTest.cc) -add_executable(serial_task_queue_test1 SerialTaskQueueTest1.cc) -add_executable(serial_task_queue_test2 SerialTaskQueueTest2.cc) -add_executable(timer_test TimerTest.cc) -add_executable(timer_test1 TimerTest1.cc) -add_executable(run_in_loop_test1 RunInLoopTest1.cc) -add_executable(run_in_loop_test2 RunInLoopTest2.cc) add_executable(logger_test LoggerTest.cc) +add_executable(logger_macro_test LoggerMacroTest.cc) + add_executable(async_file_logger_test AsyncFileLoggerTest.cc) -add_executable(tcp_server_test TcpServerTest.cc) -add_executable(concurrent_task_queue_test ConcurrentTaskQueueTest.cc) -add_executable(tcp_client_test TcpClientTest.cc) add_executable(async_file_logger_test1 AsyncFileLoggerTest1.cc) -add_executable(sendfile_test SendfileTest.cc) -add_executable(sendstream_test SendstreamTest.cc) -add_executable(timing_wheel_test TimingWheelTest.cc) -add_executable(kickoff_test KickoffTest.cc) + +add_executable(path_conversion_test PathConversionTest.cc) + add_executable(dns_test DnsTest.cc) + +add_executable(run_in_loop_test1 RunInLoopTest1.cc) +add_executable(run_in_loop_test2 RunInLoopTest2.cc) add_executable(run_on_quit_test RunOnQuitTest.cc) -add_executable(path_conversion_test PathConversionTest.cc) -add_executable(logger_macro_test LoggerMacroTest.cc) -add_executable(delayed_ssl_server_test DelayedSSLServerTest.cc) -add_executable(delayed_ssl_client_test DelayedSSLClientTest.cc) + +add_executable(timer_test TimerTest.cc) +add_executable(timer_test1 TimerTest1.cc) +add_executable(timing_wheel_test TimingWheelTest.cc) +add_executable(kickoff_test KickoffTest.cc) + +add_executable(tcp_server_test TcpServerTest.cc) +add_executable(tcp_client_test TcpClientTest.cc) add_executable(tcp_asyncstream_server_test TcpAsyncStreamServerTest.cc) + +add_executable(serial_task_queue_test1 SerialTaskQueueTest1.cc) +add_executable(serial_task_queue_test2 SerialTaskQueueTest2.cc) +add_executable(concurrent_task_queue_test ConcurrentTaskQueueTest.cc) + +add_executable(sendfile_test SendfileTest.cc) +add_executable(sendstream_test SendstreamTest.cc) + set(targets_list - ssl_server_test - ssl_client_test - serial_task_queue_test1 - serial_task_queue_test2 - timer_test - timer_test1 - run_in_loop_test1 - run_in_loop_test2 logger_test + logger_macro_test async_file_logger_test + async_file_logger_test1 + path_conversion_test + dns_test + run_in_loop_test1 + run_in_loop_test2 + run_on_quit_test + timer_test + timer_test1 + timing_wheel_test + kickoff_test tcp_server_test - concurrent_task_queue_test tcp_client_test - async_file_logger_test1 + tcp_asyncstream_server_test + serial_task_queue_test1 + serial_task_queue_test2 + concurrent_task_queue_test sendfile_test sendstream_test - timing_wheel_test - kickoff_test - dns_test - run_on_quit_test - path_conversion_test - logger_macro_test - delayed_ssl_server_test - delayed_ssl_client_test - tcp_asyncstream_server_test) +) -if(HAVE_SPDLOG) +if(TRANTOR_USE_SPDLOG) add_executable(spdlogger_test SpdLoggerTest.cc) list(APPEND targets_list spdlogger_test) -endif(HAVE_SPDLOG) +endif() + +if(TRANTOR_USE_TLS) + add_executable(ssl_server_test SSLServerTest.cc) + add_executable(ssl_client_test SSLClientTest.cc) + add_executable(delayed_ssl_server_test DelayedSSLServerTest.cc) + add_executable(delayed_ssl_client_test DelayedSSLClientTest.cc) + list( + APPEND + targets_list + ssl_server_test + ssl_client_test + delayed_ssl_server_test + delayed_ssl_client_test + ) +endif() set_property(TARGET ${targets_list} PROPERTY CXX_STANDARD 14) set_property(TARGET ${targets_list} PROPERTY CXX_STANDARD_REQUIRED ON) @@ -61,4 +78,6 @@ set_property(TARGET ${targets_list} PROPERTY CXX_EXTENSIONS OFF) foreach(T ${targets_list}) target_link_libraries(${T} PRIVATE trantor) -endforeach() \ No newline at end of file + set_standard_build_output(${T}) + +endforeach() diff --git a/trantor/unittests/CMakeLists.txt b/trantor/unittests/CMakeLists.txt index 61ac67a4..d870c76e 100644 --- a/trantor/unittests/CMakeLists.txt +++ b/trantor/unittests/CMakeLists.txt @@ -1,25 +1,41 @@ -find_package(GTest REQUIRED) -add_executable(msgbuffer_unittest MsgBufferUnittest.cc) -add_executable(inetaddress_unittest InetAddressUnittest.cc) +add_executable(hash_unittest HashUnittest.cc) add_executable(date_unittest DateUnittest.cc) +add_executable(inetaddress_unittest InetAddressUnittest.cc) +add_executable(msgbuffer_unittest MsgBufferUnittest.cc) add_executable(split_string_unittest splitStringUnittest.cc) add_executable(string_encoding_unittest stringEncodingUnittest.cc) -add_executable(ssl_name_verify_unittest sslNameVerifyUnittest.cc) -add_executable(hash_unittest HashUnittest.cc) + set(UNITTEST_TARGETS - msgbuffer_unittest - inetaddress_unittest + hash_unittest date_unittest + inetaddress_unittest + msgbuffer_unittest split_string_unittest string_encoding_unittest - ssl_name_verify_unittest - hash_unittest) +) + +if(TRANTOR_USE_TLS) + add_executable(ssl_name_verify_unittest sslNameVerifyUnittest.cc) + list(APPEND UNITTEST_TARGETS ssl_name_verify_unittest) +endif() + set_property(TARGET ${UNITTEST_TARGETS} PROPERTY CXX_STANDARD 14) set_property(TARGET ${UNITTEST_TARGETS} PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET ${UNITTEST_TARGETS} PROPERTY CXX_EXTENSIONS OFF) +if(NOT BUILD_DEPENDENCIES) + find_package(GTest REQUIRED) +endif() + include(GoogleTest) + foreach(T ${UNITTEST_TARGETS}) - target_link_libraries(${T} PRIVATE trantor GTest::GTest) + if(BUILD_DEPENDENCIES) + target_include_directories(${T} PRIVATE ${gtest_SOURCE_DIR}/include) + endif() + + target_link_libraries(${T} PRIVATE trantor GTest::gtest_main) + set_standard_build_output(${T}) + gtest_discover_tests(${T}) endforeach() diff --git a/trantor/unittests/DateUnittest.cc b/trantor/unittests/DateUnittest.cc index bdb55fd4..f8830d85 100644 --- a/trantor/unittests/DateUnittest.cc +++ b/trantor/unittests/DateUnittest.cc @@ -7,20 +7,23 @@ TEST(Date, constructorTest) { EXPECT_STREQ("1985-01-01 00:00:00", trantor::Date(1985, 1, 1) - .toCustomedFormattedStringLocal("%Y-%m-%d %H:%M:%S") + .toCustomizedFormattedStringLocal("%Y-%m-%d %H:%M:%S") .c_str()); EXPECT_STREQ("2004-02-29 00:00:00.000000", trantor::Date(2004, 2, 29) - .toCustomedFormattedStringLocal("%Y-%m-%d %H:%M:%S", true) + .toCustomizedFormattedStringLocal("%Y-%m-%d %H:%M:%S", + true) .c_str()); EXPECT_STRNE("2001-02-29 00:00:00.000000", trantor::Date(2001, 2, 29) - .toCustomedFormattedStringLocal("%Y-%m-%d %H:%M:%S", true) + .toCustomizedFormattedStringLocal("%Y-%m-%d %H:%M:%S", + true) .c_str()); EXPECT_STREQ("2018-01-01 00:00:00.000000", trantor::Date(2018, 1, 1, 12, 12, 12, 2321) .roundDay() - .toCustomedFormattedStringLocal("%Y-%m-%d %H:%M:%S", true) + .toCustomizedFormattedStringLocal("%Y-%m-%d %H:%M:%S", + true) .c_str()); } TEST(Date, DatabaseStringTest) diff --git a/trantor/utils/AsyncFileLogger.cc b/trantor/utils/AsyncFileLogger.cc index 12cf293c..d430299c 100755 --- a/trantor/utils/AsyncFileLogger.cc +++ b/trantor/utils/AsyncFileLogger.cc @@ -64,7 +64,7 @@ AsyncFileLogger::~AsyncFileLogger() } while (!writeBuffers_.empty()) { - StringPtr tmpPtr = (StringPtr &&)writeBuffers_.front(); + StringPtr tmpPtr = (StringPtr &&) writeBuffers_.front(); writeBuffers_.pop(); writeLogToFile(tmpPtr); } @@ -162,7 +162,7 @@ void AsyncFileLogger::logThreadFunc() while (!tmpBuffers_.empty()) { - StringPtr tmpPtr = (StringPtr &&)tmpBuffers_.front(); + StringPtr tmpPtr = (StringPtr &&) tmpBuffers_.front(); tmpBuffers_.pop(); writeLogToFile(tmpPtr); tmpPtr->clear(); @@ -269,7 +269,7 @@ void AsyncFileLogger::LoggerFile::switchLog(bool openNewOne) // NOTE: Remember to update initFilenameQueue() if name format changes std::string newName = filePath_ + fileBaseName_ + "." + - creationDate_.toCustomedFormattedString("%y%m%d-%H%M%S") + + creationDate_.toCustomizedFormattedString("%y%m%d-%H%M%S") + std::string(seq) + fileExtName_; #if !defined(_WIN32) || defined(__MINGW32__) rename(fileFullName_.c_str(), newName.c_str()); @@ -409,4 +409,4 @@ void AsyncFileLogger::swapBuffer() logBufferPtr_ = std::make_shared(); logBufferPtr_->reserve(kMemBufferSize); } -} +} \ No newline at end of file diff --git a/trantor/utils/Date.cc b/trantor/utils/Date.cc index a65ae193..e3deed0a 100644 --- a/trantor/utils/Date.cc +++ b/trantor/utils/Date.cc @@ -142,8 +142,8 @@ std::string Date::toFormattedString(bool showMicroseconds) const } return buf; } -std::string Date::toCustomedFormattedString(const std::string &fmtStr, - bool showMicroseconds) const +std::string Date::toCustomizedFormattedString(const std::string &fmtStr, + bool showMicroseconds) const { char buf[256] = {0}; time_t seconds = @@ -163,9 +163,9 @@ std::string Date::toCustomedFormattedString(const std::string &fmtStr, snprintf(decimals, sizeof(decimals), ".%06d", microseconds); return std::string(buf) + decimals; } -void Date::toCustomedFormattedString(const std::string &fmtStr, - char *str, - size_t len) const +void Date::toCustomizedFormattedString(const std::string &fmtStr, + char *str, + size_t len) const { // not safe time_t seconds = @@ -323,8 +323,8 @@ Date Date::fromDbString(const std::string &datetime) static_cast(timezoneOffset())); } -std::string Date::toCustomedFormattedStringLocal(const std::string &fmtStr, - bool showMicroseconds) const +std::string Date::toCustomizedFormattedStringLocal(const std::string &fmtStr, + bool showMicroseconds) const { char buf[256] = {0}; time_t seconds = diff --git a/trantor/utils/Date.h b/trantor/utils/Date.h index 7ea7c974..248f5087 100644 --- a/trantor/utils/Date.h +++ b/trantor/utils/Date.h @@ -203,7 +203,7 @@ class TRANTOR_EXPORT Date std::string toFormattedString(bool showMicroseconds) const; /** - * @brief Generate a UTC time string formated by the @p fmtStr + * @brief Generate a UTC time string formatted by the @p fmtStr * @param fmtStr is the format string for the function strftime() * @param showMicroseconds whether the microseconds are returned. * @note Examples: @@ -212,12 +212,13 @@ class TRANTOR_EXPORT Date * - "2018-01-01 10:10:25:102414" if the @p fmtStr is "%Y-%m-%d %H:%M:%S" * and the @p showMicroseconds is true */ - std::string toCustomedFormattedString(const std::string &fmtStr, - bool showMicroseconds = false) const; + std::string toCustomizedFormattedString( + const std::string &fmtStr, + bool showMicroseconds = false) const; /** * @brief Generate a local time zone string, the format of the string is - * same as the mothed toFormattedString + * same as the method toFormattedString * * @param showMicroseconds * @return std::string @@ -225,13 +226,13 @@ class TRANTOR_EXPORT Date std::string toFormattedStringLocal(bool showMicroseconds) const; /** - * @brief Generate a local time zone string formated by the @p fmtStr + * @brief Generate a local time zone string formatted by the @p fmtStr * * @param fmtStr * @param showMicroseconds * @return std::string */ - std::string toCustomedFormattedStringLocal( + std::string toCustomizedFormattedStringLocal( const std::string &fmtStr, bool showMicroseconds = false) const; @@ -268,9 +269,9 @@ class TRANTOR_EXPORT Date * @param str The string buffer for the generated time string. * @param len The length of the string buffer. */ - void toCustomedFormattedString(const std::string &fmtStr, - char *str, - size_t len) const; // UTC + void toCustomizedFormattedString(const std::string &fmtStr, + char *str, + size_t len) const; // UTC /** * @brief Return true if the time point is in a same second as another. diff --git a/trantor/utils/MsgBuffer.h b/trantor/utils/MsgBuffer.h index 9c7b2eab..4e8600cf 100644 --- a/trantor/utils/MsgBuffer.h +++ b/trantor/utils/MsgBuffer.h @@ -207,7 +207,7 @@ class TRANTOR_EXPORT MsgBuffer void appendInt32(const uint32_t i); /** - * @brief Appaend a unsigned int64 value to the end of the buffer. + * @brief Append a unsigned int64 value to the end of the buffer. * * @param l */ diff --git a/trantor/utils/SerialTaskQueue.cc b/trantor/utils/SerialTaskQueue.cc index 4b989ccb..71a7103a 100644 --- a/trantor/utils/SerialTaskQueue.cc +++ b/trantor/utils/SerialTaskQueue.cc @@ -20,7 +20,7 @@ namespace trantor { SerialTaskQueue::SerialTaskQueue(const std::string &name) - : queueName_(name.empty() ? "SerailTaskQueue" : name), + : queueName_(name.empty() ? "SerialTaskQueue" : name), loopThread_(queueName_) { loopThread_.run(); diff --git a/trantor/utils/SerialTaskQueue.h b/trantor/utils/SerialTaskQueue.h index 04742bb2..454597fe 100644 --- a/trantor/utils/SerialTaskQueue.h +++ b/trantor/utils/SerialTaskQueue.h @@ -58,7 +58,7 @@ class TRANTOR_EXPORT SerialTaskQueue : public TaskQueue SerialTaskQueue() = delete; /** - * @brief Construct a new serail task queue instance. + * @brief Construct a new serial task queue instance. * * @param name */ @@ -72,7 +72,7 @@ class TRANTOR_EXPORT SerialTaskQueue : public TaskQueue * @return true * @return false */ - bool isRuningTask() + bool isRunningTask() { return loopThread_.getLoop() ? loopThread_.getLoop()->isCallingFunctions() diff --git a/trantor/utils/TaskQueue.h b/trantor/utils/TaskQueue.h index fb656d5c..b5309718 100644 --- a/trantor/utils/TaskQueue.h +++ b/trantor/utils/TaskQueue.h @@ -36,7 +36,7 @@ class TaskQueue : public NonCopyable }; /** - * @brief Run a task in the queue sychronously. This means that the task is + * @brief Run a task in the queue synchronously. This means that the task is * executed before the method returns. * * @param task diff --git a/trantor/utils/Utilities.h b/trantor/utils/Utilities.h index 1a4390b0..c21c2aeb 100644 --- a/trantor/utils/Utilities.h +++ b/trantor/utils/Utilities.h @@ -172,7 +172,7 @@ inline std::string fromNativePath(const std::wstring &strPath) } /** - * @brief Check if the name supplied by the SSL Cert matchs a FQDN + * @brief Check if the name supplied by the SSL Cert matches a FQDN * @param certName The name supplied by the SSL Cert * @param hostName The FQDN to match * @@ -243,7 +243,7 @@ inline Hash256 sha3(const std::string &str) /** * @brief Compute the BLAKE2b hash of the given data * @note When in doubt, use SHA3 or BLAKE2b. Both are safe and SHA3 is faster if - * you are using OpenSSL and it has SHA3 in hardware mode. Owtherwise BLAKE2b is + * you are using OpenSSL and it has SHA3 in hardware mode. Otherwise BLAKE2b is * faster in software. */ TRANTOR_EXPORT Hash256 blake2b(const void *data, size_t len); @@ -255,7 +255,7 @@ inline Hash256 blake2b(const std::string &str) /** * @brief hex encode the given data * @note When in doubt, use SHA3 or BLAKE2b. Both are safe and SHA3 is faster if - * you are using OpenSSL and it has SHA3 in hardware mode. Owtherwise BLAKE2b is + * you are using OpenSSL and it has SHA3 in hardware mode. Otherwise BLAKE2b is * faster in software. */ TRANTOR_EXPORT std::string toHexString(const void *data, size_t len); @@ -280,7 +280,7 @@ inline std::string toHexString(const Hash256 &hash) * @param size Size of the buffer * @return true if successful, false otherwise * - * @note This function really sholdn't fail, but it's possible that + * @note This function really shouldn't fail, but it's possible that * * - OpenSSL can't access /dev/urandom * - Compiled with glibc that supports getentropy() but the kernel doesn't diff --git a/trantor/utils/crypto/sha1.cc b/trantor/utils/crypto/sha1.cc index fa4ae8e3..8cf619bd 100644 --- a/trantor/utils/crypto/sha1.cc +++ b/trantor/utils/crypto/sha1.cc @@ -40,7 +40,8 @@ A million repetitions of "a" #if defined(vax) || defined(ns32000) || defined(sun386) || \ defined(__i386__) || defined(MIPSEL) || defined(_MIPSEL) || \ defined(BIT_ZERO_ON_RIGHT) || defined(__alpha__) || defined(__alpha) || \ - defined(__CYGWIN32__) || defined(_WIN64) || defined(_WIN32) + defined(__CYGWIN32__) || defined(_WIN64) || defined(_WIN32) || \ + defined(__APPLE__) #define BYTE_ORDER LITTLE_ENDIAN #endif diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 00000000..edc02497 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,14 @@ +{ + "name": "trantor", + "version-semver": "1.5.17", + "description": "A non-blocking I/O cross-platform TCP network library, using C++14", + "homepage": "https://github.com/an-tao/trantor", + "license": "BSD-2-Clause", + "dependencies": [ + "spdlog", + "c-ares", + "openssl", + "botan", + "gtest" + ] +} \ No newline at end of file