diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c17f2550..3680cd22 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -24,8 +24,7 @@ jobs: run: | # Installing packages might fail as the github image becomes outdated sudo apt update - sudo apt install dos2unix clang-format - pip install cmake-format + sudo apt install dos2unix clang-format cmake-format - name: Lint run: ./format.sh && git diff --exit-code diff --git a/.github/workflows/macos-clang.yml b/.github/workflows/macos-clang.yml index 6baa1688..62167736 100644 --- a/.github/workflows/macos-clang.yml +++ b/.github/workflows/macos-clang.yml @@ -7,67 +7,99 @@ on: workflow_dispatch: jobs: - build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + build-opt-off: + name: "${{matrix.link}}-${{matrix.build-type}}-opt-off" runs-on: macos-latest + env: + shared: ${{matrix.link == 'SHARED' && 'ON' || 'OFF'}} strategy: fail-fast: false matrix: - link: [ 'STATIC', 'SHARED' ] + link: ["STATIC", "SHARED"] # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - build-type: ['Debug', 'Release'] - # Botan needs std::ranges but clang on macOS doesn't support it yet - #tls-provider: ['', 'openssl', 'botan'] - tls-provider: ['', 'openssl'] + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto) + tls-provider: ["none"] steps: - - name: Install dependencies - # botan v3 - run: | - brew install botan spdlog + - name: Install dependencies + shell: bash + working-directory: ${{env.GITHUB_WORKSPACE}} + run: | + brew install googletest + + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + + - name: Configure Cmake + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DFETCH_BUILD_MISSING_DEPS=OFF \ + -DTRANTOR_USE_SPDLOG=OFF \ + -DTRANTOR_USE_C-ARES=OFF \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - 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: Build + working-directory: ./build + run: | + make -j3 - - name: Checkout Trantor source code - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 + - name: Test + working-directory: ./build + run: | + make test + + build-opt-on: + 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"] + # Botan needs std::ranges but clang on macOS doesn't support it yet + # Support (none, openssl, botan-3, auto) + tls-provider: ["openssl", "botan-3"] + + steps: + - name: Install dependencies + shell: bash + working-directory: ${{env.GITHUB_WORKSPACE}} + run: | + brew install googletest spdlog botan - - name: Create build directory - run: | - mkdir build + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - 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: Configure Cmake + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DFETCH_BUILD_MISSING_DEPS=OFF \ + -DTRANTOR_USE_SPDLOG=ON \ + -DTRANTOR_USE_C-ARES=ON \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - 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: Build + working-directory: ./build + run: | + make -j3 - - 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: Test + working-directory: ./build + run: | + make test diff --git a/.github/workflows/rockylinux-gcc.yml b/.github/workflows/rockylinux-gcc.yml index 85de8c26..86f18517 100644 --- a/.github/workflows/rockylinux-gcc.yml +++ b/.github/workflows/rockylinux-gcc.yml @@ -7,82 +7,110 @@ on: workflow_dispatch: jobs: - build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + build-opt-off: + name: "${{matrix.link}}-${{matrix.build-type}}-opt-off" 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"] steps: - - name: Install dependencies - run: | - dnf install gcc-c++ cmake git wget -y + - name: Install build dependencies + run: | + dnf install epel-release -y + dnf install git cmake gcc gcc-c++ gtest-devel -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: Configure Cmake + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DFETCH_BUILD_MISSING_DEPS=OFF \ + -DTRANTOR_USE_SPDLOG=OFF \ + -DTRANTOR_USE_C-ARES=OFF \ + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} \ + -DBUILD_TESTING=ON - - name: Checkout Trantor source code - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 + - name: Build + working-directory: ./build + run: | + make -j4 - - name: Create build directory - run: | - mkdir build + - name: Test + working-directory: ./build + run: | + make test - - 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 + build-opt-on: + name: "${{matrix.link}}-${{matrix.build-type}}-TLS:${{matrix.tls-provider}}" + runs-on: ubuntu-latest + 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, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto), rockylinux dnf provide botan2 + tls-provider: ["openssl", "botan-3"] + + steps: + - name: Install build dependencies + run: | + dnf install epel-release -y + dnf install git cmake gcc gcc-c++ -y + dnf install gtest-devel spdlog-devel c-ares-devel openssl-devel -y + + - uses: actions/cache@v4 + id: rockylinux-cache + with: + path: | + /usr/local/Botan + key: rockylinux-${{matrix.build-type}}-${{matrix.tls-provider}} + + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - 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 + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DFETCH_BUILD_MISSING_DEPS=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 -j4 + - name: Test + working-directory: ./build + run: | + make test diff --git a/.github/workflows/ubuntu-gcc.yml b/.github/workflows/ubuntu-gcc.yml index 04b47ff7..6cc4c8ad 100644 --- a/.github/workflows/ubuntu-gcc.yml +++ b/.github/workflows/ubuntu-gcc.yml @@ -7,75 +7,105 @@ on: workflow_dispatch: jobs: - build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + build-opt-off: + name: "${{matrix.link}}-${{matrix.build-type}}-opt-off" 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"] 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: Install dependencies + run: | + sudo apt install libgtest-dev -y - - 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: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 - - name: Checkout Trantor source code - uses: actions/checkout@v4 - with: - submodules: true - fetch-depth: 0 + - name: Configure Cmake + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DFETCH_BUILD_MISSING_DEPS=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 -j4 - - 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 + build-opt-on: + 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, MinSizeRel, etc.) + build-type: ["Debug", "Release"] + # Support (none, openssl, botan-3, auto), ubuntu apt provide botan2 + tls-provider: ["openssl", "botan-3"] + + steps: + - name: Install dependencies + run: | + sudo apt install libgtest-dev libspdlog-dev libc-ares-dev -y + + - name: Allow '/usr/local' to install deps + run: | + sudo chmod -R 0777 /usr/local + + - uses: actions/cache@v4 + id: ubuntu-cache + with: + path: | + /usr/local/Botan + key: ubuntu-${{matrix.build-type}}-${{matrix.tls-provider}} + + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + + - name: Configure Cmake + run: | + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \ + -DBUILD_SHARED_LIBS=$shared \ + -DFETCH_BUILD_MISSING_DEPS=ON \ + -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 -j4 + - name: Test + working-directory: ./build + run: | + make test diff --git a/.github/workflows/windows-msvc.yml b/.github/workflows/windows-msvc.yml index 1cfc7341..09c1e86e 100644 --- a/.github/workflows/windows-msvc.yml +++ b/.github/workflows/windows-msvc.yml @@ -7,18 +7,19 @@ on: workflow_dispatch: jobs: - build: - name: '${{matrix.link}}-${{matrix.build-type}}-${{matrix.tls-provider}}' + build-opt-off: + name: "${{matrix.link}}-${{matrix.build-type}}-opt-off" 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, botan-2, auto) + tls-provider: ["none"] steps: - name: Checkout Trantor source code @@ -26,37 +27,146 @@ jobs: with: submodules: false - - name: Create build directory - working-directory: ${{env.GITHUB_WORKSPACE}} + - name: Configure Cmake run: | - mkdir build + cmake -B build -S . ` + -DBUILD_SHARED_LIBS=$shared ` + -DFETCH_BUILD_MISSING_DEPS=ON ` + -DTRANTOR_USE_SPDLOG=OFF ` + -DTRANTOR_USE_C-ARES=OFF ` + -DBUILD_TESTING=ON ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 - - name: Install conan packages - shell: bash + - 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 -C ${{matrix.build-type}} + + build-opt-on-conan: + name: "${{matrix.link}}-${{matrix.build-type}}-conan-TLS:${{matrix.tls-provider}}" + 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: ["openssl", "botan-3"] + + steps: + - name: Checkout Trantor source code + uses: actions/checkout@v4 + with: + submodules: false + + - uses: actions/cache@v4 + id: conan-cache + with: + path: | + C:\\Users\\runneradmin\\.conan2 + key: windows-conan-${{matrix.build-type}}-${{ hashFiles('conanfile.txt') }} + + - name: Install conan packages run: | pip install conan conan profile detect --force - conan install .. --output-folder=. --build=missing --settings=build_type=${{matrix.build-type}} --settings=compiler="msvc" + cmake -B build -S . ` + -DCMAKE_BUILD_TYPE=${{matrix.build-type}} ` + -DFETCH_BUILD_MISSING_DEPS=OFF ` + -DTRANTOR_USE_SPDLOG=ON ` + -DTRANTOR_USE_C-ARES=ON ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=ON ` + -DUPDATE_CONAN_FILE=ON ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 - - name: Create Build Environment & Configure Cmake - shell: bash + - name: Configure Cmake + run: | + cmake -B build -S . --fresh ` + -DCMAKE_TOOLCHAIN_FILE="./build/conan_toolchain.cmake" ` + -DBUILD_SHARED_LIBS=$shared ` + -DFETCH_BUILD_MISSING_DEPS=OFF ` + -DTRANTOR_USE_SPDLOG=ON ` + -DTRANTOR_USE_C-ARES=ON ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=OFF ` + -DCMAKE_POLICY_DEFAULT_CMP0091=NEW ` + -G "Visual Studio 17 2022" -T host=x64 -A x64 + + - name: Build 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 + # 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 -C ${{matrix.build-type}} + + build-opt-on-fetch: + name: "${{matrix.link}}-${{matrix.build-type}}-fetch-TLS:${{matrix.tls-provider}}" + 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: ["openssl", "botan-3"] + + 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: seanmiddleditch/gha-setup-vsdevenv@master + + - uses: actions/cache@v4 + id: cmake-fetch-content-cache + with: + path: | + C:/Botan + C:/OpenSSL + C:/c-ares + key: windows-fetch-${{matrix.build-type}}-${{matrix.tls-provider}} + + - name: Configure Cmake + # passing "-DFETCHCONTENT_BASE_DIR=D:/a/trantor/_deps" to keep cache + run: | + cmake -B build -S . ` + -DBUILD_SHARED_LIBS=$shared ` + -DFETCH_BUILD_MISSING_DEPS=ON ` + -DTRANTOR_USE_SPDLOG=ON ` + -DTRANTOR_USE_C-ARES=ON ` + -DTRANTOR_TLS_PROVIDER=${{matrix.tls-provider}} ` + -DBUILD_TESTING=OFF ` + -DFETCHCONTENT_BASE_DIR=D:/a/trantor/_deps ` + -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 -C ${{matrix.build-type}} diff --git a/CMakeLists.txt b/CMakeLists.txt index b65f55a4..e23c402b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,53 +1,45 @@ -cmake_minimum_required(VERSION 3.5) -project(trantor) - -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)" "" +cmake_minimum_required(VERSION 3.11) +project( + trantor + DESCRIPTION "Non-blocking I/O cross-platform TCP network library, using C++14" + HOMEPAGE_URL "https://github.com/an-tao/trantor" ) -option(USE_SPDLOG "Allow using the spdlog logging library" OFF) - -list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/) +add_library(${PROJECT_NAME}) +# Version set(TRANTOR_MAJOR_VERSION 1) set(TRANTOR_MINOR_VERSION 5) set(TRANTOR_PATCH_VERSION 20) 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" +# 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) + +# Old Build options +#[[ +option(BUILD_C-ARES "Build C-ARES" ON) Replaced by TRANTOR_USE_C-ARES +option(USE_SPDLOG "Allow using the spdlog logging library" OFF) Replaced by TRANTOR_USE_SPDLOG +option(TRANTOR_USE_TLS "TLS provider for trantor." "") Replaced by TRANTOR_TLS_PROVIDER +#]] + +# Build options +option(BUILD_SHARED_LIBS "Build ${PROJECT_NAME} as a shared lib" ON) +option(BUILD_TESTING "Build tests" OFF) +option(BUILD_DOC "Build Doxygen documentation" OFF) +option(TRANTOR_USE_SPDLOG "Using the spdlog logging library" ON) +option(TRANTOR_USE_C-ARES "Using C-ARES" ON) +option(TRANTOR_TLS_PROVIDER + "TLS(Transport Layer Security) provider. Valid options are 'OFF', 'ON', 'none', 'openssl', 'botan-3', 'auto'." + ON ) -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" +option(FETCH_BUILD_MISSING_DEPS "Fetch/build/install missing dependencies, CMake version >=3.11 required" ON) +option(UPDATE_CONAN_FILE + "Update conan file and install conan packages, using CMAKE_TOOLCHAIN_FILE, CMAKE verion >=3.15 required" OFF ) -add_library(${PROJECT_NAME}) 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 @@ -55,382 +47,177 @@ if(BUILD_SHARED_LIBS) 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) +# Change TRANTOR_TLS_PROVIDER ON/OFF to String +if(TRANTOR_TLS_PROVIDER STREQUAL OFF) + set(TRANTOR_TLS_PROVIDER + "none" + CACHE STRING "" FORCE + ) +elseif(TRANTOR_TLS_PROVIDER STREQUAL ON) + set(TRANTOR_TLS_PROVIDER + "botan-3" + CACHE STRING "" FORCE + ) +else() + # keep value provided by -DTRANTOR_TLS_PROVIDER, such as -DTRANTOR_TLS_PROVIDER=openssl endif() -include(GenerateExportHeader) -generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h) +# Sources and 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/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 +) -# 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(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/TLSPolicy.h ) -if(MINGW) - target_compile_definitions(${PROJECT_NAME} PUBLIC -D_WIN32_WINNT=0x0601) -endif(MINGW) +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 +) 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/inner/Acceptor.h - trantor/net/inner/Connector.h - trantor/net/inner/Poller.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 + 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 ) 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) - if(CMAKE_CXX_COMPILER_ID MATCHES Clang|GNU) - # Trantor uses some features that are deprecated in C++20 but Botan3 needs C++20 - target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated) - endif() - 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 + list( + APPEND + private_headers + # cmake-format: sortable + third_party/wepoll/Wepoll.h + trantor/utils/WindowsSupport.h ) - 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 + list( + APPEND + TRANTOR_SOURCES + # cmake-format: sortable + third_party/wepoll/Wepoll.c + trantor/utils/WindowsSupport.cc + trantor/net/inner/FileBufferNodeWin.cc ) -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() else() - set(TRANTOR_SOURCES ${TRANTOR_SOURCES} trantor/net/inner/NormalResolver.cc) - set(private_headers ${private_headers} trantor/net/inner/NormalResolver.h) + list(APPEND TRANTOR_SOURCES trantor/net/inner/FileBufferNodeUnix.cc) 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) -elseif(NOT ANDROID) - target_link_libraries(${PROJECT_NAME} PRIVATE pthread $<$:socket>) -endif(WIN32) +# Export header +include(cmake/SetExportHeader.cmake) -file(WRITE ${CMAKE_BINARY_DIR}/test_atomic.cpp "#include \n" - "int main() { std::atomic i(0); i++; return 0; }\n" +# 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 + $ ) -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) +# CMake modules +list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/) -if(BUILD_TESTING) - add_subdirectory(trantor/tests) - find_package(GTest) - if(GTest_FOUND) - enable_testing() - add_subdirectory(trantor/unittests) - endif() -endif() +# Common settings +include(cmake/SetSystemAndCompiler.cmake) -set(public_net_headers - trantor/net/EventLoop.h - trantor/net/EventLoopThread.h - trantor/net/EventLoopThreadPool.h - trantor/net/InetAddress.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 -) +# Update conan/vcpkg dependencies, and install them, remove CMakeCache.txt and Configure CMake Without UPDATE_CONAN_FILE +# OR INSTALL_VPKG_DEPS again +if(UPDATE_CONAN_FILE) + include(cmake/SetConan.cmake) +endif() -set(public_utils_headers - 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/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 -) +# Set options +if(NOT UPDATE_CONAN_FILE AND NOT INSTALL_DEPS_VCPKG) + include(cmake/SetDepsOptions.cmake) + include(cmake/SetSpdlog.cmake) + include(cmake/SetCAres.cmake) + include(cmake/SetTlsProvider.cmake) + include(cmake/SetTesting.cmake) + include(cmake/SetDoxygen.cmake) +endif() +# Target sources target_sources( ${PROJECT_NAME} PRIVATE ${TRANTOR_SOURCES} - ${CMAKE_CURRENT_BINARY_DIR}/exports/trantor/exports.h + ${TRANTOR_EXPORT_HEADER} ${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} -) - +# Group sources +source_group("Public API" FILES ${TRANTOR_EXPORT_HEADER} ${public_net_headers} ${public_utils_headers}) source_group("Private Headers" FILES ${private_headers}) -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) - -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} -) - -# version -write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/TrantorConfigVersion.cmake - VERSION ${TRANTOR_VERSION} - COMPATIBILITY SameMajorVersion -) - -# 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) +# Set additional +include(cmake/SetInstall.cmake) +include(cmake/SetPackageConfig.cmake) diff --git a/README.md b/README.md index 33bb7c2d..61259f61 100755 --- a/README.md +++ b/README.md @@ -1,20 +1,24 @@ # TRANTOR + [![Build Ubuntu gcc](../../actions/workflows/ubuntu-gcc.yml/badge.svg)](../../actions/workflows/ubuntu-gcc.yml/badge.svg) [![Build Macos clang](../../actions/workflows/macos-clang.yml/badge.svg)](../../actions/workflows/macos-clang.yml/badge.svg) [![Build RockyLinux gcc](../../actions/workflows/rockylinux-gcc.yml/badge.svg)](../../actions/workflows/rockylinux-gcc.yml/badge.svg) [![Build Windows msvc](../../actions/workflows/windows-msvc.yml/badge.svg)](../../actions/workflows/windows-msvc.yml/badge.svg) ## Overview + A non-blocking I/O cross-platform TCP network library, using C++14. Drawing on the design of Muduo Library ## Supported platforms + - Linux - MacOS - UNIX(BSD) - Windows ## Feature highlights + - Non-blocking I/O - cross-platform - Thread pool @@ -22,27 +26,30 @@ Drawing on the design of Muduo Library - Support SSL - Server and Client - ## Build + ```shell git clone https://github.com/an-tao/trantor.git cd trantor cmake -B build -H. -cd build +cd build make -j ``` ## Licensing -Trantor - A non-blocking I/O based TCP network library, using C++14. -Copyright (c) 2016-2021, Tao An. All rights reserved. +Trantor - A non-blocking I/O based TCP network library, using C++14. + +Copyright (c) 2016-2021, Tao An. All rights reserved. https://github.com/an-tao/trantor For more information see [License](License) ## Community + [Gitter](https://gitter.im/drogon-web/community) ## Documentation + [DocsForge](https://trantor.docsforge.com/) diff --git a/cmake/SetBotan.cmake b/cmake/SetBotan.cmake new file mode 100644 index 00000000..9acca9ae --- /dev/null +++ b/cmake/SetBotan.cmake @@ -0,0 +1,131 @@ +# build and install botan +macro(build_install_botan) + + # botan build need python + find_package(PythonInterp REQUIRED) + + if(NOT Botan_DOWNLOAD_URL) + get_github_latest_release_url("randombit" "Botan") + endif() + + # [[ VS 17.11 the STL PR: microsoft/STL#4633 on April 27, 2024 Botan 3.5.0 or below, will build error ]] + find_program(MSBUILD_EXECUTABLE msbuild) + if(MSBUILD_EXECUTABLE) + execute_process(COMMAND msbuild -version OUTPUT_VARIABLE msbuild_version OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "msbuild version: ${msbuild_version}") + + if(msbuild_version VERSION_GREATER "17.11" AND Botan_BUILD_VERSION VERSION_LESS_EQUAL "3.5.0") + message(STATUS "⚠️After msbuild version: ${msbuild_version}, Botan must greater than 3.5.0, using master branch") + FetchContent_Declare(Botan URL https://github.com/randombit/botan/archive/refs/heads/master.zip) + else() + FetchContent_Declare(Botan URL ${Botan_DOWNLOAD_URL}) + endif() + + else() + FetchContent_Declare(Botan URL ${Botan_DOWNLOAD_URL}) + endif() + + FetchContent_GetProperties(Botan) + + if(NOT Botan_POPULATED) + FetchContent_Populate(Botan) + + get_lowcase_compiler_id() + + # configure build and install + execute_process( + COMMAND ${PYTHON_EXECUTABLE} ${botan_SOURCE_DIR}/configure.py --prefix=${BOTAN_ROOT_DIR} + --cc=${cmake_cxx_compiler_id} --disable-deprecated-features --with-pkg-config --build-target=shared + WORKING_DIRECTORY ${botan_BINARY_DIR} + ) + if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + execute_process(COMMAND nmake WORKING_DIRECTORY ${botan_BINARY_DIR}) + execute_process(COMMAND nmake install WORKING_DIRECTORY ${botan_BINARY_DIR}) + else() + execute_process(COMMAND make -j4 WORKING_DIRECTORY ${botan_BINARY_DIR}) + execute_process(COMMAND make install WORKING_DIRECTORY ${botan_BINARY_DIR}) + endif() + + endif() +endmacro() + +# Set botan +macro(set_botan) + + target_compile_definitions(${PROJECT_NAME} PRIVATE TRANTOR_TLS_PROVIDER="Botan${Botan_VERSION_MAJOR}") + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BOTAN) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BOTAN${Botan_VERSION_MAJOR}) + + target_include_directories(${PROJECT_NAME} PRIVATE ${Botan_INCLUDE_DIRS}) + + # 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) + # std::max、std::min error C2589: “(”:“::” #include #include + target_compile_definitions(${PROJECT_NAME} PRIVATE NOMINMAX) + endif() + if(TARGET Botan::Botan) + target_link_libraries(${PROJECT_NAME} PRIVATE Botan::Botan) + endif() + + list( + APPEND + TRANTOR_SOURCES + trantor/net/inner/tlsprovider/BotanTLSProvider.cc + trantor/utils/crypto/botan.cc + ) + + # copy dll/libs for Windows, to solve the test/unittests running 0x000135 error + copy_files_for_win(${BOTAN_ROOT_DIR}/bin "dll") + copy_files_for_win(${BOTAN_ROOT_DIR}/lib "lib") + +endmacro() + +# Get lowcase compiler id +macro(get_lowcase_compiler_id) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(cmake_cxx_compiler_id "gcc") + else() + string(TOLOWER ${CMAKE_CXX_COMPILER_ID} cmake_cxx_compiler_id) + endif() +endmacro() + +# ###################################################################################################################### +message(STATUS "Trantor using SSL library: botan") + +if(NOT (DEFINED Botan_VERSION_MAJOR)) + message(STATUS "⛔Must specify Botan_VERSION_MAJOR") +endif() + +# Set BOTAN_ROOT_DIR, to let find_package could search from it +if(WIN32) + set(BOTAN_ROOT_DIR + C:/Botan + CACHE PATH "Let find_package use the directory to find" FORCE + ) +else() + set(BOTAN_ROOT_DIR + ${CMAKE_INSTALL_PREFIX}/Botan + CACHE PATH "Let find_package use the directory to find" FORCE + ) +endif() + +find_package(Botan ${Botan_VERSION_MAJOR}) + +if(NOT Botan_FOUND) + if(FETCH_BUILD_MISSING_DEPS) + message(STATUS "⚠️Botan${Botan_VERSION_MAJOR} not found, Building it with FetchContent...") + unset(Botan_FOUND) + + build_install_botan() + find_package(Botan ${Botan_VERSION_MAJOR} REQUIRED) + + else() + message( + FATAL_ERROR "⛔Botan${Botan_VERSION_MAJOR} not found, please install it or set FETCH_BUILD_MISSING_DEPS to ON" + ) + endif() +endif() + +set_botan() diff --git a/cmake/SetCAres.cmake b/cmake/SetCAres.cmake new file mode 100644 index 00000000..28bf0e62 --- /dev/null +++ b/cmake/SetCAres.cmake @@ -0,0 +1,92 @@ +# build and install c-ares +macro(build_install_cares) + if(NOT c-ares_DOWNLOAD_URL) + get_github_latest_release_url("c-ares" "c-ares") + endif() + FetchContent_Declare(c-ares URL ${c-ares_DOWNLOAD_URL}) + # not using FetchContent_MakeAvailable to save compile time + FetchContent_GetProperties(c-ares) + + if(NOT c-ares_POPULATED) + FetchContent_Populate(c-ares) + + # configure build and install, c-ares provided makefiles already, using them to build is faster + if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + execute_process(COMMAND buildconf.bat WORKING_DIRECTORY ${c-ares_SOURCE_DIR}) + execute_process(COMMAND nmake -f Makefile.msvc WORKING_DIRECTORY ${c-ares_SOURCE_DIR}) + set(ENV{INSTALL_DIR} ${C-ARES_DIR}) + execute_process(COMMAND nmake -f Makefile.msvc install WORKING_DIRECTORY ${c-ares_SOURCE_DIR}) + else() + execute_process(COMMAND ./buildconf WORKING_DIRECTORY ${c-ares_SOURCE_DIR}) + execute_process(COMMAND make WORKING_DIRECTORY ${c-ares_SOURCE_DIR}) + execute_process(COMMAND make --install WORKING_DIRECTORY ${c-ares_SOURCE_DIR}) + endif() + + endif() +endmacro() + +# 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) + 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() + + if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(${PROJECT_NAME} PRIVATE CARES_STATICLIB) + endif() + + list(APPEND TRANTOR_SOURCES trantor/net/inner/AresResolver.cc) + list(APPEND private_headers trantor/net/inner/AresResolver.h) + + # copy dll/libs for Windows, to solve the test/unittests running 0x000135 error + copy_files_for_win(${C-ARES_DIR}/bin "dll") + copy_files_for_win(${C-ARES_DIR}/lib "lib") + copy_files_for_win(${C-ARES_DIR}/lib "dll") +endmacro() + +# ###################################################################################################################### +message(STATUS "Setting c-ares: ${TRANTOR_USE_C-ARES}") + +if(TRANTOR_USE_C-ARES) + # Set C-ARES_DIR, to let find_package could search from it + if(WIN32) + set(C-ARES_DIR + c:/c-ares + CACHE PATH "Let find_package use the directory to find" FORCE + ) + else() + set(C-ARES_DIR + ${CMAKE_INSTALL_PREFIX}/c-ares + CACHE PATH "Let find_package use the directory to find" FORCE + ) + endif() + + find_package(c-ares) + + if(NOT c-ares_FOUND) + if(FETCH_BUILD_MISSING_DEPS) + message(STATUS "⚠️c-ares not found, Building it with FetchContent...") + unset(c-ares_FOUND) + + build_install_cares() + find_package(c-ares REQUIRED) + + else() + message(FATAL_ERROR "⛔c-ares not found, please install it or set FETCH_BUILD_MISSING_DEPS to ON") + endif() + endif() + + set_cares_resolver() +else() + set_normal_resolver() +endif() diff --git a/cmake/SetConan.cmake b/cmake/SetConan.cmake new file mode 100644 index 00000000..38c65ba3 --- /dev/null +++ b/cmake/SetConan.cmake @@ -0,0 +1,122 @@ +# Get latest verion from conan.io/center +macro(get_conan_latest_build_version lib_name) + find_program(CURL_EXECUTABLE curl) + if(NOT CURL_EXECUTABLE) + message(FATAL_ERROR "⛔CURL not found") + endif() + + # Get latest build info + execute_process( + COMMAND curl -v --connect-timeout 15 -L https://conan.io/center/recipes/${lib_name} ERROR_VARIABLE CURL_ERROR + RESULT_VARIABLE CURL_RETURN_CODE OUTPUT_VARIABLE html_text + ) + if(NOT + CURL_RETURN_CODE + EQUAL + 0 + ) + message(FATAL_ERROR "⛔Failed to get latest build info from conan.io: ${CURL_ERROR}") + endif() + + # Get latest build version + string( + REGEX MATCH + "\"version\":\"[a-zA-Z]*-*[0-9]+[\\.|-|_][0-9]+[\\.|-|_][0-9]+" + latest_build + "${html_text}" + ) + + if("${latest_build}" STREQUAL "") + message(FATAL_ERROR "⛔${lib_name}: Regex Got empty build") + else() + string( + SUBSTRING "${latest_build}" + 11 + -1 + latest_build_val + ) + set(${lib_name}_BUILD_VERSION "${latest_build_val}") + message(STATUS "${lib_name} latest build: ${latest_build_val}") + endif() +endmacro() + +# ###################################################################################################################### +message(STATUS "Updating conanfile.txt") + +if(EXISTS conanfile.json) + file(REMOVE conanfile.json) +endif() + +# add start text +set(conanfile_txt "[requires]\n") +set(cppstd "--settings=compiler.cppstd=20") +# add dependencies +if(TRANTOR_USE_SPDLOG) + get_conan_latest_build_version(spdlog) + string(APPEND conanfile_txt "spdlog/${spdlog_BUILD_VERSION}\n") +endif() +if(TRANTOR_USE_C-ARES) + get_conan_latest_build_version(c-ares) + string(APPEND conanfile_txt "c-ares/${c-ares_BUILD_VERSION}\n") +endif() +if(TRANTOR_TLS_PROVIDER STREQUAL "auto") + get_conan_latest_build_version(openssl) + string(APPEND conanfile_txt "openssl/${openssl_BUILD_VERSION}\n") +endif() +if(TRANTOR_TLS_PROVIDER STREQUAL "openssl") + get_conan_latest_build_version(openssl) + string(APPEND conanfile_txt "openssl/${openssl_BUILD_VERSION}\n") +endif() +if(TRANTOR_TLS_PROVIDER STREQUAL "botan-3") + get_conan_latest_build_version(botan) + string(APPEND conanfile_txt "botan/${botan_BUILD_VERSION}\n") + set(cppstd "--settings=compiler.cppstd=20") +endif() +if(BUILD_TESTING) + get_conan_latest_build_version(gtest) + string(APPEND conanfile_txt "gtest/${gtest_BUILD_VERSION}\n") +endif() + +# add end text +string( + APPEND + conanfile_txt + "\ + +[generators] +CMakeDeps +CMakeToolchain + +[options] + +[imports] +" +) + +file(WRITE conanfile.txt ${conanfile_txt}) + +# Install deps +message(STATUS "Installing conan packages") + +find_program(CONAN_EXECUTABLE conan) +if(NOT CONAN_EXECUTABLE) + message(FATAL_ERROR "⛔conan not found") +endif() + +# build_type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") +endif() + +# Install +execute_process( + COMMAND conan install . --output-folder=build --build=missing --settings=build_type=${CMAKE_BUILD_TYPE} ${cppstd} + RESULT_VARIABLE CONAN_RETURN_CODE +) +if(NOT + CONAN_RETURN_CODE + EQUAL + 0 +) + message(FATAL_ERROR "⛔Failed to install conan packages") +endif() diff --git a/cmake/SetCrypto.cmake b/cmake/SetCrypto.cmake new file mode 100644 index 00000000..a3c411dc --- /dev/null +++ b/cmake/SetCrypto.cmake @@ -0,0 +1,21 @@ +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 +) diff --git a/cmake/SetDepsOptions.cmake b/cmake/SetDepsOptions.cmake new file mode 100644 index 00000000..c19ea5e8 --- /dev/null +++ b/cmake/SetDepsOptions.cmake @@ -0,0 +1,172 @@ +#[[ + Get download url from github, provided by github release, + if no release, use latest tag, + if provided lib_name_BUILD_VERSION variable, use provided version + if provided lib_name_VERSION_MAJOR variable, use latest version of the major version +#]] +macro(get_github_latest_release_url org_name lib_name) + if(${lib_name}_BUILD_VERSION) + set(${lib_name}_DOWNLOAD_URL + "https://github.com/${org_name}/${lib_name}/archive/refs/tags/${lib_name}_BUILD_VERSION.zip" + ) + else() + find_program(CURL_EXECUTABLE curl) + if(NOT CURL_EXECUTABLE) + message(FATAL_ERROR "⛔CURL not found") + endif() + + # Get latest release, if not provided by lib_name_VERSION_MAJOR + if(NOT DEFINED (${lib_name}_VERSION_MAJOR)) + message(STATUS "Getting latest release from github.com") + execute_process( + COMMAND curl -v --connect-timeout 15 -L https://api.github.com/repos/${org_name}/${lib_name}/releases/latest + ERROR_VARIABLE CURL_ERROR RESULT_VARIABLE CURL_RETURN_CODE OUTPUT_VARIABLE latest_json + ) + if(NOT + CURL_RETURN_CODE + EQUAL + 0 + ) + message(FATAL_ERROR "⛔Failed to fetch latest release from github.com") + endif() + + # Get latest release, or latest tag + string( + REGEX MATCH + "\"tag_name\": \"[a-zA-Z]*-*[0-9]+[\\.|-|_][0-9]+[\\.|-|_][0-9]+" + latest_tag + "${latest_json}" + ) + + endif() + + if("${latest_tag}" STREQUAL "") + # Get all tags + message(STATUS "Getting all tags from github.com") + execute_process( + COMMAND curl -v --connect-timeout 15 -L https://api.github.com/repos/${org_name}/${lib_name}/tags + ERROR_VARIABLE CURL_ERROR RESULT_VARIABLE CURL_RETURN_CODE OUTPUT_VARIABLE tags_json + ) + if(NOT + CURL_RETURN_CODE + EQUAL + 0 + ) + message(FATAL_ERROR "⛔Failed to fetch tags from github.com: ${CURL_ERROR}") + endif() + + # latest release is null, get latest tag + if(DEFINED ${lib_name}_VERSION_MAJOR) + string( + REGEX MATCH + "\"name\": \"[a-zA-Z]*-*[${${lib_name}_VERSION_MAJOR}]+[\\.|-|_][0-9]+[\\.|-|_][0-9]+" + matched_tag + "${tags_json}" + ) + else() + string( + REGEX MATCH + "\"name\": \"[a-zA-Z]*-*[0-9]+[\\.|-|_][0-9]+[\\.|-|_][0-9]+" + matched_tag + "${tags_json}" + ) + endif() + + string( + SUBSTRING "${matched_tag}" + 9 + -1 + final_tag_val + ) + else() + string( + SUBSTRING "${latest_tag}" + 13 + -1 + final_tag_val + ) + endif() + + # Final check tag value + if("${final_tag_val}" STREQUAL "") + message(FATAL_ERROR "⛔${org_name}/${lib_name}: Regex Got empty tag") + else() + set(${lib_name}_BUILD_VERSION + "${final_tag_val}" + CACHE STRING "final tag in ${org_name}/${lib_name}" + ) + message(STATUS "Final tag: ${final_tag_val}") + message(STATUS "🚩Passing ${lib_name}_BUILD_VERSION to change version") + endif() + + set(${lib_name}_DOWNLOAD_URL + "https://github.com/${org_name}/${lib_name}/archive/refs/tags/${final_tag_val}.zip" + CACHE STRING "Download URL" + ) + endif() +endmacro() + +# copy dll/libs for Windows, to solve the test/unittests running 0x000135 error +macro(copy_files_for_win SourcePath EXT) + if(WIN32) + if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") + endif() + + file(GLOB_RECURSE files ${SourcePath}/*.${EXT}) + foreach(f ${files}) + message(STATUS "copying ${f} to ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") + file(COPY ${f} DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}) + endforeach() + endif() +endmacro() + +# Set FetchContent +macro(set_fetch_content) + message(STATUS "Setting FetchContent: ${FETCH_BUILD_MISSING_DEPS}") + + # CMake >= 3.11 + if(${CMAKE_VERSION} VERSION_LESS "3.11") + message(FATAL_ERROR "⛔CMake >= 3.11 required") + endif() + + # if cmake < 3.14, let FetchContent_MakeAvailable working also + if(${CMAKE_VERSION} VERSION_LESS "3.14") + macro(FetchContent_MakeAvailable NAME) + FetchContent_GetProperties(${NAME}) + if(NOT ${NAME}_POPULATED) + FetchContent_Populate(${NAME}) + add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) + endif() + endmacro() + endif() + + include(FetchContent) + # show progress + set(FETCHCONTENT_QUIET OFF) + set(FETCHCONTENT_UPDATES_DISCONNECTED ON) + + # disable CMP0135 warning + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24") + set(CMAKE_POLICY_DEFAULT_CMP0135 NEW) + set(DOWNLOAD_EXTRACT_TIMESTAMP ON) + endif() +endmacro() + +# ###################################################################################################################### +# Set build output path, this is mainly for Windows, to solve the test/unittests running 0x000135 error +if(WIN32) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set(CMAKE_PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +endif() + +# Using CMAKE_TOOLCHAIN_FILE disable build missing dependencies +if(CMAKE_TOOLCHAIN_FILE OR ENV{CMAKE_TOOLCHAIN_FILE}) + set(FETCH_BUILD_MISSING_DEPS OFF) + message(STATUS "⚠️Using CMAKE_TOOLCHAIN_FILE, it disable FETCH_BUILD_MISSING_DEPS") +else() + set(FETCH_BUILD_MISSING_DEPS ON) + set_fetch_content() +endif() diff --git a/cmake/SetDoxygen.cmake b/cmake/SetDoxygen.cmake new file mode 100644 index 00000000..19af76f9 --- /dev/null +++ b/cmake/SetDoxygen.cmake @@ -0,0 +1,31 @@ +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 "${PROJECT_DESCRIPTION}") + 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 + ${TRANTOR_SOURCES} + ${TRANTOR_EXPORT_HEADER} + ${public_net_headers} + ${public_utils_headers} + ${private_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..7d5b98f9 --- /dev/null +++ b/cmake/SetInstall.cmake @@ -0,0 +1,86 @@ +message(STATUS "Setting Install") + +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() + +# 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 +) + +# If build with spdlog +if(TARGET spdlog) + install( + TARGETS spdlog + # 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 + ) +endif() + +# 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 ${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) +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" + 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/SetOpenssl.cmake b/cmake/SetOpenssl.cmake new file mode 100644 index 00000000..22a0a8f1 --- /dev/null +++ b/cmake/SetOpenssl.cmake @@ -0,0 +1,90 @@ +# build and install openssl +macro(build_install_openssl) + + # openssl build need perl + find_program(PERL_EXECUTABLE perl) + if(NOT PERL_EXECUTABLE) + message(FATAL_ERROR "⛔Perl not found") + endif() + + if(NOT OpenSSL_DOWNLOAD_URL) + get_github_latest_release_url("openssl" "OpenSSL") + endif() + FetchContent_Declare(openssl URL ${OpenSSL_DOWNLOAD_URL}) + FetchContent_GetProperties(OpenSSL) + + if(NOT OpenSSL_POPULATED) + FetchContent_Populate(OpenSSL) + + # ⚠️ remove "no-asm" flags to improve openssl performance + execute_process( + COMMAND ${PERL_EXECUTABLE} ${openssl_SOURCE_DIR}/Configure no-stdio no-engine no-apps no-asm + --prefix=${OPENSSL_ROOT_DIR} WORKING_DIRECTORY ${openssl_BINARY_DIR} + ) + if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + execute_process(COMMAND nmake WORKING_DIRECTORY ${openssl_BINARY_DIR}) + execute_process(COMMAND nmake install WORKING_DIRECTORY ${openssl_BINARY_DIR}) + else() + execute_process(COMMAND make -j4 WORKING_DIRECTORY ${openssl_BINARY_DIR}) + execute_process(COMMAND make install WORKING_DIRECTORY ${openssl_BINARY_DIR}) + endif() # compiler id + + endif() + +endmacro() + +# Set openssl +macro(set_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 + ) + + # copy dll/libs for Windows, to solve the test/unittests running 0x000135 error + copy_files_for_win(${OPENSSL_ROOT_DIR}/bin "dll") + copy_files_for_win(${OPENSSL_ROOT_DIR}/lib "lib") + +endmacro() + +# ###################################################################################################################### +message(STATUS "Trantor using SSL library: openssl") +# Set OPENSSL_ROOT_DIR, to let find_package could search from the build directory +if(WIN32) + set(OPENSSL_ROOT_DIR + C:/OpenSSL + CACHE PATH "Let find_package use the directory to find" FORCE + ) +else() + set(OPENSSL_ROOT_DIR + ${CMAKE_INSTALL_PREFIX}/OpenSSL + CACHE PATH "Let find_package use the directory to find" FORCE + ) +endif() + +find_package(OpenSSL) + +if(NOT OpenSSL_FOUND) + if(FETCH_BUILD_MISSING_DEPS) + message(STATUS "⚠️OpenSSL not found, Building it with FetchContent...") + unset(OpenSSL_FOUND) + + build_install_openssl() + find_package(OpenSSL REQUIRED) + + else() + message(FATAL_ERROR "⛔OpenSSL not found, please install it or set TRANTOR_DEPENDENCIES_PROVIDER to source") + endif() +endif() + +set_openssl() 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..7977e1c2 --- /dev/null +++ b/cmake/SetSpdlog.cmake @@ -0,0 +1,36 @@ +# build and install spdlog +macro(add_spdlog) + if(NOT spdlog_DOWNLOAD_URL) + get_github_latest_release_url("gabime" "spdlog") + endif() + + FetchContent_Declare(spdlog URL ${spdlog_DOWNLOAD_URL}) + FetchContent_MakeAvailable(spdlog) +endmacro() + +macro(set_spdlog) + target_include_directories(${PROJECT_NAME} PUBLIC ${spdlog_INCLUDE_DIR}) + + target_link_libraries(${PROJECT_NAME} PUBLIC spdlog::spdlog) + target_compile_definitions(${PROJECT_NAME} PUBLIC TRANTOR_SPDLOG_SUPPORT) +endmacro() + +# ###################################################################################################################### +message(STATUS "Setting for spdlog: ${TRANTOR_USE_SPDLOG}") + +if(TRANTOR_USE_SPDLOG) + find_package(spdlog) + + if(NOT spdlog_FOUND) + if(FETCH_BUILD_MISSING_DEPS) + message(STATUS "⚠️spdlog not found, Building it with FetchContent...") + unset(spdlog_FOUND) + + add_spdlog() + else() + message(FATAL_ERROR "⛔spdlog not found, please install it or set FETCH_BUILD_MISSING_DEPS to ON") + endif() + endif() + + set_spdlog() +endif() diff --git a/cmake/SetSystemAndCompiler.cmake b/cmake/SetSystemAndCompiler.cmake new file mode 100644 index 00000000..36f6e0c9 --- /dev/null +++ b/cmake/SetSystemAndCompiler.cmake @@ -0,0 +1,81 @@ +# 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() + + # set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} + # /MTd") +endif() + +# Clang +if(CMAKE_CXX_COMPILER_ID MATCHES Clang) + # add -fexperimental-library for clang, to use c20 ranges + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library") +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(FETCH_BUILD_MISSING_DEPS 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(NOT ANDROID) + target_link_libraries(${PROJECT_NAME} PRIVATE pthread $<$:socket>) +endif() + +# atomic +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) + +# Threads +message(STATUS "Setting Threads") + +find_package(Threads) +target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads) diff --git a/cmake/SetTesting.cmake b/cmake/SetTesting.cmake new file mode 100644 index 00000000..da91b6b0 --- /dev/null +++ b/cmake/SetTesting.cmake @@ -0,0 +1,64 @@ +macro(add_gtest) + + if(NOT googletest_DOWNLOAD_URL) + get_github_latest_release_url("google" "googletest") + endif() + # turn off gmock + set(BUILD_GMOCK OFF) + + FetchContent_Declare(googletest URL ${googletest_DOWNLOAD_URL}) + # For Windows: Prevent overriding the parent project's compiler/linker settings + set(gtest_force_shared_crt + ON + CACHE BOOL "" FORCE + ) + FetchContent_MakeAvailable(googletest) + + # Override default output directory set in googletest for gtest/gtest_main + set_target_properties( + gtest + PROPERTIES RUNTIME_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + LIBRARY_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + ARCHIVE_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + PDB_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + ) + set_target_properties( + gtest_main + PROPERTIES RUNTIME_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + LIBRARY_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + ARCHIVE_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + PDB_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}" + ) + +endmacro() + +# ###################################################################################################################### +if(BUILD_TESTING) + message(STATUS "Setting Testing") + find_package(GTest) + + if(NOT GTest_FOUND) + if(FETCH_BUILD_MISSING_DEPS) + message(STATUS "⚠️GTest not found, Set it with FetchContent...") + unset(GTest_FOUND) + + add_gtest() + else() + message(FATAL_ERROR "⛔GTest not found, please install it or set FETCH_BUILD_MISSING_DEPS to ON") + endif() + endif() + + enable_testing() + # unittests + add_subdirectory(trantor/unittests) + # tests + add_subdirectory(trantor/tests) +endif() diff --git a/cmake/SetTlsProvider.cmake b/cmake/SetTlsProvider.cmake new file mode 100644 index 00000000..105b4c19 --- /dev/null +++ b/cmake/SetTlsProvider.cmake @@ -0,0 +1,58 @@ +# Set TLS provider +message(STATUS "Setting TLS: ${TRANTOR_USE_TLS} TRANTOR_TLS_PROVIDER: ${TRANTOR_TLS_PROVIDER}") + +# Checking valid TLS providers +set(VALID_TLS_PROVIDERS + "auto" + "openssl" + "botan-3" + "none" +) +if(NOT + "${TRANTOR_TLS_PROVIDER}" + IN_LIST + VALID_TLS_PROVIDERS +) + message(FATAL_ERROR "⛔Invalid TLS provider: ${TRANTOR_TLS_PROVIDER}, Valid TLS providers are: ${VALID_TLS_PROVIDERS}") +endif() + +if(TRANTOR_TLS_PROVIDER STREQUAL "openssl") + include(cmake/SetOpenssl.cmake) +elseif(TRANTOR_TLS_PROVIDER STREQUAL "botan-3") + set(Botan_VERSION_MAJOR 3) + include(cmake/SetBotan.cmake) +elseif(TRANTOR_TLS_PROVIDER STREQUAL "none") + include(cmake/SetCrypto.cmake) +elseif(TRANTOR_TLS_PROVIDER STREQUAL "auto") + + foreach(item VALID_TLS_PROVIDERS) + if(${item} STREQUAL "auto") + continue() + endif() + + if(${item} STREQUAL "openssl") + find_package(OpenSSL) + if(OPENSSL_FOUND) + include(cmake/SetOpenssl.cmake) + else() + continue() + endif() + endif() + + if(${item} STREQUAL "botan-3") + find_package(Botan 3) + if(Botan_FOUND) + include(cmake/SetBotan.cmake) + else() + continue() + endif() + endif() + + if(${item} STREQUAL "none") + include(cmake/SetCrypto.cmake) + endif() + endforeach(item) + +else() # none + include(cmake/SetCrypto.cmake) +endif() diff --git a/cmake_modules/FindBotan.cmake b/cmake_modules/FindBotan.cmake index e09ce039..74d25642 100644 --- a/cmake_modules/FindBotan.cmake +++ b/cmake_modules/FindBotan.cmake @@ -1,4 +1,4 @@ -function(find_botan_pkgconfig package_name botan_ver) +function(find_botan_pkgconfig package_name) if(TARGET Botan::Botan) return() endif() @@ -7,24 +7,24 @@ function(find_botan_pkgconfig package_name botan_ver) 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() endfunction() -function(find_botan_search package_name botan_ver) - if(TARGET Botan::Botan) - return() - endif() +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 + NAMES botan/botan.h botan/auto_rng.h + HINTS ${BOTAN_ROOT_DIR}/include PATH_SUFFIXES ${package_name} DOC "The Botan include directory" ) @@ -32,37 +32,45 @@ function(find_botan_search package_name botan_ver) find_library( Botan_LIBRARIES NAMES botan ${package_name} + HINTS ${BOTAN_ROOT_DIR}/lib DOC "The Botan library" ) - mark_as_advanced(Botan_INCLUDE_DIRS Botan_LIBRARIES) - - add_library(Botan::Botan IMPORTED UNKNOWN) - set_target_properties( - Botan::Botan - PROPERTIES - IMPORTED_LOCATION "${Botan_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${Botan_INCLUDE_DIRS}" - ) - if(botan_ver EQUAL 3) - target_compile_features(Botan::Botan INTERFACE cxx_std_20) - endif() + if(Botan_INCLUDE_DIRS AND Botan_LIBRARIES) + add_library(Botan::Botan IMPORTED UNKNOWN) + set_target_properties( + Botan::Botan + PROPERTIES + IMPORTED_LOCATION "${Botan_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${Botan_INCLUDE_DIRS}" + ) + if(${Botan_FIND_VERSION} EQUAL 3) + target_compile_features(Botan::Botan INTERFACE cxx_std_20) + endif() - if(WIN32) - target_compile_definitions(Botan::Botan INTERFACE -DNOMINMAX=1) + if(WIN32) + target_compile_definitions(Botan::Botan INTERFACE -DNOMINMAX=1) + endif() endif() endfunction() -find_package(PkgConfig) -if(NOT WIN32 AND PKG_CONFIG_FOUND) - # find_botan_pkgconfig(botan-2 2) - find_botan_pkgconfig(botan-3 3) +# ###################################################################################################################### +# 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() + +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) +mark_as_advanced(Botan_INCLUDE_DIRS Botan_LIBRARIES) diff --git a/cmake_modules/Findc-ares.cmake b/cmake_modules/Findc-ares.cmake index 73334b72..a9eda1a1 100644 --- a/cmake_modules/Findc-ares.cmake +++ b/cmake_modules/Findc-ares.cmake @@ -4,22 +4,31 @@ # 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_library(C-ARES_LIBRARIES NAMES cares) +find_path( + C-ARES_INCLUDE_DIRS + NAMES ares.h + HINTS ${C-ARES_DIR}/include +) +find_library( + C-ARES_LIBRARIES + NAMES cares + HINTS ${C-ARES_DIR}/lib +) 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}" - ) + if(NOT TARGET c-ares::cares) + 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() endif() - include(FindPackageHandleStandardArgs) find_package_handle_standard_args( c-ares diff --git a/conanfile.txt b/conanfile.txt index 2e6dc442..1abbbb81 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 +gtest/1.15.0 +openssl/3.3.1 +c-ares/1.17.1 spdlog/1.12.0 +botan/3.5.0 [generators] +CMakeDeps CMakeToolchain [options] diff --git a/trantor/tests/CMakeLists.txt b/trantor/tests/CMakeLists.txt index 90f75511..591aeab7 100644 --- a/trantor/tests/CMakeLists.txt +++ b/trantor/tests/CMakeLists.txt @@ -51,10 +51,10 @@ set(targets_list 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() set_property(TARGET ${targets_list} PROPERTY CXX_STANDARD 14) set_property(TARGET ${targets_list} PROPERTY CXX_STANDARD_REQUIRED ON) diff --git a/trantor/unittests/CMakeLists.txt b/trantor/unittests/CMakeLists.txt index cdbc9ff9..53cbdd72 100644 --- a/trantor/unittests/CMakeLists.txt +++ b/trantor/unittests/CMakeLists.txt @@ -1,26 +1,36 @@ -find_package(GTest REQUIRED) add_executable(msgbuffer_unittest MsgBufferUnittest.cc) add_executable(inetaddress_unittest InetAddressUnittest.cc) add_executable(date_unittest DateUnittest.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 - date_unittest split_string_unittest string_encoding_unittest - ssl_name_verify_unittest + date_unittest hash_unittest + inetaddress_unittest + msgbuffer_unittest +) + +if(NOT + TRANTOR_TLS_PROVIDER + STREQUAL + "none" ) + 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) include(GoogleTest) foreach(T ${UNITTEST_TARGETS}) - target_link_libraries(${T} PRIVATE trantor GTest::GTest) + message(STATUS "Add Testing ${T}") + target_link_libraries(${T} PRIVATE ${PROJECT_NAME} GTest::gtest_main) + gtest_discover_tests(${T}) endforeach()