From bc380511db6b3ba65e5236904a6dd196ca12db51 Mon Sep 17 00:00:00 2001 From: Mike Gelfand Date: Sun, 1 Jan 2023 11:49:48 -0800 Subject: [PATCH] Modernize CMake code (ongoing refactoring) (#4507) * Reformat CMake code * Bump minimum CMake version to 3.12 * Add target sources separately via `target_source()` * Make `tr_win32_app_info()` add target sources on its own * Don't use `include_directories()` * Don't use `add_definitions()` * Limit use of `add_compile_options()` * Move VDKQueue target declaration to a subdirectory * Add `tr_disable_source_files_compile()` helper * Add `tr_target_glib_resources()` helper * Add `tr_gettext_msgfmt()` helper * Enable AUTOUIC for Qt client * Enable AUTORCC for Qt client * Remove AUTO{MOC,RCC,UIC} source group overrides * Add `tr_target_idl_files()` helper * Move source group setup to `tr_qt_add_translation()` * Add `tr_target_xib_files()` helper * Prefer `target_sources()` to intermediate variables * Use explicit visibility versions of `target_*()` commands * Prefer genexes to conditions in `target_*()` commands * Add `tr_allow_compile_if()` helper * Leave only top-level `project()`, remove the rest * Minor fixups * Fixup Mac QL plugin install * Fixup IDE target folders and source groups --- CMakeLists.txt | 292 +++++------ cli/CMakeLists.txt | 33 +- cmake/FindAPPINDICATOR.cmake | 23 +- cmake/FindB64.cmake | 13 +- cmake/FindDEFLATE.cmake | 17 +- cmake/FindDHT.cmake | 15 +- cmake/FindEVENT2.cmake | 21 +- cmake/FindICONV.cmake | 17 +- cmake/FindMINIUPNPC.cmake | 40 +- cmake/FindMbedTLS.cmake | 19 +- cmake/FindNATPMP.cmake | 15 +- cmake/FindPSL.cmake | 15 +- cmake/FindSYSTEMD.cmake | 11 +- cmake/FindUTP.cmake | 18 +- cmake/FindWolfSSL.cmake | 15 +- cmake/LargeFileSupport.cmake | 7 +- cmake/TrMacros.cmake | 352 ++++++++++++- cmake/Transmission.tlb.rc.in | 6 + daemon/CMakeLists.txt | 89 ++-- dist/msi/CMakeLists.txt | 28 +- dist/msi/UtilityFunctions.cmake | 16 +- gtk/CMakeLists.txt | 448 ++++++++--------- libtransmission/CMakeLists.txt | 641 +++++++++++++----------- macosx/CMakeLists.txt | 556 ++++++++++---------- macosx/QuickLookPlugin/CMakeLists.txt | 125 ++--- macosx/VDKQueue/CMakeLists.txt | 14 + po/CMakeLists.txt | 43 +- qt/CMakeLists.txt | 404 ++++++++------- tests/CMakeLists.txt | 5 - tests/gtest/CMakeLists.txt | 19 +- tests/libtransmission/CMakeLists.txt | 133 ++--- tests/utils/CMakeLists.txt | 28 +- tests/utils/run_transmission_show.cmake | 77 ++- utils/CMakeLists.txt | 45 +- web/CMakeLists.txt | 116 ++--- 35 files changed, 2011 insertions(+), 1705 deletions(-) create mode 100644 cmake/Transmission.tlb.rc.in create mode 100644 macosx/VDKQueue/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 20a1b6f6d..493505976 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.9 FATAL_ERROR) +cmake_minimum_required(VERSION 3.12 FATAL_ERROR) if(POLICY CMP0092) cmake_policy(SET CMP0092 NEW) @@ -10,7 +10,9 @@ set(MACOS_SUPPORT_MINIMUM 10.13) # The value of this variable should be set prior to the first project() command invocation. # See: https://cmake.org/cmake/help/latest/variable/CMAKE_OSX_DEPLOYMENT_TARGET.html if(NOT CMAKE_OSX_DEPLOYMENT_TARGET) - set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOS_SUPPORT_MINIMUM} CACHE STRING "Minimum macOS version to target for deployment" FORCE) + set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOS_SUPPORT_MINIMUM} + CACHE STRING "Minimum macOS version to target for deployment" + FORCE) endif() project(transmission) @@ -23,60 +25,60 @@ include(CheckIncludeFile) include(CheckIncludeFiles) include(CheckFunctionExists) include(CheckLibraryExists) -include(CheckSymbolExists) include(ExternalProject) include(GNUInstallDirs) include(TrMacros) -set(CURL_MINIMUM 7.28.0) -set(WOLFSSL_MINIMUM 3.4) -set(DEFLATE_MINIMUM 1.10) -set(EVENT2_MINIMUM 2.1.0) -set(GIOMM_MINIMUM 2.26.0) -set(GLIBMM_MINIMUM 2.60.0) -set(GTKMM_MINIMUM 3.24.0) -set(OPENSSL_MINIMUM 0.9.7) -set(MBEDTLS_MINIMUM 1.3) -set(PSL_MINIMUM 0.21.1) -set(QT_MINIMUM 5.6) +set(CURL_MINIMUM 7.28.0) +set(WOLFSSL_MINIMUM 3.4) +set(DEFLATE_MINIMUM 1.10) +set(EVENT2_MINIMUM 2.1.0) +set(GIOMM_MINIMUM 2.26.0) +set(GLIBMM_MINIMUM 2.60.0) +set(GTKMM_MINIMUM 3.24.0) +set(OPENSSL_MINIMUM 0.9.7) +set(MBEDTLS_MINIMUM 1.3) +set(PSL_MINIMUM 0.21.1) +set(QT_MINIMUM 5.6) - option(ENABLE_DAEMON "Build daemon" ON) -tr_auto_option(ENABLE_GTK "Build GTK client" AUTO) -tr_auto_option(ENABLE_QT "Build Qt client" AUTO) -tr_auto_option(ENABLE_MAC "Build Mac client" AUTO) - option(ENABLE_WEB "Build Web client" OFF) - option(ENABLE_UTILS "Build utils (create, edit, show)" ON) - option(ENABLE_CLI "Build command-line client" OFF) - option(ENABLE_TESTS "Build unit tests" ON) - option(ENABLE_LIGHTWEIGHT "Optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc." OFF) - option(ENABLE_UTP "Build µTP support" ON) - option(ENABLE_WERROR "Treat warnings as errors" OFF) - option(ENABLE_NLS "Enable native language support" ON) - option(INSTALL_DOC "Build/install documentation" ON) - option(INSTALL_LIB "Install the library" OFF) -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) +option(ENABLE_DAEMON "Build daemon" ON) +tr_auto_option(ENABLE_GTK "Build GTK client" AUTO) +tr_auto_option(ENABLE_QT "Build Qt client" AUTO) +tr_auto_option(ENABLE_MAC "Build Mac client" AUTO) +option(ENABLE_WEB "Build Web client" OFF) +option(ENABLE_UTILS "Build utils (create, edit, show)" ON) +option(ENABLE_CLI "Build command-line client" OFF) +option(ENABLE_TESTS "Build unit tests" ON) +option(ENABLE_LIGHTWEIGHT + "Optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc." + OFF) +option(ENABLE_UTP "Build µTP support" ON) +option(ENABLE_WERROR "Treat warnings as errors" OFF) +option(ENABLE_NLS "Enable native language support" ON) +option(INSTALL_DOC "Build/install documentation" ON) +option(INSTALL_LIB "Install the library" OFF) +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_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) -tr_auto_option(WITH_INOTIFY "Enable inotify support (on systems that support it)" AUTO) -tr_auto_option(WITH_KQUEUE "Enable kqueue support (on systems that support it)" AUTO) -tr_auto_option(WITH_APPINDICATOR "Use appindicator for system tray icon in GTK client (GTK+ 3 only)" AUTO) -tr_auto_option(WITH_SYSTEMD "Add support for systemd startup notification (on systems that support it)" 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_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) +tr_auto_option(WITH_INOTIFY "Enable inotify support (on systems that support it)" AUTO) +tr_auto_option(WITH_KQUEUE "Enable kqueue support (on systems that support it)" AUTO) +tr_auto_option(WITH_APPINDICATOR "Use appindicator for system tray icon in GTK client (GTK+ 3 only)" AUTO) +tr_auto_option(WITH_SYSTEMD "Add support for systemd startup notification (on systems that support it)" AUTO) set(TR_NAME ${PROJECT_NAME}) # major.minor.patch[-[beta.N.]dev]+commit_hash # dev builds come between releases, e.g. autobuilds from CI - # these should be the only five lines you need to change set(TR_VERSION_MAJOR "4") set(TR_VERSION_MINOR "0") @@ -85,9 +87,9 @@ set(TR_VERSION_BETA_NUMBER "2") # empty string for not beta set(TR_VERSION_DEV TRUE) # derived from above: release type -if (TR_VERSION_DEV) +if(TR_VERSION_DEV) set(TR_NIGHTLY_RELEASE 1) -elseif (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") +elseif(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") set(TR_BETA_RELEASE 1) else() set(TR_STABLE_RELEASE 1) @@ -99,15 +101,15 @@ endif() # '4.0.0-beta.2' # '4.0.0' set(TR_SEMVER "${TR_VERSION_MAJOR}.${TR_VERSION_MINOR}.${TR_VERSION_PATCH}") -if (TR_VERSION_DEV OR NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") +if(TR_VERSION_DEV OR NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") string(APPEND TR_SEMVER "-") - if (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") + if(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") string(APPEND TR_SEMVER "beta.${TR_VERSION_BETA_NUMBER}") endif() - if (TR_VERSION_DEV AND NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") + if(TR_VERSION_DEV AND NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") string(APPEND TR_SEMVER ".") endif() - if (TR_VERSION_DEV) + if(TR_VERSION_DEV) string(APPEND TR_SEMVER "dev") endif() endif() @@ -127,16 +129,15 @@ string(SUBSTRING "${BASE62}" "${TR_VERSION_MINOR}" 1 TMPSTR) string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}") string(SUBSTRING "${BASE62}" "${TR_VERSION_PATCH}" 1 TMPSTR) string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}") -if (TR_VERSION_DEV) +if(TR_VERSION_DEV) string(APPEND TR_PEER_ID_PREFIX "Z") -elseif (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") +elseif(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") string(APPEND TR_PEER_ID_PREFIX "B") else() string(APPEND TR_PEER_ID_PREFIX "0") endif() string(APPEND TR_PEER_ID_PREFIX "-") - set(TR_VCS_REVISION_FILE "${CMAKE_SOURCE_DIR}/REVISION") if(EXISTS ${CMAKE_SOURCE_DIR}/.git) @@ -149,14 +150,10 @@ elseif(NOT "$ENV{TEAMCITY_PROJECT_NAME}" STREQUAL "" AND NOT "$ENV{BUILD_VCS_NUM set(TR_VCS_REVISION "$ENV{BUILD_VCS_NUMBER}") elseif(GIT_FOUND) execute_process( - COMMAND - ${GIT_EXECUTABLE} rev-list --max-count=1 HEAD - WORKING_DIRECTORY - ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE - TR_VCS_REVISION - OUTPUT_STRIP_TRAILING_WHITESPACE - ) + COMMAND ${GIT_EXECUTABLE} rev-list --max-count=1 HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE TR_VCS_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE) endif() if("${TR_VCS_REVISION}" STREQUAL "" AND EXISTS "${TR_VCS_REVISION_FILE}") @@ -196,9 +193,12 @@ if(WIN32) endforeach() endif() +set(CMAKE_FOLDER "third-party") + find_package(Fmt) -add_definitions(-DFMT_HEADER_ONLY -DFMT_EXCEPTIONS=0) -include_directories(SYSTEM ${LIBFMT_INCLUDE_DIRS}) +add_definitions( + -DFMT_HEADER_ONLY + -DFMT_EXCEPTIONS=0) find_package(WideInteger) find_package(FastFloat) @@ -221,7 +221,9 @@ endif() set(CRYPTO_PKG "") if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "ccrypto") tr_get_required_flag(WITH_CRYPTO CCRYPTO_IS_REQUIRED) - find_path(CCRYPTO_INCLUDE_DIR NAMES CommonCrypto/CommonCrypto.h ${CCRYPTO_IS_REQUIRED}) + find_path(CCRYPTO_INCLUDE_DIR + NAMES CommonCrypto/CommonCrypto.h + ${CCRYPTO_IS_REQUIRED}) mark_as_advanced(CCRYPTO_INCLUDE_DIR) tr_fixup_list_option(WITH_CRYPTO "ccrypto" CCRYPTO_INCLUDE_DIR "AUTO" CCRYPTO_IS_REQUIRED) if(WITH_CRYPTO STREQUAL "ccrypto") @@ -318,8 +320,17 @@ if(ENABLE_QT) set(ENABLE_QT_COM_INTEROP OFF) set(ENABLE_QT_DBUS_INTEROP OFF) - set(QT_REQUIRED_MODULES Core Gui Widgets Network Svg LinguistTools) - set(QT_OPTIONAL_MODULES DBus AxContainer AxServer) + set(QT_REQUIRED_MODULES + Core + Gui + Widgets + Network + Svg + LinguistTools) + set(QT_OPTIONAL_MODULES + DBus + AxContainer + AxServer) set(MISSING_QT_MODULE) set(Qt_NAMES Qt6 Qt5) @@ -413,7 +424,7 @@ tr_add_external_auto_library(EVENT2 libevent event tr_add_external_auto_library(NATPMP libnatpmp natpmp) if(NOT USE_SYSTEM_NATPMP) - set(NATPMP_DEFINITIONS -DNATPMP_STATICLIB) + set(NATPMP_DEFINITIONS NATPMP_STATICLIB) endif() tr_add_external_auto_library(MINIUPNPC miniupnpc miniupnpc @@ -421,9 +432,9 @@ tr_add_external_auto_library(MINIUPNPC miniupnpc miniupnpc -DUPNPC_BUILD_STATIC=ON -DUPNPC_BUILD_SHARED=OFF -DUPNPC_BUILD_TESTS=OFF) -set(MINIUPNPC_DEFINITIONS -DSYSTEM_MINIUPNP) +set(MINIUPNPC_DEFINITIONS SYSTEM_MINIUPNP) if(NOT USE_SYSTEM_MINIUPNPC) - list(APPEND MINIUPNPC_DEFINITIONS -DMINIUPNP_STATICLIB) + list(APPEND MINIUPNPC_DEFINITIONS MINIUPNP_STATICLIB) set(MINIUPNPC_VERSION 1.9) set(MINIUPNPC_API_VERSION 12) endif() @@ -437,15 +448,18 @@ tr_add_external_auto_library(PSL libpsl psl) if(ENABLE_UTP) tr_add_external_auto_library(UTP libutp utp - CMAKE_ARGS - -DLIBUTP_BUILD_PROGRAMS=OFF) + CMAKE_ARGS -DLIBUTP_BUILD_PROGRAMS=OFF) if(UTP_UPSTREAM_TARGET) # Use C++ linker for anything that depends on static libutp # TODO: switch to imported targets for all the dependencies add_library(UTP::UTP STATIC IMPORTED) - set_property(TARGET UTP::UTP PROPERTY IMPORTED_LOCATION "${UTP_LIBRARIES}") - set_property(TARGET UTP::UTP PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX") + set_property( + TARGET UTP::UTP + PROPERTY IMPORTED_LOCATION "${UTP_LIBRARIES}") + set_property( + TARGET UTP::UTP + PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX") set(UTP_LIBRARIES UTP::UTP) endif() endif() @@ -484,8 +498,6 @@ if(WITH_SYSTEMD) tr_fixup_auto_option(WITH_SYSTEMD SYSTEMD_FOUND SYSTEMD_IS_REQUIRED) endif() -include_directories(${CMAKE_BINARY_DIR}) - if(WIN32) foreach(L C CXX) # Filter out needless definitions @@ -493,6 +505,8 @@ if(WIN32) endforeach() endif() +unset(CMAKE_FOLDER) + ## Compiler standard version set(CMAKE_C_STANDARD 11) @@ -509,8 +523,7 @@ include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) if(MSVC) - set(WARNING_CANDIDATES - /W4) + set(WARNING_CANDIDATES /W4) foreach(FLAG ${WARNING_CANDIDATES}) list(APPEND C_WARNING_FLAGS ${FLAG}) @@ -573,7 +586,7 @@ else() set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}") string(TOLOWER "${CACHE_ID}" CACHE_ID) check_c_compiler_flag(${FLAG} ${CACHE_ID}) - if (${CACHE_ID}) + if(${CACHE_ID}) # Make sure the next loop only adds flags that are relevant for a particular language set(CMAKE_REQUIRED_FLAGS ${FLAG}) break() @@ -587,7 +600,7 @@ else() set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}") string(TOLOWER "${CACHE_ID}" CACHE_ID) check_c_compiler_flag(${FLAG} ${CACHE_ID}) - if (${CACHE_ID}) + if(${CACHE_ID}) list(APPEND C_WARNING_FLAGS ${FLAG}) endif() @@ -595,7 +608,7 @@ else() set(CACHE_ID "${CMAKE_CXX_COMPILER_ID}_CXX_HAS${FLAG_ID}") string(TOLOWER "${CACHE_ID}" CACHE_ID) check_cxx_compiler_flag(${FLAG} ${CACHE_ID}) - if (${CACHE_ID}) + if(${CACHE_ID}) list(APPEND CXX_WARNING_FLAGS ${FLAG}) endif() @@ -616,83 +629,11 @@ add_compile_options( include(LargeFileSupport) -set(NEEDED_HEADERS - sys/signalfd.h - sys/statvfs.h - xfs/xfs.h - xlocale.h) - -if(ENABLE_NLS) - check_library_exists(intl libintl_gettext "" HAVE_LIBINTL) - if(HAVE_LIBINTL) - set(LIBINTL_LIBRARY intl) - # check_function_exists() below may need this - # when looking for gettext() and ngettext() - list(APPEND CMAKE_REQUIRED_LIBRARIES intl) - endif() - - list(APPEND NEEDED_HEADERS libintl.h) -endif() - -foreach(H ${NEEDED_HEADERS}) - tr_make_id("${H}" H_ID) - check_include_file(${H} HAVE_${H_ID}) - if(HAVE_${H_ID}) - add_definitions(-DHAVE_${H_ID}) - endif() -endforeach() - -set(NEEDED_FUNCTIONS - _configthreadlocale - copy_file_range - copyfile - daemon - fallocate64 - flock - getmntent - gettext - htonll - mkdtemp - ngettext - ntohll - posix_fadvise - posix_fallocate - pread - pwrite - sendfile64 - statvfs - strlcpy - syslog) - -foreach(F ${NEEDED_FUNCTIONS}) - tr_make_id("${F}" F_ID) - check_function_exists(${F} HAVE_${F_ID}) - if(HAVE_${F_ID}) - add_definitions(-DHAVE_${F_ID}) - endif() -endforeach() - -if(ICONV_FOUND) - add_definitions(-DHAVE_ICONV) - if(ICONV_SECOND_ARGUMENT_IS_CONST) - add_definitions(-DICONV_SECOND_ARGUMENT_IS_CONST) - endif() -endif() - -# if(MINGW) -# check_function_exists(__mingw_printf HAVE_MINGW_PRINTF) -# if(HAVE_MINGW_PRINTF) -# add_definitions(-D__USE_MINGW_ANSI_STDIO=1 -D__STDC_FORMAT_MACROS=1) -# endif() -# endif() - check_library_exists(m sqrt "" HAVE_LIBM) if(HAVE_LIBM) set(LIBM_LIBRARY m) endif() -check_symbol_exists(SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT) - set(TR_NETWORK_LIBRARIES) if(WIN32) list(APPEND TR_NETWORK_LIBRARIES iphlpapi ws2_32) @@ -709,7 +650,7 @@ else() endif() if(RUN_CLANG_TIDY STREQUAL "AUTO") - if (DEFINED ENV{LGTM_SRC} OR DEFINED ENV{APPVEYOR}) # skip clang-tidy on LGTM/appveyor + if(DEFINED ENV{LGTM_SRC} OR DEFINED ENV{APPVEYOR}) # skip clang-tidy on LGTM/appveyor set(RUN_CLANG_TIDY OFF) else() set(RUN_CLANG_TIDY ON) @@ -719,7 +660,7 @@ endif() if(RUN_CLANG_TIDY) message(STATUS "Looking for clang-tidy") find_program(CLANG_TIDY clang-tidy) - if (CLANG_TIDY STREQUAL "CLANG_TIDY-NOTFOUND") + if(CLANG_TIDY STREQUAL "CLANG_TIDY-NOTFOUND") message(STATUS "Looking for clang-tidy - not found") else() message(STATUS "Looking for clang-tidy - found") @@ -733,7 +674,9 @@ if(ENABLE_TESTS) endif() function(tr_install_web DST_DIR) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/web/public_html DESTINATION ${DST_DIR}) + install( + DIRECTORY ${CMAKE_SOURCE_DIR}/web/public_html + DESTINATION ${DST_DIR}) endfunction() add_subdirectory(libtransmission) @@ -760,8 +703,17 @@ if(ENABLE_DAEMON OR ENABLE_GTK OR ENABLE_QT) endif() if(INSTALL_DOC) - install(FILES AUTHORS COPYING README.md docs/rpc-spec.md extras/send-email-when-torrent-done.sh DESTINATION ${CMAKE_INSTALL_DOCDIR}) - install(DIRECTORY news DESTINATION ${CMAKE_INSTALL_DOCDIR}) + install( + FILES + AUTHORS + COPYING + README.md + docs/rpc-spec.md + extras/send-email-when-torrent-done.sh + DESTINATION ${CMAKE_INSTALL_DOCDIR}) + install( + DIRECTORY news + DESTINATION ${CMAKE_INSTALL_DOCDIR}) endif() if(MSVC AND ENABLE_DAEMON AND ENABLE_QT AND ENABLE_UTILS AND WITH_CRYPTO STREQUAL "openssl") @@ -781,33 +733,27 @@ endif() list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}" "[.]git" - "node_modules" -) + "node_modules") ## Code Formatting if(GIT_FOUND) - execute_process(COMMAND - "${GIT_EXECUTABLE}" rev-parse --show-toplevel + execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --show-toplevel WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE TR_GIT_ROOT - OUTPUT_STRIP_TRAILING_WHITESPACE - ) + OUTPUT_STRIP_TRAILING_WHITESPACE) if(TR_GIT_ROOT AND IS_DIRECTORY "${TR_GIT_ROOT}/.git") - configure_file( - "${CMAKE_SOURCE_DIR}/extras/pre-commit" - "${TR_GIT_ROOT}/.git/hooks/pre-commit" - COPYONLY - ) + configure_file("${CMAKE_SOURCE_DIR}/extras/pre-commit" "${TR_GIT_ROOT}/.git/hooks/pre-commit" COPYONLY) add_custom_target(check-format COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" --check - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - ) + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") add_custom_target(format COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - ) - set_property(TARGET check-format format PROPERTY FOLDER "utility") + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_property( + TARGET check-format format + PROPERTY FOLDER "utility") endif() unset(TR_GIT_ROOT) endif() diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 053518a1c..b38e7b8b5 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -1,18 +1,33 @@ -project(trcli) +add_executable(${TR_NAME}-cli) -include_directories(${CMAKE_SOURCE_DIR}) +target_sources(${TR_NAME}-cli + PRIVATE + cli.cc) -tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE +target_include_directories(${TR_NAME}-cli + PRIVATE + ${CMAKE_SOURCE_DIR}) + +target_include_directories(${TR_NAME}-cli SYSTEM + PRIVATE + ${LIBFMT_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS}) + +target_link_libraries(${TR_NAME}-cli + PRIVATE + ${TR_NAME}) + +tr_win32_app_info(${TR_NAME}-cli "Transmission Utility ('cli', obsolete)" "${TR_NAME}-cli" "${TR_NAME}-cli.exe") -add_executable(${TR_NAME}-cli cli.cc ${${PROJECT_NAME}_WIN32_RC_FILE}) -include_directories(${TR_NAME}-cli ${CURL_INCLUDE_DIRS}) -target_link_libraries(${TR_NAME}-cli ${TR_NAME}) - -install(TARGETS ${TR_NAME}-cli DESTINATION ${CMAKE_INSTALL_BINDIR}) +install( + TARGETS ${TR_NAME}-cli + DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) - install(FILES ${TR_NAME}-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install( + FILES ${TR_NAME}-cli.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() diff --git a/cmake/FindAPPINDICATOR.cmake b/cmake/FindAPPINDICATOR.cmake index 91c04e141..c398b1314 100644 --- a/cmake/FindAPPINDICATOR.cmake +++ b/cmake/FindAPPINDICATOR.cmake @@ -1,8 +1,14 @@ find_package(PkgConfig QUIET) pkg_check_modules(PC_AYATANA_APPINDICATOR QUIET ayatana-appindicator3-0.1) -find_path(AYATANA_APPINDICATOR_INCLUDE_DIR NAMES libayatana-appindicator/app-indicator.h HINTS ${PC_AYATANA_APPINDICATOR_INCLUDE_DIRS}) -find_library(AYATANA_APPINDICATOR_LIBRARY NAMES ayatana-appindicator3 ayatana-appindicator HINTS ${PC_AYATANA_APPINDICATOR_LIBRARY_DIRS}) +find_path(AYATANA_APPINDICATOR_INCLUDE_DIR + NAMES libayatana-appindicator/app-indicator.h + HINTS ${PC_AYATANA_APPINDICATOR_INCLUDE_DIRS}) +find_library(AYATANA_APPINDICATOR_LIBRARY + NAMES + ayatana-appindicator3 + ayatana-appindicator + HINTS ${PC_AYATANA_APPINDICATOR_LIBRARY_DIRS}) if(AYATANA_APPINDICATOR_INCLUDE_DIR AND AYATANA_APPINDICATOR_LIBRARY) set(APPINDICATOR_INCLUDE_DIR ${AYATANA_APPINDICATOR_INCLUDE_DIR}) @@ -10,8 +16,14 @@ if(AYATANA_APPINDICATOR_INCLUDE_DIR AND AYATANA_APPINDICATOR_LIBRARY) set(APPINDICATOR_IS_AYATANA ON) else() pkg_check_modules(PC_APPINDICATOR QUIET appindicator3-0.1) - find_path(APPINDICATOR_INCLUDE_DIR NAMES libappindicator/app-indicator.h HINTS ${PC_APPINDICATOR_INCLUDE_DIRS}) - find_library(APPINDICATOR_LIBRARY NAMES appindicator3 appindicator HINTS ${PC_APPINDICATOR_LIBRARY_DIRS}) + find_path(APPINDICATOR_INCLUDE_DIR + NAMES libappindicator/app-indicator.h + HINTS ${PC_APPINDICATOR_INCLUDE_DIRS}) + find_library(APPINDICATOR_LIBRARY + NAMES + appindicator3 + appindicator + HINTS ${PC_APPINDICATOR_LIBRARY_DIRS}) set(APPINDICATOR_IS_AYATANA OFF) endif() @@ -20,8 +32,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(APPINDICATOR REQUIRED_VARS APPINDICATOR_LIBRARY - APPINDICATOR_INCLUDE_DIR -) + APPINDICATOR_INCLUDE_DIR) mark_as_advanced(AYATANA_APPINDICATOR_INCLUDE_DIR AYATANA_APPINDICATOR_LIBRARY) mark_as_advanced(APPINDICATOR_INCLUDE_DIR APPINDICATOR_LIBRARY) diff --git a/cmake/FindB64.cmake b/cmake/FindB64.cmake index 206ecc086..e015e7694 100644 --- a/cmake/FindB64.cmake +++ b/cmake/FindB64.cmake @@ -12,8 +12,14 @@ if(UNIX) 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}) +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}) @@ -23,8 +29,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(B64 REQUIRED_VARS B64_LIBRARY - B64_INCLUDE_DIR -) + B64_INCLUDE_DIR) mark_as_advanced(B64_INCLUDE_DIR B64_LIBRARY) diff --git a/cmake/FindDEFLATE.cmake b/cmake/FindDEFLATE.cmake index 806f2c267..c015a5bb4 100644 --- a/cmake/FindDEFLATE.cmake +++ b/cmake/FindDEFLATE.cmake @@ -8,13 +8,17 @@ if(DEFLATE_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - # pkg-config support added in libdeflate v1.9 - pkg_check_modules(_DEFLATE libdeflate>=${DEFLATE_MINIMUM}) + find_package(PkgConfig QUIET) + # pkg-config support added in libdeflate v1.9 + pkg_check_modules(_DEFLATE libdeflate>=${DEFLATE_MINIMUM}) endif() -find_path(DEFLATE_INCLUDE_DIR NAMES libdeflate.h HINTS ${_DEFLATE_INCLUDEDIR}) -find_library(DEFLATE_LIBRARY NAMES deflate HINTS ${_DEFLATE_LIBDIR}) +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}) @@ -26,8 +30,7 @@ find_package_handle_standard_args(DEFLATE REQUIRED_VARS DEFLATE_INCLUDE_DIR DEFLATE_LIBRARY - DEFLATE_VERSION -) + DEFLATE_VERSION) mark_as_advanced(DEFLATE_INCLUDE_DIR DEFLATE_LIBRARY) diff --git a/cmake/FindDHT.cmake b/cmake/FindDHT.cmake index 059292aca..23bb44c85 100644 --- a/cmake/FindDHT.cmake +++ b/cmake/FindDHT.cmake @@ -8,12 +8,16 @@ if(DHT_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_DHT QUIET libdht) + 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}) +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}) @@ -23,8 +27,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DHT REQUIRED_VARS DHT_LIBRARY - DHT_INCLUDE_DIR -) + DHT_INCLUDE_DIR) mark_as_advanced(DHT_INCLUDE_DIR DHT_LIBRARY) diff --git a/cmake/FindEVENT2.cmake b/cmake/FindEVENT2.cmake index 7c60bf387..22a160ad0 100644 --- a/cmake/FindEVENT2.cmake +++ b/cmake/FindEVENT2.cmake @@ -8,18 +8,25 @@ if(EVENT2_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_EVENT2 QUIET libevent) + 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}) +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 ]+\"[^\"]+\"") + 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() @@ -35,9 +42,7 @@ find_package_handle_standard_args(EVENT2 REQUIRED_VARS EVENT2_LIBRARY EVENT2_INCLUDE_DIR - VERSION_VAR - EVENT2_VERSION -) + VERSION_VAR EVENT2_VERSION) mark_as_advanced(EVENT2_INCLUDE_DIR EVENT2_LIBRARY) diff --git a/cmake/FindICONV.cmake b/cmake/FindICONV.cmake index 2f5933a2b..213a95f14 100644 --- a/cmake/FindICONV.cmake +++ b/cmake/FindICONV.cmake @@ -1,7 +1,13 @@ # Grabbed from http://public.kitware.com/Bug/view.php?id=13517 and slightly modified. -find_path(ICONV_INCLUDE_DIR iconv.h) -find_library(ICONV_LIBRARY NAMES iconv libiconv libiconv-2 c) +find_path(ICONV_INCLUDE_DIR + NAMES iconv.h) +find_library(ICONV_LIBRARY + NAMES + iconv + libiconv + libiconv-2 + c) set(ICONV_INCLUDE_DIRS ${ICONV_INCLUDE_DIR}) set(ICONV_LIBRARIES ${ICONV_LIBRARY}) @@ -12,9 +18,7 @@ find_package_handle_standard_args(ICONV REQUIRED_VARS ICONV_LIBRARY ICONV_INCLUDE_DIR - VERSION_VAR - ICONV_VERSION -) + VERSION_VAR ICONV_VERSION) if(ICONV_FOUND AND NOT DEFINED ICONV_SECOND_ARGUMENT_IS_CONST) include(CheckCXXSourceCompiles) @@ -38,8 +42,7 @@ if(ICONV_FOUND AND NOT DEFINED ICONV_SECOND_ARGUMENT_IS_CONST) FAIL_REGEX "discards qualifiers in nested pointer types" FAIL_REGEX "incompatible pointer type" FAIL_REGEX "invalid conversion" - FAIL_REGEX "no matching function" - ) + FAIL_REGEX "no matching function") set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_LIBRARIES) diff --git a/cmake/FindMINIUPNPC.cmake b/cmake/FindMINIUPNPC.cmake index 85410708d..99e19068c 100644 --- a/cmake/FindMINIUPNPC.cmake +++ b/cmake/FindMINIUPNPC.cmake @@ -8,18 +8,25 @@ if(MINIUPNPC_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_MINIUPNPC QUIET libminiupnpc) + 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}) +find_path(MINIUPNPC_INCLUDE_DIR + NAMES miniupnpc/miniupnpc.h + HINTS ${_MINIUPNPC_INCLUDEDIR}) +find_library(MINIUPNPC_LIBRARY + NAMES + miniupnpc + libminiupnpc + HINTS ${_MINIUPNPC_LIBDIR}) if(MINIUPNPC_INCLUDE_DIR) if(_MINIUPNPC_VERSION) set(MINIUPNPC_VERSION ${_MINIUPNPC_VERSION}) else() - file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.h" MINIUPNPC_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_VERSION[\t ]+\"[^\"]+\"") + file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.h" MINIUPNPC_VERSION_STR + REGEX "^#define[\t ]+MINIUPNPC_VERSION[\t ]+\"[^\"]+\"") if(MINIUPNPC_VERSION_STR MATCHES "\"([^\"]+)\"") set(MINIUPNPC_VERSION "${CMAKE_MATCH_1}") endif() @@ -27,7 +34,8 @@ if(MINIUPNPC_INCLUDE_DIR) # Let's hope it's 1.7 or higher, since it provides # MINIUPNPC_API_VERSION and we won't have to figure # it out on our own - file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.h" MINIUPNPC_API_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+") + file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.h" MINIUPNPC_API_VERSION_STR + REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+") if(MINIUPNPC_API_VERSION_STR MATCHES "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)") set(MINIUPNPC_API_VERSION "${CMAKE_MATCH_1}") endif() @@ -37,8 +45,7 @@ if(MINIUPNPC_INCLUDE_DIR) # Or maybe it's miniupnp 1.6 if(NOT DEFINED MINIUPNPC_API_VERSION) file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c - " - #include + "#include #include #include #include @@ -52,12 +59,11 @@ if(MINIUPNPC_INCLUDE_DIR) char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0, 0, &errno ); - UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); + UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, \"TCP\", intClient, intPort, NULL, NULL, NULL ); return 0; - } - ") + }") try_compile(_MINIUPNPC_HAVE_VERSION_1_6 ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c @@ -75,8 +81,7 @@ if(MINIUPNPC_INCLUDE_DIR) # Or maybe it's miniupnp 1.5 if(NOT DEFINED MINIUPNPC_API_VERSION) file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c - " - #include + "#include #include #include int main() @@ -89,12 +94,11 @@ if(MINIUPNPC_INCLUDE_DIR) char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0 ); - UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); + UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, \"TCP\", intClient, intPort ); return 0; - } - ") + }") try_compile(_MINIUPNPC_HAVE_VERSION_1_5 ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c @@ -121,9 +125,7 @@ find_package_handle_standard_args(MINIUPNPC MINIUPNPC_LIBRARY MINIUPNPC_INCLUDE_DIR MINIUPNPC_API_VERSION - VERSION_VAR - MINIUPNPC_VERSION -) + VERSION_VAR MINIUPNPC_VERSION) mark_as_advanced(MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY) diff --git a/cmake/FindMbedTLS.cmake b/cmake/FindMbedTLS.cmake index 935a63538..cc40c570f 100644 --- a/cmake/FindMbedTLS.cmake +++ b/cmake/FindMbedTLS.cmake @@ -12,14 +12,21 @@ if(UNIX) pkg_check_modules(_MBEDTLS QUIET mbedtls) endif() -find_path(MBEDTLS_INCLUDE_DIR NAMES mbedtls/version.h HINTS ${_MBEDTLS_INCLUDEDIR}) -find_library(MBEDTLS_LIBRARY NAMES mbedtls HINTS ${_MBEDTLS_LIBDIR}) -find_library(MBEDCRYPTO_LIBRARY NAMES mbedcrypto HINTS ${_MBEDTLS_LIBDIR}) +find_path(MBEDTLS_INCLUDE_DIR + NAMES mbedtls/version.h + HINTS ${_MBEDTLS_INCLUDEDIR}) +find_library(MBEDTLS_LIBRARY + NAMES mbedtls + HINTS ${_MBEDTLS_LIBDIR}) +find_library(MBEDCRYPTO_LIBRARY + NAMES mbedcrypto + HINTS ${_MBEDTLS_LIBDIR}) if(_MBEDTLS_VERSION) set(MBEDTLS_VERSION ${_MBEDTLS_VERSION}) elseif(MBEDTLS_INCLUDE_DIR) - file(STRINGS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h" MBEDTLS_VERSION_STR REGEX "^#define[\t ]+MBEDTLS_VERSION_STRING[\t ]+\"[^\"]+\"") + file(STRINGS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h" MBEDTLS_VERSION_STR + REGEX "^#define[\t ]+MBEDTLS_VERSION_STRING[\t ]+\"[^\"]+\"") if(MBEDTLS_VERSION_STR MATCHES "\"([^\"]+)\"") set(MBEDTLS_VERSION "${CMAKE_MATCH_1}") endif() @@ -34,9 +41,7 @@ find_package_handle_standard_args(MbedTLS REQUIRED_VARS MBEDTLS_LIBRARY MBEDTLS_INCLUDE_DIR - VERSION_VAR - MBEDTLS_VERSION -) + VERSION_VAR MBEDTLS_VERSION) mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDCRYPTO_LIBRARY) diff --git a/cmake/FindNATPMP.cmake b/cmake/FindNATPMP.cmake index abac825ce..3fdaec90b 100644 --- a/cmake/FindNATPMP.cmake +++ b/cmake/FindNATPMP.cmake @@ -8,12 +8,16 @@ if(NATPMP_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_NATPMP QUIET libnatpmp) + 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}) +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}) @@ -23,8 +27,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(NATPMP REQUIRED_VARS NATPMP_LIBRARY - NATPMP_INCLUDE_DIR -) + NATPMP_INCLUDE_DIR) mark_as_advanced(NATPMP_INCLUDE_DIR NATPMP_LIBRARY) diff --git a/cmake/FindPSL.cmake b/cmake/FindPSL.cmake index 6ef2139fc..b0a6ceb4b 100644 --- a/cmake/FindPSL.cmake +++ b/cmake/FindPSL.cmake @@ -8,12 +8,16 @@ if(PSL_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_PSL QUIET libpsl) + 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}) +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}) @@ -23,8 +27,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(PSL REQUIRED_VARS PSL_LIBRARY - PSL_INCLUDE_DIR -) + PSL_INCLUDE_DIR) mark_as_advanced(PSL_INCLUDE_DIR PSL_LIBRARY) diff --git a/cmake/FindSYSTEMD.cmake b/cmake/FindSYSTEMD.cmake index c5dfb3dc8..487d7ed77 100644 --- a/cmake/FindSYSTEMD.cmake +++ b/cmake/FindSYSTEMD.cmake @@ -3,16 +3,19 @@ if(UNIX) pkg_check_modules(PC_SYSTEMD QUIET libsystemd) endif() -find_path(SYSTEMD_INCLUDE_DIR NAMES systemd/sd-daemon.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS}) -find_library(SYSTEMD_LIBRARY NAMES systemd HINTS ${PC_SYSTEMD_LIBRARY_DIRS}) +find_path(SYSTEMD_INCLUDE_DIR + NAMES systemd/sd-daemon.h + HINTS ${PC_SYSTEMD_INCLUDE_DIRS}) +find_library(SYSTEMD_LIBRARY + NAMES systemd + HINTS ${PC_SYSTEMD_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SYSTEMD REQUIRED_VARS SYSTEMD_LIBRARY - SYSTEMD_INCLUDE_DIR -) + SYSTEMD_INCLUDE_DIR) mark_as_advanced(SYSTEMD_INCLUDE_DIR SYSTEMD_LIBRARY) diff --git a/cmake/FindUTP.cmake b/cmake/FindUTP.cmake index 670df2a70..bc19e214f 100644 --- a/cmake/FindUTP.cmake +++ b/cmake/FindUTP.cmake @@ -8,12 +8,16 @@ if(UTP_PREFER_STATIC_LIB) endif() if(UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_UTP QUIET libutp) + 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}) +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(CheckSymbolExists) @@ -36,8 +40,7 @@ if(UTP_INCLUDE_DIR AND UTP_LIBRARY) utp_set_callback utp_set_userdata utp_write - utp_writev - ) + utp_writev) set(_UTP_OLD_CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES}") set(_UTP_OLD_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") @@ -71,8 +74,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(UTP REQUIRED_VARS UTP_LIBRARY - UTP_INCLUDE_DIR -) + UTP_INCLUDE_DIR) mark_as_advanced(UTP_INCLUDE_DIR UTP_LIBRARY) diff --git a/cmake/FindWolfSSL.cmake b/cmake/FindWolfSSL.cmake index 121b0e757..974801e93 100644 --- a/cmake/FindWolfSSL.cmake +++ b/cmake/FindWolfSSL.cmake @@ -12,13 +12,18 @@ if(UNIX) pkg_check_modules(_WOLFSSL QUIET wolfssl) endif() -find_path(WOLFSSL_INCLUDE_DIR NAMES wolfssl/version.h HINTS ${_WOLFSSL_INCLUDEDIR}) -find_library(WOLFSSL_LIBRARY NAMES wolfssl HINTS ${_WOLFSSL_LIBDIR}) +find_path(WOLFSSL_INCLUDE_DIR + NAMES wolfssl/version.h + HINTS ${_WOLFSSL_INCLUDEDIR}) +find_library(WOLFSSL_LIBRARY + NAMES wolfssl + HINTS ${_WOLFSSL_LIBDIR}) if(_WOLFSSL_VERSION) set(WOLFSSL_VERSION ${_WOLFSSL_VERSION}) elseif(WOLFSSL_INCLUDE_DIR) - file(STRINGS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h" WOLFSSL_VERSION_STR REGEX "^#define[\t ]+LIBWOLFSSL_VERSION_STRING[\t ]+\"[^\"]+\"") + file(STRINGS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h" WOLFSSL_VERSION_STR + REGEX "^#define[\t ]+LIBWOLFSSL_VERSION_STRING[\t ]+\"[^\"]+\"") if(WOLFSSL_VERSION_STR MATCHES "\"([^\"]+)\"") set(WOLFSSL_VERSION "${CMAKE_MATCH_1}") endif() @@ -33,9 +38,7 @@ find_package_handle_standard_args(WolfSSL REQUIRED_VARS WOLFSSL_LIBRARY WOLFSSL_INCLUDE_DIR - VERSION_VAR - WOLFSSL_VERSION -) + VERSION_VAR WOLFSSL_VERSION) mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY) diff --git a/cmake/LargeFileSupport.cmake b/cmake/LargeFileSupport.cmake index a94415beb..a0d59935e 100644 --- a/cmake/LargeFileSupport.cmake +++ b/cmake/LargeFileSupport.cmake @@ -7,12 +7,11 @@ if(NOT DEFINED NO_LFS_MACROS_REQUIRED) # We can't simply define LARGE_OFF_T to be 9223372036854775807, # since some C++ compilers masquerading as C compilers # incorrectly reject 9223372036854775807. - set(LFS_TEST_PROGRAM " - #include + set(LFS_TEST_PROGRAM + "#include #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; - int main() { return 0; } - ") + int main() { return 0; }") check_c_source_compiles("${LFS_TEST_PROGRAM}" NO_LFS_MACROS_REQUIRED) if(NOT NO_LFS_MACROS_REQUIRED) diff --git a/cmake/TrMacros.cmake b/cmake/TrMacros.cmake index a5e201f32..e1ed88bb4 100644 --- a/cmake/TrMacros.cmake +++ b/cmake/TrMacros.cmake @@ -1,3 +1,6 @@ +include(CheckFunctionExists) +include(CheckIncludeFile) + macro(tr_auto_option_changed NAME ACC VAL FIL STK) if(NOT ("${VAL}" STREQUAL "AUTO" OR "${VAL}" STREQUAL "ON" OR "${VAL}" STREQUAL "OFF")) if("${VAL}" STREQUAL "0" OR "${VAL}" STREQUAL "NO" OR "${VAL}" STREQUAL "FALSE" OR "${VAL}" STREQUAL "N") @@ -11,7 +14,8 @@ macro(tr_auto_option_changed NAME ACC VAL FIL STK) endmacro() macro(tr_auto_option NAME DESC VAL) - set(${NAME} "${VAL}" CACHE STRING "${DESC}") + set(${NAME} "${VAL}" + CACHE STRING "${DESC}") set_property(CACHE ${NAME} PROPERTY STRINGS "AUTO;ON;OFF") variable_watch(${NAME} tr_auto_option_changed) endmacro() @@ -57,7 +61,7 @@ endmacro() macro(tr_get_required_flag IVAR OVAR) set(${OVAR}) - if (${IVAR} AND NOT ${IVAR} STREQUAL "AUTO") + if(${IVAR} AND NOT ${IVAR} STREQUAL "AUTO") set(${OVAR} REQUIRED) endif() endmacro() @@ -69,6 +73,61 @@ function(tr_make_id INPUT OVAR) set(${OVAR} "${ID}" PARENT_SCOPE) endfunction() +function(tr_string_unindent RESULT_VAR TEXT) + if(TEXT MATCHES [==[^([ ]+)]==]) + string(REGEX REPLACE "(^|\n)${CMAKE_MATCH_1}($|.)" "\\1\\2" TEXT "${TEXT}") + endif() + set(${RESULT_VAR} "${TEXT}" PARENT_SCOPE) +endfunction() + +macro(tr_eval SCRIPT) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18) + cmake_language(EVAL CODE "${SCRIPT}") + else() + tr_string_unindent(_TR_EVAL_SCRIPT "${SCRIPT}") + + string(SHA1 _TR_EVAL_TMP_FILE "${_TR_EVAL_SCRIPT}") + string(SUBSTRING "${_TR_EVAL_TMP_FILE}" 0 10 _TR_EVAL_TMP_FILE) + set(_TR_EVAL_TMP_FILE "${CMAKE_BINARY_DIR}/.tr-cache/tr_eval.${_TR_EVAL_TMP_FILE}.cmake") + + if(NOT EXISTS "${_TR_EVAL_TMP_FILE}") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/.tr-cache") + file(WRITE "${_TR_EVAL_TMP_FILE}" "${_TR_EVAL_SCRIPT}") + endif() + + include("${_TR_EVAL_TMP_FILE}") + + unset(_TR_EVAL_TMP_FILE) + unset(_TR_EVAL_SCRIPT) + endif() +endmacro() + +function(tr_process_list_conditions VAR_PREFIX) + set(ALLOWED_ITEMS) + set(DISALLOWED_ITEMS) + + set(ALLOW TRUE) + foreach(ARG IN LISTS ARGN) + if(ARG MATCHES [==[^\[(.+)\]$]==]) + set(COND "${CMAKE_MATCH_1}") + string(STRIP "${COND}" COND) + tr_eval("\ + if(${COND}) + set(ALLOW TRUE) + else() + set(ALLOW FALSE) + endif()") + elseif(ALLOW) + list(APPEND ALLOWED_ITEMS "${ARG}") + else() + list(APPEND DISALLOWED_ITEMS "${ARG}") + endif() + endforeach() + + set(${VAR_PREFIX}_ALLOWED "${ALLOWED_ITEMS}" PARENT_SCOPE) + set(${VAR_PREFIX}_DISALLOWED "${DISALLOWED_ITEMS}" PARENT_SCOPE) +endfunction() + macro(tr_add_external_auto_library ID DIRNAME LIBNAME) if(USE_SYSTEM_${ID}) tr_get_required_flag(USE_SYSTEM_${ID} SYSTEM_${ID}_IS_REQUIRED) @@ -82,8 +141,10 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME) set(${ID}_UPSTREAM_TARGET ${LIBNAME}) set(${ID}_PREFIX "${CMAKE_BINARY_DIR}/third-party/${${ID}_UPSTREAM_TARGET}") - set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include" CACHE INTERNAL "") - set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE INTERNAL "") + set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include" + CACHE INTERNAL "") + set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" + CACHE INTERNAL "") set(${ID}_INCLUDE_DIRS ${${ID}_INCLUDE_DIR}) set(${ID}_LIBRARIES ${${ID}_LIBRARY}) @@ -114,8 +175,7 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME) "-DCMAKE_INSTALL_PREFIX:PATH=" "-DCMAKE_INSTALL_LIBDIR:STRING=lib" ${${ID}_EXT_PROJ_CMAKE_ARGS} - BUILD_BYPRODUCTS "${${ID}_LIBRARY}" - ) + BUILD_BYPRODUCTS "${${ID}_LIBRARY}") set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "third-party") endif() @@ -129,7 +189,47 @@ function(tr_append_target_property TGT PROP VAL) set_target_properties(${TGT} PROPERTIES ${PROP} "${VAL}") endfunction() -function(tr_win32_app_info OVAR DESCR INTNAME ORIGFNAME) +function(tr_target_compile_definitions_for_headers TGT) + cmake_parse_arguments(ARG "" "" "PRIVATE;PUBLIC" ${ARGN}) + foreach(VISIBILITY IN ITEMS PRIVATE PUBLIC) + foreach(H IN LISTS ARG_${VISIBILITY}) + tr_make_id("HAVE_${H}" H_ID) + check_include_file(${H} ${H_ID}) + target_compile_definitions(${TGT} + ${VISIBILITY} + $<$:${H_ID}>) + endforeach() + endforeach() +endfunction() + +function(tr_target_compile_definitions_for_functions TGT) + cmake_parse_arguments(ARG "" "" "PRIVATE;PUBLIC;REQUIRED_LIBS" ${ARGN}) + set(CMAKE_REQUIRED_LIBRARIES "${ARG_REQUIRED_LIBS}") + foreach(VISIBILITY IN ITEMS PRIVATE PUBLIC) + foreach(F IN LISTS ARG_${VISIBILITY}) + tr_make_id("HAVE_${F}" F_ID) + check_function_exists(${F} ${F_ID}) + target_compile_definitions(${TGT} + ${VISIBILITY} + $<$:${F_ID}>) + endforeach() + endforeach() +endfunction() + +function(tr_disable_source_files_compile) + if(ARGN) + set_property( + SOURCE ${ARGN} + PROPERTY HEADER_FILE_ONLY ON) + endif() +endfunction() + +function(tr_allow_compile_if) + tr_process_list_conditions(FILES ${ARGN}) + tr_disable_source_files_compile(${FILES_DISALLOWED}) +endfunction() + +function(tr_win32_app_info TGT DESCR INTNAME ORIGFNAME) if(NOT WIN32) return() endif() @@ -143,7 +243,9 @@ function(tr_win32_app_info OVAR DESCR INTNAME ORIGFNAME) configure_file("${CMAKE_SOURCE_DIR}/cmake/Transmission.rc.in" "${INTNAME}-app-info.rc") - set(${OVAR} "${CMAKE_CURRENT_BINARY_DIR}/${INTNAME}-app-info.rc" PARENT_SCOPE) + target_sources(${TGT} + PRIVATE + "${CMAKE_CURRENT_BINARY_DIR}/${INTNAME}-app-info.rc") endfunction() function(tr_select_library LIBNAMES FUNCNAME DIRS OVAR) @@ -180,7 +282,10 @@ function(tr_fixup_bundle_item BUNDLE_DIR BUNDLE_ITEMS DEP_DIRS) set(DEP_BUNDLE_PATH "Contents/MacOS/${DEP_NAME}") elseif(DEP_FULL_PATH MATCHES "^(.+)/(([^/]+[.]framework)/.+)$") set(DEP_NAME "${CMAKE_MATCH_2}") - file(COPY "${CMAKE_MATCH_1}/${CMAKE_MATCH_3}" DESTINATION "${BUNDLE_DIR}/Contents/Frameworks/" PATTERN "Headers" EXCLUDE) + file( + COPY "${CMAKE_MATCH_1}/${CMAKE_MATCH_3}" + DESTINATION "${BUNDLE_DIR}/Contents/Frameworks/" + PATTERN "Headers" EXCLUDE) set(DEP_BUNDLE_PATH "Contents/Frameworks/${DEP_NAME}") else() message(FATAL_ERROR "Don't know how to fixup '${DEP_FULL_PATH}'") @@ -198,28 +303,221 @@ function(tr_fixup_bundle_item BUNDLE_DIR BUNDLE_ITEMS DEP_DIRS) endwhile() endfunction() -macro(tr_qt_wrap_ui) - if(Qt_VERSION_MAJOR EQUAL 6) - qt6_wrap_ui(${ARGN}) - else() - qt5_wrap_ui(${ARGN}) - endif() -endmacro() +function(tr_glib_compile_resources TGT NAME INPUT_DIR INPUT_FILE OUTPUT_FILE_BASE) + if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE) + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_resources + OUTPUT_VARIABLE GLIB_COMPILE_RESOURCES_EXECUTABLE + OUTPUT_STRIP_TRAILING_WHITESPACE) -macro(tr_qt_add_resources) - if(Qt_VERSION_MAJOR EQUAL 6) - qt6_add_resources(${ARGN}) - else() - qt5_add_resources(${ARGN}) - endif() -endmacro() + if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE) + message(SEND_ERROR "Unable to find glib-compile-resources executable") + endif() -macro(tr_qt_add_translation) + set(GLIB_COMPILE_RESOURCES_EXECUTABLE "${GLIB_COMPILE_RESOURCES_EXECUTABLE}" + CACHE STRING "glib-compile-resources executable") + endif() + + set_property( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${INPUT_DIR}/${INPUT_FILE}") + + file(STRINGS "${INPUT_DIR}/${INPUT_FILE}" INPUT_LINES) + set(OUTPUT_DEPENDS) + foreach(INPUT_LINE IN LISTS INPUT_LINES) + if(INPUT_LINE MATCHES ">([^<]+)") + list(APPEND OUTPUT_DEPENDS "${INPUT_DIR}/${CMAKE_MATCH_1}") + endif() + endforeach() + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c" + COMMAND + "${GLIB_COMPILE_RESOURCES_EXECUTABLE}" + "--target=${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c" + "--sourcedir=${INPUT_DIR}" + --generate-source + --c-name "${NAME}" + "${INPUT_DIR}/${INPUT_FILE}" + DEPENDS + "${INPUT_DIR}/${INPUT_FILE}" + ${OUTPUT_DEPENDS} + WORKING_DIRECTORY "${INPUT_DIR}") + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h" + COMMAND + "${GLIB_COMPILE_RESOURCES_EXECUTABLE}" + "--target=${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h" + "--sourcedir=${INPUT_DIR}" + --generate-header + --c-name "${NAME}" + "${INPUT_DIR}/${INPUT_FILE}" + DEPENDS + "${INPUT_DIR}/${INPUT_FILE}" + ${OUTPUT_DEPENDS} + WORKING_DIRECTORY "${INPUT_DIR}") + + target_sources(${TGT} + PRIVATE + "${INPUT_DIR}/${INPUT_FILE}" + "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c" + "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h") + + source_group("Generated Files" + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c" + "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h") +endfunction() + +function(tr_target_glib_resources TGT) + foreach(ARG IN LISTS ARGN) + get_filename_component(ARG_PATH "${ARG}" ABSOLUTE) + string(SHA1 ARG_HASH "${ARG_PATH}") + string(SUBSTRING "${ARG_HASH}" 0 10 ARG_HASH) + + get_filename_component(ARG_NAME_WE "${ARG}" NAME_WE) + string(MAKE_C_IDENTIFIER "${ARG_NAME_WE}" ARG_ID) + + get_filename_component(ARG_DIR "${ARG_PATH}" DIRECTORY) + get_filename_component(ARG_NAME "${ARG}" NAME) + + tr_glib_compile_resources(${TGT} + "${ARG_ID}_${ARG_HASH}" + "${ARG_DIR}" + "${ARG_NAME}" + "${ARG_ID}-${ARG_HASH}") + endforeach() +endfunction() + +function(tr_gettext_msgfmt TGT OUTPUT_FILE INPUT_FILE) + get_filename_component(OUTPUT_FILE_EXT "${OUTPUT_FILE}" LAST_EXT) + if(OUTPUT_FILE_EXT STREQUAL ".desktop") + set(MODE_ARG "--desktop") + elseif(OUTPUT_FILE_EXT STREQUAL ".xml") + set(MODE_ARG "--xml") + else() + message(FATAL_ERROR "Unsupported output file extension: '${OUTPUT_FILE_EXT}'") + endif() + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ${MODE_ARG} -d ${CMAKE_SOURCE_DIR}/po --template ${INPUT_FILE} -o ${OUTPUT_FILE} + DEPENDS ${INPUT_FILE} + VERBATIM) + + target_sources(${TGT} + PRIVATE + "${INPUT_FILE}" + "${OUTPUT_FILE}") + + source_group("Generated Files" + FILES + "${OUTPUT_FILE}") +endfunction() + +macro(tr_qt_add_translation OUTPUT_FILES_VAR) if(Qt_VERSION_MAJOR EQUAL 6) - qt6_add_translation(${ARGN} OPTIONS -silent) + qt6_add_translation(${OUTPUT_FILES_VAR} ${ARGN} OPTIONS -silent) elseif(Qt_VERSION GREATER_EQUAL 5.11) - qt5_add_translation(${ARGN} OPTIONS -silent) + qt5_add_translation(${OUTPUT_FILES_VAR} ${ARGN} OPTIONS -silent) else() - qt5_add_translation(${ARGN}) + qt5_add_translation(${OUTPUT_FILES_VAR} ${ARGN}) endif() + + source_group("Generated Files" + FILES ${${OUTPUT_FILES_VAR}}) endmacro() + +function(tr_wrap_idl TGT INPUT_FILE OUTPUT_FILE_BASE) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb + COMMAND ${MIDL_EXECUTABLE} /tlb ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb ${INPUT_FILE} + DEPENDS ${INPUT_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + + configure_file("${CMAKE_SOURCE_DIR}/cmake/Transmission.tlb.rc.in" ${OUTPUT_FILE_BASE}.tlb.rc) + + target_sources(${TGT} + PRIVATE + ${INPUT_FILE} + ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb + ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb.rc) + + source_group("Generated Files" + FILES + ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb + ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb.rc) + + tr_disable_source_files_compile( + ${INPUT_FILE} + ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb) +endfunction() + +function(tr_target_idl_files TGT) + foreach(ARG IN LISTS ARGN) + get_filename_component(ARG_PATH "${ARG}" ABSOLUTE) + string(SHA1 ARG_HASH "${ARG_PATH}") + string(SUBSTRING "${ARG_HASH}" 0 10 ARG_HASH) + + get_filename_component(ARG_NAME_WE "${ARG}" NAME_WE) + string(MAKE_C_IDENTIFIER "${ARG_NAME_WE}" ARG_ID) + + tr_wrap_idl(${TGT} + "${ARG}" + "${ARG_ID}-${ARG_HASH}") + endforeach() +endfunction() + +function(tr_wrap_xib TGT INPUT_FILE OUTPUT_FILE OUTPUT_FOLDER) + if(NOT IBTOOL_EXECUTABLE) + find_program(IBTOOL_EXECUTABLE ibtool REQUIRED) + endif() + + if(OUTPUT_FOLDER) + string(PREPEND OUTPUT_FOLDER "/") + endif() + + get_filename_component(OUTPUT_FILE_DIR "${OUTPUT_FILE}" DIRECTORY) + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_FILE_DIR} + COMMAND ${IBTOOL_EXECUTABLE} --compile ${OUTPUT_FILE} ${INPUT_FILE} + DEPENDS ${INPUT_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM) + + target_sources(${TGT} + PRIVATE + ${INPUT_FILE} + ${OUTPUT_FILE}) + + set(RESOURCES_DIR Resources) + if(NOT CMAKE_GENERATOR STREQUAL Xcode) + string(APPEND RESOURCES_DIR "${OUTPUT_FOLDER}") + endif() + set_source_files_properties( + ${OUTPUT_FILE} + PROPERTIES + MACOSX_PACKAGE_LOCATION "${RESOURCES_DIR}") + + source_group("Resources${OUTPUT_FOLDER}" + FILES ${INPUT_FILE}) + + source_group("Generated Files${OUTPUT_FOLDER}" + FILES ${OUTPUT_FILE}) +endfunction() + +function(tr_target_xib_files TGT) + foreach(ARG IN LISTS ARGN) + get_filename_component(ARG_DIR "${ARG}" DIRECTORY) + get_filename_component(ARG_NAME_WLE "${ARG}" NAME_WLE) + + tr_wrap_xib(${TGT} + "${ARG}" + "${CMAKE_CURRENT_BINARY_DIR}/${ARG_DIR}/${ARG_NAME_WLE}.nib" + "${ARG_DIR}") + endforeach() +endfunction() diff --git a/cmake/Transmission.tlb.rc.in b/cmake/Transmission.tlb.rc.in new file mode 100644 index 000000000..dc3ffa1b1 --- /dev/null +++ b/cmake/Transmission.tlb.rc.in @@ -0,0 +1,6 @@ +#include "winresrc.h" + +#pragma code_page(1252) + +LANGUAGE 0, 0 +1 TYPELIB "${OUTPUT_FILE_BASE}.tlb" diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt index 41e8879c5..4e1a08b19 100644 --- a/daemon/CMakeLists.txt +++ b/daemon/CMakeLists.txt @@ -1,58 +1,61 @@ -project(trdaemon) +add_executable(${TR_NAME}-daemon) -if(WITH_SYSTEMD) - add_definitions(-DUSE_SYSTEMD) -endif() +target_sources(${TR_NAME}-daemon + PRIVATE + daemon.cc + daemon.h + daemon-posix.cc + daemon-win32.cc) -include_directories( - ${CMAKE_SOURCE_DIR} -) -include_directories( - SYSTEM - ${CURL_INCLUDE_DIRS} - ${EVENT2_INCLUDE_DIRS} -) +tr_allow_compile_if( + [=[[WIN32]]=] + daemon-win32.cc + [=[[NOT WIN32]]=] + daemon-posix.cc) -set(${PROJECT_NAME}_SOURCES - daemon.cc - daemon-posix.cc - daemon-win32.cc -) +target_compile_definitions(${TR_NAME}-daemon + PRIVATE + $<$:USE_SYSTEMD>) -if(WIN32) - set_source_files_properties(daemon-posix.cc PROPERTIES HEADER_FILE_ONLY ON) -else() - set_source_files_properties(daemon-win32.cc PROPERTIES HEADER_FILE_ONLY ON) -endif() +tr_target_compile_definitions_for_headers(${TR_NAME}-daemon + PRIVATE + sys/signalfd.h) -set(${PROJECT_NAME}_HEADERS - daemon.h -) +tr_target_compile_definitions_for_functions(${TR_NAME}-daemon + PRIVATE + daemon + syslog) -tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE +target_include_directories(${TR_NAME}-daemon + PRIVATE + ${CMAKE_SOURCE_DIR}) + +target_include_directories(${TR_NAME}-daemon SYSTEM + PRIVATE + ${LIBFMT_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS} + ${EVENT2_INCLUDE_DIRS} + $<$:${SYSTEMD_INCLUDE_DIRS}>) + +target_link_libraries(${TR_NAME}-daemon + PRIVATE + ${TR_NAME} + ${EVENT2_LIBRARIES} + $<$:${SYSTEMD_LIBRARIES}>) + +tr_win32_app_info(${TR_NAME}-daemon "Transmission Daemon" "${TR_NAME}-daemon" "${TR_NAME}-daemon.exe") -add_executable(${TR_NAME}-daemon - ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_HEADERS} - ${${PROJECT_NAME}_WIN32_RC_FILE}) - -target_link_libraries(${TR_NAME}-daemon - ${TR_NAME} - ${EVENT2_LIBRARIES} -) - -if(WITH_SYSTEMD) - target_include_directories(${TR_NAME}-daemon PRIVATE ${SYSTEMD_INCLUDE_DIRS}) - target_link_libraries(${TR_NAME}-daemon ${SYSTEMD_LIBRARIES}) -endif() - foreach(P daemon) - install(TARGETS ${TR_NAME}-${P} DESTINATION ${CMAKE_INSTALL_BINDIR}) + install( + TARGETS ${TR_NAME}-${P} + DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) - install(FILES ${TR_NAME}-${P}.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install( + FILES ${TR_NAME}-${P}.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() endforeach() diff --git a/dist/msi/CMakeLists.txt b/dist/msi/CMakeLists.txt index 9d19d0da5..b87d1ae75 100644 --- a/dist/msi/CMakeLists.txt +++ b/dist/msi/CMakeLists.txt @@ -1,5 +1,3 @@ -project(tr-dist-msi) - include(UtilityFunctions.cmake) if(CMAKE_SIZEOF_VOID_P EQUAL 8) @@ -56,7 +54,9 @@ else() set(TR_OPENSSL_SSL_NAME "ssleay32.dll") endif() -file(COPY "${CMAKE_SOURCE_DIR}/qt/icons/transmission.ico" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file( + COPY "${CMAKE_SOURCE_DIR}/qt/icons/transmission.ico" + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) set(WEBSRCDIR "${CMAKE_INSTALL_PREFIX}/share/transmission/public_html") set(TRQMSRCDIR "${CMAKE_INSTALL_PREFIX}/share/transmission/translations") @@ -66,11 +66,11 @@ configure_file(TransmissionConfig.wxi.in TransmissionConfig.wxi) wix_heat(WebUi.wxs "${WEBSRCDIR}" WebUiComponents WEBINSTALLDIR var.WebSrcDir) wix_heat(QtClientTranslations.wxs "${TRQMSRCDIR}" QtClientTranslationsComponents QMINSTALLDIR var.TrQmSrcDir) -wix_heat(QtTranslations.wxs "${QTQMSRCDIR}" QtTranslationsComponents QMINSTALLDIR var.QtQmSrcDir XSL_TRANSFORM QtTranslations.xsl) +wix_heat(QtTranslations.wxs "${QTQMSRCDIR}" QtTranslationsComponents QMINSTALLDIR var.QtQmSrcDir + XSL_TRANSFORM QtTranslations.xsl) -wix_candle(${PROJECT_NAME}_OBJS - ARCHITECTURE - ${ARCH} +wix_candle(WIX_OBJS + ARCHITECTURE ${ARCH} SOURCES components/CliTools.wxs components/CommonLibs.wxs @@ -95,14 +95,11 @@ wix_candle(${PROJECT_NAME}_OBJS "MsvcCrtMsmFile=${TR_MSVC_CRT_MSM_FILE}" "OpenSslCryptoName=${TR_OPENSSL_CRYPTO_NAME}" "OpenSslSslName=${TR_OPENSSL_SSL_NAME}" - EXTRA_DEPENDS - "${CMAKE_CURRENT_BINARY_DIR}/TransmissionConfig.wxi") + EXTRA_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/TransmissionConfig.wxi") -wix_light(${PROJECT_NAME}_OUTPUT - NAME - transmission-${MSI_FILENAME_VERSION}-${ARCH} - OBJECTS - ${${PROJECT_NAME}_OBJS} +wix_light(WIX_OUTPUT + NAME transmission-${MSI_FILENAME_VERSION}-${ARCH} + OBJECTS ${WIX_OBJS} EXTENSIONS WixUIExtension WixUtilExtension @@ -119,5 +116,4 @@ add_custom_target(pack-msi QtTranslations.xsl Transmission.wxs TransmissionConfig.wxi.in - DEPENDS - "${${PROJECT_NAME}_OUTPUT}") + DEPENDS "${WIX_OUTPUT}") diff --git a/dist/msi/UtilityFunctions.cmake b/dist/msi/UtilityFunctions.cmake index 0bcc382fb..759be358f 100644 --- a/dist/msi/UtilityFunctions.cmake +++ b/dist/msi/UtilityFunctions.cmake @@ -22,8 +22,12 @@ function(find_msvc_crt_msm OUTPUT_VAR) set(CMN_PF_DIR "CommonProgramFiles(x86)") find_file(${OUTPUT_VAR} NAMES "${MSM_FILE}" - PATHS ${VC_VER_DIRS} $ENV{${CMN_PF_DIR}} - PATH_SUFFIXES "MergeModules" "Merge Modules") + PATHS + ${VC_VER_DIRS} + $ENV{${CMN_PF_DIR}} + PATH_SUFFIXES + "MergeModules" + "Merge Modules") message(STATUS " * Result: ${${OUTPUT_VAR}}") set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) @@ -76,7 +80,9 @@ function(wix_candle OUTPUT_VAR) add_custom_command( OUTPUT "${CANDLE_OUTPUT}" COMMAND candle ${OPTIONS} "${F}" -out "${CANDLE_OUTPUT}" - DEPENDS "${F}" ${CANDLE_EXTRA_DEPENDS}) + DEPENDS + "${F}" + ${CANDLE_EXTRA_DEPENDS}) list(APPEND ${OUTPUT_VAR} "${CANDLE_OUTPUT}") endforeach() @@ -96,7 +102,9 @@ function(wix_light OUTPUT_VAR) OUTPUT ${LIGHT_OUTPUT} BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.wixpdb" COMMAND light ${OPTIONS} -out "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.msi" ${LIGHT_OBJECTS} - DEPENDS ${LIGHT_OBJECTS} ${LIGHT_EXTRA_DEPENDS}) + DEPENDS + ${LIGHT_OBJECTS} + ${LIGHT_EXTRA_DEPENDS}) list(APPEND ${OUTPUT_VAR} ${LIGHT_OUTPUT}) set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) diff --git a/gtk/CMakeLists.txt b/gtk/CMakeLists.txt index c9ed110ba..54fd0df38 100644 --- a/gtk/CMakeLists.txt +++ b/gtk/CMakeLists.txt @@ -1,279 +1,245 @@ -project(trgtk) - -if(ENABLE_WERROR) - add_compile_options($,/WX,-Werror>) -endif() - -execute_process( - COMMAND - ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_resources - OUTPUT_VARIABLE - GLIB_COMPILE_RESOURCES_EXECUTABLE - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE) - message(SEND_ERROR "Unable to find glib-compile-resources executable") -endif() - find_program(APPSTREAM appstreamcli) +add_executable(${TR_NAME}-gtk WIN32) + +target_sources(${TR_NAME}-gtk + PRIVATE + Actions.cc + Actions.h + Application.cc + Application.h + DetailsDialog.cc + DetailsDialog.h + Dialogs.cc + Dialogs.h + FaviconCache.cc + FaviconCache.h + FileList.cc + FileList.h + FilterBar.cc + FilterBar.h + Flags.h + FreeSpaceLabel.cc + FreeSpaceLabel.h + GtkCompat.h + HigWorkarea.h + IconCache.cc + IconCache.h + ListModelAdapter.cc + ListModelAdapter.h + main.cc + MainWindow.cc + MainWindow.h + MakeDialog.cc + MakeDialog.h + MessageLogWindow.cc + MessageLogWindow.h + Notify.cc + Notify.h + OptionsDialog.cc + OptionsDialog.h + PathButton.cc + PathButton.h + Prefs.cc + Prefs.h + PrefsDialog.cc + PrefsDialog.h + RelocateDialog.cc + RelocateDialog.h + Session.cc + Session.h + StatsDialog.cc + StatsDialog.h + SystemTrayIcon.cc + SystemTrayIcon.h + Torrent.cc + Torrent.h + TorrentCellRenderer.cc + TorrentCellRenderer.h + TorrentFilter.cc + TorrentFilter.h + TorrentSorter.cc + TorrentSorter.h + Utils.cc + Utils.h) + +target_sources(${TR_NAME}-gtk + PRIVATE + ui/gtk3/AddTrackerDialog.ui + ui/gtk3/DetailsDialog.ui + ui/gtk3/EditTrackersDialog.ui + ui/gtk3/FilterBar.ui + ui/gtk3/MainWindow.ui + ui/gtk3/MakeDialog.ui + ui/gtk3/MakeProgressDialog.ui + ui/gtk3/MessageLogWindow.ui + ui/gtk3/OptionsDialog.ui + ui/gtk3/PrefsDialog.ui + ui/gtk3/RelocateDialog.ui + ui/gtk3/StatsDialog.ui + ui/gtk3/TorrentUrlChooserDialog.ui) + +source_group(Ui/GTK3 + REGULAR_EXPRESSION [[ui/gtk3/.*\.ui$]]) + +target_sources(${TR_NAME}-gtk + PRIVATE + ui/gtk4/AddTrackerDialog.ui + ui/gtk4/DetailsDialog.ui + ui/gtk4/EditTrackersDialog.ui + ui/gtk4/FilterBar.ui + ui/gtk4/MainWindow.ui + ui/gtk4/MakeDialog.ui + ui/gtk4/MakeProgressDialog.ui + ui/gtk4/MessageLogWindow.ui + ui/gtk4/OptionsDialog.ui + ui/gtk4/PrefsDialog.ui + ui/gtk4/RelocateDialog.ui + ui/gtk4/StatsDialog.ui + ui/gtk4/TorrentUrlChooserDialog.ui) + +source_group(Ui/GTK4 + REGULAR_EXPRESSION [[ui/gtk4/.*\.ui$]]) + +target_link_directories(${TR_NAME}-gtk + PRIVATE + ${GTK${GTK_VERSION}_LIBRARY_DIRS}) + +if(WITH_APPINDICATOR) + set_property( + SOURCE SystemTrayIcon.cc + APPEND + PROPERTY COMPILE_DEFINITIONS + HAVE_APPINDICATOR) + if(APPINDICATOR_IS_AYATANA) + set_property( + SOURCE SystemTrayIcon.cc + APPEND + PROPERTY COMPILE_DEFINITIONS + APPINDICATOR_IS_AYATANA) + endif() +endif() + if(GTK_VERSION EQUAL 4) set(UI_SUBDIR ui/gtk4) else() set(UI_SUBDIR ui/gtk3) endif() -set(${PROJECT_NAME}_UI_FILES - ${UI_SUBDIR}/AddTrackerDialog.ui - ${UI_SUBDIR}/DetailsDialog.ui - ${UI_SUBDIR}/EditTrackersDialog.ui - ${UI_SUBDIR}/FilterBar.ui - ${UI_SUBDIR}/MainWindow.ui - ${UI_SUBDIR}/MakeDialog.ui - ${UI_SUBDIR}/MakeProgressDialog.ui - ${UI_SUBDIR}/MessageLogWindow.ui - ${UI_SUBDIR}/OptionsDialog.ui - ${UI_SUBDIR}/PrefsDialog.ui - ${UI_SUBDIR}/RelocateDialog.ui - ${UI_SUBDIR}/StatsDialog.ui - ${UI_SUBDIR}/TorrentUrlChooserDialog.ui -) - -macro(gtr_compile_resources NAME INPUT_DIR INPUT_FILE OUTPUT_FILE_BASE) - add_custom_command( - OUTPUT - "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c" - "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h" - COMMAND - "${GLIB_COMPILE_RESOURCES_EXECUTABLE}" - "--target=${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c" - "--sourcedir=${INPUT_DIR}" - --generate-source - --c-name "${NAME}" - "${INPUT_DIR}/${INPUT_FILE}" - COMMAND - "${GLIB_COMPILE_RESOURCES_EXECUTABLE}" - "--target=${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h" - "--sourcedir=${INPUT_DIR}" - --generate-header - --c-name "${NAME}" - "${INPUT_DIR}/${INPUT_FILE}" - DEPENDS - "${INPUT_DIR}/${INPUT_FILE}" - ${ARGN} - WORKING_DIRECTORY - "${INPUT_DIR}" - ) -endmacro() - -gtr_compile_resources(transmission ${CMAKE_CURRENT_SOURCE_DIR} transmission.gresource.xml transmission-resources - icons/hicolor_apps_scalable_transmission.svg - icons/lock.svg - icons/options-symbolic.svg - icons/ratio-symbolic.svg - icons/turtle-symbolic.svg - transmission-ui.css - transmission-ui.xml -) -gtr_compile_resources(transmission_ui ${CMAKE_CURRENT_SOURCE_DIR}/${UI_SUBDIR} transmission-ui.gresource.xml transmission-ui-resources - ${${PROJECT_NAME}_UI_FILES} -) +tr_target_glib_resources(${TR_NAME}-gtk + transmission.gresource.xml + ${UI_SUBDIR}/transmission-ui.gresource.xml) if(ENABLE_NLS) - set(${PROJECT_NAME}_DESKTOP_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.desktop") - add_custom_command( - OUTPUT ${${PROJECT_NAME}_DESKTOP_FILE} - COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --desktop -d ${CMAKE_SOURCE_DIR}/po --template ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in -o ${${PROJECT_NAME}_DESKTOP_FILE} - DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in - VERBATIM - ) + set(DESKTOP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TR_NAME}-gtk.desktop") + tr_gettext_msgfmt(${TR_NAME}-gtk + ${DESKTOP_FILE} + ${CMAKE_CURRENT_SOURCE_DIR}/transmission-gtk.desktop.in) + target_sources(${TR_NAME}-gtk + PRIVATE + ${DESKTOP_FILE}) - set(${PROJECT_NAME}_METAINFO_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.metainfo.xml") - add_custom_command( - OUTPUT ${${PROJECT_NAME}_METAINFO_FILE} - COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --xml -d ${CMAKE_SOURCE_DIR}/po --template ${PROJECT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in -o ${${PROJECT_NAME}_METAINFO_FILE} - DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in - VERBATIM - ) - - source_group("Generated Files" FILES ${${PROJECT_NAME}_DESKTOP_FILE} ${${PROJECT_NAME}_METAINFO_FILE}) + set(METAINFO_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TR_NAME}-gtk.metainfo.xml") + tr_gettext_msgfmt(${TR_NAME}-gtk + ${METAINFO_FILE} + ${CMAKE_CURRENT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in) + target_sources(${TR_NAME}-gtk + PRIVATE + ${METAINFO_FILE}) endif() -set(${PROJECT_NAME}_SOURCES - Actions.cc - Application.cc - DetailsDialog.cc - Dialogs.cc - FaviconCache.cc - FileList.cc - FilterBar.cc - FreeSpaceLabel.cc - IconCache.cc - ListModelAdapter.cc - main.cc - MainWindow.cc - MakeDialog.cc - MessageLogWindow.cc - Notify.cc - OptionsDialog.cc - PathButton.cc - Prefs.cc - PrefsDialog.cc - RelocateDialog.cc - Session.cc - StatsDialog.cc - SystemTrayIcon.cc - Torrent.cc - TorrentCellRenderer.cc - TorrentFilter.cc - TorrentSorter.cc - Utils.cc - ${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.c - ${CMAKE_CURRENT_BINARY_DIR}/transmission-ui-resources.c -) +target_compile_definitions(${TR_NAME}-gtk + PRIVATE + TRANSMISSIONLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}" + GETTEXT_PACKAGE="${TR_NAME}-gtk" + G_DISABLE_DEPRECATED + GDK_PIXBUF_DISABLE_DEPRECATED + GDK_DISABLE_DEPRECATED + GTK_DISABLE_DEPRECATED + PANGO_DISABLE_DEPRECATED + # FIXME: these break libnotify's headers + # G_DISABLE_SINGLE_INCLUDES + # GTK_DISABLE_SINGLE_INCLUDES + GDKMM_DISABLE_DEPRECATED + GIOMM_DISABLE_DEPRECATED + GLIBMM_DISABLE_DEPRECATED + GTKMM_DISABLE_DEPRECATED + PANGOMM_DISABLE_DEPRECATED + SIGCXX_DISABLE_DEPRECATED + $<$:WITH_UTP>) -set(${PROJECT_NAME}_HEADERS - Actions.h - Application.h - DetailsDialog.h - Dialogs.h - FaviconCache.h - FileList.h - FilterBar.h - Flags.h - FreeSpaceLabel.h - GtkCompat.h - HigWorkarea.h - IconCache.h - ListModelAdapter.h - MainWindow.h - MakeDialog.h - MessageLogWindow.h - Notify.h - OptionsDialog.h - PathButton.h - Prefs.h - PrefsDialog.h - RelocateDialog.h - Session.h - StatsDialog.h - SystemTrayIcon.h - Torrent.h - TorrentCellRenderer.h - TorrentFilter.h - TorrentSorter.h - Utils.h - ${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.h - ${CMAKE_CURRENT_BINARY_DIR}/transmission-ui-resources.h -) +target_compile_options(${TR_NAME}-gtk + PRIVATE + ${GTK${GTK_VERSION}_CFLAGS_OTHER} + $<$:$,/WX,-Werror>> + $<$>:-Wno-exit-time-destructors>) -include_directories( - ${CMAKE_SOURCE_DIR} - ${PROJECT_BINARY_DIR} -) +target_include_directories(${TR_NAME}-gtk + PRIVATE + ${CMAKE_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}) -include_directories( - SYSTEM - ${GTK${GTK_VERSION}_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS} - ${EVENT2_INCLUDE_DIRS} -) - -if(WITH_APPINDICATOR) - include_directories(SYSTEM ${APPINDICATOR_INCLUDE_DIRS}) -endif() - -link_directories( - ${GTK${GTK_VERSION}_LIBRARY_DIRS} -) - -add_definitions( - "-DTRANSMISSIONLOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\"" - "-DGETTEXT_PACKAGE=\"${TR_NAME}-gtk\"" - -DG_DISABLE_DEPRECATED - -DGDK_PIXBUF_DISABLE_DEPRECATED - -DGDK_DISABLE_DEPRECATED - -DGTK_DISABLE_DEPRECATED - -DPANGO_DISABLE_DEPRECATED - # FIXME: these break libnotify's headers - # -DG_DISABLE_SINGLE_INCLUDES - # -DGTK_DISABLE_SINGLE_INCLUDES - -DGDKMM_DISABLE_DEPRECATED - -DGIOMM_DISABLE_DEPRECATED - -DGLIBMM_DISABLE_DEPRECATED - -DGTKMM_DISABLE_DEPRECATED - -DPANGOMM_DISABLE_DEPRECATED - -DSIGCXX_DISABLE_DEPRECATED - ${GTK${GTK_VERSION}_CFLAGS_OTHER} -) - -if(ENABLE_UTP) - add_definitions(-DWITH_UTP) -endif() - -if(WITH_APPINDICATOR) - set_property(SOURCE SystemTrayIcon.cc APPEND PROPERTY COMPILE_DEFINITIONS HAVE_APPINDICATOR) - if(APPINDICATOR_IS_AYATANA) - set_property(SOURCE SystemTrayIcon.cc APPEND PROPERTY COMPILE_DEFINITIONS APPINDICATOR_IS_AYATANA) - endif() -endif() - -tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE - "Transmission GTK+ Client" - "${TR_NAME}-gtk" - "${TR_NAME}-gtk.exe" - "${TR_NAME}.ico") - -add_executable(${TR_NAME}-gtk WIN32 - ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_HEADERS} - ${${PROJECT_NAME}_DESKTOP_FILE} - ${${PROJECT_NAME}_METAINFO_FILE} - ${${PROJECT_NAME}_WIN32_RC_FILE} -) +target_include_directories(${TR_NAME}-gtk SYSTEM + PRIVATE + ${LIBFMT_INCLUDE_DIRS} + ${GTK${GTK_VERSION}_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS} + ${EVENT2_INCLUDE_DIRS} + $<$:${APPINDICATOR_INCLUDE_DIRS}>) target_link_libraries(${TR_NAME}-gtk - ${TR_NAME} - ${GTK${GTK_VERSION}_LIBRARIES} - ${CURL_LIBRARIES} - ${EVENT2_LIBRARIES} -) - -if(WITH_APPINDICATOR) - target_link_libraries(${TR_NAME}-gtk ${APPINDICATOR_LIBRARIES}) -endif() - -if(NOT MSVC) - target_compile_options(${TR_NAME}-gtk PRIVATE -Wno-exit-time-destructors) -endif() + PRIVATE + ${TR_NAME} + ${GTK${GTK_VERSION}_LIBRARIES} + ${CURL_LIBRARIES} + ${EVENT2_LIBRARIES} + $<$:${APPINDICATOR_LIBRARIES}>) if(MSVC) tr_append_target_property(${TR_NAME}-gtk LINK_FLAGS "/ENTRY:mainCRTStartup") endif() -install(TARGETS ${TR_NAME}-gtk DESTINATION ${CMAKE_INSTALL_BINDIR}) +tr_win32_app_info(${TR_NAME}-gtk + "Transmission GTK+ Client" + "${TR_NAME}-gtk" + "${TR_NAME}-gtk.exe" + "${TR_NAME}.ico") -set(${PROJECT_NAME}_PUBLIC_ICONS +install( + TARGETS ${TR_NAME}-gtk + DESTINATION ${CMAKE_INSTALL_BINDIR}) + +set(PUBLIC_ICONS hicolor_apps_scalable_transmission.svg hicolor_apps_scalable_transmission-devel.svg - hicolor_apps_symbolic_transmission-symbolic.svg -) + hicolor_apps_symbolic_transmission-symbolic.svg) set(ICON_NAME_REGEX "^([^_]+)_([^_]+)_([^_]+)_(.+)$") -foreach(ICON ${${PROJECT_NAME}_PUBLIC_ICONS}) +foreach(ICON ${PUBLIC_ICONS}) string(REGEX REPLACE ${ICON_NAME_REGEX} "\\1/\\3/\\2" ICON_DIR ${ICON}) string(REGEX REPLACE ${ICON_NAME_REGEX} "\\4" ICON_NAME ${ICON}) - install(FILES icons/${ICON} DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/${ICON_DIR}/ RENAME ${ICON_NAME}) + install( + FILES icons/${ICON} + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/${ICON_DIR}/ + RENAME ${ICON_NAME}) endforeach() if(INSTALL_DOC) - install(FILES ${TR_NAME}-gtk.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install( + FILES ${TR_NAME}-gtk.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() if(ENABLE_NLS) - install(FILES ${${PROJECT_NAME}_DESKTOP_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) - install(FILES ${${PROJECT_NAME}_METAINFO_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) + install( + FILES ${DESKTOP_FILE} + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install( + FILES ${METAINFO_FILE} + DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) else() - install(FILES transmission-gtk.desktop.in DESTINATION ${CMAKE_INSTALL_DATADIR}/applications RENAME ${TR_NAME}-gtk.desktop) + install( + FILES transmission-gtk.desktop.in + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications + RENAME ${TR_NAME}-gtk.desktop) endif() diff --git a/libtransmission/CMakeLists.txt b/libtransmission/CMakeLists.txt index 8aa6d23f4..e17ee9f8c 100644 --- a/libtransmission/CMakeLists.txt +++ b/libtransmission/CMakeLists.txt @@ -1,321 +1,354 @@ -project(libtr) +include(CheckLibraryExists) +include(CheckSymbolExists) -configure_file( - version.h.in - version.h -) - -set(${PROJECT_NAME}_SOURCES - announce-list.cc - announcer-http.cc - announcer-udp.cc - announcer.cc - bandwidth.cc - bitfield.cc - block-info.cc - blocklist.cc - cache.cc - clients.cc - completion.cc - crypto-utils-ccrypto.cc - crypto-utils-fallback.cc - crypto-utils-mbedtls.cc - crypto-utils-openssl.cc - crypto-utils-wolfssl.cc - crypto-utils.cc - error.cc - file-piece-map.cc - file-posix.cc - file-win32.cc - file.cc - handshake.cc - inout.cc - log.cc - magnet-metainfo.cc - makemeta.cc - net.cc - open-files.cc - peer-io.cc - peer-mgr-active-requests.cc - peer-mgr-wishlist.cc - peer-mgr.cc - peer-mse.cc - peer-msgs.cc - peer-socket.cc - platform-quota.cc - platform.cc - port-forwarding-natpmp.cc - port-forwarding-upnp.cc - port-forwarding.cc - quark.cc - resume.cc - rpc-server.cc - rpcimpl.cc - session-id.cc - session-alt-speeds.cc - session-settings.cc - session-thread.cc - session.cc - stats.cc - subprocess-posix.cc - subprocess-win32.cc - timer-ev.cc - torrent-ctor.cc - torrent-files.cc - torrent-magnet.cc - torrent-metainfo.cc - torrent.cc - torrents.cc - tr-assert.cc - tr-assert.mm - tr-dht.cc - tr-getopt.cc - tr-lpd.cc - tr-udp.cc - tr-utp.cc - utils.cc - variant-benc.cc - variant-json.cc - variant.cc - variant-converters.cc - verify.cc - watchdir-generic.cc - watchdir-inotify.cc - watchdir-kqueue.cc - watchdir-win32.cc - watchdir.cc - web-utils.cc - web.cc - webseed.cc -) - -set_source_files_properties(crypto-utils-fallback.cc PROPERTIES HEADER_FILE_ONLY ON) -foreach(CP ccrypto mbedtls openssl wolfssl) - if(NOT CP STREQUAL CRYPTO_PKG) - set_source_files_properties(crypto-utils-${CP}.cc PROPERTIES HEADER_FILE_ONLY ON) +if(ENABLE_NLS) + check_library_exists(intl libintl_gettext "" HAVE_LIBINTL) + if(HAVE_LIBINTL) + set(LIBINTL_LIBRARY intl) endif() -endforeach() - -if(WITH_INOTIFY) - add_definitions(-DWITH_INOTIFY) -else() - set_source_files_properties(watchdir-inotify.cc PROPERTIES HEADER_FILE_ONLY ON) endif() -if(WITH_KQUEUE) - add_definitions(-DWITH_KQUEUE) -else() - set_source_files_properties(watchdir-kqueue.cc PROPERTIES HEADER_FILE_ONLY ON) -endif() +check_symbol_exists(SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT) -if(WIN32) - set_source_files_properties(file-posix.cc subprocess-posix.cc PROPERTIES HEADER_FILE_ONLY ON) -else() - set_source_files_properties(file-win32.cc subprocess-win32.cc watchdir-win32.cc PROPERTIES HEADER_FILE_ONLY ON) -endif() +add_library(${TR_NAME} STATIC) -if(APPLE) - set_source_files_properties(tr-assert.cc PROPERTIES HEADER_FILE_ONLY ON) -else() - set_source_files_properties(tr-assert.mm PROPERTIES HEADER_FILE_ONLY ON) -endif() +target_sources(${TR_NAME} + PRIVATE + announce-list.cc + announce-list.h + announcer-common.h + announcer-http.cc + announcer-udp.cc + announcer.cc + announcer.h + bandwidth.cc + bandwidth.h + benc.h + bitfield.cc + bitfield.h + block-info.cc + block-info.h + blocklist.cc + blocklist.h + cache.cc + cache.h + clients.cc + clients.h + completion.cc + completion.h + crypto-utils-ccrypto.cc + crypto-utils-fallback.cc + crypto-utils-mbedtls.cc + crypto-utils-openssl.cc + crypto-utils-wolfssl.cc + crypto-utils.cc + crypto-utils.h + error-types.h + error.cc + error.h + file-piece-map.cc + file-piece-map.h + file-posix.cc + file-win32.cc + file.cc + file.h + handshake.cc + handshake.h + history.h + inout.cc + inout.h + log.cc + log.h + lru-cache.h + magnet-metainfo.cc + magnet-metainfo.h + makemeta.cc + makemeta.h + mime-types.h + net.cc + net.h + open-files.cc + open-files.h + peer-common.h + peer-io.cc + peer-io.h + peer-mgr-active-requests.cc + peer-mgr-active-requests.h + peer-mgr-wishlist.cc + peer-mgr-wishlist.h + peer-mgr.cc + peer-mgr.h + peer-mse.cc + peer-mse.h + peer-msgs.cc + peer-msgs.h + peer-socket.cc + peer-socket.h + platform-quota.cc + platform-quota.h + platform.cc + platform.h + port-forwarding-natpmp.cc + port-forwarding-natpmp.h + port-forwarding-upnp.cc + port-forwarding-upnp.h + port-forwarding.cc + port-forwarding.h + quark.cc + quark.h + resume.cc + resume.h + rpc-server.cc + rpc-server.h + rpcimpl.cc + rpcimpl.h + session-alt-speeds.cc + session-alt-speeds.h + session-id.cc + session-id.h + session-settings.cc + session-thread.cc + session-thread.h + session.cc + session.h + stats.cc + stats.h + subprocess-posix.cc + subprocess-win32.cc + subprocess.h + timer-ev.cc + timer-ev.h + timer.h + torrent-ctor.cc + torrent-files.cc + torrent-files.h + torrent-magnet.cc + torrent-magnet.h + torrent-metainfo.cc + torrent-metainfo.h + torrent.cc + torrent.h + torrents.cc + torrents.h + tr-assert.cc + tr-assert.h + tr-assert.mm + tr-buffer.h + tr-dht.cc + tr-dht.h + tr-getopt.cc + tr-getopt.h + tr-lpd.cc + tr-lpd.h + tr-macros.h + tr-strbuf.h + tr-udp.cc + tr-utp.cc + tr-utp.h + transmission.h + utils-ev.h + utils.cc + utils.h + variant-benc.cc + variant-common.h + variant-converters.cc + variant-json.cc + variant.cc + variant.h + verify.cc + verify.h + version.h.in + watchdir-base.h + watchdir-generic.cc + watchdir-inotify.cc + watchdir-kqueue.cc + watchdir-win32.cc + watchdir.cc + watchdir.h + web-utils.cc + web-utils.h + web.cc + web.h + webseed.cc + webseed.h) -set(${PROJECT_NAME}_PUBLIC_HEADERS - ${PROJECT_BINARY_DIR}/version.h - error-types.h - error.h - file.h - log.h - makemeta.h - quark.h - rpcimpl.h - session-id.h - timer-ev.h - timer.h - tr-assert.h - tr-getopt.h - tr-macros.h - tr-strbuf.h - tr-buffer.h - transmission.h - utils.h - variant.h - watchdir.h - web-utils.h - web.h -) +configure_file(version.h.in version.h) -set(${PROJECT_NAME}_PRIVATE_HEADERS - announce-list.h - announcer-common.h - announcer.h - bandwidth.h - benc.h - bitfield.h - block-info.h - blocklist.h - cache.h - clients.h - completion.h - crypto-utils.h - file-piece-map.h - handshake.h - history.h - inout.h - lru-cache.h - magnet-metainfo.h - mime-types.h - net.h - open-files.h - peer-common.h - peer-io.h - peer-mgr-active-requests.h - peer-mgr-wishlist.h - peer-mgr.h - peer-mse.h - peer-msgs.h - peer-socket.h - platform-quota.h - platform.h - port-forwarding-natpmp.h - port-forwarding-upnp.h - port-forwarding.h - resume.h - rpc-server.h - session-alt-speeds.h - session-thread.h - session.h - stats.h - subprocess.h - torrent-files.h - torrent-magnet.h - torrent-metainfo.h - torrent.h - torrents.h - tr-dht.h - tr-lpd.h - tr-utp.h - utils-ev.h - variant-common.h - verify.h - version.h - watchdir-base.h - webseed.h -) +target_sources(${TR_NAME} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/version.h) -if(NOT ENABLE_UTP) - set_source_files_properties(tr-utp.cc PROPERTIES HEADER_FILE_ONLY ON) -endif() +tr_allow_compile_if( + [=[[TRUE]]=] + crypto-utils-fallback.cc + [=[[CRYPTO_PKG STREQUAL "ccrypto"]]=] + crypto-utils-ccrypto.cc + [=[[CRYPTO_PKG STREQUAL "mbedtls"]]=] + crypto-utils-mbedtls.cc + [=[[CRYPTO_PKG STREQUAL "openssl"]]=] + crypto-utils-openssl.cc + [=[[CRYPTO_PKG STREQUAL "wolfssl"]]=] + crypto-utils-wolfssl.cc + [=[[ENABLE_UTP]]=] + tr-utp.cc + [=[[WITH_INOTIFY]]=] + watchdir-inotify.cc + [=[[WITH_KQUEUE]]=] + watchdir-kqueue.cc + [=[[APPLE]]=] + tr-assert.mm + [=[[NOT APPLE]]=] + tr-assert.cc + [=[[WIN32]]=] + file-win32.cc + subprocess-win32.cc + watchdir-win32.cc + [=[[NOT WIN32]]=] + file-posix.cc + subprocess-posix.cc) -add_definitions( - -D__TRANSMISSION__ - -DWIDE_INTEGER_DISABLE_FLOAT_INTEROP - -DWIDE_INTEGER_DISABLE_IOSTREAM - "-DPACKAGE_DATA_DIR=\"${CMAKE_INSTALL_FULL_DATAROOTDIR}\"" - ${NATPMP_DEFINITIONS} - ${MINIUPNPC_DEFINITIONS} -) - -if(ENABLE_LIGHTWEIGHT) - add_definitions(-DTR_LIGHTWEIGHT) -endif() - -if(NOT ENABLE_NLS) - add_definitions(-DDISABLE_GETTEXT) -endif() - -if(ENABLE_UTP) - add_definitions(-DWITH_UTP) -endif() - -if(MINIUPNPC_VERSION VERSION_LESS 1.7) - # API version macro was only added in 1.7 - add_definitions(-DMINIUPNPC_API_VERSION=${MINIUPNPC_API_VERSION}) -endif() - -if(USE_SYSTEM_B64) - add_definitions(-DUSE_SYSTEM_B64) -endif() - -if(HAVE_SO_REUSEPORT) - add_definitions(-DHAVE_SO_REUSEPORT=1) -endif() - -include_directories( - ${PROJECT_SOURCE_DIR} - ${PROJECT_BINARY_DIR} -) - -include_directories( - SYSTEM - ${WIDE_INTEGER_INCLUDE_DIRS} - ${UTFCPP_INCLUDE_DIRS} - ${DEFLATE_INCLUDE_DIRS} - ${FAST_FLOAT_INCLUDE_DIRS} - ${CRYPTO_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS} - ${EVENT2_INCLUDE_DIRS} - ${PSL_INCLUDE_DIRS} - ${NATPMP_INCLUDE_DIRS} - ${MINIUPNPC_INCLUDE_DIRS} - ${DHT_INCLUDE_DIRS} - ${UTP_INCLUDE_DIRS} - ${B64_INCLUDE_DIRS} -) - -if(ICONV_FOUND) - include_directories(SYSTEM ${ICONV_INCLUDE_DIRS}) -endif() - -add_library(${TR_NAME} STATIC - ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_PUBLIC_HEADERS} - ${${PROJECT_NAME}_PRIVATE_HEADERS} -) - -foreach(UT ${EVENT2_UPSTREAM_TARGET} - ${NATPMP_UPSTREAM_TARGET} - ${MINIUPNPC_UPSTREAM_TARGET} - ${DHT_UPSTREAM_TARGET} - ${DEFLATE_UPSTREAM_TARGET} - ${UTP_UPSTREAM_TARGET} - ${PSL_UPSTREAM_TARGET} - ${B64_UPSTREAM_TARGET}) +foreach(UT + ${EVENT2_UPSTREAM_TARGET} + ${NATPMP_UPSTREAM_TARGET} + ${MINIUPNPC_UPSTREAM_TARGET} + ${DHT_UPSTREAM_TARGET} + ${DEFLATE_UPSTREAM_TARGET} + ${UTP_UPSTREAM_TARGET} + ${PSL_UPSTREAM_TARGET} + ${B64_UPSTREAM_TARGET}) add_dependencies(${TR_NAME} ${UT}) endforeach() +target_compile_definitions(${TR_NAME} + PRIVATE + __TRANSMISSION__ + WIDE_INTEGER_DISABLE_FLOAT_INTEROP + WIDE_INTEGER_DISABLE_IOSTREAM + PACKAGE_DATA_DIR="${CMAKE_INSTALL_FULL_DATAROOTDIR}" + $<$:WITH_INOTIFY> + $<$:WITH_KQUEUE> + $<$:TR_LIGHTWEIGHT> + $<$:WITH_UTP> + $<$:MINIUPNPC_API_VERSION=${MINIUPNPC_API_VERSION}> # API version macro was only added in 1.7 + $<$:USE_SYSTEM_B64> + $<$:HAVE_SO_REUSEPORT=1> + $<$:HAVE_ICONV> + $<$:ICONV_SECOND_ARGUMENT_IS_CONST> + ${NATPMP_DEFINITIONS} + ${MINIUPNPC_DEFINITIONS} + PUBLIC + $<$>:DISABLE_GETTEXT>) + +tr_target_compile_definitions_for_headers(${TR_NAME} + PRIVATE + sys/statvfs.h + xfs/xfs.h + xlocale.h) + +if(ENABLE_NLS) + tr_target_compile_definitions_for_headers(${TR_NAME} + PRIVATE + libintl.h) +endif() + +tr_target_compile_definitions_for_functions(${TR_NAME} + PRIVATE + copyfile + copy_file_range + fallocate64 + flock + getmntent + htonll + mkdtemp + ntohll + posix_fadvise + posix_fallocate + pread + pwrite + sendfile64 + statvfs + PUBLIC + gettext + ngettext + REQUIRED_LIBS + $<$:${LIBINTL_LIBRARY}>) # gettext, ngettext + +target_include_directories(${TR_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + INTERFACE + ${CMAKE_BINARY_DIR}) + +target_include_directories(${TR_NAME} SYSTEM + PRIVATE + ${WIDE_INTEGER_INCLUDE_DIRS} + ${UTFCPP_INCLUDE_DIRS} + ${DEFLATE_INCLUDE_DIRS} + ${FAST_FLOAT_INCLUDE_DIRS} + ${CRYPTO_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS} + ${PSL_INCLUDE_DIRS} + ${NATPMP_INCLUDE_DIRS} + ${MINIUPNPC_INCLUDE_DIRS} + ${DHT_INCLUDE_DIRS} + ${UTP_INCLUDE_DIRS} + ${B64_INCLUDE_DIRS} + $<$:${ICONV_INCLUDE_DIRS}> + PUBLIC + ${EVENT2_INCLUDE_DIRS} + ${LIBFMT_INCLUDE_DIRS}) + target_link_libraries(${TR_NAME} - ${CMAKE_THREAD_LIBS_INIT} - ${DEFLATE_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${CURL_LIBRARIES} - ${EVENT2_LIBRARIES} - ${PSL_LIBRARIES} - ${NATPMP_LIBRARIES} - ${MINIUPNPC_LIBRARIES} - ${DHT_LIBRARIES} - ${UTP_LIBRARIES} - ${B64_LIBRARIES} - ${LIBINTL_LIBRARY} - ${LIBM_LIBRARY} - ${TR_NETWORK_LIBRARIES} - jsonsl - wildmat -) - -if(ICONV_FOUND) - target_link_libraries(${TR_NAME} ${ICONV_LIBRARIES}) -endif() - -if(WIN32) - target_link_libraries(${TR_NAME} crypt32 shlwapi) -endif() - -if(APPLE) - target_link_libraries(${TR_NAME} "-framework Foundation") -endif() + PRIVATE + ${CMAKE_THREAD_LIBS_INIT} + ${DEFLATE_LIBRARIES} + ${CRYPTO_LIBRARIES} + ${CURL_LIBRARIES} + ${EVENT2_LIBRARIES} + ${PSL_LIBRARIES} + ${NATPMP_LIBRARIES} + ${MINIUPNPC_LIBRARIES} + ${DHT_LIBRARIES} + ${UTP_LIBRARIES} + ${B64_LIBRARIES} + ${LIBINTL_LIBRARY} + ${LIBM_LIBRARY} + ${TR_NETWORK_LIBRARIES} + jsonsl + wildmat + $<$:${ICONV_LIBRARIES}> + $<$:crypt32> + $<$:shlwapi> + "$<$:-framework Foundation>") if(INSTALL_LIB) - install(TARGETS ${TR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(FILES ${${PROJECT_NAME}_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TR_NAME}) + install( + TARGETS ${TR_NAME} + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install( + FILES + error-types.h + error.h + file.h + log.h + makemeta.h + quark.h + rpcimpl.h + session-id.h + timer-ev.h + timer.h + tr-assert.h + tr-buffer.h + tr-getopt.h + tr-macros.h + tr-strbuf.h + transmission.h + utils.h + variant.h + watchdir.h + web-utils.h + web.h + ${CMAKE_CURRENT_BINARY_DIR}/version.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TR_NAME}) endif() diff --git a/macosx/CMakeLists.txt b/macosx/CMakeLists.txt index 3db2af3a6..34f823217 100644 --- a/macosx/CMakeLists.txt +++ b/macosx/CMakeLists.txt @@ -1,186 +1,176 @@ -project(trmac) - if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS MACOS_SUPPORT_MINIMUM) message(FATAL_ERROR "Targeting macOS versions before ${MACOS_SUPPORT_MINIMUM} is not supported for the macOS project, please adjust CMAKE_OSX_DEPLOYMENT_TARGET (${CMAKE_OSX_DEPLOYMENT_TARGET})") endif() -include_directories(${CMAKE_SOURCE_DIR}) +set(MAC_BUNDLE_NAME Transmission) add_compile_options( -fcxx-modules -fmodules - -fobjc-arc) + -fobjc-arc + # #warnings are good practice in development + "-Wno-#warnings" + # GNU extensions are good practice in Objective-C + -Wno-gnu) find_program(ACTOOL_EXECUTABLE actool REQUIRED) find_program(CODESIGN_EXECUTABLE codesign REQUIRED) -find_program(IBTOOL_EXECUTABLE ibtool REQUIRED) -macro(tr_wrap_xib IFILE OFILE) - get_filename_component(twx_nib_dir "${OFILE}" DIRECTORY) - add_custom_command( - OUTPUT ${OFILE} - COMMAND ${CMAKE_COMMAND} -E make_directory ${twx_nib_dir} - COMMAND ${IBTOOL_EXECUTABLE} --compile ${OFILE} ${IFILE} - DEPENDS ${IFILE} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - VERBATIM - ) - source_group("Generated Files" FILES ${OFILE}) -endmacro() +add_subdirectory(QuickLookPlugin) +add_subdirectory(VDKQueue) -set(${PROJECT_NAME}_SOURCES - AboutWindowController.mm - AddMagnetWindowController.mm - AddWindowController.mm - BadgeView.mm - Badger.mm - BlocklistDownloader.mm - BlocklistDownloaderViewController.mm - BlocklistScheduler.mm - BonjourController.mm - ButtonToolbarItem.mm - ColorTextField.mm - Controller.mm - CreatorWindowController.mm - DragOverlayView.mm - DragOverlayWindow.mm - ExpandedPathToIconTransformer.mm - ExpandedPathToPathTransformer.mm - FileListNode.mm - FileNameCell.mm - FileOutlineController.mm - FileOutlineView.mm - FilePriorityCell.mm - FileRenameSheetController.mm - FilterBarController.mm - FilterBarView.mm - FilterButton.mm - GlobalOptionsPopoverViewController.mm - GroupPopUpButtonCell.mm - GroupTextCell.mm - GroupToolbarItem.mm - GroupsController.mm - GroupsPrefsController.mm - InfoActivityViewController.mm - InfoFileViewController.mm - InfoGeneralViewController.mm - InfoOptionsViewController.mm - InfoPeersViewController.mm - InfoTextField.mm - InfoTrackersViewController.mm - InfoWindowController.mm - main.mm - MessageWindowController.mm - NSApplicationAdditions.mm - NSDataAdditions.mm - NSImageAdditions.mm - NSKeyedUnarchiverAdditions.mm - NSMutableArrayAdditions.mm - NSStringAdditions.mm - PeerProgressIndicatorCell.mm - PeerTableView.mm - PiecesView.mm - PortChecker.mm - PredicateEditorRowTemplateAny.mm - PrefsController.mm - PrefsWindow.mm - PriorityPopUpButtonCell.mm - ProgressGradients.mm - ShareToolbarItem.mm - ShareTorrentFileHelper.mm - SparkleProxy.mm - StatsWindowController.mm - StatusBarController.mm - StatusBarView.mm - Toolbar.mm - Torrent.mm - TorrentCell.mm - TorrentGroup.mm - TorrentTableView.mm - TrackerCell.mm - TrackerNode.mm - TrackerTableView.mm - URLSheetWindowController.mm - WebSeedTableView.mm -) +add_executable(${TR_NAME}-mac MACOSX_BUNDLE) -set(${PROJECT_NAME}_HEADERS - AboutWindowController.h - AddMagnetWindowController.h - AddWindowController.h - BadgeView.h - Badger.h - BlocklistDownloader.h - BlocklistDownloaderViewController.h - BlocklistScheduler.h - BonjourController.h - ButtonToolbarItem.h - CocoaCompatibility.h - ColorTextField.h - Controller.h - CreatorWindowController.h - DragOverlayView.h - DragOverlayWindow.h - ExpandedPathToIconTransformer.h - ExpandedPathToPathTransformer.h - FileListNode.h - FileNameCell.h - FileOutlineController.h - FileOutlineView.h - FilePriorityCell.h - FileRenameSheetController.h - FilterBarController.h - FilterBarView.h - FilterButton.h - GlobalOptionsPopoverViewController.h - GroupPopUpButtonCell.h - GroupTextCell.h - GroupToolbarItem.h - GroupsController.h - GroupsPrefsController.h - InfoActivityViewController.h - InfoFileViewController.h - InfoGeneralViewController.h - InfoOptionsViewController.h - InfoPeersViewController.h - InfoTextField.h - InfoTrackersViewController.h - InfoViewController.h - InfoWindowController.h - MessageWindowController.h - NSApplicationAdditions.h - NSDataAdditions.h - NSImageAdditions.h - NSKeyedUnarchiverAdditions.h - NSMutableArrayAdditions.h - NSStringAdditions.h - PeerProgressIndicatorCell.h - PeerTableView.h - PiecesView.h - PortChecker.h - PredicateEditorRowTemplateAny.h - PrefsController.h - PrefsWindow.h - PriorityPopUpButtonCell.h - ProgressGradients.h - ShareToolbarItem.h - ShareTorrentFileHelper.h - StatsWindowController.h - StatusBarController.h - StatusBarView.h - Toolbar.h - Torrent.h - TorrentCell.h - TorrentGroup.h - TorrentTableView.h - TrackerCell.h - TrackerNode.h - TrackerTableView.h - URLSheetWindowController.h - WebSeedTableView.h -) +target_sources(${TR_NAME}-mac + PRIVATE + AboutWindowController.h + AboutWindowController.mm + AddMagnetWindowController.h + AddMagnetWindowController.mm + AddWindowController.h + AddWindowController.mm + Badger.h + Badger.mm + BadgeView.h + BadgeView.mm + BlocklistDownloader.h + BlocklistDownloader.mm + BlocklistDownloaderViewController.h + BlocklistDownloaderViewController.mm + BlocklistScheduler.h + BlocklistScheduler.mm + BonjourController.h + BonjourController.mm + ButtonToolbarItem.h + ButtonToolbarItem.mm + CocoaCompatibility.h + ColorTextField.h + ColorTextField.mm + Controller.h + Controller.mm + CreatorWindowController.h + CreatorWindowController.mm + DragOverlayView.h + DragOverlayView.mm + DragOverlayWindow.h + DragOverlayWindow.mm + ExpandedPathToIconTransformer.h + ExpandedPathToIconTransformer.mm + ExpandedPathToPathTransformer.h + ExpandedPathToPathTransformer.mm + FileListNode.h + FileListNode.mm + FileNameCell.h + FileNameCell.mm + FileOutlineController.h + FileOutlineController.mm + FileOutlineView.h + FileOutlineView.mm + FilePriorityCell.h + FilePriorityCell.mm + FileRenameSheetController.h + FileRenameSheetController.mm + FilterBarController.h + FilterBarController.mm + FilterBarView.h + FilterBarView.mm + FilterButton.h + FilterButton.mm + GlobalOptionsPopoverViewController.h + GlobalOptionsPopoverViewController.mm + GroupPopUpButtonCell.h + GroupPopUpButtonCell.mm + GroupsController.h + GroupsController.mm + GroupsPrefsController.h + GroupsPrefsController.mm + GroupTextCell.h + GroupTextCell.mm + GroupToolbarItem.h + GroupToolbarItem.mm + InfoActivityViewController.h + InfoActivityViewController.mm + InfoFileViewController.h + InfoFileViewController.mm + InfoGeneralViewController.h + InfoGeneralViewController.mm + InfoOptionsViewController.h + InfoOptionsViewController.mm + InfoPeersViewController.h + InfoPeersViewController.mm + InfoTextField.h + InfoTextField.mm + InfoTrackersViewController.h + InfoTrackersViewController.mm + InfoViewController.h + InfoWindowController.h + InfoWindowController.mm + main.mm + MessageWindowController.h + MessageWindowController.mm + NSApplicationAdditions.h + NSApplicationAdditions.mm + NSDataAdditions.h + NSDataAdditions.mm + NSImageAdditions.h + NSImageAdditions.mm + NSKeyedUnarchiverAdditions.h + NSKeyedUnarchiverAdditions.mm + NSMutableArrayAdditions.h + NSMutableArrayAdditions.mm + NSStringAdditions.h + NSStringAdditions.mm + PeerProgressIndicatorCell.h + PeerProgressIndicatorCell.mm + PeerTableView.h + PeerTableView.mm + PiecesView.h + PiecesView.mm + PortChecker.h + PortChecker.mm + PredicateEditorRowTemplateAny.h + PredicateEditorRowTemplateAny.mm + PrefsController.h + PrefsController.mm + PrefsWindow.h + PrefsWindow.mm + PriorityPopUpButtonCell.h + PriorityPopUpButtonCell.mm + ProgressGradients.h + ProgressGradients.mm + ShareToolbarItem.h + ShareToolbarItem.mm + ShareTorrentFileHelper.h + ShareTorrentFileHelper.mm + SparkleProxy.mm + StatsWindowController.h + StatsWindowController.mm + StatusBarController.h + StatusBarController.mm + StatusBarView.h + StatusBarView.mm + Toolbar.h + Toolbar.mm + Torrent.h + Torrent.mm + TorrentCell.h + TorrentCell.mm + TorrentGroup.h + TorrentGroup.mm + TorrentTableView.h + TorrentTableView.mm + TrackerCell.h + TrackerCell.mm + TrackerNode.h + TrackerNode.mm + TrackerTableView.h + TrackerTableView.mm + URLSheetWindowController.h + URLSheetWindowController.mm + WebSeedTableView.h + WebSeedTableView.mm) -set(${PROJECT_NAME}_XIB_FILES +set(XIB_FILES AboutWindow.xib BlocklistStatusWindow.xib FileRenameSheetController.xib @@ -192,24 +182,23 @@ set(${PROJECT_NAME}_XIB_FILES MessageWindow.xib StatsWindow.xib StatusBar.xib - URLSheetWindow.xib -) -source_group(Resources FILES ${${PROJECT_NAME}_XIB_FILES}) + URLSheetWindow.xib) -set(${PROJECT_NAME}_RESOURCES +set(RESOURCES Defaults.plist Credits.rtf sparkle_dsa_pub.pem ../COPYING - Images/TransmissionDocument.icns -) -source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES}) + Images/TransmissionDocument.icns) +source_group(Resources + FILES ${RESOURCES}) -set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources -) +set_source_files_properties( + ${RESOURCES} + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) -set(${PROJECT_NAME}_IMAGESETS +set(IMAGESETS ActionHover Bandwidth CleanupTemplate @@ -267,8 +256,7 @@ set(${PROJECT_NAME}_IMAGESETS UpArrowTemplate UploadBadge YingYangGroupTemplate - YingYangTemplate -) + YingYangTemplate) set(APPICON_NAME AppIcon) @@ -279,7 +267,7 @@ set(IMAGE_ASSETS ${IMAGE_ASSETS_DIR}/Contents.json ${APPICONSET_DIR}/Contents.json) -foreach(IMG IN LISTS ${PROJECT_NAME}_IMAGESETS) +foreach(IMG IN LISTS IMAGESETS) set(IMG_DIR "${IMAGE_ASSETS_DIR}/${IMG}.imageset") list(APPEND IMAGE_ASSETS ${IMG_DIR}/${IMG}.png @@ -301,7 +289,8 @@ add_custom_command( OUTPUT ${COMPILED_IMAGE_ASSETS} ${APPICON_NAME}.Info.plist - COMMAND ${ACTOOL_EXECUTABLE} + COMMAND + ${ACTOOL_EXECUTABLE} --compile "${CMAKE_CURRENT_BINARY_DIR}" --platform macosx --minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET} @@ -309,16 +298,21 @@ add_custom_command( --output-partial-info-plist "${CMAKE_CURRENT_BINARY_DIR}/${APPICON_NAME}.Info.plist" ${IMAGE_ASSETS_DIR} DEPENDS ${IMAGE_ASSETS} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) -source_group("Generated Files" FILES ${COMPILED_IMAGE_ASSETS} ${APPICON_NAME}.Info.plist) + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +source_group("Generated Files" + FILES + ${COMPILED_IMAGE_ASSETS} + ${APPICON_NAME}.Info.plist) -list(APPEND ${PROJECT_NAME}_RESOURCES ${COMPILED_IMAGE_ASSETS}) +list(APPEND RESOURCES + ${COMPILED_IMAGE_ASSETS}) -set_source_files_properties(${COMPILED_IMAGE_ASSETS} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources) +set_source_files_properties( + ${COMPILED_IMAGE_ASSETS} + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) -set(${PROJECT_NAME}_LINGUAS +set(LINGUAS da de en @@ -328,16 +322,15 @@ set(${PROJECT_NAME}_LINGUAS nl pt_PT ru - tr -) + tr) if(ENABLE_NLS) - set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) + set(ENABLED_LINGUAS ${LINGUAS}) else() - set(${PROJECT_NAME}_ENABLED_LINGUAS en) + set(ENABLED_LINGUAS en) endif() -set(${PROJECT_NAME}_LANG_XIB_FILES +set(BASE_XIB_FILES AddMagnetWindow.xib AddWindow.xib Creator.xib @@ -347,137 +340,102 @@ set(${PROJECT_NAME}_LANG_XIB_FILES InfoGeneralView.xib InfoOptionsView.xib MainMenu.xib - PrefsWindow.xib -) + PrefsWindow.xib) +list(TRANSFORM BASE_XIB_FILES + PREPEND Base.lproj/) -set(${PROJECT_NAME}_LANG_STRINGS_FILES +set(LANG_STRINGS_FILES InfoPlist.strings - Localizable.strings -) + Localizable.strings) -set(${PROJECT_NAME}_NIB_FILES) -foreach(F ${${PROJECT_NAME}_XIB_FILES}) - get_filename_component(F_BASE "${F}" NAME_WE) - set(F_NIB "${PROJECT_BINARY_DIR}/${F_BASE}.nib") - tr_wrap_xib("${F}" "${F_NIB}") - list(APPEND ${PROJECT_NAME}_NIB_FILES "${F_NIB}") -endforeach() - -set_source_files_properties(${${PROJECT_NAME}_NIB_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources) - -set(${PROJECT_NAME}_BASE_XIB_FILES) -set(${PROJECT_NAME}_BASE_NIB_FILES) -foreach(F ${${PROJECT_NAME}_LANG_XIB_FILES}) - set(F_XIB "Base.lproj/${F}") - get_filename_component(F_BASE "${F}" NAME_WE) - set(F_NIB "${PROJECT_BINARY_DIR}/Base.lproj/${F_BASE}.nib") - tr_wrap_xib("${F_XIB}" "${F_NIB}") - list(APPEND ${PROJECT_NAME}_BASE_XIB_FILES "${F_XIB}") - list(APPEND ${PROJECT_NAME}_BASE_NIB_FILES "${F_NIB}") - source_group(Resources/Base.lproj FILES ${F_XIB}) -endforeach() - -foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) - set(${PROJECT_NAME}_${LANG}_STRINGS_FILES) +foreach(LANG ${ENABLED_LINGUAS}) + set(${LANG}_STRINGS_FILES) if(NOT LANG STREQUAL "en") - foreach(F ${${PROJECT_NAME}_LANG_XIB_FILES}) + foreach(F ${BASE_XIB_FILES}) get_filename_component(F_BASE "${F}" NAME_WE) - list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F_BASE}.strings) + list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F_BASE}.strings) endforeach() endif() - foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES}) - list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) + foreach(F ${LANG_STRINGS_FILES}) + list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) endforeach() - source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) + source_group(Resources/${LANG}.lproj + FILES ${${LANG}_STRINGS_FILES}) endforeach() -include_directories( - ${CMAKE_SOURCE_DIR}/libtransmission - ${CMAKE_BINARY_DIR}/libtransmission - ${PROJECT_SOURCE_DIR}/VDKQueue -) - -add_compile_options( - # #warnings are good practice in development - "-Wno-#warnings" - # GNU extensions are good practice in Objective-C - -Wno-gnu -) - -add_library(vdkqueue STATIC - VDKQueue/VDKQueue.mm - VDKQueue/VDKQueue.h -) - -set_property(TARGET vdkqueue PROPERTY FOLDER "third-party") - -set(BASE_NIB_FILES_RESOURCES_DIR Resources) -if(NOT CMAKE_GENERATOR STREQUAL Xcode) - string(APPEND BASE_NIB_FILES_RESOURCES_DIR /Base.lproj) -endif() -set_source_files_properties(${${PROJECT_NAME}_BASE_NIB_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION ${BASE_NIB_FILES_RESOURCES_DIR}) - -foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) - list(APPEND ${PROJECT_NAME}_RESOURCES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) +foreach(LANG ${ENABLED_LINGUAS}) + list(APPEND RESOURCES ${${LANG}_STRINGS_FILES}) set(STRINGS_FILES_RESOURCES_DIR Resources) if(NOT CMAKE_GENERATOR STREQUAL Xcode) string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj) endif() - set_source_files_properties(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) + set_source_files_properties( + ${${LANG}_STRINGS_FILES} + PROPERTIES + MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) endforeach() -add_executable(${TR_NAME}-mac MACOSX_BUNDLE - ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_HEADERS} - ${${PROJECT_NAME}_XIB_FILES} - ${${PROJECT_NAME}_NIB_FILES} - ${${PROJECT_NAME}_BASE_XIB_FILES} - ${${PROJECT_NAME}_BASE_NIB_FILES} - ${${PROJECT_NAME}_RESOURCES} -) +target_sources(${TR_NAME}-mac + PRIVATE + ${RESOURCES}) -find_library(SPARKLE_FRAMEWORK Sparkle PATHS ${PROJECT_SOURCE_DIR} NO_DEFAULT_PATHS) +tr_target_xib_files(${TR_NAME}-mac + ${XIB_FILES} + ${BASE_XIB_FILES}) + +target_include_directories(${TR_NAME}-mac + PRIVATE + ${CMAKE_SOURCE_DIR}) + +target_include_directories(${TR_NAME}-mac SYSTEM + PRIVATE + ${LIBFMT_INCLUDE_DIRS}) + +find_library(SPARKLE_FRAMEWORK Sparkle + PATHS ${CMAKE_CURRENT_SOURCE_DIR} + NO_DEFAULT_PATHS) target_link_libraries(${TR_NAME}-mac - ${TR_NAME} - vdkqueue - ${SPARKLE_FRAMEWORK} - "-framework AppKit" - "-framework Carbon" - "-framework Foundation" - "-framework IOKit" - "-framework Quartz" - "-framework Security" - "-weak_framework UserNotifications" -) + PRIVATE + ${TR_NAME} + vdkqueue + ${SPARKLE_FRAMEWORK} + "-framework AppKit" + "-framework Carbon" + "-framework Foundation" + "-framework IOKit" + "-framework Quartz" + "-framework Security" + "-weak_framework UserNotifications") if(NOT CMAKE_GENERATOR STREQUAL Xcode) - add_custom_command(TARGET ${TR_NAME}-mac POST_BUILD + add_custom_command( + TARGET ${TR_NAME}-mac + POST_BUILD COMMAND ${CODESIGN_EXECUTABLE} -s - $) endif() -set(MAC_BUNDLE_NAME Transmission) +set_target_properties( + ${TR_NAME}-mac + PROPERTIES + OUTPUT_NAME ${MAC_BUNDLE_NAME} + MACOSX_BUNDLE_GUI_IDENTIFIER "org.m0k.transmission" + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in + INSTALL_RPATH "@executable_path;@executable_path/../Frameworks") -set_target_properties(${TR_NAME}-mac PROPERTIES - OUTPUT_NAME ${MAC_BUNDLE_NAME} - MACOSX_BUNDLE_GUI_IDENTIFIER "org.m0k.transmission" - MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/Info.plist.in - INSTALL_RPATH "@executable_path;@executable_path/../Frameworks" -) +install( + TARGETS ${TR_NAME}-mac + DESTINATION Applications) -add_subdirectory(QuickLookPlugin) - -install(TARGETS ${TR_NAME}-mac DESTINATION Applications) - -install(DIRECTORY TransmissionHelp DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources) +install( + DIRECTORY TransmissionHelp + DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources) tr_install_web(Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources) -install(CODE " - list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\") +install(CODE + "list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\") include(TrMacros) include(GetPrerequisites) - tr_fixup_bundle_item(\"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\" \"Contents/MacOS/${MAC_BUNDLE_NAME}\" \"${PROJECT_SOURCE_DIR}\") -") + tr_fixup_bundle_item( + \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\" + \"Contents/MacOS/${MAC_BUNDLE_NAME}\" \"${CMAKE_CURRENT_SOURCE_DIR}\")") diff --git a/macosx/QuickLookPlugin/CMakeLists.txt b/macosx/QuickLookPlugin/CMakeLists.txt index 1e5c36d70..5b795d165 100644 --- a/macosx/QuickLookPlugin/CMakeLists.txt +++ b/macosx/QuickLookPlugin/CMakeLists.txt @@ -1,17 +1,14 @@ -project(trmacql) +add_library(${TR_NAME}-mac-ql MODULE) -set(${PROJECT_NAME}_SOURCES - ../NSDataAdditions.mm - ../NSStringAdditions.mm - GeneratePreviewForURL.mm - GenerateThumbnailForURL.mm - main.cc -) +target_sources(${TR_NAME}-mac-ql + PRIVATE + ../NSDataAdditions.mm + ../NSStringAdditions.mm + GeneratePreviewForURL.mm + GenerateThumbnailForURL.mm + main.cc) -set(${PROJECT_NAME}_HEADERS -) - -set(${PROJECT_NAME}_LINGUAS +set(LINGUAS da de en @@ -21,77 +18,83 @@ set(${PROJECT_NAME}_LINGUAS nl pt_PT ru - tr -) + tr) if(ENABLE_NLS) - set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) + set(ENABLED_LINGUAS ${LINGUAS}) else() - set(${PROJECT_NAME}_ENABLED_LINGUAS en) + set(ENABLED_LINGUAS en) endif() -set(${PROJECT_NAME}_LANG_STRINGS_FILES - Localizable.strings -) +set(LANG_STRINGS_FILES + Localizable.strings) -set(${PROJECT_NAME}_RESOURCES - style.css -) -source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES}) +set(RESOURCES + style.css) +source_group(Resources + FILES ${RESOURCES}) -set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES - MACOSX_PACKAGE_LOCATION Resources) +set_source_files_properties( + ${RESOURCES} + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) -foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) - set(${PROJECT_NAME}_${LANG}_STRINGS_FILES) +foreach(LANG ${ENABLED_LINGUAS}) + set(${LANG}_STRINGS_FILES) set(STRINGS_FILES_RESOURCES_DIR Resources) if(NOT CMAKE_GENERATOR STREQUAL Xcode) string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj) endif() - foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES}) - list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) - list(APPEND ${PROJECT_NAME}_RESOURCES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) - set_source_files_properties(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES - MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) + foreach(F ${LANG_STRINGS_FILES}) + list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) + list(APPEND RESOURCES ${${LANG}_STRINGS_FILES}) + set_source_files_properties( + ${${LANG}_STRINGS_FILES} + PROPERTIES + MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) endforeach() - source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) + source_group(Resources/${LANG}.lproj + FILES ${${LANG}_STRINGS_FILES}) endforeach() -add_library(${TR_NAME}-mac-ql MODULE - ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_HEADERS} - ${${PROJECT_NAME}_RESOURCES} -) +target_sources(${TR_NAME}-mac-ql + PRIVATE + ${RESOURCES}) set(MAC_QL_BUNDLE_NAME QuickLookPlugin) -set_target_properties(${TR_NAME}-mac-ql PROPERTIES - OUTPUT_NAME ${MAC_QL_BUNDLE_NAME} - MACOSX_BUNDLE ON - BUNDLE ON - BUNDLE_EXTENSION qlgenerator - MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/Info.plist.in" - INSTALL_RPATH "@loader_path/../../../../../MacOS;@loader_path/../../../../../Frameworks" -) +set_target_properties( + ${TR_NAME}-mac-ql + PROPERTIES + OUTPUT_NAME ${MAC_QL_BUNDLE_NAME} + MACOSX_BUNDLE ON + BUNDLE ON + BUNDLE_EXTENSION qlgenerator + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in" + INSTALL_RPATH "@loader_path/../../../../../MacOS;@loader_path/../../../../../Frameworks") -target_include_directories(${TR_NAME}-mac-ql PRIVATE - .. -) +target_include_directories(${TR_NAME}-mac-ql + PRIVATE + ${CMAKE_SOURCE_DIR} + ..) target_link_libraries(${TR_NAME}-mac-ql - ${TR_NAME} - "-framework Foundation" - "-framework CoreFoundation" - "-framework CoreServices" - "-framework AppKit" - "-framework QuickLook" -) + PRIVATE + ${TR_NAME} + "-framework Foundation" + "-framework CoreFoundation" + "-framework CoreServices" + "-framework AppKit" + "-framework QuickLook") -install(TARGETS ${TR_NAME}-mac-ql DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Library/QuickLook) +install( + TARGETS ${TR_NAME}-mac-ql + DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Library/QuickLook) -install(CODE " - list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\") +install(CODE + "list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\") include(TrMacros) include(GetPrerequisites) - tr_fixup_bundle_item(\"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\" \"Contents/Library/QuickLook/${MAC_QL_BUNDLE_NAME}.qlgenerator/Contents/MacOS/${MAC_QL_BUNDLE_NAME}\" \"\") -") + tr_fixup_bundle_item( + \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\" + \"Contents/Library/QuickLook/${MAC_QL_BUNDLE_NAME}.qlgenerator/Contents/MacOS/${MAC_QL_BUNDLE_NAME}\" \"\")") diff --git a/macosx/VDKQueue/CMakeLists.txt b/macosx/VDKQueue/CMakeLists.txt new file mode 100644 index 000000000..564b46d88 --- /dev/null +++ b/macosx/VDKQueue/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(vdkqueue STATIC) + +target_sources(vdkqueue + PRIVATE + VDKQueue.h + VDKQueue.mm) + +set_property( + TARGET vdkqueue + PROPERTY FOLDER "third-party") + +target_include_directories(vdkqueue + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 52175f36a..50dc0e162 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -1,6 +1,4 @@ -project(trpo) - -set(${PROJECT_NAME}_LINGUAS +set(LINGUAS an ar ast @@ -86,40 +84,37 @@ set(${PROJECT_NAME}_LINGUAS vi zh_CN zh_HK - zh_TW -) + zh_TW) set(GETTEXT_PACKAGE ${TR_NAME}-gtk) if(ENABLE_NLS) - set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) + set(ENABLED_LINGUAS ${LINGUAS}) else() - set(${PROJECT_NAME}_ENABLED_LINGUAS) + set(ENABLED_LINGUAS) endif() -set(${PROJECT_NAME}_MO_FILES) -foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) +set(MO_FILES) +foreach(LANG ${ENABLED_LINGUAS}) set(msgfmt_INPUT_FILE ${LANG}.po) set(msgfmt_OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${GETTEXT_PACKAGE}-${LANG}.mo) add_custom_command( - OUTPUT - ${msgfmt_OUTPUT_FILE} - COMMAND - ${GETTEXT_MSGFMT_EXECUTABLE} - --output-file=${msgfmt_OUTPUT_FILE} - ${msgfmt_INPUT_FILE} - WORKING_DIRECTORY - ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS - ${msgfmt_INPUT_FILE} - ) + OUTPUT ${msgfmt_OUTPUT_FILE} + COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --output-file=${msgfmt_OUTPUT_FILE} ${msgfmt_INPUT_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${msgfmt_INPUT_FILE}) - list(APPEND ${PROJECT_NAME}_MO_FILES ${msgfmt_OUTPUT_FILE}) + list(APPEND MO_FILES ${msgfmt_OUTPUT_FILE}) - install(FILES ${msgfmt_OUTPUT_FILE} DESTINATION ${CMAKE_INSTALL_LOCALEDIR}/${LANG}/LC_MESSAGES/ RENAME ${GETTEXT_PACKAGE}.mo) + install( + FILES ${msgfmt_OUTPUT_FILE} + DESTINATION ${CMAKE_INSTALL_LOCALEDIR}/${LANG}/LC_MESSAGES/ + RENAME ${GETTEXT_PACKAGE}.mo) endforeach() -if(${PROJECT_NAME}_MO_FILES) - add_custom_target(${GETTEXT_PACKAGE}-po ALL DEPENDS ${${PROJECT_NAME}_MO_FILES}) +if(MO_FILES) + add_custom_target(${GETTEXT_PACKAGE}-po + ALL + DEPENDS ${MO_FILES}) endif() diff --git a/qt/CMakeLists.txt b/qt/CMakeLists.txt index 5092eab63..d5e87cb4c 100644 --- a/qt/CMakeLists.txt +++ b/qt/CMakeLists.txt @@ -1,154 +1,150 @@ -project(trqt) - set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Generated Files") -set_property(GLOBAL PROPERTY AUTOMOC_SOURCE_GROUP "Generated Files") -set_property(GLOBAL PROPERTY AUTORCC_SOURCE_GROUP "Generated Files") -set_property(GLOBAL PROPERTY AUTOUIC_SOURCE_GROUP "Generated Files") -set(${PROJECT_NAME}_SOURCES - AboutDialog.cc - AddData.cc - Application.cc - ColumnResizer.cc - ComInteropHelper.cc - DBusInteropHelper.cc - DetailsDialog.cc - FaviconCache.cc - FileTreeDelegate.cc - FileTreeItem.cc - FileTreeModel.cc - FileTreeView.cc - FilterBar.cc - FilterBarComboBox.cc - FilterBarComboBoxDelegate.cc - Filters.cc - Formatter.cc - FreeSpaceLabel.cc - IconCache.cc - IconToolButton.cc - InteropHelper.cc - InteropObject.cc - LicenseDialog.cc - MainWindow.cc - MakeDialog.cc - OptionsDialog.cc - PathButton.cc - Prefs.cc - PrefsDialog.cc - RelocateDialog.cc - RpcClient.cc - RpcQueue.cc - Session.cc - SessionDialog.cc - SqueezeLabel.cc - StatsDialog.cc - StyleHelper.cc - Torrent.cc - TorrentDelegate.cc - TorrentDelegateMin.cc - TorrentFilter.cc - TorrentModel.cc - TorrentView.cc - TrackerDelegate.cc - TrackerModel.cc - TrackerModelFilter.cc - Utils.cc - VariantHelpers.cc - WatchDir.cc -) +add_executable(${TR_NAME}-qt WIN32) -if (NOT ENABLE_QT_COM_INTEROP) - set_source_files_properties(ComInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON) -endif() -if (NOT ENABLE_QT_DBUS_INTEROP) - set_source_files_properties(DBusInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON) -endif() +target_sources(${TR_NAME}-qt + PRIVATE + AboutDialog.cc + AboutDialog.h + AddData.cc + AddData.h + Application.cc + Application.h + BaseDialog.h + ColumnResizer.cc + ColumnResizer.h + ComInteropHelper.cc + ComInteropHelper.h + CustomVariantType.h + DBusInteropHelper.cc + DBusInteropHelper.h + DetailsDialog.cc + DetailsDialog.h + FaviconCache.cc + FaviconCache.h + FileTreeDelegate.cc + FileTreeDelegate.h + FileTreeItem.cc + FileTreeItem.h + FileTreeModel.cc + FileTreeModel.h + FileTreeView.cc + FileTreeView.h + FilterBar.cc + FilterBar.h + FilterBarComboBox.cc + FilterBarComboBox.h + FilterBarComboBoxDelegate.cc + FilterBarComboBoxDelegate.h + Filters.cc + Filters.h + Formatter.cc + Formatter.h + FreeSpaceLabel.cc + FreeSpaceLabel.h + IconCache.cc + IconCache.h + IconToolButton.cc + IconToolButton.h + InteropHelper.cc + InteropHelper.h + InteropObject.cc + InteropObject.h + LicenseDialog.cc + LicenseDialog.h + MainWindow.cc + MainWindow.h + MakeDialog.cc + MakeDialog.h + OptionsDialog.cc + OptionsDialog.h + PathButton.cc + PathButton.h + Prefs.cc + Prefs.h + PrefsDialog.cc + PrefsDialog.h + RelocateDialog.cc + RelocateDialog.h + RpcClient.cc + RpcClient.h + RpcQueue.cc + RpcQueue.h + Session.cc + Session.h + SessionDialog.cc + SessionDialog.h + Speed.h + SqueezeLabel.cc + SqueezeLabel.h + StatsDialog.cc + StatsDialog.h + StyleHelper.cc + StyleHelper.h + Torrent.cc + Torrent.h + TorrentDelegate.cc + TorrentDelegate.h + TorrentDelegateMin.cc + TorrentDelegateMin.h + TorrentFilter.cc + TorrentFilter.h + TorrentModel.cc + TorrentModel.h + TorrentView.cc + TorrentView.h + TrackerDelegate.cc + TrackerDelegate.h + TrackerModel.cc + TrackerModel.h + TrackerModelFilter.cc + TrackerModelFilter.h + Typedefs.h + Utils.cc + Utils.h + VariantHelpers.cc + VariantHelpers.h + WatchDir.cc + WatchDir.h) -set(${PROJECT_NAME}_HEADERS - AboutDialog.h - AddData.h - Application.h - BaseDialog.h - ColumnResizer.h - ComInteropHelper.h - CustomVariantType.h - DBusInteropHelper.h - DetailsDialog.h - FaviconCache.h - FileTreeDelegate.h - FileTreeItem.h - FileTreeModel.h - FileTreeView.h - FilterBar.h - FilterBarComboBox.h - FilterBarComboBoxDelegate.h - Filters.h - Formatter.h - FreeSpaceLabel.h - IconCache.h - IconToolButton.h - InteropHelper.h - InteropObject.h - LicenseDialog.h - MainWindow.h - MakeDialog.h - OptionsDialog.h - PathButton.h - Prefs.h - PrefsDialog.h - RelocateDialog.h - RpcClient.h - RpcQueue.h - Session.h - SessionDialog.h - Speed.h - SqueezeLabel.h - StatsDialog.h - StyleHelper.h - Torrent.h - TorrentDelegate.h - TorrentDelegateMin.h - TorrentFilter.h - TorrentModel.h - TorrentView.h - TrackerDelegate.h - TrackerModel.h - TrackerModelFilter.h - Typedefs.h - Utils.h - VariantHelpers.h - WatchDir.h -) +tr_allow_compile_if( + [=[[ENABLE_QT_COM_INTEROP]]=] + ComInteropHelper.cc + [=[[ENABLE_QT_DBUS_INTEROP]]=] + DBusInteropHelper.cc) -set(${PROJECT_NAME}_UI_FILES - AboutDialog.ui - DetailsDialog.ui - LicenseDialog.ui - MainWindow.ui - MakeDialog.ui - MakeProgressDialog.ui - OptionsDialog.ui - PrefsDialog.ui - RelocateDialog.ui - SessionDialog.ui - StatsDialog.ui - TrackersDialog.ui -) -source_group(Ui FILES ${${PROJECT_NAME}_UI_FILES}) +target_sources(${TR_NAME}-qt + PRIVATE + AboutDialog.ui + DetailsDialog.ui + LicenseDialog.ui + MainWindow.ui + MakeDialog.ui + MakeProgressDialog.ui + OptionsDialog.ui + PrefsDialog.ui + RelocateDialog.ui + SessionDialog.ui + StatsDialog.ui + TrackersDialog.ui) -tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES ${${PROJECT_NAME}_UI_FILES}) -source_group("Generated Files" FILES ${${PROJECT_NAME}_UI_SOURCES}) +source_group(Ui + REGULAR_EXPRESSION [[.*\.ui$]]) + +target_sources(${TR_NAME}-qt + PRIVATE + application.qrc) -set(${PROJECT_NAME}_QRC_FILES application.qrc) if(WIN32 OR APPLE) - list(APPEND ${PROJECT_NAME}_QRC_FILES icons/Faenza/Faenza.qrc) + target_sources(${TR_NAME}-qt + PRIVATE + icons/Faenza/Faenza.qrc) endif() -source_group(Resources FILES ${${PROJECT_NAME}_QRC_FILES}) -tr_qt_add_resources(${PROJECT_NAME}_QRC_SOURCES ${${PROJECT_NAME}_QRC_FILES}) -source_group("Generated Files" FILES ${${PROJECT_NAME}_QRC_SOURCES}) +source_group(Resources + REGULAR_EXPRESSION [[.*\.qrc$]]) -set(${PROJECT_NAME}_LINGUAS +set(LINGUAS af ca da @@ -178,99 +174,99 @@ set(${PROJECT_NAME}_LINGUAS sv tr uk - zh_CN -) + zh_CN) if(ENABLE_NLS) - set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) + set(ENABLED_LINGUAS ${LINGUAS}) else() - set(${PROJECT_NAME}_ENABLED_LINGUAS) + set(ENABLED_LINGUAS) endif() -set(${PROJECT_NAME}_TS_FILES) -foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) - list(APPEND ${PROJECT_NAME}_TS_FILES translations/transmission_${LANG}.ts) +set(TS_FILES) +foreach(LANG ${ENABLED_LINGUAS}) + list(APPEND TS_FILES translations/transmission_${LANG}.ts) endforeach() -if(${PROJECT_NAME}_TS_FILES) - tr_qt_add_translation(${PROJECT_NAME}_QM_FILES ${${PROJECT_NAME}_TS_FILES}) - source_group("Generated Files" FILES ${${PROJECT_NAME}_QM_FILES}) +if(TS_FILES) + tr_qt_add_translation(QM_FILES ${TS_FILES}) endif() -include_directories( - ${CMAKE_SOURCE_DIR} - ${PROJECT_SOURCE_DIR} -) - -include_directories( - SYSTEM - ${PROJECT_BINARY_DIR} - ${CURL_INCLUDE_DIRS} - ${EVENT2_INCLUDE_DIRS} -) - -tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE - "Transmission Qt Client" - "transmission-qt" - "transmission-qt.exe" - "qtr.ico") +target_sources(${TR_NAME}-qt + PRIVATE + ${QM_FILES}) if(ENABLE_QT_COM_INTEROP) - add_custom_command( - OUTPUT - ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb - COMMAND - ${MIDL_EXECUTABLE} /tlb ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb transmission-qt.idl - DEPENDS - transmission-qt.idl - WORKING_DIRECTORY - ${CMAKE_CURRENT_SOURCE_DIR} - ) - list(APPEND ${PROJECT_NAME}_WIN32_RC_FILE transmission-qt.tlb.rc transmission-qt.idl ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb) - set_source_files_properties(transmission-qt.idl ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb PROPERTIES HEADER_FILE_ONLY ON) + tr_target_idl_files(${TR_NAME}-qt + transmission-qt.idl) endif() -add_executable(${TR_NAME}-qt WIN32 - ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_UI_SOURCES} - ${${PROJECT_NAME}_QRC_SOURCES} - ${${PROJECT_NAME}_HEADERS} - ${${PROJECT_NAME}_QM_FILES} - ${${PROJECT_NAME}_WIN32_RC_FILE} -) +target_include_directories(${TR_NAME}-qt + PRIVATE + ${CMAKE_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}) + +target_include_directories(${TR_NAME}-qt SYSTEM + PRIVATE + ${CURL_INCLUDE_DIRS} + ${EVENT2_INCLUDE_DIRS}) target_link_libraries(${TR_NAME}-qt - ${TR_NAME} - ${QT_TARGETS} - ${CURL_LIBRARIES} - ${EVENT2_LIBRARIES} -) + PRIVATE + ${TR_NAME} + ${QT_TARGETS} + ${CURL_LIBRARIES} + ${EVENT2_LIBRARIES}) -target_compile_definitions(${TR_NAME}-qt PRIVATE - "TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\"" - QT_NO_CAST_FROM_ASCII - $<$:ENABLE_COM_INTEROP> - $<$:ENABLE_DBUS_INTEROP>) +target_compile_definitions(${TR_NAME}-qt + PRIVATE + "TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\"" + QT_NO_CAST_FROM_ASCII + $<$:ENABLE_COM_INTEROP> + $<$:ENABLE_DBUS_INTEROP>) if(MSVC) tr_append_target_property(${TR_NAME}-qt LINK_FLAGS "/ENTRY:mainCRTStartup") endif() -set_target_properties(${TR_NAME}-qt PROPERTIES AUTOMOC TRUE) +set_target_properties( + ${TR_NAME}-qt + PROPERTIES + AUTOMOC ON + AUTORCC ON + AUTOUIC ON) -install(TARGETS ${TR_NAME}-qt DESTINATION ${CMAKE_INSTALL_BINDIR}) +tr_win32_app_info(${TR_NAME}-qt + "Transmission Qt Client" + "transmission-qt" + "transmission-qt.exe" + "qtr.ico") + +install( + TARGETS ${TR_NAME}-qt + DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) - install(FILES ${TR_NAME}-qt.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install( + FILES ${TR_NAME}-qt.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() -install(FILES transmission-qt.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) +install( + FILES transmission-qt.desktop + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) if(ENABLE_NLS) - install(FILES ${${PROJECT_NAME}_QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${TR_NAME}/translations) + install( + FILES ${QM_FILES} + DESTINATION ${CMAKE_INSTALL_DATADIR}/${TR_NAME}/translations) endif() if(WIN32) - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" CONTENT "") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" DESTINATION ${CMAKE_INSTALL_SYSCONFDIR} RENAME qt.conf) + file(GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" + CONTENT "") + install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" + DESTINATION ${CMAKE_INSTALL_SYSCONFDIR} + RENAME qt.conf) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 61dc578d6..de69ff33b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,8 +1,3 @@ -include_directories(SYSTEM - ${LIBFMT_INCLUDE_DIRS} - ${THIRD_PARTY_DIR}/googletest/googletest/include - ${THIRD_PARTY_DIR}/googletest/googletest) - add_subdirectory(gtest) add_subdirectory(libtransmission) add_subdirectory(utils) diff --git a/tests/gtest/CMakeLists.txt b/tests/gtest/CMakeLists.txt index 1cd714788..54e17bd07 100644 --- a/tests/gtest/CMakeLists.txt +++ b/tests/gtest/CMakeLists.txt @@ -1,5 +1,16 @@ -add_library(gtestall STATIC - ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc - ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc) +add_library(gtestall STATIC) -set_property(TARGET gtestall PROPERTY FOLDER "third-party") +target_sources(gtestall + PRIVATE + ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc + ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc) + +set_property( + TARGET gtestall + PROPERTY FOLDER "third-party") + +target_include_directories(gtestall SYSTEM + PRIVATE + ${THIRD_PARTY_DIR}/googletest/googletest + PUBLIC + ${THIRD_PARTY_DIR}/googletest/googletest/include) diff --git a/tests/libtransmission/CMakeLists.txt b/tests/libtransmission/CMakeLists.txt index 226132e4d..7465da42e 100644 --- a/tests/libtransmission/CMakeLists.txt +++ b/tests/libtransmission/CMakeLists.txt @@ -1,57 +1,62 @@ -add_executable(libtransmission-test - announce-list-test.cc - announcer-test.cc - announcer-udp-test.cc - benc-test.cc - bitfield-test.cc - block-info-test.cc - blocklist-test.cc - buffer-test.cc - clients-test.cc - completion-test.cc - copy-test.cc - crypto-test-ref.h - crypto-test.cc - error-test.cc - dht-test.cc - file-piece-map-test.cc - file-test.cc - getopt-test.cc - handshake-test.cc - history-test.cc - json-test.cc - lpd-test.cc - magnet-metainfo-test.cc - makemeta-test.cc - move-test.cc - net-test.cc - open-files-test.cc - peer-mgr-active-requests-test.cc - peer-mgr-wishlist-test.cc - peer-msgs-test.cc - platform-test.cc - quark-test.cc - remove-test.cc - rename-test.cc - rpc-test.cc - session-test.cc - session-alt-speeds-test.cc - settings-test.cc - strbuf-test.cc - subprocess-test-script.cmd - subprocess-test.cc - test-fixtures.h - timer-test.cc - torrent-files-test.cc - torrent-magnet-test.cc - torrent-metainfo-test.cc - torrents-test.cc - utils-test.cc - variant-test.cc - watchdir-test.cc - web-utils-test.cc) +add_executable(libtransmission-test) -set_property(TARGET libtransmission-test PROPERTY FOLDER "tests") +target_sources(libtransmission-test + PRIVATE + announce-list-test.cc + announcer-test.cc + announcer-udp-test.cc + benc-test.cc + bitfield-test.cc + block-info-test.cc + blocklist-test.cc + buffer-test.cc + clients-test.cc + completion-test.cc + copy-test.cc + crypto-test-ref.h + crypto-test.cc + error-test.cc + dht-test.cc + file-piece-map-test.cc + file-test.cc + getopt-test.cc + handshake-test.cc + history-test.cc + json-test.cc + lpd-test.cc + magnet-metainfo-test.cc + makemeta-test.cc + move-test.cc + net-test.cc + open-files-test.cc + peer-mgr-active-requests-test.cc + peer-mgr-wishlist-test.cc + peer-msgs-test.cc + platform-test.cc + quark-test.cc + remove-test.cc + rename-test.cc + rpc-test.cc + session-test.cc + session-alt-speeds-test.cc + settings-test.cc + strbuf-test.cc + subprocess-test-script.cmd + subprocess-test.cc + test-fixtures.h + timer-test.cc + torrent-files-test.cc + torrent-magnet-test.cc + torrent-metainfo-test.cc + torrents-test.cc + utils-test.cc + variant-test.cc + watchdir-test.cc + web-utils-test.cc) + +set_property( + TARGET libtransmission-test + PROPERTY FOLDER "tests") target_compile_definitions(libtransmission-test PRIVATE @@ -65,6 +70,7 @@ target_include_directories(libtransmission-test target_include_directories(libtransmission-test SYSTEM PRIVATE + ${LIBFMT_INCLUDE_DIRS} ${WIDE_INTEGER_INCLUDE_DIRS} ${B64_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} @@ -72,8 +78,7 @@ target_include_directories(libtransmission-test SYSTEM ${EVENT2_INCLUDE_DIRS}) target_compile_options(libtransmission-test - PRIVATE - $<$,$>:-Wno-sign-compare>) # patches welcomed + PRIVATE $<$,$>:-Wno-sign-compare>) # patches welcomed target_link_libraries(libtransmission-test PRIVATE @@ -88,14 +93,20 @@ add_custom_command( TARGET libtransmission-test PRE_BUILD COMMAND - ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/subprocess-test-script.cmd - $/subprocess-test.cmd) + ${CMAKE_COMMAND} + -E copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/subprocess-test-script.cmd + $/subprocess-test.cmd) -add_executable(subprocess-test - subprocess-test-program.cc) +add_executable(subprocess-test) -set_property(TARGET subprocess-test PROPERTY FOLDER "tests") +target_sources(subprocess-test + PRIVATE + subprocess-test-program.cc) + +set_property( + TARGET subprocess-test + PROPERTY FOLDER "tests") target_include_directories(subprocess-test PRIVATE diff --git a/tests/utils/CMakeLists.txt b/tests/utils/CMakeLists.txt index fea9c8c79..146ebe573 100644 --- a/tests/utils/CMakeLists.txt +++ b/tests/utils/CMakeLists.txt @@ -1,18 +1,18 @@ function(AddShowTest name file_basename) - add_test( - NAME ${name} - COMMAND ${CMAKE_COMMAND} - -D transmission_show:string=$ - -D torrent_file:string=assets/${file_basename}.torrent - -D reference_file:string=${CMAKE_CURRENT_SOURCE_DIR}/assets/${file_basename}.show - -P "${CMAKE_CURRENT_SOURCE_DIR}/run_transmission_show.cmake" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) + add_test( + NAME ${name} + COMMAND + ${CMAKE_COMMAND} + -D transmission_show:string=$ + -D torrent_file:string=assets/${file_basename}.torrent + -D reference_file:string=${CMAKE_CURRENT_SOURCE_DIR}/assets/${file_basename}.show + -P "${CMAKE_CURRENT_SOURCE_DIR}/run_transmission_show.cmake" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endfunction() # disabled AddShowTest(transmission-show-bittorrent-v2 bittorrent-v2-test) -AddShowTest(transmission-show-bittorrent-v2-hybrid-test bittorrent-v2-hybrid-test) -AddShowTest(transmission-show-inner-sanctum Inner_Sanctum_movie_archive) -AddShowTest(transmission-show-thor Thor_and_the_Amazon_Women.avi) -AddShowTest(transmission-show-ubuntu ubuntu-20.04.3-desktop-amd64.iso) -AddShowTest(transmission-show-ubuntu-hybrid hybrid-single-ubuntu-20.04.3-desktop-amd64.iso) +addshowtest(transmission-show-bittorrent-v2-hybrid-test bittorrent-v2-hybrid-test) +addshowtest(transmission-show-inner-sanctum Inner_Sanctum_movie_archive) +addshowtest(transmission-show-thor Thor_and_the_Amazon_Women.avi) +addshowtest(transmission-show-ubuntu ubuntu-20.04.3-desktop-amd64.iso) +addshowtest(transmission-show-ubuntu-hybrid hybrid-single-ubuntu-20.04.3-desktop-amd64.iso) diff --git a/tests/utils/run_transmission_show.cmake b/tests/utils/run_transmission_show.cmake index 115ab8c90..00148a024 100644 --- a/tests/utils/run_transmission_show.cmake +++ b/tests/utils/run_transmission_show.cmake @@ -1,52 +1,49 @@ # compare the output of transmission-show to a reference file. -# returns 0 if the files match, nonzero otherwise. +# returns 0 if the files match, nonzero otherwise. ## -if (CMAKE_VERSION VERSION_LESS 3.14) - # --ignore-eol was introduced in CMake 3.14 - message(status "skipping transmission-show test; cmake version too old") +if(CMAKE_VERSION VERSION_LESS 3.14) + # --ignore-eol was introduced in CMake 3.14 + message(status "skipping transmission-show test; cmake version too old") else() - get_filename_component(torrent_basename "${torrent_file}" NAME) - set(output_file ${CMAKE_CURRENT_BINARY_DIR}/${torrent_basename}.out) + get_filename_component(torrent_basename "${torrent_file}" NAME) + set(output_file ${CMAKE_CURRENT_BINARY_DIR}/${torrent_basename}.out) - message(STATUS "transmission_show ${transmission_show}") - message(STATUS " input_file ${torrent_file}") - message(STATUS " output_file ${output_file}") - message(STATUS " reference_file ${reference_file}") + message(STATUS "transmission_show ${transmission_show}") + message(STATUS " input_file ${torrent_file}") + message(STATUS " output_file ${output_file}") + message(STATUS " reference_file ${reference_file}") - # The app's output includes timestamps, so fake our TZ to ensure - # the test doesn't depend on the physical TZ of the test machine - set(ENV{TZ} "UTC") - execute_process( - COMMAND ${transmission_show} ${torrent_file} - OUTPUT_FILE ${output_file} - ) + # The app's output includes timestamps, so fake our TZ to ensure + # the test doesn't depend on the physical TZ of the test machine + set(ENV{TZ} "UTC") + execute_process( + COMMAND ${transmission_show} ${torrent_file} + OUTPUT_FILE ${output_file}) - execute_process( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${reference_file} ${output_file} - RESULT_VARIABLE STATUS - ) + execute_process( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${reference_file} ${output_file} + RESULT_VARIABLE STATUS) - if(STATUS AND NOT STATUS EQUAL 0) - file(READ ${reference_file} CONTENTS) - message("EXPECTED CONTENTS (${reference_file}):") - message(${CONTENTS}) + if(STATUS AND NOT STATUS EQUAL 0) + file(READ ${reference_file} CONTENTS) + message("EXPECTED CONTENTS (${reference_file}):") + message(${CONTENTS}) - file(READ ${output_file} CONTENTS) - message("RECEIVED CONTENTS (${output_file}):") - message(${CONTENTS}) + file(READ ${output_file} CONTENTS) + message("RECEIVED CONTENTS (${output_file}):") + message(${CONTENTS}) - find_program(DIFF_EXEC diff) - if (DIFF_EXEC) - message("DIFF:") - execute_process(COMMAND ${DIFF_EXEC} -u ${output_file} ${reference_file}) - endif() - - file(REMOVE ${output_file}) - message(FATAL_ERROR "failed: files '${reference_file}' and '${output_file}' do not match") - else() - file(REMOVE ${output_file}) - message("passed") - endif() + find_program(DIFF_EXEC diff) + if(DIFF_EXEC) + message("DIFF:") + execute_process(COMMAND ${DIFF_EXEC} -u ${output_file} ${reference_file}) + endif() + file(REMOVE ${output_file}) + message(FATAL_ERROR "failed: files '${reference_file}' and '${output_file}' do not match") + else() + file(REMOVE ${output_file}) + message("passed") + endif() endif() diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index defda1416..614f4cefd 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -1,26 +1,37 @@ -project(trutils) - -include_directories( - ${CMAKE_SOURCE_DIR} -) -include_directories( - SYSTEM - ${EVENT2_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS} -) - foreach(P create edit remote show) - tr_win32_app_info(${PROJECT_NAME}_${P}_WIN32_RC_FILE + add_executable(${TR_NAME}-${P}) + + target_sources(${TR_NAME}-${P} + PRIVATE + ${P}.cc) + + target_include_directories(${TR_NAME}-${P} + PRIVATE + ${CMAKE_SOURCE_DIR}) + + target_include_directories(${TR_NAME}-${P} SYSTEM + PRIVATE + ${LIBFMT_INCLUDE_DIRS} + ${EVENT2_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS}) + + target_link_libraries(${TR_NAME}-${P} + PRIVATE + ${TR_NAME} + ${CURL_LIBRARIES}) + + tr_win32_app_info(${TR_NAME}-${P} "Transmission Utility ('${P}')" "${TR_NAME}-${P}" "${TR_NAME}-${P}.exe") - add_executable(${TR_NAME}-${P} ${P}.cc ${${PROJECT_NAME}_${P}_WIN32_RC_FILE}) - target_link_libraries(${TR_NAME}-${P} ${TR_NAME}) - - install(TARGETS ${TR_NAME}-${P} DESTINATION ${CMAKE_INSTALL_BINDIR}) + install( + TARGETS ${TR_NAME}-${P} + DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) - install(FILES ${TR_NAME}-${P}.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install( + FILES ${TR_NAME}-${P}.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() endforeach() diff --git a/web/CMakeLists.txt b/web/CMakeLists.txt index 750958cd1..d08f65747 100644 --- a/web/CMakeLists.txt +++ b/web/CMakeLists.txt @@ -1,65 +1,59 @@ -project(trweb) - set(TRWEB_SRCS - src/about-dialog.js - src/action-manager.js - src/alert-dialog.js - src/context-menu.js - src/file-row.js - src/formatter.js - src/inspector.js - src/main.js - src/move-dialog.js - src/notifications.js - src/open-dialog.js - src/overflow-menu.js - src/prefs-dialog.js - src/prefs.js - src/remote.js - src/remove-dialog.js - src/rename-dialog.js - src/shortcuts-dialog.js - src/statistics-dialog.js - src/torrent.js - src/torrent-row.js - src/transmission.js - src/utils.js - assets/css/transmission-app.scss -) + src/about-dialog.js + src/action-manager.js + src/alert-dialog.js + src/context-menu.js + src/file-row.js + src/formatter.js + src/inspector.js + src/main.js + src/move-dialog.js + src/notifications.js + src/open-dialog.js + src/overflow-menu.js + src/prefs-dialog.js + src/prefs.js + src/remote.js + src/remove-dialog.js + src/rename-dialog.js + src/shortcuts-dialog.js + src/statistics-dialog.js + src/torrent.js + src/torrent-row.js + src/transmission.js + src/utils.js + assets/css/transmission-app.scss) set(TRWEB_IMGS - assets/img/box.svg - assets/img/film.svg - assets/img/modern-tortoise-blue.png - assets/img/modern-tortoise.png - assets/img/chevron-down.svg - assets/img/chevron-up.svg - assets/img/horizontal-rule.svg - assets/img/lock-fill.svg - assets/img/logo.png - assets/img/image.svg - assets/img/magnet.svg - assets/img/music.svg - assets/img/file-text.svg - assets/img/package.svg - assets/img/folder.svg - assets/img/pause-circle-active.svg - assets/img/pause-circle-idle.svg - assets/img/play-circle-active.svg - assets/img/play-circle-idle.svg - assets/img/router.svg - assets/img/type.svg -) + assets/img/box.svg + assets/img/film.svg + assets/img/modern-tortoise-blue.png + assets/img/modern-tortoise.png + assets/img/chevron-down.svg + assets/img/chevron-up.svg + assets/img/horizontal-rule.svg + assets/img/lock-fill.svg + assets/img/logo.png + assets/img/image.svg + assets/img/magnet.svg + assets/img/music.svg + assets/img/file-text.svg + assets/img/package.svg + assets/img/folder.svg + assets/img/pause-circle-active.svg + assets/img/pause-circle-idle.svg + assets/img/play-circle-active.svg + assets/img/play-circle-idle.svg + assets/img/router.svg + assets/img/type.svg) -add_custom_target( - trweb ALL - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/package.json" "${CMAKE_CURRENT_BINARY_DIR}/package.json" - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/yarn.lock" "${CMAKE_CURRENT_BINARY_DIR}/yarn.lock" - COMMAND yarn install - COMMAND yarn webpack --config "${CMAKE_CURRENT_SOURCE_DIR}/webpack.config.js" --context "${CMAKE_CURRENT_SOURCE_DIR}" - BYPRODUCTS - public_html/transmission-app.js - public_html/transmission-app.js.LICENSE.txt - DEPENDS ${TRWEB_IMGS} - SOURCES ${TRWEB_SRCS} -) +add_custom_target(trweb ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/package.json" "${CMAKE_CURRENT_BINARY_DIR}/package.json" + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/yarn.lock" "${CMAKE_CURRENT_BINARY_DIR}/yarn.lock" + COMMAND yarn install + COMMAND yarn webpack --config "${CMAKE_CURRENT_SOURCE_DIR}/webpack.config.js" --context "${CMAKE_CURRENT_SOURCE_DIR}" + BYPRODUCTS + public_html/transmission-app.js + public_html/transmission-app.js.LICENSE.txt + DEPENDS ${TRWEB_IMGS} + SOURCES ${TRWEB_SRCS})