From a89ca4f2c9a0c284bacc47b32c1af9083f77132e Mon Sep 17 00:00:00 2001 From: Yat Ho Date: Mon, 12 Jan 2026 23:04:47 +0800 Subject: [PATCH] build(cmake): support building with (almost) all system 3rd-party libraries (#7554) * build: overhaul tr_add_external_auto_library * build: use package-provided CMake config file libevent * build: use package-provided CMake config file miniupnpc * build: update libutp find module * build: make LIBNAME an optional parameter * build: use package-provided CMake config file libdeflate * build: update libb64 find module * build: update libnatpmp find module * build: update libpsl find module * build: support system fast_float library * chore: reformat long brew commands * build: support system fmt library * build: support system rapidjson library * build: support system small library * build: support system library utf8cpp * build: support system library WideInteger * build: support system library gtest * fix: incorrectly labeled test suites * build: remove unused parameters from tr_add_external_auto_library * build: update crc32c cmake script * fix: dht system library * fix: add libutp interface target * code review: move TrGtest.cmake * code review: move tr_get_fmt_version into Findfmt.cmake * code review: use option() for gtest * code review: move find_package(PkgConfig) out of loop * build: delete FindCrc32c.cmake Impossible to parse package version from distributed source files. * code review: Finddht.cmake * build: delete FindFastFloat.cmake Impossible to parse package version from distributed source files. * code review: Findfmt.cmake * code review: Findlibb64.cmake * code review: Findlibdeflate.cmake * code review: Findlibevent.cmake * code review: Findlibnatpmp.cmake * code review: Findlibpsl.cmake * code review: Findlibutp.cmake * code review: Findlibminiupnpc.cmake * code review: FindRapidJSON.cmake * build: delete FindSmall.cmake Impossible to parse package version from distributed source files. * build: only accept cmake config package for utf8cpp Impossible to parse package version from distributed source files. * build: delete FindWideInteger.cmake Impossible to parse package version from distributed source files. * build: add `USE_SYSTEM_DEFAULT` * ci: drop Fedora 40 and adopt Fedora 43 * ci: try to silence system header warnings * ci: use `cmake --install` * Revert "build: only accept cmake config package for utf8cpp" This reverts commit 2158d631fd90c4a18c3290b7c08c3fc088345ed8. * build: harden utf8cpp find module * chore: bump wide-integer Pick up https://github.com/ckormanyos/wide-integer/commit/bf9398f9dadf60aa3928be6a0681c2d5ebdad457 and https://github.com/ckormanyos/wide-integer/commit/bcc726a30f3d7c475266b34e83ff50aa9186f285 * refactor: gtest should be included with angled brackets Now that gtest is built as a system library, it should be included with angled brackets instead of quotes. * code review: fixup libutp variables before `find_package_handle_standard_args` * code review: define `WIDE_INTEGER_HAS_LIMB_TYPE_UINT64` only for targets depending on WideInteger * chore: bump wide-integer Pickup https://github.com/ckormanyos/wide-integer/commit/4b2258acac771baf3e9961be6bb89c9a907a2634 so that wide-integer tests won't run in Transmission project. --- .github/workflows/actions.yml | 293 +++++++++++++++--- CMakeLists.txt | 157 ++++++++-- cmake/FindB64.cmake | 39 --- cmake/FindCRC32C.cmake | 30 -- cmake/FindDEFLATE.cmake | 49 --- cmake/FindDHT.cmake | 37 --- cmake/FindEVENT2.cmake | 52 ---- cmake/FindFastFloat.cmake | 5 - cmake/FindFmt.cmake | 26 -- cmake/FindLibevent.cmake | 89 ++++++ cmake/FindMINIUPNPC.cmake | 39 --- cmake/FindNATPMP.cmake | 37 --- cmake/FindPSL.cmake | 37 --- cmake/FindRapidJSON.cmake | 42 ++- cmake/FindSmall.cmake | 9 - cmake/FindUTP.cmake | 84 ----- cmake/FindUtfCpp.cmake | 5 - cmake/FindWideInteger.cmake | 21 -- cmake/Finddht.cmake | 39 +++ cmake/Findfmt.cmake | 71 +++++ cmake/Findlibb64.cmake | 51 +++ cmake/Findlibdeflate.cmake | 73 +++++ cmake/Findlibnatpmp.cmake | 39 +++ cmake/Findlibpsl.cmake | 49 +++ cmake/Findlibutp.cmake | 94 ++++++ cmake/Findminiupnpc.cmake | 68 ++++ cmake/Findutf8cpp.cmake | 34 ++ cmake/TrGTest.cmake | 16 + cmake/TrMacros.cmake | 104 ++++--- daemon/CMakeLists.txt | 2 +- libtransmission/CMakeLists.txt | 13 +- libtransmission/port-forwarding-upnp.cc | 2 +- tests/CMakeLists.txt | 3 +- tests/gtest/CMakeLists.txt | 26 -- tests/libtransmission/CMakeLists.txt | 23 +- tests/libtransmission/announce-list-test.cc | 2 + tests/libtransmission/announcer-udp-test.cc | 2 + tests/libtransmission/api-compat-test.cc | 3 +- tests/libtransmission/bitfield-test.cc | 4 +- tests/libtransmission/blocklist-test.cc | 3 +- tests/libtransmission/clients-test.cc | 4 +- tests/libtransmission/copy-test.cc | 3 +- tests/libtransmission/crypto-test.cc | 4 +- tests/libtransmission/dht-test.cc | 3 +- tests/libtransmission/error-test.cc | 4 +- tests/libtransmission/file-test.cc | 3 +- tests/libtransmission/handshake-test.cc | 3 +- tests/libtransmission/history-test.cc | 4 +- tests/libtransmission/json-test.cc | 4 +- tests/libtransmission/lpd-test.cc | 3 +- tests/libtransmission/makemeta-test.cc | 3 +- tests/libtransmission/move-test.cc | 3 +- tests/libtransmission/open-files-test.cc | 3 +- tests/libtransmission/peer-msgs-test.cc | 2 +- tests/libtransmission/platform-test.cc | 3 +- tests/libtransmission/remove-test.cc | 3 +- tests/libtransmission/rename-test.cc | 3 +- tests/libtransmission/rpc-test.cc | 5 +- tests/libtransmission/session-test.cc | 3 +- tests/libtransmission/subprocess-test.cc | 2 + tests/libtransmission/test-fixtures.h | 4 +- tests/libtransmission/timer-test.cc | 2 + tests/libtransmission/torrent-files-test.cc | 3 +- tests/libtransmission/torrent-magnet-test.cc | 3 +- .../libtransmission/torrent-metainfo-test.cc | 3 +- tests/libtransmission/torrent-queue-test.cc | 3 +- tests/libtransmission/torrents-test.cc | 2 + tests/libtransmission/utils-test.cc | 3 +- tests/libtransmission/variant-test.cc | 2 + tests/libtransmission/watchdir-test.cc | 2 + third-party/small | 2 +- third-party/wide-integer | 2 +- utils/CMakeLists.txt | 2 +- 73 files changed, 1205 insertions(+), 665 deletions(-) delete mode 100644 cmake/FindB64.cmake delete mode 100644 cmake/FindCRC32C.cmake delete mode 100644 cmake/FindDEFLATE.cmake delete mode 100644 cmake/FindDHT.cmake delete mode 100644 cmake/FindEVENT2.cmake delete mode 100644 cmake/FindFastFloat.cmake delete mode 100644 cmake/FindFmt.cmake create mode 100644 cmake/FindLibevent.cmake delete mode 100644 cmake/FindMINIUPNPC.cmake delete mode 100644 cmake/FindNATPMP.cmake delete mode 100644 cmake/FindPSL.cmake delete mode 100644 cmake/FindSmall.cmake delete mode 100644 cmake/FindUTP.cmake delete mode 100644 cmake/FindUtfCpp.cmake delete mode 100644 cmake/FindWideInteger.cmake create mode 100644 cmake/Finddht.cmake create mode 100644 cmake/Findfmt.cmake create mode 100644 cmake/Findlibb64.cmake create mode 100644 cmake/Findlibdeflate.cmake create mode 100644 cmake/Findlibnatpmp.cmake create mode 100644 cmake/Findlibpsl.cmake create mode 100644 cmake/Findlibutp.cmake create mode 100644 cmake/Findminiupnpc.cmake create mode 100644 cmake/Findutf8cpp.cmake create mode 100644 cmake/TrGTest.cmake delete mode 100644 tests/gtest/CMakeLists.txt diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 67e5c3843..7894a4393 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -122,7 +122,7 @@ jobs: exit 1 sanitizer-tests-ubuntu: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: [ what-to-make ] if: ${{ needs.what-to-make.outputs.make-tests == 'true' }} steps: @@ -140,15 +140,19 @@ jobs: clang \ cmake \ gettext \ + libb64-dev \ libcurl4-openssl-dev \ libdeflate-dev \ libevent-dev \ + libfast-float-dev \ libfmt-dev \ libminiupnpc-dev \ libnatpmp-dev \ libpsl-dev \ libssl-dev \ - ninja-build + libutfcpp-dev \ + ninja-build \ + rapidjson-dev - name: Get Source uses: actions/checkout@v4 with: @@ -174,7 +178,13 @@ jobs: -DENABLE_TESTS=ON \ -DENABLE_UTILS=ON \ -DREBUILD_WEB=OFF \ - -DRUN_CLANG_TIDY=OFF + -DRUN_CLANG_TIDY=OFF \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Ubuntu` - name: Make run: cmake --build obj --config Debug --target libtransmission-test transmission-show - name: Test with sanitizers @@ -191,7 +201,24 @@ jobs: echo '${{ toJSON(runner) }}' sw_vers - name: Get Dependencies - run: brew install --formulae cmake gettext libdeflate libevent libpsl miniupnpc ninja node pkgconf + run: | + brew install --formulae \ + cmake \ + crc32c \ + fast_float \ + fmt \ + gettext \ + libb64 \ + libdeflate \ + libevent \ + libnatpmp \ + libpsl \ + miniupnpc \ + ninja \ + node \ + pkgconf \ + rapidjson \ + utf8cpp - name: Get Source uses: actions/checkout@v4 with: @@ -215,7 +242,12 @@ jobs: -DENABLE_TESTS=ON \ -DENABLE_UTILS=ON \ -DREBUILD_WEB=OFF \ - -DRUN_CLANG_TIDY=OFF + -DRUN_CLANG_TIDY=OFF \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Homebrew` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Homebrew` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Homebrew` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Homebrew` - name: Make run: cmake --build obj --config Debug --target libtransmission-test transmission-show - name: Test with sanitizers @@ -243,15 +275,19 @@ jobs: clang-tidy-20 \ cmake \ gettext \ + libb64-dev \ libcurl4-openssl-dev \ libdeflate-dev \ libevent-dev \ + libfast-float-dev \ libfmt-dev \ libminiupnpc-dev \ libnatpmp-dev \ libpsl-dev \ libssl-dev \ - ninja-build + libutfcpp-dev \ + ninja-build \ + rapidjson-dev - name: Get Source uses: actions/checkout@v4 with: @@ -268,7 +304,13 @@ jobs: -DCMAKE_C_COMPILER='clang' \ -DCMAKE_INSTALL_PREFIX=pfx \ -DENABLE_TESTS=${{ (needs.what-to-make.outputs.make-tests == 'true') && 'ON' || 'OFF' }} \ - -DRUN_CLANG_TIDY=ON + -DRUN_CLANG_TIDY=ON \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Ubuntu` - name: Make (Core) run: cmake --build obj --config Debug --target transmission 2>&1 | tee makelog - name: Make (Tests) @@ -377,7 +419,24 @@ jobs: echo '${{ toJSON(runner) }}' sw_vers - name: Get Dependencies - run: brew install --formulae cmake gettext libdeflate libevent libpsl miniupnpc ninja node pkgconf crc32c + run: | + brew install --formulae \ + cmake \ + crc32c \ + fast_float \ + fmt \ + gettext \ + libb64 \ + libdeflate \ + libevent \ + libnatpmp \ + libpsl \ + miniupnpc \ + ninja \ + node \ + pkgconf \ + rapidjson \ + utf8cpp - name: Get Dependencies (GTK) if: ${{ needs.what-to-make.outputs.make-gtk == 'true' }} run: brew install --formula gtkmm3 @@ -398,6 +457,8 @@ jobs: -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_INSTALL_PREFIX=pfx \ -DCMAKE_PREFIX_PATH=`brew --prefix`/opt/qt \ + -DCMAKE_CXX_FLAGS='--system-header-prefix=fmt/' `# Needed to supress system header warnings in macos-15-intel` \ + -DCMAKE_C_FLAGS='--system-header-prefix=fmt/' `# Needed to supress system header warnings in macos-15-intel` \ -DENABLE_CLI=${{ (needs.what-to-make.outputs.make-cli == 'true') && 'ON' || 'OFF' }} \ -DENABLE_DAEMON=${{ (needs.what-to-make.outputs.make-daemon == 'true') && 'ON' || 'OFF' }} \ -DENABLE_GTK=${{ (needs.what-to-make.outputs.make-gtk == 'true') && 'ON' || 'OFF' }} \ @@ -408,7 +469,11 @@ jobs: -DREBUILD_WEB=${{ (needs.what-to-make.outputs.make-web == 'true') && 'ON' || 'OFF' }} \ -DENABLE_WERROR=ON \ -DRUN_CLANG_TIDY=OFF \ - -DUSE_SYSTEM_Crc32c=ON + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Homebrew` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Homebrew` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Homebrew` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Homebrew` - name: Make run: cmake --build obj --config RelWithDebInfo - name: Test @@ -417,7 +482,7 @@ jobs: TMPDIR: /private/tmp run: cmake -E chdir obj ctest -j $(sysctl -n hw.logicalcpu) --build-config RelWithDebInfo --output-on-failure - name: Install - run: cmake --build obj --config RelWithDebInfo --target install/strip + run: cmake --install obj --config RelWithDebInfo --strip - uses: actions/upload-artifact@v4 with: name: binaries-${{ matrix.os }}-cmake-universal @@ -425,7 +490,7 @@ jobs: alpine-musl: needs: [ what-to-make ] - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest container: image: alpine:latest if: ${{ needs.what-to-make.outputs.make-cli == 'true' || needs.what-to-make.outputs.make-daemon == 'true' || needs.what-to-make.outputs.make-gtk == 'true' || needs.what-to-make.outputs.make-qt == 'true' || needs.what-to-make.outputs.make-tests == 'true' || needs.what-to-make.outputs.make-utils == 'true' }} @@ -445,16 +510,22 @@ jobs: cmake \ crc32c-dev \ curl-dev \ + fast_float \ fmt-dev \ gettext-dev \ git \ + libdeflate-dev \ + libdeflate-static \ libevent-dev \ - libpsl \ + libnatpmp-dev \ + libpsl-dev \ linux-headers \ miniupnpc-dev \ ninja \ npm \ pkgconfig \ + rapidjson-dev \ + utfcpp \ xz - name: Get Dependencies (GTK) if: ${{ needs.what-to-make.outputs.make-gtk == 'true' }} @@ -487,7 +558,12 @@ jobs: -DREBUILD_WEB=${{ (needs.what-to-make.outputs.make-web == 'true') && 'ON' || 'OFF' }} \ -DENABLE_WERROR=ON \ -DRUN_CLANG_TIDY=OFF \ - -DUSE_SYSTEM_CRC32C=ON + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_B64=OFF `# Not packaged in Alpine` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Alpine` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Alpine` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Alpine` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Alpine` - name: Make run: cmake --build obj --config RelWithDebInfo - name: Test @@ -497,7 +573,7 @@ jobs: QT_QPA_PLATFORM: offscreen run: cmake -E chdir obj ctest -j $(nproc) --build-config RelWithDebInfo --output-on-failure - name: Install - run: cmake --build obj --config RelWithDebInfo --target install/strip + run: cmake --install obj --config RelWithDebInfo --strip - uses: actions/upload-artifact@v4 with: name: binaries-${{ github.job }} @@ -560,7 +636,7 @@ jobs: if: ${{ needs.what-to-make.outputs.make-tests == 'true' }} run: cmake -E chdir obj ctest -j $(nproc) --build-config RelWithDebInfo --output-on-failure --timeout 600 - name: Install - run: cmake --build obj --config RelWithDebInfo --target install + run: cmake --install obj --config RelWithDebInfo - name: Package if: ${{ needs.what-to-make.outputs.make-dist == 'true' || (needs.what-to-make.outputs.make-daemon == 'true' && needs.what-to-make.outputs.make-qt == 'true') }} run: | @@ -674,14 +750,7 @@ jobs: -DREBUILD_WEB=${{ (needs.what-to-make.outputs.make-web == 'true') && 'ON' || 'OFF' }} \ -DENABLE_WERROR=ON \ -DRUN_CLANG_TIDY=OFF \ - -DUSE_SYSTEM_EVENT2=OFF \ - -DUSE_SYSTEM_DEFLATE=OFF \ - -DUSE_SYSTEM_DHT=OFF \ - -DUSE_SYSTEM_MINIUPNPC=OFF \ - -DUSE_SYSTEM_NATPMP=OFF \ - -DUSE_SYSTEM_UTP=OFF \ - -DUSE_SYSTEM_B64=OFF \ - -DUSE_SYSTEM_PSL=OFF + -DUSE_SYSTEM_DEFAULT=OFF - name: Make run: cmake --build obj --config RelWithDebInfo - name: Test @@ -690,7 +759,7 @@ jobs: TMPDIR: /private/tmp run: cmake -E chdir obj ctest -j $(sysctl -n hw.logicalcpu) --build-config RelWithDebInfo --output-on-failure - name: Install - run: cmake --build obj --config RelWithDebInfo --target install/strip + run: cmake --install obj --config RelWithDebInfo --strip - uses: actions/upload-artifact@v4 with: name: binaries-${{ matrix.os }}-from-tarball @@ -699,7 +768,7 @@ jobs: debian-11-from-tarball: needs: [ make-source-tarball, what-to-make ] if: ${{ needs.what-to-make.outputs.make-cli == 'true' || needs.what-to-make.outputs.make-daemon == 'true' || needs.what-to-make.outputs.make-gtk == 'true' || needs.what-to-make.outputs.make-qt == 'true' || needs.what-to-make.outputs.make-tests == 'true' || needs.what-to-make.outputs.make-utils == 'true' }} - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest container: image: debian:11-slim steps: @@ -717,16 +786,18 @@ jobs: cmake \ g++ \ gettext \ + libb64-dev \ libcurl4-openssl-dev \ libdeflate-dev \ libevent-dev \ - libfmt-dev \ + libgtest-dev \ libminiupnpc-dev \ libnatpmp-dev \ libpsl-dev \ libssl-dev \ ninja-build \ pkg-config \ + rapidjson-dev \ xz-utils - name: Get NPM uses: actions/setup-node@v4 @@ -761,7 +832,17 @@ jobs: -DENABLE_UTILS=${{ (needs.what-to-make.outputs.make-utils == 'true') && 'ON' || 'OFF' }} \ -DREBUILD_WEB=${{ (needs.what-to-make.outputs.make-web == 'true') && 'ON' || 'OFF' }} \ -DENABLE_WERROR=ON \ - -DRUN_CLANG_TIDY=OFF + -DRUN_CLANG_TIDY=OFF \ + -DUSE_SYSTEM_GTEST=ON \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Debian 11` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Debian 11` \ + -DUSE_SYSTEM_FAST_FLOAT=OFF `# Not packaged in Debian 11` \ + -DUSE_SYSTEM_FMT=OFF `# Debian 11 package too old` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Debian 11` \ + -DUSE_SYSTEM_UTF8CPP=OFF `# Debian 11 package too old` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Debian 11` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Debian 11` - name: Build run: cmake --build obj --config RelWithDebInfo - name: Test @@ -770,18 +851,116 @@ jobs: QT_QPA_PLATFORM: offscreen run: cmake -E chdir obj ctest -j $(nproc) --build-config RelWithDebInfo --output-on-failure - name: Install - run: cmake --build obj --config RelWithDebInfo --target install/strip + run: cmake --install obj --config RelWithDebInfo --strip - uses: actions/upload-artifact@v4 with: name: binaries-${{ github.job }} path: pfx/**/* - fedora-39-from-tarball: + debian-from-tarball: needs: [ make-source-tarball, what-to-make ] if: ${{ needs.what-to-make.outputs.make-cli == 'true' || needs.what-to-make.outputs.make-daemon == 'true' || needs.what-to-make.outputs.make-gtk == 'true' || needs.what-to-make.outputs.make-qt == 'true' || needs.what-to-make.outputs.make-tests == 'true' || needs.what-to-make.outputs.make-utils == 'true' }} - runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + version: [stable, testing] + runs-on: ubuntu-latest container: - image: fedora:39 + image: debian:${{ matrix.version }}-slim + steps: + - name: Show Configuration + run: | + echo '${{ toJSON(needs) }}' + echo '${{ toJSON(runner) }}' + cat /etc/os-release + - name: Get Dependencies + run: | + set -ex + apt update + apt install -y --no-install-recommends \ + ca-certificates \ + cmake \ + g++ \ + gettext \ + libb64-dev \ + libcurl4-openssl-dev \ + libdeflate-dev \ + libevent-dev \ + libfast-float-dev \ + libfmt-dev \ + libgtest-dev \ + libminiupnpc-dev \ + libnatpmp-dev \ + libpsl-dev \ + libssl-dev \ + libutfcpp-dev \ + ninja-build \ + pkg-config \ + rapidjson-dev \ + xz-utils + - name: Get NPM + uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Get Dependencies (GTK3) + if: ${{ needs.what-to-make.outputs.make-gtk == 'true' }} + run: apt install -y --no-install-recommends libglibmm-2.4-dev libgtkmm-3.0-dev + - name: Get Dependencies (Qt6) + if: ${{ needs.what-to-make.outputs.make-qt == 'true' }} + run: apt install -y --no-install-recommends qt6-svg-dev qt6-tools-dev + - name: Get Source + uses: actions/download-artifact@v4 + with: + name: source-tarball + - name: Extract Source + run: mkdir src && tar xf transmission*.tar.* -C src --strip-components 1 + - name: Configure + run: | + cmake \ + -S src \ + -B obj \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=pfx \ + -DENABLE_CLI=${{ (needs.what-to-make.outputs.make-cli == 'true') && 'ON' || 'OFF' }} \ + -DENABLE_DAEMON=${{ (needs.what-to-make.outputs.make-daemon == 'true') && 'ON' || 'OFF' }} \ + -DENABLE_GTK=${{ (needs.what-to-make.outputs.make-gtk == 'true') && 'ON' || 'OFF' }} \ + -DENABLE_MAC=OFF \ + -DENABLE_QT=${{ (needs.what-to-make.outputs.make-qt == 'true') && 'ON' || 'OFF' }} \ + -DENABLE_TESTS=${{ (needs.what-to-make.outputs.make-tests == 'true') && 'ON' || 'OFF' }} \ + -DENABLE_UTILS=${{ (needs.what-to-make.outputs.make-utils == 'true') && 'ON' || 'OFF' }} \ + -DREBUILD_WEB=${{ (needs.what-to-make.outputs.make-web == 'true') && 'ON' || 'OFF' }} \ + -DENABLE_WERROR=ON \ + -DRUN_CLANG_TIDY=OFF \ + -DUSE_SYSTEM_GTEST=ON \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Debian` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Debian` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Debian` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Debian` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Debian` + - name: Build + run: cmake --build obj --config RelWithDebInfo + - name: Test + if: ${{ needs.what-to-make.outputs.make-tests == 'true' }} + run: cmake -E chdir obj ctest -j $(nproc) --build-config RelWithDebInfo --output-on-failure + - name: Install + run: cmake --install obj --config RelWithDebInfo --strip + - uses: actions/upload-artifact@v4 + with: + name: binaries-${{ github.job }}-${{ matrix.version }} + path: pfx/**/* + + fedora-from-tarball: + needs: [ make-source-tarball, what-to-make ] + if: ${{ needs.what-to-make.outputs.make-cli == 'true' || needs.what-to-make.outputs.make-daemon == 'true' || needs.what-to-make.outputs.make-gtk == 'true' || needs.what-to-make.outputs.make-qt == 'true' || needs.what-to-make.outputs.make-tests == 'true' || needs.what-to-make.outputs.make-utils == 'true' }} + strategy: + fail-fast: false + matrix: + version: [41, 42, 43] + runs-on: ubuntu-latest + container: + image: fedora:${{ matrix.version }} steps: - name: Show Configuration run: | @@ -794,10 +973,12 @@ jobs: dnf install -y \ ca-certificates \ cmake \ + fast_float-devel \ fmt-devel \ gcc-c++ \ gettext \ google-crc32c-devel \ + libb64-devel \ libcurl-devel \ libdeflate-devel \ libevent-devel \ @@ -807,12 +988,14 @@ jobs: ninja-build \ openssl-devel \ pkgconf-pkg-config \ + rapidjson-devel \ + utf8cpp-devel \ xz - name: Get NPM uses: actions/setup-node@v4 with: node-version: lts/* - - name: Get Dependencies (GTK) + - name: Get Dependencies (GTK4) if: ${{ needs.what-to-make.outputs.make-gtk == 'true' }} run: dnf install -y glibmm2.68-devel gtkmm4.0-devel - name: Get Dependencies (Qt6) @@ -843,7 +1026,11 @@ jobs: -DENABLE_DEPRECATED=ON \ -DENABLE_WERROR=OFF \ -DRUN_CLANG_TIDY=OFF \ - -DUSE_SYSTEM_Crc32c=ON + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Fedora` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Fedora` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Fedora` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Fedora` - name: Build run: cmake --build obj --config RelWithDebInfo - name: Test @@ -852,16 +1039,16 @@ jobs: QT_QPA_PLATFORM: offscreen run: cmake -E chdir obj ctest -j $(nproc) --build-config RelWithDebInfo --output-on-failure - name: Install - run: cmake --build obj --config RelWithDebInfo --target install/strip + run: cmake --install obj --config RelWithDebInfo --strip - uses: actions/upload-artifact@v4 with: - name: binaries-${{ github.job }} + name: binaries-${{ github.job }}-${{ matrix.version }} path: pfx/**/* - ubuntu-22-04-from-tarball: + ubuntu-24-04-from-tarball: needs: [ make-source-tarball, what-to-make ] if: ${{ needs.what-to-make.outputs.make-cli == 'true' || needs.what-to-make.outputs.make-daemon == 'true' || needs.what-to-make.outputs.make-gtk == 'true' || needs.what-to-make.outputs.make-qt == 'true' || needs.what-to-make.outputs.make-tests == 'true' || needs.what-to-make.outputs.make-utils == 'true' }} - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Show Configuration run: | @@ -878,15 +1065,19 @@ jobs: clang \ cmake \ gettext \ + libb64-dev \ libcurl4-openssl-dev \ libdeflate-dev \ libevent-dev \ + libfast-float-dev \ libfmt-dev \ libminiupnpc-dev \ libnatpmp-dev \ libpsl-dev \ libssl-dev \ - ninja-build + libutfcpp-dev \ + ninja-build \ + rapidjson-dev - name: Get NPM uses: actions/setup-node@v4 with: @@ -920,7 +1111,13 @@ jobs: -DENABLE_UTILS=${{ (needs.what-to-make.outputs.make-utils == 'true') && 'ON' || 'OFF' }} \ -DREBUILD_WEB=${{ (needs.what-to-make.outputs.make-web == 'true') && 'ON' || 'OFF' }} \ -DENABLE_WERROR=ON \ - -DRUN_CLANG_TIDY=OFF + -DRUN_CLANG_TIDY=OFF \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Ubuntu` - name: Make run: cmake --build obj --config RelWithDebInfo - name: Test @@ -929,7 +1126,7 @@ jobs: TMPDIR: /private/tmp run: cmake -E chdir obj ctest -j $(nproc) --build-config RelWithDebInfo --output-on-failure - name: Install - run: cmake --build obj --config RelWithDebInfo --target install/strip + run: cmake --install obj --config RelWithDebInfo --strip - uses: actions/upload-artifact@v4 with: name: binaries-${{ github.job }} @@ -959,7 +1156,7 @@ jobs: with: java-version: '17' distribution: 'temurin' - + - name: Setup Gradle uses: gradle/gradle-build-action@v3 with: @@ -1005,15 +1202,19 @@ jobs: clang \ cmake \ gettext \ + libb64-dev \ libcurl4-openssl-dev \ libdeflate-dev \ libevent-dev \ + libfast-float-dev \ libfmt-dev \ libminiupnpc-dev \ libnatpmp-dev \ libpsl-dev \ libssl-dev \ - ninja-build + libutfcpp-dev \ + ninja-build \ + rapidjson-dev - name: Get Dependencies (GTK) if: ${{ needs.what-to-make.outputs.make-gtk == 'true' }} run: sudo apt-get install -y --no-install-recommends libglibmm-2.4-dev libgtkmm-3.0-dev @@ -1045,6 +1246,12 @@ jobs: -DENABLE_UTILS=${{ (needs.what-to-make.outputs.make-utils == 'true') && 'ON' || 'OFF' }} \ -DREBUILD_WEB=OFF \ -DENABLE_WERROR=ON \ - -DRUN_CLANG_TIDY=OFF + -DRUN_CLANG_TIDY=OFF \ + -DUSE_SYSTEM_DEFAULT=ON \ + -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_DHT=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_SMALL=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_UTP=OFF `# Not packaged in Ubuntu` \ + -DUSE_SYSTEM_WIDE_INTEGER=OFF `# Not packaged in Ubuntu` - name: Make run: cmake --build obj --config RelWithDebInfo -- "-k 0" diff --git a/CMakeLists.txt b/CMakeLists.txt index 1143d71b1..9d657aba0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,8 +24,8 @@ endif() project(transmission) set(TR_THIRD_PARTY_DIR_NAME third-party) -set(TR_THIRD_PARTY_SOURCE_DIR ${PROJECT_SOURCE_DIR}/${TR_THIRD_PARTY_DIR_NAME}) -set(TR_THIRD_PARTY_BINARY_DIR ${PROJECT_BINARY_DIR}/${TR_THIRD_PARTY_DIR_NAME}) +set(TR_THIRD_PARTY_SOURCE_DIR "${PROJECT_SOURCE_DIR}/${TR_THIRD_PARTY_DIR_NAME}") +set(TR_THIRD_PARTY_BINARY_DIR "${PROJECT_BINARY_DIR}/${TR_THIRD_PARTY_DIR_NAME}") list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" @@ -43,17 +43,28 @@ include(TrMacros) set(CURL_MINIMUM 7.28.0) set(WOLFSSL_MINIMUM 3.4) +set(CRC32C_MINIMUM 1.1.0) set(DEFLATE_MINIMUM 1.7) set(EVENT2_MINIMUM 2.1.0) +set(FMT_MINIMUM 8.0.1) +# fast_float's version file is configured with `COMPATIBILITY SameMajorVersion` +# The version range currently distributed varies greatly (e.g. Debian Trixie -> 8.0.0, Ubuntu 24.04 -> 3.9.0) +# set(FAST_FLOAT_MINIMUM 3...8) set(GIOMM_MINIMUM 2.26.0) set(GLIBMM_MINIMUM 2.60.0) set(GTKMM3_MINIMUM 3.24.0) set(GTKMM4_MINIMUM 4.11.1) set(OPENSSL_MINIMUM 1.1.0) set(MBEDTLS_MINIMUM 2.7) +set(MINIUPNPC_MINIMUM 2.2.1) set(NPM_MINIMUM 10.2.3) # Node.js 20.10 (eslint-plugin-unicorn) -set(PSL_MINIMUM 0.21.1) +set(PSL_MINIMUM 0.21.0) set(QT_MINIMUM 5.15) +set(RAPIDJSON_MINIMUM 1.1.0) +set(SMALL_MINIMUM 0.2.2) +# utf8cpp v4's version file is configured with `COMPATIBILITY SameMajorVersion` +# and does not support version range. +# set(UTF8CPP_MINIMUM 3.1...4) option(ENABLE_DAEMON "Build daemon" ON) tr_auto_option(ENABLE_GTK "Build GTK client" AUTO) @@ -71,15 +82,22 @@ option(INSTALL_DOC "Build/install documentation" ON) option(INSTALL_LIB "Install the library" OFF) tr_auto_option(ENABLE_DEPRECATED "Allow deprecated API use of upstream packages, e.g. GTK" AUTO) tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" AUTO) -tr_auto_option(USE_SYSTEM_EVENT2 "Use system event2 library" AUTO) -tr_auto_option(USE_SYSTEM_DEFLATE "Use system deflate library" AUTO) -tr_auto_option(USE_SYSTEM_DHT "Use system dht library" AUTO) -tr_auto_option(USE_SYSTEM_MINIUPNPC "Use system miniupnpc library" AUTO) -tr_auto_option(USE_SYSTEM_NATPMP "Use system natpmp library" AUTO) -tr_auto_option(USE_SYSTEM_UTP "Use system utp library" AUTO) -tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO) -tr_auto_option(USE_SYSTEM_PSL "Use system psl library" AUTO) -tr_auto_option(USE_SYSTEM_CRC32C "Use system crc32c library" AUTO) +tr_auto_option(USE_SYSTEM_DEFAULT "Default value for USE_SYSTEM_* options" AUTO) +tr_auto_option(USE_SYSTEM_EVENT2 "Use system event2 library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_DEFLATE "Use system deflate library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_DHT "Use system dht library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_FAST_FLOAT "Use system fast_float library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_FMT "Use system fmt library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_MINIUPNPC "Use system miniupnpc library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_NATPMP "Use system natpmp library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_RAPIDJSON "Use system RapidJSON library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_SMALL "Use system small library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_UTF8CPP "Use system uft8cpp library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_WIDE_INTEGER "Use system WideInteger library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_UTP "Use system utp library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_PSL "Use system psl library" ${USE_SYSTEM_DEFAULT}) +tr_auto_option(USE_SYSTEM_CRC32C "Use system crc32c library" ${USE_SYSTEM_DEFAULT}) tr_list_option(USE_GTK_VERSION "Use specific GTK version" AUTO 3 4) tr_list_option(USE_QT_VERSION "Use specific Qt version" AUTO 5 6) tr_list_option(WITH_CRYPTO "Use specified crypto library" AUTO ccrypto mbedtls openssl wolfssl) @@ -240,13 +258,6 @@ set(CMAKE_FOLDER "${TR_THIRD_PARTY_DIR_NAME}") set(SOURCE_ICONS_DIR "${PROJECT_SOURCE_DIR}/icons") -find_package(FastFloat) -find_package(Fmt) -find_package(RapidJSON) -find_package(Small) -find_package(UtfCpp) -find_package(WideInteger) - find_package(Threads) find_package(PkgConfig QUIET) @@ -497,19 +508,24 @@ if(ENABLE_MAC) tr_fixup_auto_option(ENABLE_MAC MAC_FOUND MAC_IS_REQUIRED) endif() +# Don't build libdeflate as subdirectory as its CMakeLists.txt +# messes with global CMAKE_* variables and global compiler options if(WIN32 AND NOT MINGW) set(DEFLATE_LIB_NAME deflatestatic) else() set(DEFLATE_LIB_NAME deflate) endif() -tr_add_external_auto_library(DEFLATE libdeflate ${DEFLATE_LIB_NAME} - TARGET deflate::deflate +tr_add_external_auto_library(DEFLATE libdeflate + LIBNAME ${DEFLATE_LIB_NAME} + TARGET libdeflate::libdeflate CMAKE_ARGS -DLIBDEFLATE_BUILD_SHARED_LIB=OFF -DLIBDEFLATE_BUILD_GZIP=OFF) -tr_add_external_auto_library(EVENT2 libevent event - TARGET libevent::event +tr_add_external_auto_library(EVENT2 Libevent + SUBPROJECT + SOURCE_DIR libevent + COMPONENTS core extra CMAKE_ARGS -DEVENT__DISABLE_OPENSSL:BOOL=ON -DEVENT__DISABLE_BENCHMARK:BOOL=ON @@ -517,8 +533,14 @@ tr_add_external_auto_library(EVENT2 libevent event -DEVENT__DISABLE_REGRESS:BOOL=ON -DEVENT__DISABLE_SAMPLES:BOOL=ON -DEVENT__LIBRARY_TYPE:STRING=STATIC) +# Workaround, perm fix: https://github.com/libevent/libevent/pull/1791 +if(NOT TARGET libevent::core) + add_library(libevent::core ALIAS event_core) + add_library(libevent::extra ALIAS event_extra) +endif() -tr_add_external_auto_library(NATPMP libnatpmp natpmp +tr_add_external_auto_library(NATPMP libnatpmp + LIBNAME natpmp TARGET natpmp::natpmp CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF) @@ -534,14 +556,16 @@ if(WIN32) else() set(TR_MINIUPNPC_LIBNAME miniupnpc) endif() -tr_add_external_auto_library(MINIUPNPC miniupnp/miniupnpc ${TR_MINIUPNPC_LIBNAME} - TARGET miniupnpc::libminiupnpc +tr_add_external_auto_library(MINIUPNPC miniupnpc + LIBNAME ${TR_MINIUPNPC_LIBNAME} + SOURCE_DIR miniupnp/miniupnpc + TARGET miniupnpc::miniupnpc CMAKE_ARGS -DUPNPC_BUILD_STATIC=ON -DUPNPC_BUILD_SHARED=OFF -DUPNPC_BUILD_TESTS=OFF) if(NOT USE_SYSTEM_MINIUPNPC) - target_compile_definitions(miniupnpc::libminiupnpc + target_compile_definitions(miniupnpc::miniupnpc INTERFACE MINIUPNP_STATICLIB) endif() @@ -549,34 +573,99 @@ unset(TR_MINIUPNPC_LIBNAME) add_subdirectory(${TR_THIRD_PARTY_SOURCE_DIR}/wildmat) -tr_add_external_auto_library(DHT dht dht +tr_add_external_auto_library(DHT dht + LIBNAME dht TARGET dht::dht) -tr_add_external_auto_library(PSL libpsl psl +tr_add_external_auto_library(PSL libpsl + LIBNAME psl TARGET psl::psl) if(ENABLE_UTP) - tr_add_external_auto_library(UTP libutp utp + tr_add_external_auto_library(UTP libutp SUBPROJECT - TARGET libutp::libutp CMAKE_ARGS -DLIBUTP_SHARED:BOOL=OFF) endif() -tr_add_external_auto_library(B64 libb64 b64 +tr_add_external_auto_library(B64 libb64 SUBPROJECT - TARGET libb64::libb64 CMAKE_ARGS -DLIBB64_SHARED:BOOL=OFF) -tr_add_external_auto_library(CRC32C crc32c crc32c +# Don't build crc32c as subdirectory as its CMakeLists.txt +# messes with global CMAKE_* variables and global compiler options +tr_add_external_auto_library(CRC32C Crc32c TARGET Crc32c::crc32c + LIBNAME crc32c + SOURCE_DIR crc32c CMAKE_ARGS -DCRC32C_BUILD_TESTS=OFF -DCRC32C_BUILD_BENCHMARKS=OFF -DCRC32C_USE_GLOG=OFF -DCRC32C_INSTALL=ON) +tr_add_external_auto_library(FAST_FLOAT FastFloat + SUBPROJECT + SOURCE_DIR fast_float + CMAKE_ARGS + -DFASTFLOAT_INSTALL=OFF + -DFASTFLOAT_TEST=OFF + -DFASTFLOAT_SANITIZE=OFF + -DFASTFLOAT_CXX_STANDARD=${CMAKE_CXX_STANDARD}) + +tr_add_external_auto_library(FMT fmt + SUBPROJECT + CMAKE_ARGS + -DFMT_INSTALL=OFF + -DFMT_SYSTEM_HEADERS=ON) + +# RapidJSON's CMakeLists.txt messes with global +# CMAKE_* variables, so don't build as subproject +tr_add_external_auto_library(RAPIDJSON RapidJSON + LIBNAME RapidJSON + SOURCE_DIR rapidjson + TARGET RapidJSON + HEADER_ONLY + CMAKE_ARGS + -DRAPIDJSON_BUILD_DOC=OFF + -DRAPIDJSON_BUILD_EXAMPLES=OFF + -DRAPIDJSON_BUILD_TESTS=OFF + -DRAPIDJSON_BUILD_CXX11=OFF + -DRAPIDJSON_BUILD_CXX17=OFF + -DCMAKE_INSTALL_DIR=OFF) + +tr_add_external_auto_library(SMALL small + SUBPROJECT + CMAKE_ARGS + -DSMALL_BUILD_WITH_EXCEPTIONS=OFF) + +tr_add_external_auto_library(UTF8CPP utf8cpp + SUBPROJECT + SOURCE_DIR utfcpp) +if (NOT TARGET utf8::cpp) + add_library(utf8::cpp ALIAS utf8cpp) +endif() + +tr_add_external_auto_library(WIDE_INTEGER WideInteger + SUBPROJECT + SOURCE_DIR wide-integer) +add_library(transmission::WideInteger INTERFACE IMPORTED) +target_link_libraries(transmission::WideInteger + INTERFACE + WideInteger::WideInteger) +include(CheckCXXSourceCompiles) +check_cxx_source_compiles( +"int main() +{ + unsigned __int128 u; + signed __int128 i; + return 0; +}" TR_HAVE_INT128) +target_compile_definitions(transmission::WideInteger + INTERFACE + $<$:WIDE_INTEGER_HAS_LIMB_TYPE_UINT64>) + set(TR_WEB_ASSETS ${PROJECT_SOURCE_DIR}/web/public_html) if(REBUILD_WEB) tr_get_required_flag(REBUILD_WEB NPM_IS_REQUIRED) diff --git a/cmake/FindB64.cmake b/cmake/FindB64.cmake deleted file mode 100644 index e015e7694..000000000 --- a/cmake/FindB64.cmake +++ /dev/null @@ -1,39 +0,0 @@ -if(B64_PREFER_STATIC_LIB) - set(B64_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_B64 QUIET libb64) -endif() - -find_path(B64_INCLUDE_DIR - NAMES - b64/cdecode.h - b64/cencode.h - HINTS ${_B64_INCLUDEDIR}) -find_library(B64_LIBRARY - NAMES b64 - HINTS ${_B64_LIBDIR}) - -set(B64_INCLUDE_DIRS ${B64_INCLUDE_DIR}) -set(B64_LIBRARIES ${B64_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(B64 - REQUIRED_VARS - B64_LIBRARY - B64_INCLUDE_DIR) - -mark_as_advanced(B64_INCLUDE_DIR B64_LIBRARY) - -if(B64_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${B64_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(B64_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindCRC32C.cmake b/cmake/FindCRC32C.cmake deleted file mode 100644 index 7dbe24d22..000000000 --- a/cmake/FindCRC32C.cmake +++ /dev/null @@ -1,30 +0,0 @@ -if(CRC32C_PREFER_STATIC_LIB) - set(CRC32C_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -find_path(CRC32C_INCLUDE_DIR - NAMES crc32c/crc32c.h) -find_library(CRC32C_LIBRARY - NAMES crc32c) - -set(CRC32C_INCLUDE_DIRS ${CRC32C_INCLUDE_DIR}) -set(CRC32C_LIBRARIES ${CRC32C_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(CRC32C - REQUIRED_VARS - CRC32C_INCLUDE_DIR - CRC32C_LIBRARY) - -mark_as_advanced(CRC32C_INCLUDE_DIR CRC32C_LIBRARY) - -if(CRC32C_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${CRC32C_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(CRC32C_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindDEFLATE.cmake b/cmake/FindDEFLATE.cmake deleted file mode 100644 index e57d84b4c..000000000 --- a/cmake/FindDEFLATE.cmake +++ /dev/null @@ -1,49 +0,0 @@ -if(DEFLATE_PREFER_STATIC_LIB) - set(DEFLATE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - # pkg-config support added in libdeflate v1.9 - pkg_check_modules(_DEFLATE QUIET libdeflate) -endif() - -find_path(DEFLATE_INCLUDE_DIR - NAMES libdeflate.h - HINTS ${_DEFLATE_INCLUDEDIR}) -find_library(DEFLATE_LIBRARY - NAMES deflate - HINTS ${_DEFLATE_LIBDIR}) - -set(DEFLATE_INCLUDE_DIRS ${DEFLATE_INCLUDE_DIR}) -set(DEFLATE_LIBRARIES ${DEFLATE_LIBRARY}) - -if(_DEFLATE_VERSION) - set(DEFLATE_VERSION ${_DEFLATE_VERSION}) -elseif(DEFLATE_INCLUDE_DIR) - file(STRINGS "${DEFLATE_INCLUDE_DIR}/libdeflate.h" DEFLATE_VERSION_STR - REGEX "^#define[\t ]+LIBDEFLATE_VERSION_STRING[\t ]+\"[^\"]+\"") - if(DEFLATE_VERSION_STR MATCHES "\"([^\"]+)\"") - set(DEFLATE_VERSION "${CMAKE_MATCH_1}") - endif() -endif() - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(DEFLATE - REQUIRED_VARS - DEFLATE_INCLUDE_DIR - DEFLATE_LIBRARY - VERSION_VAR DEFLATE_VERSION) - -mark_as_advanced(DEFLATE_INCLUDE_DIR DEFLATE_LIBRARY) - -if(DEFLATE_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${DEFLATE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(DEFLATE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindDHT.cmake b/cmake/FindDHT.cmake deleted file mode 100644 index 23bb44c85..000000000 --- a/cmake/FindDHT.cmake +++ /dev/null @@ -1,37 +0,0 @@ -if(DHT_PREFER_STATIC_LIB) - set(DHT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_DHT QUIET libdht) -endif() - -find_path(DHT_INCLUDE_DIR - NAMES dht/dht.h - HINTS ${_DHT_INCLUDEDIR}) -find_library(DHT_LIBRARY - NAMES dht - HINTS ${_DHT_LIBDIR}) - -set(DHT_INCLUDE_DIRS ${DHT_INCLUDE_DIR}) -set(DHT_LIBRARIES ${DHT_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(DHT - REQUIRED_VARS - DHT_LIBRARY - DHT_INCLUDE_DIR) - -mark_as_advanced(DHT_INCLUDE_DIR DHT_LIBRARY) - -if(DHT_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${DHT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(DHT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindEVENT2.cmake b/cmake/FindEVENT2.cmake deleted file mode 100644 index 22a160ad0..000000000 --- a/cmake/FindEVENT2.cmake +++ /dev/null @@ -1,52 +0,0 @@ -if(EVENT2_PREFER_STATIC_LIB) - set(EVENT2_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_EVENT2 QUIET libevent) -endif() - -find_path(EVENT2_INCLUDE_DIR - NAMES event2/event.h - HINTS ${_EVENT2_INCLUDEDIR}) -find_library(EVENT2_LIBRARY - NAMES - event-2.1 - event - HINTS ${_EVENT2_LIBDIR}) - -if(EVENT2_INCLUDE_DIR) - if(_EVENT2_VERSION) - set(EVENT2_VERSION ${_EVENT2_VERSION}) - else() - file(STRINGS "${EVENT2_INCLUDE_DIR}/event2/event-config.h" EVENT2_VERSION_STR - REGEX "^#define[\t ]+_EVENT_VERSION[\t ]+\"[^\"]+\"") - if(EVENT2_VERSION_STR MATCHES "\"([^\"]+)\"") - set(EVENT2_VERSION "${CMAKE_MATCH_1}") - endif() - endif() -endif() - -set(EVENT2_INCLUDE_DIRS ${EVENT2_INCLUDE_DIR}) -set(EVENT2_LIBRARIES ${EVENT2_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(EVENT2 - REQUIRED_VARS - EVENT2_LIBRARY - EVENT2_INCLUDE_DIR - VERSION_VAR EVENT2_VERSION) - -mark_as_advanced(EVENT2_INCLUDE_DIR EVENT2_LIBRARY) - -if(EVENT2_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${EVENT2_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(EVENT2_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindFastFloat.cmake b/cmake/FindFastFloat.cmake deleted file mode 100644 index a3cea4abb..000000000 --- a/cmake/FindFastFloat.cmake +++ /dev/null @@ -1,5 +0,0 @@ -add_library(FastFloat::fast_float INTERFACE IMPORTED) - -target_include_directories(FastFloat::fast_float - INTERFACE - ${TR_THIRD_PARTY_SOURCE_DIR}/fast_float/include) diff --git a/cmake/FindFmt.cmake b/cmake/FindFmt.cmake deleted file mode 100644 index 8b531e872..000000000 --- a/cmake/FindFmt.cmake +++ /dev/null @@ -1,26 +0,0 @@ -add_library(fmt::fmt-header-only INTERFACE IMPORTED) - -set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE "${TR_THIRD_PARTY_SOURCE_DIR}/fmt/include") - -target_include_directories(fmt::fmt-header-only - INTERFACE - ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE}) - -set(_FMT_VERSION_H_PATH "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE}/fmt/base.h") -if(NOT EXISTS "${_FMT_VERSION_H_PATH}") - # fmt < 11 - set(_FMT_VERSION_H_PATH "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE}/fmt/core.h") -endif() -file(READ "${_FMT_VERSION_H_PATH}" _FMT_VERSION_H) -if(_FMT_VERSION_H MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])") - # Use math to skip leading zeros if any. - math(EXPR _FMT_VERSION_MAJOR ${CMAKE_MATCH_1}) - math(EXPR _FMT_VERSION_MINOR ${CMAKE_MATCH_2}) - math(EXPR _FMT_VERSION_PATCH ${CMAKE_MATCH_3}) - set(${CMAKE_FIND_PACKAGE_NAME}_VERSION "${_FMT_VERSION_MAJOR}.${_FMT_VERSION_MINOR}.${_FMT_VERSION_PATCH}") -endif() - -target_compile_definitions(fmt::fmt-header-only - INTERFACE - $,FMT_USE_EXCEPTIONS,FMT_EXCEPTIONS>=0 - FMT_HEADER_ONLY=1) diff --git a/cmake/FindLibevent.cmake b/cmake/FindLibevent.cmake new file mode 100644 index 000000000..41bc696fa --- /dev/null +++ b/cmake/FindLibevent.cmake @@ -0,0 +1,89 @@ +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(LIBEVENT_STATIC_LINK TRUE) +endif() +find_package(${CMAKE_FIND_PACKAGE_NAME} QUIET NO_MODULE) + +include(FindPackageHandleStandardArgs) +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} CONFIG_MODE HANDLE_COMPONENTS) + return() +endif() + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) +endif() + +foreach(_comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) + if(UNIX) + pkg_check_modules(_EVENT2_${_comp} QUIET libevent-${_comp}) + + if(_EVENT2_${_comp}_VERSION AND NOT ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION ${_EVENT2_${_comp}_VERSION}) + endif() + endif() + + # All components share the same include directory + find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES event2/event.h + HINTS ${_EVENT2_${_comp}_INCLUDEDIR}) + + find_library(${CMAKE_FIND_PACKAGE_NAME}_${_comp}_LIBRARY + NAMES "event_${_comp}" + HINTS ${_EVENT2_${_comp}_LIBDIR}) + + mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_${_comp}_LIBRARY) + + set(${CMAKE_FIND_PACKAGE_NAME}_${_comp}_FOUND FALSE) + if(${CMAKE_FIND_PACKAGE_NAME}_${_comp}_LIBRARY) + set(${CMAKE_FIND_PACKAGE_NAME}_${_comp}_FOUND TRUE) + endif() +endforeach() + +if(NOT ${CMAKE_FIND_PACKAGE_NAME}_VERSION AND ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + file(STRINGS "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}/event2/event-config.h" _EVENT_VERSION_STR + REGEX "^#define[\t ]+EVENT__VERSION[\t ]+\"[^\"]+\"") + if(_EVENT_VERSION_STR MATCHES "\"([^\"]+)\"") + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION "${CMAKE_MATCH_1}") + endif() +endif() + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + HANDLE_COMPONENTS + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + VERSION_VAR ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES) + foreach(_comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) + if(NOT TARGET libevent::${_comp}) + add_library(libevent::${_comp} INTERFACE IMPORTED) + target_include_directories(libevent::${_comp} + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + target_link_libraries(libevent::${_comp} + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_${_comp}_LIBRARY}) + endif() + + list(APPEND ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES libevent::${_comp}) + endforeach() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/FindMINIUPNPC.cmake b/cmake/FindMINIUPNPC.cmake deleted file mode 100644 index e15af6785..000000000 --- a/cmake/FindMINIUPNPC.cmake +++ /dev/null @@ -1,39 +0,0 @@ -if(MINIUPNPC_PREFER_STATIC_LIB) - set(MINIUPNPC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_MINIUPNPC QUIET libminiupnpc) -endif() - -find_path(MINIUPNPC_INCLUDE_DIR - NAMES miniupnpc/miniupnpc.h - HINTS ${_MINIUPNPC_INCLUDEDIR}) -find_library(MINIUPNPC_LIBRARY - NAMES - miniupnpc - libminiupnpc - HINTS ${_MINIUPNPC_LIBDIR}) - -set(MINIUPNPC_INCLUDE_DIRS ${MINIUPNPC_INCLUDE_DIR}) -set(MINIUPNPC_LIBRARIES ${MINIUPNPC_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(MINIUPNPC - REQUIRED_VARS - MINIUPNPC_LIBRARY - MINIUPNPC_INCLUDE_DIR) - -mark_as_advanced(MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY) - -if(MINIUPNPC_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${MINIUPNPC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(MINIUPNPC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindNATPMP.cmake b/cmake/FindNATPMP.cmake deleted file mode 100644 index 3fdaec90b..000000000 --- a/cmake/FindNATPMP.cmake +++ /dev/null @@ -1,37 +0,0 @@ -if(NATPMP_PREFER_STATIC_LIB) - set(NATPMP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_NATPMP QUIET libnatpmp) -endif() - -find_path(NATPMP_INCLUDE_DIR - NAMES natpmp.h - HINTS ${_NATPMP_INCLUDEDIR}) -find_library(NATPMP_LIBRARY - NAMES natpmp - HINTS ${_NATPMP_LIBDIR}) - -set(NATPMP_INCLUDE_DIRS ${NATPMP_INCLUDE_DIR}) -set(NATPMP_LIBRARIES ${NATPMP_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(NATPMP - REQUIRED_VARS - NATPMP_LIBRARY - NATPMP_INCLUDE_DIR) - -mark_as_advanced(NATPMP_INCLUDE_DIR NATPMP_LIBRARY) - -if(NATPMP_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${NATPMP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(NATPMP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindPSL.cmake b/cmake/FindPSL.cmake deleted file mode 100644 index b0a6ceb4b..000000000 --- a/cmake/FindPSL.cmake +++ /dev/null @@ -1,37 +0,0 @@ -if(PSL_PREFER_STATIC_LIB) - set(PSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_PSL QUIET libpsl) -endif() - -find_path(PSL_INCLUDE_DIR - NAMES libpsl.h - HINTS ${_PSL_INCLUDEDIR}) -find_library(PSL_LIBRARY - NAMES psl - HINTS ${_PSL_LIBDIR}) - -set(PSL_INCLUDE_DIRS ${PSL_INCLUDE_DIR}) -set(PSL_LIBRARIES ${PSL_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(PSL - REQUIRED_VARS - PSL_LIBRARY - PSL_INCLUDE_DIR) - -mark_as_advanced(PSL_INCLUDE_DIR PSL_LIBRARY) - -if(PSL_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${PSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(PSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindRapidJSON.cmake b/cmake/FindRapidJSON.cmake index aec9374de..f43436588 100644 --- a/cmake/FindRapidJSON.cmake +++ b/cmake/FindRapidJSON.cmake @@ -1,9 +1,37 @@ -add_library(RapidJSON INTERFACE IMPORTED) +find_package(${CMAKE_FIND_PACKAGE_NAME} QUIET NO_MODULE) -target_include_directories(RapidJSON - INTERFACE - ${TR_THIRD_PARTY_SOURCE_DIR}/rapidjson/include) +include(FindPackageHandleStandardArgs) +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} CONFIG_MODE) + return() +endif() -target_compile_definitions(RapidJSON - INTERFACE - RAPIDJSON_HAS_STDSTRING=1) +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_RAPIDJSON QUIET RapidJSON) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES rapidjson/rapidjson.h + HINTS ${_RAPIDJSON_INCLUDEDIR}) + +if(_RAPIDJSON_VERSION) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION ${_RAPIDJSON_VERSION}) +endif() + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + VERSION_VAR ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + + if(NOT TARGET RapidJSON) + add_library(RapidJSON INTERFACE IMPORTED) + target_include_directories(RapidJSON + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) diff --git a/cmake/FindSmall.cmake b/cmake/FindSmall.cmake deleted file mode 100644 index 0a1f3b947..000000000 --- a/cmake/FindSmall.cmake +++ /dev/null @@ -1,9 +0,0 @@ -add_library(small::small INTERFACE IMPORTED) - -target_include_directories(small::small - INTERFACE - ${TR_THIRD_PARTY_SOURCE_DIR}/small/include) - -target_compile_definitions(small::small - INTERFACE - SMALL_DISABLE_EXCEPTIONS=1) diff --git a/cmake/FindUTP.cmake b/cmake/FindUTP.cmake deleted file mode 100644 index d86e455fa..000000000 --- a/cmake/FindUTP.cmake +++ /dev/null @@ -1,84 +0,0 @@ -if(UTP_PREFER_STATIC_LIB) - set(UTP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if(WIN32) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) - endif() -endif() - -if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_UTP QUIET libutp) -endif() - -find_path(UTP_INCLUDE_DIR - NAMES libutp/utp.h - HINTS ${_UTP_INCLUDEDIR}) -find_library(UTP_LIBRARY - NAMES utp - HINTS ${_UTP_LIBDIR}) - -if(UTP_INCLUDE_DIR AND UTP_LIBRARY) - include(CheckCXXSymbolExists) - - set(_UTP_FUNCS - utp_check_timeouts - utp_close - utp_connect - utp_context_get_userdata - utp_context_set_option - utp_context_set_userdata - utp_create_socket - utp_destroy - utp_getpeername - utp_get_userdata - utp_init - utp_issue_deferred_acks - utp_process_udp - utp_read_drained - utp_set_callback - utp_set_userdata - utp_write - utp_writev) - - set(_UTP_OLD_CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES}") - set(_UTP_OLD_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") - set(_UTP_OLD_CMAKE_REQUIRED_QUIET "${CMAKE_REQUIRED_QUIET}") - - set(CMAKE_REQUIRED_INCLUDES "${UTP_INCLUDE_DIR}") - set(CMAKE_REQUIRED_LIBRARIES "${UTP_LIBRARY}") - set(CMAKE_REQUIRED_QUIET ON) - - foreach(_UTP_FUNC IN LISTS _UTP_FUNCS) - string(MAKE_C_IDENTIFIER "HAVE_${_UTP_FUNC}" _UTP_FUNC_VAR) - string(TOUPPER "${_UTP_FUNC_VAR}" _UTP_FUNC_VAR) - check_cxx_symbol_exists(${_UTP_FUNC} libutp/utp.h ${_UTP_FUNC_VAR}) - if(NOT ${_UTP_FUNC_VAR}) - unset(UTP_INCLUDE_DIR CACHE) - unset(UTP_LIBRARY CACHE) - break() - endif() - endforeach() - - set(CMAKE_REQUIRED_INCLUDES "${_UTP_OLD_CMAKE_REQUIRED_INCLUDES}") - set(CMAKE_REQUIRED_LIBRARIES "${_UTP_OLD_CMAKE_REQUIRED_LIBRARIES}") - set(CMAKE_REQUIRED_QUIET "${_UTP_OLD_CMAKE_REQUIRED_QUIET}") -endif() - -set(UTP_INCLUDE_DIRS ${UTP_INCLUDE_DIR}) -set(UTP_LIBRARIES ${UTP_LIBRARY}) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(UTP - REQUIRED_VARS - UTP_LIBRARY - UTP_INCLUDE_DIR) - -mark_as_advanced(UTP_INCLUDE_DIR UTP_LIBRARY) - -if(UTP_PREFER_STATIC_LIB) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${UTP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(UTP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() diff --git a/cmake/FindUtfCpp.cmake b/cmake/FindUtfCpp.cmake deleted file mode 100644 index f79085a3b..000000000 --- a/cmake/FindUtfCpp.cmake +++ /dev/null @@ -1,5 +0,0 @@ -add_library(utf8::cpp INTERFACE IMPORTED) - -target_include_directories(utf8::cpp - INTERFACE - ${TR_THIRD_PARTY_SOURCE_DIR}/utfcpp/source) diff --git a/cmake/FindWideInteger.cmake b/cmake/FindWideInteger.cmake deleted file mode 100644 index 87494b0e7..000000000 --- a/cmake/FindWideInteger.cmake +++ /dev/null @@ -1,21 +0,0 @@ -add_library(WideInteger::WideInteger INTERFACE IMPORTED) - -target_include_directories(WideInteger::WideInteger - INTERFACE - ${TR_THIRD_PARTY_SOURCE_DIR}/wide-integer) - -set(_INT128_TEST_FILE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckInt128.c) -file(WRITE ${_INT128_TEST_FILE} - "int main() - { - unsigned __int128 u; - signed __int128 i; - return 0; - }") -try_compile(_HAVE_INT128 - ${CMAKE_BINARY_DIR} - ${_INT128_TEST_FILE}) -target_compile_definitions(WideInteger::WideInteger - INTERFACE - $<$:WIDE_INTEGER_HAS_LIMB_TYPE_UINT64> -) diff --git a/cmake/Finddht.cmake b/cmake/Finddht.cmake new file mode 100644 index 000000000..c22802fee --- /dev/null +++ b/cmake/Finddht.cmake @@ -0,0 +1,39 @@ +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_DHT QUIET libdht) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES dht/dht.h + HINTS ${_DHT_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES dht + HINTS ${_DHT_LIBDIR}) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findfmt.cmake b/cmake/Findfmt.cmake new file mode 100644 index 000000000..c748086ca --- /dev/null +++ b/cmake/Findfmt.cmake @@ -0,0 +1,71 @@ +find_package(${CMAKE_FIND_PACKAGE_NAME} QUIET NO_MODULE) + +include(FindPackageHandleStandardArgs) +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} CONFIG_MODE) + return() +endif() + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_FMT QUIET fmt) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES fmt/core.h + HINTS ${_FMT_INCLUDEDIR}) + +if(_FMT_VERSION) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION ${_FMT_VERSION}) +elseif(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + set(_FMT_VERSION_H_PATH "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}/fmt/base.h") + if(NOT EXISTS "${_FMT_VERSION_H_PATH}") + # fmt < 11 + set(_FMT_VERSION_H_PATH "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}/fmt/core.h") + endif() + file(READ "${_FMT_VERSION_H_PATH}" _FMT_VERSION_H) + if(_FMT_VERSION_H MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])") + # Use math to skip leading zeros if any. + math(EXPR _FMT_VERSION_MAJOR ${CMAKE_MATCH_1}) + math(EXPR _FMT_VERSION_MINOR ${CMAKE_MATCH_2}) + math(EXPR _FMT_VERSION_PATCH ${CMAKE_MATCH_3}) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION "${_FMT_VERSION_MAJOR}.${_FMT_VERSION_MINOR}.${_FMT_VERSION_PATCH}") + endif() +endif() + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + VERSION_VAR ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + + if(NOT TARGET fmt::fmt-header-only) + add_library(fmt::fmt-header-only INTERFACE IMPORTED) + target_compile_definitions(fmt::fmt-header-only-only INTERFACE FMT_HEADER_ONLY=1) + target_compile_features(fmt::fmt-header-only-only INTERFACE cxx_std_11) + target_include_directories(fmt::fmt-header-only + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + if(MSVC) + target_compile_options(fmt::fmt-header-only INTERFACE $<$:/utf-8>) + endif() + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findlibb64.cmake b/cmake/Findlibb64.cmake new file mode 100644 index 000000000..1c2a267c9 --- /dev/null +++ b/cmake/Findlibb64.cmake @@ -0,0 +1,51 @@ +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_B64 QUIET libb64) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES + b64/cdecode.h + b64/cencode.h + HINTS ${_B64_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES b64 + HINTS ${_B64_LIBDIR}) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + + if(NOT TARGET libb64::libb64) + add_library(libb64::libb64 INTERFACE IMPORTED) + target_include_directories(libb64::libb64 + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + target_link_libraries(libb64::libb64 + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findlibdeflate.cmake b/cmake/Findlibdeflate.cmake new file mode 100644 index 000000000..1cce4da11 --- /dev/null +++ b/cmake/Findlibdeflate.cmake @@ -0,0 +1,73 @@ +find_package(${CMAKE_FIND_PACKAGE_NAME} QUIET NO_MODULE) + +include(FindPackageHandleStandardArgs) +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + if(TARGET libdeflate::libdeflate_static AND (${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB OR NOT TARGET libdeflate::libdeflate_shared)) + add_library(libdeflate::libdeflate ALIAS libdeflate::libdeflate_static) + else() + add_library(libdeflate::libdeflate ALIAS libdeflate::libdeflate_shared) + endif() + + find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} CONFIG_MODE) + return() +endif() + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + # pkg-config support added in libdeflate v1.9 + pkg_check_modules(_DEFLATE QUIET libdeflate) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES libdeflate.h + HINTS ${_DEFLATE_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES deflate + HINTS ${_DEFLATE_LIBDIR}) + +if(_DEFLATE_VERSION) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION ${_DEFLATE_VERSION}) +elseif(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + file(STRINGS "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}/libdeflate.h" ${CMAKE_FIND_PACKAGE_NAME}_VERSION_STR + REGEX "^#define[\t ]+LIBDEFLATE_VERSION_STRING[\t ]+\"[^\"]+\"") + if(${CMAKE_FIND_PACKAGE_NAME}_VERSION_STR MATCHES "\"([^\"]+)\"") + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION "${CMAKE_MATCH_1}") + endif() +endif() + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + VERSION_VAR ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + + if(NOT TARGET libdeflate::libdeflate) + add_library(libdeflate::libdeflate INTERFACE IMPORTED) + target_include_directories(libdeflate::libdeflate + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + target_link_libraries(libdeflate::libdeflate + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findlibnatpmp.cmake b/cmake/Findlibnatpmp.cmake new file mode 100644 index 000000000..ea6cc07e2 --- /dev/null +++ b/cmake/Findlibnatpmp.cmake @@ -0,0 +1,39 @@ +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_NATPMP QUIET libnatpmp) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES natpmp.h + HINTS ${_NATPMP_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES natpmp + HINTS ${_NATPMP_LIBDIR}) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findlibpsl.cmake b/cmake/Findlibpsl.cmake new file mode 100644 index 000000000..583a52548 --- /dev/null +++ b/cmake/Findlibpsl.cmake @@ -0,0 +1,49 @@ +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_PSL QUIET libpsl) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES libpsl.h + HINTS ${_PSL_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES psl + HINTS ${_PSL_LIBDIR}) + +if(_PSL_VERSION) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION ${_PSL_VERSION}) +elseif(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + file(STRINGS "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}/libpsl.h" _PSL_VERSION_STR + REGEX "^#define[\t ]+PSL_VERSION[\t ]+\"[^\"]+\"") + if(_PSL_VERSION_STR MATCHES "\"([^\"]+)\"") + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION "${CMAKE_MATCH_1}") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + VERSION_VAR ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findlibutp.cmake b/cmake/Findlibutp.cmake new file mode 100644 index 000000000..bb706405a --- /dev/null +++ b/cmake/Findlibutp.cmake @@ -0,0 +1,94 @@ +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_UTP QUIET libutp) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES libutp/utp.h + HINTS ${_UTP_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES utp + HINTS ${_UTP_LIBDIR}) + +include(CheckCXXSymbolExists) + +set(_UTP_FUNCS + utp_check_timeouts + utp_close + utp_connect + utp_context_get_userdata + utp_context_set_option + utp_context_set_userdata + utp_create_socket + utp_destroy + utp_getpeername + utp_get_userdata + utp_init + utp_issue_deferred_acks + utp_process_udp + utp_read_drained + utp_set_callback + utp_set_userdata + utp_write + utp_writev) + +set(_UTP_OLD_CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES}") +set(_UTP_OLD_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") +set(_UTP_OLD_CMAKE_REQUIRED_QUIET "${CMAKE_REQUIRED_QUIET}") + +set(CMAKE_REQUIRED_INCLUDES "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}") +set(CMAKE_REQUIRED_LIBRARIES "${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}") +set(CMAKE_REQUIRED_QUIET ON) + +foreach(_UTP_FUNC IN LISTS _UTP_FUNCS) + string(MAKE_C_IDENTIFIER "HAVE_${_UTP_FUNC}" _UTP_FUNC_VAR) + string(TOUPPER "${_UTP_FUNC_VAR}" _UTP_FUNC_VAR) + check_cxx_symbol_exists(${_UTP_FUNC} libutp/utp.h ${_UTP_FUNC_VAR}) + if(NOT ${_UTP_FUNC_VAR}) + unset(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR CACHE) + unset(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY CACHE) + break() + endif() +endforeach() + +set(CMAKE_REQUIRED_INCLUDES "${_UTP_OLD_CMAKE_REQUIRED_INCLUDES}") +set(CMAKE_REQUIRED_LIBRARIES "${_UTP_OLD_CMAKE_REQUIRED_LIBRARIES}") +set(CMAKE_REQUIRED_QUIET "${_UTP_OLD_CMAKE_REQUIRED_QUIET}") + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + + if(NOT TARGET libutp::libutp) + add_library(libutp::libutp INTERFACE IMPORTED) + target_include_directories(libutp::libutp + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + target_link_libraries(libutp::libutp + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findminiupnpc.cmake b/cmake/Findminiupnpc.cmake new file mode 100644 index 000000000..3f339004b --- /dev/null +++ b/cmake/Findminiupnpc.cmake @@ -0,0 +1,68 @@ +find_package(${CMAKE_FIND_PACKAGE_NAME} QUIET NO_MODULE) + +include(FindPackageHandleStandardArgs) +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} CONFIG_MODE) + return() +endif() + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_MINIUPNPC QUIET libminiupnpc) +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES miniupnpc/miniupnpc.h + HINTS ${_MINIUPNPC_INCLUDEDIR}) +find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + NAMES + miniupnpc + libminiupnpc + HINTS ${_MINIUPNPC_LIBDIR}) + +if(_MINIUPNPC_VERSION) + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION ${_MINIUPNPC_VERSION}) +elseif(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + file(STRINGS "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}/miniupnpc/miniupnpc.h" _MINIUPNPC_VERSION_STR + REGEX "^#define[\t ]+MINIUPNPC_VERSION[\t ]+\"[^\"]+\"") + if(_MINIUPNPC_VERSION_STR MATCHES "\"([^\"]+)\"") + set(${CMAKE_FIND_PACKAGE_NAME}_VERSION "${CMAKE_MATCH_1}") + endif() +endif() + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + VERSION_VAR ${CMAKE_FIND_PACKAGE_NAME}_VERSION) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + set(${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + + if(NOT TARGET miniupnpc::miniupnpc) + add_library(miniupnpc::miniupnpc INTERFACE IMPORTED) + target_include_directories(miniupnpc::miniupnpc + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + target_link_libraries(miniupnpc::miniupnpc + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}) + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) + +if(${CMAKE_FIND_PACKAGE_NAME}_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(${CMAKE_FIND_PACKAGE_NAME}_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/cmake/Findutf8cpp.cmake b/cmake/Findutf8cpp.cmake new file mode 100644 index 000000000..5e6ba5435 --- /dev/null +++ b/cmake/Findutf8cpp.cmake @@ -0,0 +1,34 @@ +find_package(${CMAKE_FIND_PACKAGE_NAME} QUIET NO_MODULE) + +include(FindPackageHandleStandardArgs) +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + if(${CMAKE_FIND_PACKAGE_NAME}_VERSION VERSION_LESS 4.0.0) + # Before 4.0.0, some compiler options from their tests leaked into the + # main target. We workaround by clearing them here. + set_property(TARGET utf8cpp PROPERTY INTERFACE_COMPILE_OPTIONS) + endif() + + find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} CONFIG_MODE) + return() +endif() + +find_path(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR + NAMES utf8.h + PATH_SUFFIXES utf8cpp) + +find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) + +if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + + if(NOT TARGET utf8::cpp) + add_library(utf8::cpp INTERFACE IMPORTED) + + target_include_directories(utf8::cpp + INTERFACE + ${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR}) + endif() +endif() + +mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIR) diff --git a/cmake/TrGTest.cmake b/cmake/TrGTest.cmake new file mode 100644 index 000000000..edf3d7e33 --- /dev/null +++ b/cmake/TrGTest.cmake @@ -0,0 +1,16 @@ +include(TrMacros) + +option(USE_SYSTEM_GTEST "Use system GTest library" OFF) + +tr_add_external_auto_library(GTEST GTest + SUBPROJECT + SOURCE_DIR googletest + CMAKE_ARGS + -DBUILD_GMOCK=OFF + -DINSTALL_GTEST=OFF + -DBUILD_SHARED_LIBS=ON) + +# The GTest::gtest_main target is new in CMake 3.20 +if(NOT TARGET GTest::gtest_main) + add_library(GTest::gtest_main ALIAS GTest::Main) +endif() diff --git a/cmake/TrMacros.cmake b/cmake/TrMacros.cmake index 797b655b5..e56066e21 100644 --- a/cmake/TrMacros.cmake +++ b/cmake/TrMacros.cmake @@ -128,48 +128,78 @@ function(tr_process_list_conditions VAR_PREFIX) set(${VAR_PREFIX}_DISALLOWED "${DISALLOWED_ITEMS}" PARENT_SCOPE) endfunction() -macro(tr_add_external_auto_library ID DIRNAME LIBNAME) - cmake_parse_arguments(_TAEAL_ARG "SUBPROJECT" "TARGET" "CMAKE_ARGS" ${ARGN}) +macro(tr_add_external_auto_library ID PACKAGENAME) + cmake_parse_arguments(_TAEAL_ARG + "SUBPROJECT;HEADER_ONLY" + "LIBNAME;SOURCE_DIR;TARGET" + "CMAKE_ARGS;COMPONENTS" + ${ARGN}) - if(USE_SYSTEM_${ID}) - tr_get_required_flag(USE_SYSTEM_${ID} SYSTEM_${ID}_IS_REQUIRED) - find_package(${ID} ${${ID}_MINIMUM} ${SYSTEM_${ID}_IS_REQUIRED}) - tr_fixup_auto_option(USE_SYSTEM_${ID} ${ID}_FOUND SYSTEM_${ID}_IS_REQUIRED) + set(_TAEAL_SOURCE_DIR "${TR_THIRD_PARTY_SOURCE_DIR}") + set(_TAEAL_BINARY_DIR "${TR_THIRD_PARTY_BINARY_DIR}") + if (_TAEAL_ARG_SOURCE_DIR) + string(APPEND _TAEAL_SOURCE_DIR "/${_TAEAL_ARG_SOURCE_DIR}") + string(APPEND _TAEAL_BINARY_DIR "/${_TAEAL_ARG_SOURCE_DIR}.bld") + else() + string(APPEND _TAEAL_SOURCE_DIR "/${PACKAGENAME}") + string(APPEND _TAEAL_BINARY_DIR "/${PACKAGENAME}.bld") endif() if(USE_SYSTEM_${ID}) - unset(${ID}_UPSTREAM_TARGET) + tr_get_required_flag(USE_SYSTEM_${ID} SYSTEM_${ID}_IS_REQUIRED) + set(_TAEAL_QUIET) + if(NOT SYSTEM_${ID}_IS_REQUIRED) + set(_TAEAL_QUIET QUIET) + endif() + find_package(${PACKAGENAME} ${${ID}_MINIMUM} ${SYSTEM_${ID}_IS_REQUIRED} ${_TAEAL_QUIET} + COMPONENTS ${_TAEAL_ARG_COMPONENTS}) + tr_fixup_auto_option(USE_SYSTEM_${ID} ${PACKAGENAME}_FOUND SYSTEM_${ID}_IS_REQUIRED) + endif() + + if(USE_SYSTEM_${ID}) + unset(${PACKAGENAME}_UPSTREAM_TARGET) elseif(_TAEAL_ARG_SUBPROJECT) foreach(ARG IN LISTS _TAEAL_ARG_CMAKE_ARGS) if(ARG MATCHES "^-D([^=: ]+)(:[^= ]+)?=(.*)$") set(${CMAKE_MATCH_1} ${CMAKE_MATCH_3} CACHE INTERNAL "") endif() endforeach() - add_subdirectory("${TR_THIRD_PARTY_SOURCE_DIR}/${DIRNAME}" "${TR_THIRD_PARTY_BINARY_DIR}/${DIRNAME}.bld") + + set(_TAEAL_SUBDIR_SYSTEM) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.25) + set(_TAEAL_SUBDIR_SYSTEM SYSTEM) + endif() + add_subdirectory("${_TAEAL_SOURCE_DIR}" "${_TAEAL_BINARY_DIR}" EXCLUDE_FROM_ALL ${_TAEAL_SUBDIR_SYSTEM}) else() - set(${ID}_UPSTREAM_TARGET ${LIBNAME}) - set(${ID}_PREFIX "${TR_THIRD_PARTY_BINARY_DIR}/${DIRNAME}.bld/pfx") + if(NOT _TAEAL_ARG_LIBNAME) + message(FATAL_ERROR "LIBNAME must be specified if not SUBPROJECT") + endif () - set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include" - CACHE INTERNAL "") - set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" + set(${PACKAGENAME}_UPSTREAM_TARGET "_${_TAEAL_ARG_LIBNAME}") + set(${PACKAGENAME}_PREFIX "${_TAEAL_BINARY_DIR}/pfx") + + set(${PACKAGENAME}_INCLUDE_DIR "${${PACKAGENAME}_PREFIX}/include" CACHE INTERNAL "") + set(${PACKAGENAME}_INCLUDE_DIRS ${${PACKAGENAME}_INCLUDE_DIR}) - set(${ID}_INCLUDE_DIRS ${${ID}_INCLUDE_DIR}) - set(${ID}_LIBRARIES ${${ID}_LIBRARY}) + if(NOT _TAEAL_ARG_HEADER_ONLY) + set(${PACKAGENAME}_LIBRARY "${${PACKAGENAME}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${_TAEAL_ARG_LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" + CACHE INTERNAL "") + set(${PACKAGENAME}_LIBRARIES ${${PACKAGENAME}_LIBRARY}) + endif() - set(${ID}_EXT_PROJ_CMAKE_ARGS) + set(${PACKAGENAME}_EXT_PROJ_CMAKE_ARGS) if(APPLE) - string(REPLACE ";" "$" ${ID}_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - list(APPEND ${ID}_EXT_PROJ_CMAKE_ARGS - "-DCMAKE_OSX_ARCHITECTURES:STRING=${${ID}_CMAKE_OSX_ARCHITECTURES}" + string(REPLACE ";" "$" ${PACKAGENAME}_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") + list(APPEND ${PACKAGENAME}_EXT_PROJ_CMAKE_ARGS + "-DCMAKE_OSX_ARCHITECTURES:STRING=${${PACKAGENAME}_CMAKE_OSX_ARCHITECTURES}" "-DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET}" "-DCMAKE_OSX_SYSROOT:PATH=${CMAKE_OSX_SYSROOT}") endif() if(ANDROID) - list(APPEND ${ID}_EXT_PROJ_CMAKE_ARGS + list(APPEND ${PACKAGENAME}_EXT_PROJ_CMAKE_ARGS "-DANDROID_PLATFORM=${ANDROID_PLATFORM}" "-DANDROID_NDK=${ANDROID_NDK}" "-DANDROID_ABI=${ANDROID_ABI}" @@ -179,15 +209,15 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME) endif() if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) - list(APPEND ${ID}_EXT_PROJ_CMAKE_ARGS + list(APPEND ${PACKAGENAME}_EXT_PROJ_CMAKE_ARGS "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") endif() ExternalProject_Add( - ${${ID}_UPSTREAM_TARGET} - PREFIX "${TR_THIRD_PARTY_BINARY_DIR}/${DIRNAME}.bld" - SOURCE_DIR "${TR_THIRD_PARTY_SOURCE_DIR}/${DIRNAME}" - INSTALL_DIR "${${ID}_PREFIX}" + ${${PACKAGENAME}_UPSTREAM_TARGET} + PREFIX "${_TAEAL_BINARY_DIR}" + SOURCE_DIR "${_TAEAL_SOURCE_DIR}" + INSTALL_DIR "${${PACKAGENAME}_PREFIX}" CMAKE_ARGS -Wno-dev # We don't want to be warned over unused variables --no-warn-unused-cli @@ -200,29 +230,31 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME) "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX:PATH=" "-DCMAKE_INSTALL_LIBDIR:STRING=lib" - ${${ID}_EXT_PROJ_CMAKE_ARGS} + ${${PACKAGENAME}_EXT_PROJ_CMAKE_ARGS} ${_TAEAL_ARG_CMAKE_ARGS} - BUILD_BYPRODUCTS "${${ID}_LIBRARY}") + BUILD_BYPRODUCTS "${${PACKAGENAME}_LIBRARY}") - set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "${TR_THIRD_PARTY_DIR_NAME}") + set_property(TARGET ${${PACKAGENAME}_UPSTREAM_TARGET} PROPERTY FOLDER "${TR_THIRD_PARTY_DIR_NAME}") # Imported target (below) requires include directories to be present at configuration time - file(MAKE_DIRECTORY ${${ID}_INCLUDE_DIRS}) + file(MAKE_DIRECTORY ${${PACKAGENAME}_INCLUDE_DIRS}) endif() - if(_TAEAL_ARG_TARGET AND (USE_SYSTEM_${ID} OR NOT _TAEAL_ARG_SUBPROJECT)) + if(NOT _TAEAL_ARG_SUBPROJECT AND _TAEAL_ARG_TARGET AND NOT TARGET ${_TAEAL_ARG_TARGET}) add_library(${_TAEAL_ARG_TARGET} INTERFACE IMPORTED) target_include_directories(${_TAEAL_ARG_TARGET} INTERFACE - ${${ID}_INCLUDE_DIRS}) + ${${PACKAGENAME}_INCLUDE_DIRS}) - target_link_libraries(${_TAEAL_ARG_TARGET} - INTERFACE - ${${ID}_LIBRARIES}) + if(NOT _TAEAL_ARG_HEADER_ONLY) + target_link_libraries(${_TAEAL_ARG_TARGET} + INTERFACE + ${${PACKAGENAME}_LIBRARIES}) + endif() - if(${ID}_UPSTREAM_TARGET) - add_dependencies(${_TAEAL_ARG_TARGET} ${${ID}_UPSTREAM_TARGET}) + if(${PACKAGENAME}_UPSTREAM_TARGET) + add_dependencies(${_TAEAL_ARG_TARGET} ${${PACKAGENAME}_UPSTREAM_TARGET}) endif() endif() diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt index 000bc3705..0f138559b 100644 --- a/daemon/CMakeLists.txt +++ b/daemon/CMakeLists.txt @@ -33,7 +33,7 @@ target_include_directories(${TR_NAME}-daemon SYSTEM target_link_libraries(${TR_NAME}-daemon PRIVATE ${TR_NAME} - libevent::event + libevent::core fmt::fmt-header-only $<$:${SYSTEMD_LIBRARIES}>) diff --git a/libtransmission/CMakeLists.txt b/libtransmission/CMakeLists.txt index daa84c6e1..54c9c4d56 100644 --- a/libtransmission/CMakeLists.txt +++ b/libtransmission/CMakeLists.txt @@ -218,6 +218,7 @@ tr_allow_compile_if( target_compile_definitions(${TR_NAME} PRIVATE __TRANSMISSION__ + RAPIDJSON_HAS_STDSTRING=1 WIDE_INTEGER_DISABLE_FLOAT_INTEROP WIDE_INTEGER_DISABLE_IOSTREAM PACKAGE_DATA_DIR="${CMAKE_INSTALL_FULL_DATAROOTDIR}" @@ -227,6 +228,9 @@ target_compile_definitions(${TR_NAME} $<$:USE_SYSTEM_B64> $<$:HAVE_SO_REUSEPORT=1> PUBLIC + FMT_USE_EXCEPTIONS=0 # {fmt} >= 11.2.0 + FMT_EXCEPTIONS=0 # {fmt} < 11.2.0 + SMALL_DISABLE_EXCEPTIONS=1 # Workaround, perm fix at https://github.com/alandefreitas/small/pull/52 $<$:WITH_CCRYPTO> $<$:WITH_MBEDTLS> $<$:WITH_OPENSSL> @@ -269,12 +273,12 @@ endif() target_link_libraries(${TR_NAME} PRIVATE Threads::Threads - deflate::deflate + libdeflate::libdeflate CURL::libcurl FastFloat::fast_float psl::psl natpmp::natpmp - miniupnpc::libminiupnpc + miniupnpc::miniupnpc dht::dht libutp::libutp libb64::libb64 @@ -285,7 +289,7 @@ target_link_libraries(${TR_NAME} RapidJSON utf8::cpp wildmat - WideInteger::WideInteger + transmission::WideInteger Crc32c::crc32c $<$:crypt32> $<$:shlwapi> @@ -296,7 +300,8 @@ target_link_libraries(${TR_NAME} transmission::crypto_impl fmt::fmt-header-only small::small - libevent::event) + libevent::core + libevent::extra) if(INSTALL_LIB) install( diff --git a/libtransmission/port-forwarding-upnp.cc b/libtransmission/port-forwarding-upnp.cc index 3151ee441..edd6fe251 100644 --- a/libtransmission/port-forwarding-upnp.cc +++ b/libtransmission/port-forwarding-upnp.cc @@ -30,7 +30,7 @@ #include "libtransmission/utils.h" // for _(), tr_strerror() #ifndef MINIUPNPC_API_VERSION -#error miniupnpc >= 1.7 is required +#error "MINIUPNPC_API_VERSION macro not defined" #endif namespace diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4aa971546..f5fd0c67b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,5 @@ -add_subdirectory(gtest) +include(TrGTest) + add_subdirectory(libtransmission) if(ENABLE_UTILS) add_subdirectory(utils) diff --git a/tests/gtest/CMakeLists.txt b/tests/gtest/CMakeLists.txt deleted file mode 100644 index 77eef5320..000000000 --- a/tests/gtest/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -set(GTEST_ROOT_DIR ${TR_THIRD_PARTY_SOURCE_DIR}/googletest/googletest) - -add_library(gtestall STATIC) - -# GTest 1.12 triggers nullptr warnings in gcc 13 -set(CACHE_ID "${CMAKE_CXX_COMPILER_ID}_CXX_HAS-Wnull-dereference") -string(TOLOWER "${CACHE_ID}" CACHE_ID) -check_c_compiler_flag(-Wnull-dereference ${CACHE_ID}) -if(${CACHE_ID}) - target_compile_options(gtestall PRIVATE -Wno-null-dereference) -endif() - -target_sources(gtestall - PRIVATE - ${GTEST_ROOT_DIR}/src/gtest-all.cc - ${GTEST_ROOT_DIR}/src/gtest_main.cc) - -set_property( - TARGET gtestall - PROPERTY FOLDER "${TR_THIRD_PARTY_DIR_NAME}") - -target_include_directories(gtestall SYSTEM - PRIVATE - ${GTEST_ROOT_DIR} - PUBLIC - ${GTEST_ROOT_DIR}/include) diff --git a/tests/libtransmission/CMakeLists.txt b/tests/libtransmission/CMakeLists.txt index 247106337..de648ba6c 100644 --- a/tests/libtransmission/CMakeLists.txt +++ b/tests/libtransmission/CMakeLists.txt @@ -75,11 +75,28 @@ target_compile_options(libtransmission-test target_link_libraries(libtransmission-test PRIVATE ${TR_NAME} - gtestall + GTest::gtest_main dht::dht fmt::fmt-header-only - libevent::event - WideInteger::WideInteger) + libevent::core + transmission::WideInteger) + +if (WIN32) + cmake_policy(PUSH) + cmake_minimum_required(VERSION 3.21 FATAL_ERROR) + + add_custom_command( + TARGET libtransmission-test POST_BUILD + COMMAND + ${CMAKE_COMMAND} + -E copy_if_different + $ + $ + COMMAND_EXPAND_LISTS + ) + + cmake_policy(POP) +endif () if(NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR) gtest_discover_tests(libtransmission-test diff --git a/tests/libtransmission/announce-list-test.cc b/tests/libtransmission/announce-list-test.cc index 624bd2e04..7b21daf39 100644 --- a/tests/libtransmission/announce-list-test.cc +++ b/tests/libtransmission/announce-list-test.cc @@ -13,6 +13,8 @@ #include +#include + #include #include diff --git a/tests/libtransmission/announcer-udp-test.cc b/tests/libtransmission/announcer-udp-test.cc index e53ad18a5..c9a2b68a9 100644 --- a/tests/libtransmission/announcer-udp-test.cc +++ b/tests/libtransmission/announcer-udp-test.cc @@ -26,6 +26,8 @@ #include +#include + #define LIBTRANSMISSION_ANNOUNCER_MODULE #include diff --git a/tests/libtransmission/api-compat-test.cc b/tests/libtransmission/api-compat-test.cc index 0b68050c6..bf0b4ba48 100644 --- a/tests/libtransmission/api-compat-test.cc +++ b/tests/libtransmission/api-compat-test.cc @@ -5,11 +5,12 @@ #include +#include + #include #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using ApiCompatTest = ::libtransmission::test::TransmissionTest; diff --git a/tests/libtransmission/bitfield-test.cc b/tests/libtransmission/bitfield-test.cc index 7350fcf28..ea51614cc 100644 --- a/tests/libtransmission/bitfield-test.cc +++ b/tests/libtransmission/bitfield-test.cc @@ -10,11 +10,11 @@ #include #include +#include + #include #include -#include "gtest/gtest.h" - TEST(Bitfield, count) { auto constexpr IterCount = size_t{ 10000U }; diff --git a/tests/libtransmission/blocklist-test.cc b/tests/libtransmission/blocklist-test.cc index b67d9a4ad..ce40d74f7 100644 --- a/tests/libtransmission/blocklist-test.cc +++ b/tests/libtransmission/blocklist-test.cc @@ -6,13 +6,14 @@ #include #include +#include + #include #include #include // tr_session.addressIsBlocked() #include -#include "gtest/gtest.h" #include "test-fixtures.h" namespace libtransmission::test diff --git a/tests/libtransmission/clients-test.cc b/tests/libtransmission/clients-test.cc index 2ce7659d2..07a8f389c 100644 --- a/tests/libtransmission/clients-test.cc +++ b/tests/libtransmission/clients-test.cc @@ -8,12 +8,12 @@ #include // size_t #include +#include + #include // tr_rand_obj() #include #include -#include "gtest/gtest.h" - using namespace std::literals; TEST(Client, clientForId) diff --git a/tests/libtransmission/copy-test.cc b/tests/libtransmission/copy-test.cc index 1dd6d0dac..a3ffa72ad 100644 --- a/tests/libtransmission/copy-test.cc +++ b/tests/libtransmission/copy-test.cc @@ -9,13 +9,14 @@ #include #include +#include + #include #include #include #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" namespace libtransmission::test diff --git a/tests/libtransmission/crypto-test.cc b/tests/libtransmission/crypto-test.cc index 181c9a2df..5f9c3e70c 100644 --- a/tests/libtransmission/crypto-test.cc +++ b/tests/libtransmission/crypto-test.cc @@ -13,13 +13,13 @@ #include #include +#include + #include #include #include #include -#include "gtest/gtest.h" - using namespace std::literals; namespace diff --git a/tests/libtransmission/dht-test.cc b/tests/libtransmission/dht-test.cc index 5209b7e4f..49fd979d7 100644 --- a/tests/libtransmission/dht-test.cc +++ b/tests/libtransmission/dht-test.cc @@ -32,6 +32,8 @@ #include +#include + #include #include // tr_rand_obj @@ -48,7 +50,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" #ifdef _WIN32 diff --git a/tests/libtransmission/error-test.cc b/tests/libtransmission/error-test.cc index db32f959d..315deb5d8 100644 --- a/tests/libtransmission/error-test.cc +++ b/tests/libtransmission/error-test.cc @@ -5,12 +5,12 @@ #include +#include + #include #include "test-fixtures.h" -#include "gtest/gtest.h" - using namespace std::literals; TEST(Error, errorSet) diff --git a/tests/libtransmission/file-test.cc b/tests/libtransmission/file-test.cc index 509cb2070..04773eac8 100644 --- a/tests/libtransmission/file-test.cc +++ b/tests/libtransmission/file-test.cc @@ -25,12 +25,13 @@ #include +#include + #include #include #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" #if !defined(__OpenBSD__) diff --git a/tests/libtransmission/handshake-test.cc b/tests/libtransmission/handshake-test.cc index 8c9e60ce8..fe8e8ef07 100644 --- a/tests/libtransmission/handshake-test.cc +++ b/tests/libtransmission/handshake-test.cc @@ -23,6 +23,8 @@ #include +#include + #include #include // tr_sha1_to_string, tr_base... @@ -37,7 +39,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/history-test.cc b/tests/libtransmission/history-test.cc index 6dc20047f..f97af9048 100644 --- a/tests/libtransmission/history-test.cc +++ b/tests/libtransmission/history-test.cc @@ -5,9 +5,9 @@ #include // size_t -#include +#include -#include "gtest/gtest.h" +#include TEST(History, recentHistory) { diff --git a/tests/libtransmission/json-test.cc b/tests/libtransmission/json-test.cc index 26ca6e7e3..990b7a9ff 100644 --- a/tests/libtransmission/json-test.cc +++ b/tests/libtransmission/json-test.cc @@ -11,13 +11,13 @@ #include #include +#include + #include #include #include #include -#include "gtest/gtest.h" - using namespace std::literals; class JSONTest : public ::testing::TestWithParam diff --git a/tests/libtransmission/lpd-test.cc b/tests/libtransmission/lpd-test.cc index 8eb124db1..970e01807 100644 --- a/tests/libtransmission/lpd-test.cc +++ b/tests/libtransmission/lpd-test.cc @@ -11,6 +11,8 @@ #include #include +#include + #include // tr_torrent_activity #include // tr_rand_obj() @@ -20,7 +22,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/makemeta-test.cc b/tests/libtransmission/makemeta-test.cc index 7b1e67476..c9a14737d 100644 --- a/tests/libtransmission/makemeta-test.cc +++ b/tests/libtransmission/makemeta-test.cc @@ -12,6 +12,8 @@ #include #include +#include + #include #include #include @@ -23,7 +25,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/move-test.cc b/tests/libtransmission/move-test.cc index 619785cc5..c18640819 100644 --- a/tests/libtransmission/move-test.cc +++ b/tests/libtransmission/move-test.cc @@ -9,6 +9,8 @@ #include #include +#include + #include #include @@ -20,7 +22,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/open-files-test.cc b/tests/libtransmission/open-files-test.cc index 7d4cbaebf..662d879a9 100644 --- a/tests/libtransmission/open-files-test.cc +++ b/tests/libtransmission/open-files-test.cc @@ -12,6 +12,8 @@ #include +#include + #include #include @@ -19,7 +21,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/peer-msgs-test.cc b/tests/libtransmission/peer-msgs-test.cc index 4c45e55e9..fa73a7006 100644 --- a/tests/libtransmission/peer-msgs-test.cc +++ b/tests/libtransmission/peer-msgs-test.cc @@ -3,7 +3,7 @@ // or any future license endorsed by Mnemosyne LLC. // License text can be found in the licenses/ folder. -#include "gtest/gtest.h" +#include TEST(PeerMsgs, placeholder) { diff --git a/tests/libtransmission/platform-test.cc b/tests/libtransmission/platform-test.cc index 9b2c49229..230a7ba0a 100644 --- a/tests/libtransmission/platform-test.cc +++ b/tests/libtransmission/platform-test.cc @@ -8,6 +8,8 @@ #include +#include + #include #include @@ -15,7 +17,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/remove-test.cc b/tests/libtransmission/remove-test.cc index 7aee2f793..522d0b3c9 100644 --- a/tests/libtransmission/remove-test.cc +++ b/tests/libtransmission/remove-test.cc @@ -10,13 +10,14 @@ #include #include +#include + #include #include #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/rename-test.cc b/tests/libtransmission/rename-test.cc index 1fe307b2a..49fe14365 100644 --- a/tests/libtransmission/rename-test.cc +++ b/tests/libtransmission/rename-test.cc @@ -11,6 +11,8 @@ #include #include +#include + #include #include @@ -21,7 +23,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" struct tr_ctor; diff --git a/tests/libtransmission/rpc-test.cc b/tests/libtransmission/rpc-test.cc index aec139426..881b30238 100644 --- a/tests/libtransmission/rpc-test.cc +++ b/tests/libtransmission/rpc-test.cc @@ -13,12 +13,13 @@ #include #include +#include + +#include #include #include #include -#include "gtest/gtest.h" -#include "libtransmission/quark.h" #include "test-fixtures.h" struct tr_session; diff --git a/tests/libtransmission/session-test.cc b/tests/libtransmission/session-test.cc index f7ae99da6..8baffe4ca 100644 --- a/tests/libtransmission/session-test.cc +++ b/tests/libtransmission/session-test.cc @@ -12,6 +12,8 @@ #include #include +#include + #include #include @@ -21,7 +23,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/subprocess-test.cc b/tests/libtransmission/subprocess-test.cc index e9fca1bb9..f7624403d 100644 --- a/tests/libtransmission/subprocess-test.cc +++ b/tests/libtransmission/subprocess-test.cc @@ -12,6 +12,8 @@ #include #include +#include + #include #include #include diff --git a/tests/libtransmission/test-fixtures.h b/tests/libtransmission/test-fixtures.h index e6321cd56..cb8dfe9f4 100644 --- a/tests/libtransmission/test-fixtures.h +++ b/tests/libtransmission/test-fixtures.h @@ -18,6 +18,8 @@ #include +#include + #include // tr_base64_decode() #include #include // tr_sys_file_*() @@ -27,8 +29,6 @@ #include #include -#include "gtest/gtest.h" - using namespace std::literals; inline std::ostream& operator<<(std::ostream& os, tr_error const& err) diff --git a/tests/libtransmission/timer-test.cc b/tests/libtransmission/timer-test.cc index 8862c92bc..d2680c3cc 100644 --- a/tests/libtransmission/timer-test.cc +++ b/tests/libtransmission/timer-test.cc @@ -8,6 +8,8 @@ #include +#include + #include #include #include diff --git a/tests/libtransmission/torrent-files-test.cc b/tests/libtransmission/torrent-files-test.cc index c49700bb6..c5b85cee6 100644 --- a/tests/libtransmission/torrent-files-test.cc +++ b/tests/libtransmission/torrent-files-test.cc @@ -11,6 +11,8 @@ #include #include +#include + #include #include @@ -18,7 +20,6 @@ #include "libtransmission/tr-macros.h" #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/torrent-magnet-test.cc b/tests/libtransmission/torrent-magnet-test.cc index 7c4f49c07..d6250b848 100644 --- a/tests/libtransmission/torrent-magnet-test.cc +++ b/tests/libtransmission/torrent-magnet-test.cc @@ -7,11 +7,12 @@ #include #include +#include + #include #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" namespace libtransmission::test diff --git a/tests/libtransmission/torrent-metainfo-test.cc b/tests/libtransmission/torrent-metainfo-test.cc index a6a53fb17..2b52e449d 100644 --- a/tests/libtransmission/torrent-metainfo-test.cc +++ b/tests/libtransmission/torrent-metainfo-test.cc @@ -9,6 +9,8 @@ #include #include +#include + #include #include @@ -20,7 +22,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/torrent-queue-test.cc b/tests/libtransmission/torrent-queue-test.cc index 914021e8e..56d46e862 100644 --- a/tests/libtransmission/torrent-queue-test.cc +++ b/tests/libtransmission/torrent-queue-test.cc @@ -9,10 +9,11 @@ #include #include +#include + #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using namespace std::literals; diff --git a/tests/libtransmission/torrents-test.cc b/tests/libtransmission/torrents-test.cc index d7644e764..334cb9262 100644 --- a/tests/libtransmission/torrents-test.cc +++ b/tests/libtransmission/torrents-test.cc @@ -11,6 +11,8 @@ #include #include +#include + #include #include diff --git a/tests/libtransmission/utils-test.cc b/tests/libtransmission/utils-test.cc index 5db1b5936..ccaac4b91 100644 --- a/tests/libtransmission/utils-test.cc +++ b/tests/libtransmission/utils-test.cc @@ -21,6 +21,8 @@ #include +#include + #include #include // tr_rand_int() @@ -29,7 +31,6 @@ #include #include -#include "gtest/gtest.h" #include "test-fixtures.h" using UtilsTest = ::libtransmission::test::TransmissionTest; diff --git a/tests/libtransmission/variant-test.cc b/tests/libtransmission/variant-test.cc index 329e8c503..43b17cd4b 100644 --- a/tests/libtransmission/variant-test.cc +++ b/tests/libtransmission/variant-test.cc @@ -14,6 +14,8 @@ #include #include +#include + #define LIBTRANSMISSION_VARIANT_MODULE #include diff --git a/tests/libtransmission/watchdir-test.cc b/tests/libtransmission/watchdir-test.cc index 746ab7478..7d67ea6af 100644 --- a/tests/libtransmission/watchdir-test.cc +++ b/tests/libtransmission/watchdir-test.cc @@ -20,6 +20,8 @@ #include +#include + #define LIBTRANSMISSION_WATCHDIR_MODULE #include diff --git a/third-party/small b/third-party/small index 46bb00342..d5e268f48 160000 --- a/third-party/small +++ b/third-party/small @@ -1 +1 @@ -Subproject commit 46bb00342b052b76a7b95ef639fcc601e80e2988 +Subproject commit d5e268f4845a1890e4a09d871995a8c2be7f2010 diff --git a/third-party/wide-integer b/third-party/wide-integer index c725651dd..aed8a39b3 160000 --- a/third-party/wide-integer +++ b/third-party/wide-integer @@ -1 +1 @@ -Subproject commit c725651dd2d97932822daf92337cf634eb56d9fa +Subproject commit aed8a39b3996350661be25df7b35bca3a7a5d4ec diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 35abbe55c..9492432e6 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -10,7 +10,7 @@ foreach(P create edit remote show) ${TR_NAME} CURL::libcurl fmt::fmt-header-only - libevent::event) + libevent::core) tr_win32_app_info(${TR_NAME}-${P} "Transmission Utility ('${P}')"