diff --git a/.github/actions/install-deps/action.yml b/.github/actions/install-deps/action.yml index 056785777..c939ca364 100644 --- a/.github/actions/install-deps/action.yml +++ b/.github/actions/install-deps/action.yml @@ -200,6 +200,7 @@ runs: # Transmission-specific libraries BASE_PACKAGES+=( crc32c + fmt libb64 libdeflate libevent diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index becfeb149..97314d015 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -388,6 +388,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' }} \ @@ -762,6 +764,7 @@ jobs: -DUSE_SYSTEM_DEFAULT=ON \ -DUSE_SYSTEM_CRC32C=OFF `# Not packaged in Debian 11` \ -DUSE_SYSTEM_DHT=OFF `# Not packaged in Debian 11` \ + -DUSE_SYSTEM_FMT=OFF `# Debian 11 package too old` \ -DUSE_SYSTEM_UTP=OFF `# Not packaged in Debian 11` - name: Build run: cmake --build obj --config RelWithDebInfo diff --git a/CMakeLists.txt b/CMakeLists.txt index 25d778efa..3200c2d28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ set(CURL_MINIMUM 7.28.0) set(WOLFSSL_MINIMUM 3.4) set(DEFLATE_MINIMUM 1.7) set(EVENT2_MINIMUM 2.1.0) +set(FMT_MINIMUM 8.0.1) set(GIOMM_MINIMUM 2.26.0) set(GLIBMM_MINIMUM 2.60.0) set(GTKMM3_MINIMUM 3.24.0) @@ -75,6 +76,7 @@ tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" ${USE_SYSTEM_DEFAULT} 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_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_UTP "Use system utp library" ${USE_SYSTEM_DEFAULT}) @@ -244,7 +246,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) @@ -579,6 +580,12 @@ tr_add_external_auto_library_legacy(CRC32C crc32c crc32c -DCRC32C_USE_GLOG=OFF -DCRC32C_INSTALL=ON) +tr_add_external_auto_library(FMT fmt + SUBPROJECT + CMAKE_ARGS + -DFMT_INSTALL=OFF + -DFMT_SYSTEM_HEADERS=ON) + 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/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/Findfmt.cmake b/cmake/Findfmt.cmake new file mode 100644 index 000000000..fade71ff1 --- /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 INTERFACE FMT_HEADER_ONLY=1) + target_compile_features(fmt::fmt-header-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/libtransmission/CMakeLists.txt b/libtransmission/CMakeLists.txt index daa84c6e1..99fc38b83 100644 --- a/libtransmission/CMakeLists.txt +++ b/libtransmission/CMakeLists.txt @@ -227,6 +227,8 @@ 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 $<$:WITH_CCRYPTO> $<$:WITH_MBEDTLS> $<$:WITH_OPENSSL>