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
This commit is contained in:
Mike Gelfand 2023-01-01 11:49:48 -08:00 committed by GitHub
parent 453836f324
commit bc380511db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 2011 additions and 1705 deletions

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.9 FATAL_ERROR) cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
if(POLICY CMP0092) if(POLICY CMP0092)
cmake_policy(SET CMP0092 NEW) 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. # 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 # See: https://cmake.org/cmake/help/latest/variable/CMAKE_OSX_DEPLOYMENT_TARGET.html
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET) 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() endif()
project(transmission) project(transmission)
@ -23,60 +25,60 @@ include(CheckIncludeFile)
include(CheckIncludeFiles) include(CheckIncludeFiles)
include(CheckFunctionExists) include(CheckFunctionExists)
include(CheckLibraryExists) include(CheckLibraryExists)
include(CheckSymbolExists)
include(ExternalProject) include(ExternalProject)
include(GNUInstallDirs) include(GNUInstallDirs)
include(TrMacros) include(TrMacros)
set(CURL_MINIMUM 7.28.0) set(CURL_MINIMUM 7.28.0)
set(WOLFSSL_MINIMUM 3.4) set(WOLFSSL_MINIMUM 3.4)
set(DEFLATE_MINIMUM 1.10) set(DEFLATE_MINIMUM 1.10)
set(EVENT2_MINIMUM 2.1.0) set(EVENT2_MINIMUM 2.1.0)
set(GIOMM_MINIMUM 2.26.0) set(GIOMM_MINIMUM 2.26.0)
set(GLIBMM_MINIMUM 2.60.0) set(GLIBMM_MINIMUM 2.60.0)
set(GTKMM_MINIMUM 3.24.0) set(GTKMM_MINIMUM 3.24.0)
set(OPENSSL_MINIMUM 0.9.7) set(OPENSSL_MINIMUM 0.9.7)
set(MBEDTLS_MINIMUM 1.3) set(MBEDTLS_MINIMUM 1.3)
set(PSL_MINIMUM 0.21.1) set(PSL_MINIMUM 0.21.1)
set(QT_MINIMUM 5.6) set(QT_MINIMUM 5.6)
option(ENABLE_DAEMON "Build daemon" ON) option(ENABLE_DAEMON "Build daemon" ON)
tr_auto_option(ENABLE_GTK "Build GTK client" AUTO) tr_auto_option(ENABLE_GTK "Build GTK client" AUTO)
tr_auto_option(ENABLE_QT "Build Qt client" AUTO) tr_auto_option(ENABLE_QT "Build Qt client" AUTO)
tr_auto_option(ENABLE_MAC "Build Mac client" AUTO) tr_auto_option(ENABLE_MAC "Build Mac client" AUTO)
option(ENABLE_WEB "Build Web client" OFF) option(ENABLE_WEB "Build Web client" OFF)
option(ENABLE_UTILS "Build utils (create, edit, show)" ON) option(ENABLE_UTILS "Build utils (create, edit, show)" ON)
option(ENABLE_CLI "Build command-line client" OFF) option(ENABLE_CLI "Build command-line client" OFF)
option(ENABLE_TESTS "Build unit tests" ON) 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_LIGHTWEIGHT
option(ENABLE_UTP "Build µTP support" ON) "Optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc."
option(ENABLE_WERROR "Treat warnings as errors" OFF) OFF)
option(ENABLE_NLS "Enable native language support" ON) option(ENABLE_UTP "Build µTP support" ON)
option(INSTALL_DOC "Build/install documentation" ON) option(ENABLE_WERROR "Treat warnings as errors" OFF)
option(INSTALL_LIB "Install the library" OFF) option(ENABLE_NLS "Enable native language support" ON)
tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" AUTO) option(INSTALL_DOC "Build/install documentation" ON)
tr_auto_option(USE_SYSTEM_EVENT2 "Use system event2 library" AUTO) option(INSTALL_LIB "Install the library" OFF)
tr_auto_option(USE_SYSTEM_DEFLATE "Use system deflate library" AUTO) tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" AUTO)
tr_auto_option(USE_SYSTEM_DHT "Use system dht library" 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_MINIUPNPC "Use system miniupnpc library" AUTO)
tr_auto_option(USE_SYSTEM_NATPMP "Use system natpmp 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_UTP "Use system utp library" AUTO)
tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO) tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO)
tr_auto_option(USE_SYSTEM_PSL "Use system psl library" AUTO) tr_auto_option(USE_SYSTEM_PSL "Use system psl library" AUTO)
tr_list_option(USE_GTK_VERSION "Use specific GTK version" AUTO 3 4) 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(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_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_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_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_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(WITH_SYSTEMD "Add support for systemd startup notification (on systems that support it)" AUTO)
set(TR_NAME ${PROJECT_NAME}) set(TR_NAME ${PROJECT_NAME})
# major.minor.patch[-[beta.N.]dev]+commit_hash # major.minor.patch[-[beta.N.]dev]+commit_hash
# dev builds come between releases, e.g. autobuilds from CI # dev builds come between releases, e.g. autobuilds from CI
# these should be the only five lines you need to change # these should be the only five lines you need to change
set(TR_VERSION_MAJOR "4") set(TR_VERSION_MAJOR "4")
set(TR_VERSION_MINOR "0") 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) set(TR_VERSION_DEV TRUE)
# derived from above: release type # derived from above: release type
if (TR_VERSION_DEV) if(TR_VERSION_DEV)
set(TR_NIGHTLY_RELEASE 1) set(TR_NIGHTLY_RELEASE 1)
elseif (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "") elseif(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
set(TR_BETA_RELEASE 1) set(TR_BETA_RELEASE 1)
else() else()
set(TR_STABLE_RELEASE 1) set(TR_STABLE_RELEASE 1)
@ -99,15 +101,15 @@ endif()
# '4.0.0-beta.2' # '4.0.0-beta.2'
# '4.0.0' # '4.0.0'
set(TR_SEMVER "${TR_VERSION_MAJOR}.${TR_VERSION_MINOR}.${TR_VERSION_PATCH}") 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 "-") 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}") string(APPEND TR_SEMVER "beta.${TR_VERSION_BETA_NUMBER}")
endif() 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 ".") string(APPEND TR_SEMVER ".")
endif() endif()
if (TR_VERSION_DEV) if(TR_VERSION_DEV)
string(APPEND TR_SEMVER "dev") string(APPEND TR_SEMVER "dev")
endif() endif()
endif() endif()
@ -127,16 +129,15 @@ string(SUBSTRING "${BASE62}" "${TR_VERSION_MINOR}" 1 TMPSTR)
string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}") string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}")
string(SUBSTRING "${BASE62}" "${TR_VERSION_PATCH}" 1 TMPSTR) string(SUBSTRING "${BASE62}" "${TR_VERSION_PATCH}" 1 TMPSTR)
string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}") string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}")
if (TR_VERSION_DEV) if(TR_VERSION_DEV)
string(APPEND TR_PEER_ID_PREFIX "Z") 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") string(APPEND TR_PEER_ID_PREFIX "B")
else() else()
string(APPEND TR_PEER_ID_PREFIX "0") string(APPEND TR_PEER_ID_PREFIX "0")
endif() endif()
string(APPEND TR_PEER_ID_PREFIX "-") string(APPEND TR_PEER_ID_PREFIX "-")
set(TR_VCS_REVISION_FILE "${CMAKE_SOURCE_DIR}/REVISION") set(TR_VCS_REVISION_FILE "${CMAKE_SOURCE_DIR}/REVISION")
if(EXISTS ${CMAKE_SOURCE_DIR}/.git) 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}") set(TR_VCS_REVISION "$ENV{BUILD_VCS_NUMBER}")
elseif(GIT_FOUND) elseif(GIT_FOUND)
execute_process( execute_process(
COMMAND COMMAND ${GIT_EXECUTABLE} rev-list --max-count=1 HEAD
${GIT_EXECUTABLE} rev-list --max-count=1 HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
WORKING_DIRECTORY OUTPUT_VARIABLE TR_VCS_REVISION
${CMAKE_SOURCE_DIR} OUTPUT_STRIP_TRAILING_WHITESPACE)
OUTPUT_VARIABLE
TR_VCS_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif() endif()
if("${TR_VCS_REVISION}" STREQUAL "" AND EXISTS "${TR_VCS_REVISION_FILE}") if("${TR_VCS_REVISION}" STREQUAL "" AND EXISTS "${TR_VCS_REVISION_FILE}")
@ -196,9 +193,12 @@ if(WIN32)
endforeach() endforeach()
endif() endif()
set(CMAKE_FOLDER "third-party")
find_package(Fmt) find_package(Fmt)
add_definitions(-DFMT_HEADER_ONLY -DFMT_EXCEPTIONS=0) add_definitions(
include_directories(SYSTEM ${LIBFMT_INCLUDE_DIRS}) -DFMT_HEADER_ONLY
-DFMT_EXCEPTIONS=0)
find_package(WideInteger) find_package(WideInteger)
find_package(FastFloat) find_package(FastFloat)
@ -221,7 +221,9 @@ endif()
set(CRYPTO_PKG "") set(CRYPTO_PKG "")
if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "ccrypto") if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "ccrypto")
tr_get_required_flag(WITH_CRYPTO CCRYPTO_IS_REQUIRED) 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) mark_as_advanced(CCRYPTO_INCLUDE_DIR)
tr_fixup_list_option(WITH_CRYPTO "ccrypto" CCRYPTO_INCLUDE_DIR "AUTO" CCRYPTO_IS_REQUIRED) tr_fixup_list_option(WITH_CRYPTO "ccrypto" CCRYPTO_INCLUDE_DIR "AUTO" CCRYPTO_IS_REQUIRED)
if(WITH_CRYPTO STREQUAL "ccrypto") if(WITH_CRYPTO STREQUAL "ccrypto")
@ -318,8 +320,17 @@ if(ENABLE_QT)
set(ENABLE_QT_COM_INTEROP OFF) set(ENABLE_QT_COM_INTEROP OFF)
set(ENABLE_QT_DBUS_INTEROP OFF) set(ENABLE_QT_DBUS_INTEROP OFF)
set(QT_REQUIRED_MODULES Core Gui Widgets Network Svg LinguistTools) set(QT_REQUIRED_MODULES
set(QT_OPTIONAL_MODULES DBus AxContainer AxServer) Core
Gui
Widgets
Network
Svg
LinguistTools)
set(QT_OPTIONAL_MODULES
DBus
AxContainer
AxServer)
set(MISSING_QT_MODULE) set(MISSING_QT_MODULE)
set(Qt_NAMES Qt6 Qt5) 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) tr_add_external_auto_library(NATPMP libnatpmp natpmp)
if(NOT USE_SYSTEM_NATPMP) if(NOT USE_SYSTEM_NATPMP)
set(NATPMP_DEFINITIONS -DNATPMP_STATICLIB) set(NATPMP_DEFINITIONS NATPMP_STATICLIB)
endif() endif()
tr_add_external_auto_library(MINIUPNPC miniupnpc miniupnpc 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_STATIC=ON
-DUPNPC_BUILD_SHARED=OFF -DUPNPC_BUILD_SHARED=OFF
-DUPNPC_BUILD_TESTS=OFF) -DUPNPC_BUILD_TESTS=OFF)
set(MINIUPNPC_DEFINITIONS -DSYSTEM_MINIUPNP) set(MINIUPNPC_DEFINITIONS SYSTEM_MINIUPNP)
if(NOT USE_SYSTEM_MINIUPNPC) if(NOT USE_SYSTEM_MINIUPNPC)
list(APPEND MINIUPNPC_DEFINITIONS -DMINIUPNP_STATICLIB) list(APPEND MINIUPNPC_DEFINITIONS MINIUPNP_STATICLIB)
set(MINIUPNPC_VERSION 1.9) set(MINIUPNPC_VERSION 1.9)
set(MINIUPNPC_API_VERSION 12) set(MINIUPNPC_API_VERSION 12)
endif() endif()
@ -437,15 +448,18 @@ tr_add_external_auto_library(PSL libpsl psl)
if(ENABLE_UTP) if(ENABLE_UTP)
tr_add_external_auto_library(UTP libutp utp tr_add_external_auto_library(UTP libutp utp
CMAKE_ARGS CMAKE_ARGS -DLIBUTP_BUILD_PROGRAMS=OFF)
-DLIBUTP_BUILD_PROGRAMS=OFF)
if(UTP_UPSTREAM_TARGET) if(UTP_UPSTREAM_TARGET)
# Use C++ linker for anything that depends on static libutp # Use C++ linker for anything that depends on static libutp
# TODO: switch to imported targets for all the dependencies # TODO: switch to imported targets for all the dependencies
add_library(UTP::UTP STATIC IMPORTED) add_library(UTP::UTP STATIC IMPORTED)
set_property(TARGET UTP::UTP PROPERTY IMPORTED_LOCATION "${UTP_LIBRARIES}") set_property(
set_property(TARGET UTP::UTP PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX") TARGET UTP::UTP
PROPERTY IMPORTED_LOCATION "${UTP_LIBRARIES}")
set_property(
TARGET UTP::UTP
PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX")
set(UTP_LIBRARIES UTP::UTP) set(UTP_LIBRARIES UTP::UTP)
endif() endif()
endif() endif()
@ -484,8 +498,6 @@ if(WITH_SYSTEMD)
tr_fixup_auto_option(WITH_SYSTEMD SYSTEMD_FOUND SYSTEMD_IS_REQUIRED) tr_fixup_auto_option(WITH_SYSTEMD SYSTEMD_FOUND SYSTEMD_IS_REQUIRED)
endif() endif()
include_directories(${CMAKE_BINARY_DIR})
if(WIN32) if(WIN32)
foreach(L C CXX) foreach(L C CXX)
# Filter out needless definitions # Filter out needless definitions
@ -493,6 +505,8 @@ if(WIN32)
endforeach() endforeach()
endif() endif()
unset(CMAKE_FOLDER)
## Compiler standard version ## Compiler standard version
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
@ -509,8 +523,7 @@ include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag)
if(MSVC) if(MSVC)
set(WARNING_CANDIDATES set(WARNING_CANDIDATES /W4)
/W4)
foreach(FLAG ${WARNING_CANDIDATES}) foreach(FLAG ${WARNING_CANDIDATES})
list(APPEND C_WARNING_FLAGS ${FLAG}) list(APPEND C_WARNING_FLAGS ${FLAG})
@ -573,7 +586,7 @@ else()
set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}") set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}")
string(TOLOWER "${CACHE_ID}" CACHE_ID) string(TOLOWER "${CACHE_ID}" CACHE_ID)
check_c_compiler_flag(${FLAG} ${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 # Make sure the next loop only adds flags that are relevant for a particular language
set(CMAKE_REQUIRED_FLAGS ${FLAG}) set(CMAKE_REQUIRED_FLAGS ${FLAG})
break() break()
@ -587,7 +600,7 @@ else()
set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}") set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}")
string(TOLOWER "${CACHE_ID}" CACHE_ID) string(TOLOWER "${CACHE_ID}" CACHE_ID)
check_c_compiler_flag(${FLAG} ${CACHE_ID}) check_c_compiler_flag(${FLAG} ${CACHE_ID})
if (${CACHE_ID}) if(${CACHE_ID})
list(APPEND C_WARNING_FLAGS ${FLAG}) list(APPEND C_WARNING_FLAGS ${FLAG})
endif() endif()
@ -595,7 +608,7 @@ else()
set(CACHE_ID "${CMAKE_CXX_COMPILER_ID}_CXX_HAS${FLAG_ID}") set(CACHE_ID "${CMAKE_CXX_COMPILER_ID}_CXX_HAS${FLAG_ID}")
string(TOLOWER "${CACHE_ID}" CACHE_ID) string(TOLOWER "${CACHE_ID}" CACHE_ID)
check_cxx_compiler_flag(${FLAG} ${CACHE_ID}) check_cxx_compiler_flag(${FLAG} ${CACHE_ID})
if (${CACHE_ID}) if(${CACHE_ID})
list(APPEND CXX_WARNING_FLAGS ${FLAG}) list(APPEND CXX_WARNING_FLAGS ${FLAG})
endif() endif()
@ -616,83 +629,11 @@ add_compile_options(
include(LargeFileSupport) 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) check_library_exists(m sqrt "" HAVE_LIBM)
if(HAVE_LIBM) if(HAVE_LIBM)
set(LIBM_LIBRARY m) set(LIBM_LIBRARY m)
endif() endif()
check_symbol_exists(SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT)
set(TR_NETWORK_LIBRARIES) set(TR_NETWORK_LIBRARIES)
if(WIN32) if(WIN32)
list(APPEND TR_NETWORK_LIBRARIES iphlpapi ws2_32) list(APPEND TR_NETWORK_LIBRARIES iphlpapi ws2_32)
@ -709,7 +650,7 @@ else()
endif() endif()
if(RUN_CLANG_TIDY STREQUAL "AUTO") 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) set(RUN_CLANG_TIDY OFF)
else() else()
set(RUN_CLANG_TIDY ON) set(RUN_CLANG_TIDY ON)
@ -719,7 +660,7 @@ endif()
if(RUN_CLANG_TIDY) if(RUN_CLANG_TIDY)
message(STATUS "Looking for clang-tidy") message(STATUS "Looking for clang-tidy")
find_program(CLANG_TIDY 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") message(STATUS "Looking for clang-tidy - not found")
else() else()
message(STATUS "Looking for clang-tidy - found") message(STATUS "Looking for clang-tidy - found")
@ -733,7 +674,9 @@ if(ENABLE_TESTS)
endif() endif()
function(tr_install_web DST_DIR) 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() endfunction()
add_subdirectory(libtransmission) add_subdirectory(libtransmission)
@ -760,8 +703,17 @@ if(ENABLE_DAEMON OR ENABLE_GTK OR ENABLE_QT)
endif() endif()
if(INSTALL_DOC) 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(
install(DIRECTORY news DESTINATION ${CMAKE_INSTALL_DOCDIR}) 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() endif()
if(MSVC AND ENABLE_DAEMON AND ENABLE_QT AND ENABLE_UTILS AND WITH_CRYPTO STREQUAL "openssl") 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 list(APPEND CPACK_SOURCE_IGNORE_FILES
"${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}"
"[.]git" "[.]git"
"node_modules" "node_modules")
)
## Code Formatting ## Code Formatting
if(GIT_FOUND) if(GIT_FOUND)
execute_process(COMMAND execute_process(
"${GIT_EXECUTABLE}" rev-parse --show-toplevel COMMAND "${GIT_EXECUTABLE}" rev-parse --show-toplevel
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE TR_GIT_ROOT OUTPUT_VARIABLE TR_GIT_ROOT
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE)
)
if(TR_GIT_ROOT AND IS_DIRECTORY "${TR_GIT_ROOT}/.git") if(TR_GIT_ROOT AND IS_DIRECTORY "${TR_GIT_ROOT}/.git")
configure_file( configure_file("${CMAKE_SOURCE_DIR}/extras/pre-commit" "${TR_GIT_ROOT}/.git/hooks/pre-commit" COPYONLY)
"${CMAKE_SOURCE_DIR}/extras/pre-commit"
"${TR_GIT_ROOT}/.git/hooks/pre-commit"
COPYONLY
)
add_custom_target(check-format add_custom_target(check-format
COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" --check COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" --check
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
)
add_custom_target(format add_custom_target(format
COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
) set_property(
set_property(TARGET check-format format PROPERTY FOLDER "utility") TARGET check-format format
PROPERTY FOLDER "utility")
endif() endif()
unset(TR_GIT_ROOT) unset(TR_GIT_ROOT)
endif() endif()

View File

@ -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)" "Transmission Utility ('cli', obsolete)"
"${TR_NAME}-cli" "${TR_NAME}-cli"
"${TR_NAME}-cli.exe") "${TR_NAME}-cli.exe")
add_executable(${TR_NAME}-cli cli.cc ${${PROJECT_NAME}_WIN32_RC_FILE}) install(
include_directories(${TR_NAME}-cli ${CURL_INCLUDE_DIRS}) TARGETS ${TR_NAME}-cli
target_link_libraries(${TR_NAME}-cli ${TR_NAME}) DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS ${TR_NAME}-cli DESTINATION ${CMAKE_INSTALL_BINDIR})
if(INSTALL_DOC) 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() endif()

View File

@ -1,8 +1,14 @@
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(PC_AYATANA_APPINDICATOR QUIET ayatana-appindicator3-0.1) 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_path(AYATANA_APPINDICATOR_INCLUDE_DIR
find_library(AYATANA_APPINDICATOR_LIBRARY NAMES ayatana-appindicator3 ayatana-appindicator HINTS ${PC_AYATANA_APPINDICATOR_LIBRARY_DIRS}) 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) if(AYATANA_APPINDICATOR_INCLUDE_DIR AND AYATANA_APPINDICATOR_LIBRARY)
set(APPINDICATOR_INCLUDE_DIR ${AYATANA_APPINDICATOR_INCLUDE_DIR}) 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) set(APPINDICATOR_IS_AYATANA ON)
else() else()
pkg_check_modules(PC_APPINDICATOR QUIET appindicator3-0.1) 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_path(APPINDICATOR_INCLUDE_DIR
find_library(APPINDICATOR_LIBRARY NAMES appindicator3 appindicator HINTS ${PC_APPINDICATOR_LIBRARY_DIRS}) 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) set(APPINDICATOR_IS_AYATANA OFF)
endif() endif()
@ -20,8 +32,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(APPINDICATOR find_package_handle_standard_args(APPINDICATOR
REQUIRED_VARS REQUIRED_VARS
APPINDICATOR_LIBRARY APPINDICATOR_LIBRARY
APPINDICATOR_INCLUDE_DIR APPINDICATOR_INCLUDE_DIR)
)
mark_as_advanced(AYATANA_APPINDICATOR_INCLUDE_DIR AYATANA_APPINDICATOR_LIBRARY) mark_as_advanced(AYATANA_APPINDICATOR_INCLUDE_DIR AYATANA_APPINDICATOR_LIBRARY)
mark_as_advanced(APPINDICATOR_INCLUDE_DIR APPINDICATOR_LIBRARY) mark_as_advanced(APPINDICATOR_INCLUDE_DIR APPINDICATOR_LIBRARY)

View File

@ -12,8 +12,14 @@ if(UNIX)
pkg_check_modules(_B64 QUIET libb64) pkg_check_modules(_B64 QUIET libb64)
endif() endif()
find_path(B64_INCLUDE_DIR NAMES b64/cdecode.h b64/cencode.h HINTS ${_B64_INCLUDEDIR}) find_path(B64_INCLUDE_DIR
find_library(B64_LIBRARY NAMES b64 HINTS ${_B64_LIBDIR}) 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_INCLUDE_DIRS ${B64_INCLUDE_DIR})
set(B64_LIBRARIES ${B64_LIBRARY}) set(B64_LIBRARIES ${B64_LIBRARY})
@ -23,8 +29,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(B64 find_package_handle_standard_args(B64
REQUIRED_VARS REQUIRED_VARS
B64_LIBRARY B64_LIBRARY
B64_INCLUDE_DIR B64_INCLUDE_DIR)
)
mark_as_advanced(B64_INCLUDE_DIR B64_LIBRARY) mark_as_advanced(B64_INCLUDE_DIR B64_LIBRARY)

View File

@ -8,13 +8,17 @@ if(DEFLATE_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
# pkg-config support added in libdeflate v1.9 # pkg-config support added in libdeflate v1.9
pkg_check_modules(_DEFLATE libdeflate>=${DEFLATE_MINIMUM}) pkg_check_modules(_DEFLATE libdeflate>=${DEFLATE_MINIMUM})
endif() endif()
find_path(DEFLATE_INCLUDE_DIR NAMES libdeflate.h HINTS ${_DEFLATE_INCLUDEDIR}) find_path(DEFLATE_INCLUDE_DIR
find_library(DEFLATE_LIBRARY NAMES deflate HINTS ${_DEFLATE_LIBDIR}) NAMES libdeflate.h
HINTS ${_DEFLATE_INCLUDEDIR})
find_library(DEFLATE_LIBRARY
NAMES deflate
HINTS ${_DEFLATE_LIBDIR})
set(DEFLATE_INCLUDE_DIRS ${DEFLATE_INCLUDE_DIR}) set(DEFLATE_INCLUDE_DIRS ${DEFLATE_INCLUDE_DIR})
set(DEFLATE_LIBRARIES ${DEFLATE_LIBRARY}) set(DEFLATE_LIBRARIES ${DEFLATE_LIBRARY})
@ -26,8 +30,7 @@ find_package_handle_standard_args(DEFLATE
REQUIRED_VARS REQUIRED_VARS
DEFLATE_INCLUDE_DIR DEFLATE_INCLUDE_DIR
DEFLATE_LIBRARY DEFLATE_LIBRARY
DEFLATE_VERSION DEFLATE_VERSION)
)
mark_as_advanced(DEFLATE_INCLUDE_DIR DEFLATE_LIBRARY) mark_as_advanced(DEFLATE_INCLUDE_DIR DEFLATE_LIBRARY)

View File

@ -8,12 +8,16 @@ if(DHT_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(_DHT QUIET libdht) pkg_check_modules(_DHT QUIET libdht)
endif() endif()
find_path(DHT_INCLUDE_DIR NAMES dht/dht.h HINTS ${_DHT_INCLUDEDIR}) find_path(DHT_INCLUDE_DIR
find_library(DHT_LIBRARY NAMES dht HINTS ${_DHT_LIBDIR}) 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_INCLUDE_DIRS ${DHT_INCLUDE_DIR})
set(DHT_LIBRARIES ${DHT_LIBRARY}) set(DHT_LIBRARIES ${DHT_LIBRARY})
@ -23,8 +27,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(DHT find_package_handle_standard_args(DHT
REQUIRED_VARS REQUIRED_VARS
DHT_LIBRARY DHT_LIBRARY
DHT_INCLUDE_DIR DHT_INCLUDE_DIR)
)
mark_as_advanced(DHT_INCLUDE_DIR DHT_LIBRARY) mark_as_advanced(DHT_INCLUDE_DIR DHT_LIBRARY)

View File

@ -8,18 +8,25 @@ if(EVENT2_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(_EVENT2 QUIET libevent) pkg_check_modules(_EVENT2 QUIET libevent)
endif() endif()
find_path(EVENT2_INCLUDE_DIR NAMES event2/event.h HINTS ${_EVENT2_INCLUDEDIR}) find_path(EVENT2_INCLUDE_DIR
find_library(EVENT2_LIBRARY NAMES event-2.1 event HINTS ${_EVENT2_LIBDIR}) 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_INCLUDE_DIR)
if(_EVENT2_VERSION) if(_EVENT2_VERSION)
set(EVENT2_VERSION ${_EVENT2_VERSION}) set(EVENT2_VERSION ${_EVENT2_VERSION})
else() 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 "\"([^\"]+)\"") if(EVENT2_VERSION_STR MATCHES "\"([^\"]+)\"")
set(EVENT2_VERSION "${CMAKE_MATCH_1}") set(EVENT2_VERSION "${CMAKE_MATCH_1}")
endif() endif()
@ -35,9 +42,7 @@ find_package_handle_standard_args(EVENT2
REQUIRED_VARS REQUIRED_VARS
EVENT2_LIBRARY EVENT2_LIBRARY
EVENT2_INCLUDE_DIR EVENT2_INCLUDE_DIR
VERSION_VAR VERSION_VAR EVENT2_VERSION)
EVENT2_VERSION
)
mark_as_advanced(EVENT2_INCLUDE_DIR EVENT2_LIBRARY) mark_as_advanced(EVENT2_INCLUDE_DIR EVENT2_LIBRARY)

View File

@ -1,7 +1,13 @@
# Grabbed from http://public.kitware.com/Bug/view.php?id=13517 and slightly modified. # Grabbed from http://public.kitware.com/Bug/view.php?id=13517 and slightly modified.
find_path(ICONV_INCLUDE_DIR iconv.h) find_path(ICONV_INCLUDE_DIR
find_library(ICONV_LIBRARY NAMES iconv libiconv libiconv-2 c) NAMES iconv.h)
find_library(ICONV_LIBRARY
NAMES
iconv
libiconv
libiconv-2
c)
set(ICONV_INCLUDE_DIRS ${ICONV_INCLUDE_DIR}) set(ICONV_INCLUDE_DIRS ${ICONV_INCLUDE_DIR})
set(ICONV_LIBRARIES ${ICONV_LIBRARY}) set(ICONV_LIBRARIES ${ICONV_LIBRARY})
@ -12,9 +18,7 @@ find_package_handle_standard_args(ICONV
REQUIRED_VARS REQUIRED_VARS
ICONV_LIBRARY ICONV_LIBRARY
ICONV_INCLUDE_DIR ICONV_INCLUDE_DIR
VERSION_VAR VERSION_VAR ICONV_VERSION)
ICONV_VERSION
)
if(ICONV_FOUND AND NOT DEFINED ICONV_SECOND_ARGUMENT_IS_CONST) if(ICONV_FOUND AND NOT DEFINED ICONV_SECOND_ARGUMENT_IS_CONST)
include(CheckCXXSourceCompiles) 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 "discards qualifiers in nested pointer types"
FAIL_REGEX "incompatible pointer type" FAIL_REGEX "incompatible pointer type"
FAIL_REGEX "invalid conversion" FAIL_REGEX "invalid conversion"
FAIL_REGEX "no matching function" FAIL_REGEX "no matching function")
)
set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_LIBRARIES) set(CMAKE_REQUIRED_LIBRARIES)

View File

@ -8,18 +8,25 @@ if(MINIUPNPC_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(_MINIUPNPC QUIET libminiupnpc) pkg_check_modules(_MINIUPNPC QUIET libminiupnpc)
endif() endif()
find_path(MINIUPNPC_INCLUDE_DIR NAMES miniupnpc/miniupnpc.h HINTS ${_MINIUPNPC_INCLUDEDIR}) find_path(MINIUPNPC_INCLUDE_DIR
find_library(MINIUPNPC_LIBRARY NAMES miniupnpc libminiupnpc HINTS ${_MINIUPNPC_LIBDIR}) NAMES miniupnpc/miniupnpc.h
HINTS ${_MINIUPNPC_INCLUDEDIR})
find_library(MINIUPNPC_LIBRARY
NAMES
miniupnpc
libminiupnpc
HINTS ${_MINIUPNPC_LIBDIR})
if(MINIUPNPC_INCLUDE_DIR) if(MINIUPNPC_INCLUDE_DIR)
if(_MINIUPNPC_VERSION) if(_MINIUPNPC_VERSION)
set(MINIUPNPC_VERSION ${_MINIUPNPC_VERSION}) set(MINIUPNPC_VERSION ${_MINIUPNPC_VERSION})
else() 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 "\"([^\"]+)\"") if(MINIUPNPC_VERSION_STR MATCHES "\"([^\"]+)\"")
set(MINIUPNPC_VERSION "${CMAKE_MATCH_1}") set(MINIUPNPC_VERSION "${CMAKE_MATCH_1}")
endif() endif()
@ -27,7 +34,8 @@ if(MINIUPNPC_INCLUDE_DIR)
# Let's hope it's 1.7 or higher, since it provides # Let's hope it's 1.7 or higher, since it provides
# MINIUPNPC_API_VERSION and we won't have to figure # MINIUPNPC_API_VERSION and we won't have to figure
# it out on our own # 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]+)") if(MINIUPNPC_API_VERSION_STR MATCHES "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)")
set(MINIUPNPC_API_VERSION "${CMAKE_MATCH_1}") set(MINIUPNPC_API_VERSION "${CMAKE_MATCH_1}")
endif() endif()
@ -37,8 +45,7 @@ if(MINIUPNPC_INCLUDE_DIR)
# Or maybe it's miniupnp 1.6 # Or maybe it's miniupnp 1.6
if(NOT DEFINED MINIUPNPC_API_VERSION) if(NOT DEFINED MINIUPNPC_API_VERSION)
file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c
" "#include <stdlib.h>
#include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <miniupnpc/miniupnpc.h> #include <miniupnpc/miniupnpc.h>
#include <miniupnpc/upnpcommands.h> #include <miniupnpc/upnpcommands.h>
@ -52,12 +59,11 @@ if(MINIUPNPC_INCLUDE_DIR)
char intPort[8]; char intPort[8];
char intClient[16]; char intClient[16];
upnpDiscover( 2000, NULL, NULL, 0, 0, &errno ); 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, UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype,
portStr, \"TCP\", intClient, intPort, NULL, NULL, NULL ); portStr, \"TCP\", intClient, intPort, NULL, NULL, NULL );
return 0; return 0;
} }")
")
try_compile(_MINIUPNPC_HAVE_VERSION_1_6 try_compile(_MINIUPNPC_HAVE_VERSION_1_6
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c ${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 # Or maybe it's miniupnp 1.5
if(NOT DEFINED MINIUPNPC_API_VERSION) if(NOT DEFINED MINIUPNPC_API_VERSION)
file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c
" "#include <stdlib.h>
#include <stdlib.h>
#include <miniupnpc/miniupnpc.h> #include <miniupnpc/miniupnpc.h>
#include <miniupnpc/upnpcommands.h> #include <miniupnpc/upnpcommands.h>
int main() int main()
@ -89,12 +94,11 @@ if(MINIUPNPC_INCLUDE_DIR)
char intPort[8]; char intPort[8];
char intClient[16]; char intClient[16];
upnpDiscover( 2000, NULL, NULL, 0 ); 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, UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype,
portStr, \"TCP\", intClient, intPort ); portStr, \"TCP\", intClient, intPort );
return 0; return 0;
} }")
")
try_compile(_MINIUPNPC_HAVE_VERSION_1_5 try_compile(_MINIUPNPC_HAVE_VERSION_1_5
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c
@ -121,9 +125,7 @@ find_package_handle_standard_args(MINIUPNPC
MINIUPNPC_LIBRARY MINIUPNPC_LIBRARY
MINIUPNPC_INCLUDE_DIR MINIUPNPC_INCLUDE_DIR
MINIUPNPC_API_VERSION MINIUPNPC_API_VERSION
VERSION_VAR VERSION_VAR MINIUPNPC_VERSION)
MINIUPNPC_VERSION
)
mark_as_advanced(MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY) mark_as_advanced(MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY)

View File

@ -12,14 +12,21 @@ if(UNIX)
pkg_check_modules(_MBEDTLS QUIET mbedtls) pkg_check_modules(_MBEDTLS QUIET mbedtls)
endif() endif()
find_path(MBEDTLS_INCLUDE_DIR NAMES mbedtls/version.h HINTS ${_MBEDTLS_INCLUDEDIR}) find_path(MBEDTLS_INCLUDE_DIR
find_library(MBEDTLS_LIBRARY NAMES mbedtls HINTS ${_MBEDTLS_LIBDIR}) NAMES mbedtls/version.h
find_library(MBEDCRYPTO_LIBRARY NAMES mbedcrypto HINTS ${_MBEDTLS_LIBDIR}) HINTS ${_MBEDTLS_INCLUDEDIR})
find_library(MBEDTLS_LIBRARY
NAMES mbedtls
HINTS ${_MBEDTLS_LIBDIR})
find_library(MBEDCRYPTO_LIBRARY
NAMES mbedcrypto
HINTS ${_MBEDTLS_LIBDIR})
if(_MBEDTLS_VERSION) if(_MBEDTLS_VERSION)
set(MBEDTLS_VERSION ${_MBEDTLS_VERSION}) set(MBEDTLS_VERSION ${_MBEDTLS_VERSION})
elseif(MBEDTLS_INCLUDE_DIR) 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 "\"([^\"]+)\"") if(MBEDTLS_VERSION_STR MATCHES "\"([^\"]+)\"")
set(MBEDTLS_VERSION "${CMAKE_MATCH_1}") set(MBEDTLS_VERSION "${CMAKE_MATCH_1}")
endif() endif()
@ -34,9 +41,7 @@ find_package_handle_standard_args(MbedTLS
REQUIRED_VARS REQUIRED_VARS
MBEDTLS_LIBRARY MBEDTLS_LIBRARY
MBEDTLS_INCLUDE_DIR MBEDTLS_INCLUDE_DIR
VERSION_VAR VERSION_VAR MBEDTLS_VERSION)
MBEDTLS_VERSION
)
mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDCRYPTO_LIBRARY) mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDCRYPTO_LIBRARY)

View File

@ -8,12 +8,16 @@ if(NATPMP_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(_NATPMP QUIET libnatpmp) pkg_check_modules(_NATPMP QUIET libnatpmp)
endif() endif()
find_path(NATPMP_INCLUDE_DIR NAMES natpmp.h HINTS ${_NATPMP_INCLUDEDIR}) find_path(NATPMP_INCLUDE_DIR
find_library(NATPMP_LIBRARY NAMES natpmp HINTS ${_NATPMP_LIBDIR}) NAMES natpmp.h
HINTS ${_NATPMP_INCLUDEDIR})
find_library(NATPMP_LIBRARY
NAMES natpmp
HINTS ${_NATPMP_LIBDIR})
set(NATPMP_INCLUDE_DIRS ${NATPMP_INCLUDE_DIR}) set(NATPMP_INCLUDE_DIRS ${NATPMP_INCLUDE_DIR})
set(NATPMP_LIBRARIES ${NATPMP_LIBRARY}) set(NATPMP_LIBRARIES ${NATPMP_LIBRARY})
@ -23,8 +27,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NATPMP find_package_handle_standard_args(NATPMP
REQUIRED_VARS REQUIRED_VARS
NATPMP_LIBRARY NATPMP_LIBRARY
NATPMP_INCLUDE_DIR NATPMP_INCLUDE_DIR)
)
mark_as_advanced(NATPMP_INCLUDE_DIR NATPMP_LIBRARY) mark_as_advanced(NATPMP_INCLUDE_DIR NATPMP_LIBRARY)

View File

@ -8,12 +8,16 @@ if(PSL_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(_PSL QUIET libpsl) pkg_check_modules(_PSL QUIET libpsl)
endif() endif()
find_path(PSL_INCLUDE_DIR NAMES libpsl.h HINTS ${_PSL_INCLUDEDIR}) find_path(PSL_INCLUDE_DIR
find_library(PSL_LIBRARY NAMES psl HINTS ${_PSL_LIBDIR}) NAMES libpsl.h
HINTS ${_PSL_INCLUDEDIR})
find_library(PSL_LIBRARY
NAMES psl
HINTS ${_PSL_LIBDIR})
set(PSL_INCLUDE_DIRS ${PSL_INCLUDE_DIR}) set(PSL_INCLUDE_DIRS ${PSL_INCLUDE_DIR})
set(PSL_LIBRARIES ${PSL_LIBRARY}) set(PSL_LIBRARIES ${PSL_LIBRARY})
@ -23,8 +27,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PSL find_package_handle_standard_args(PSL
REQUIRED_VARS REQUIRED_VARS
PSL_LIBRARY PSL_LIBRARY
PSL_INCLUDE_DIR PSL_INCLUDE_DIR)
)
mark_as_advanced(PSL_INCLUDE_DIR PSL_LIBRARY) mark_as_advanced(PSL_INCLUDE_DIR PSL_LIBRARY)

View File

@ -3,16 +3,19 @@ if(UNIX)
pkg_check_modules(PC_SYSTEMD QUIET libsystemd) pkg_check_modules(PC_SYSTEMD QUIET libsystemd)
endif() endif()
find_path(SYSTEMD_INCLUDE_DIR NAMES systemd/sd-daemon.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS}) find_path(SYSTEMD_INCLUDE_DIR
find_library(SYSTEMD_LIBRARY NAMES systemd HINTS ${PC_SYSTEMD_LIBRARY_DIRS}) NAMES systemd/sd-daemon.h
HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
find_library(SYSTEMD_LIBRARY
NAMES systemd
HINTS ${PC_SYSTEMD_LIBRARY_DIRS})
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SYSTEMD find_package_handle_standard_args(SYSTEMD
REQUIRED_VARS REQUIRED_VARS
SYSTEMD_LIBRARY SYSTEMD_LIBRARY
SYSTEMD_INCLUDE_DIR SYSTEMD_INCLUDE_DIR)
)
mark_as_advanced(SYSTEMD_INCLUDE_DIR SYSTEMD_LIBRARY) mark_as_advanced(SYSTEMD_INCLUDE_DIR SYSTEMD_LIBRARY)

View File

@ -8,12 +8,16 @@ if(UTP_PREFER_STATIC_LIB)
endif() endif()
if(UNIX) if(UNIX)
find_package(PkgConfig QUIET) find_package(PkgConfig QUIET)
pkg_check_modules(_UTP QUIET libutp) pkg_check_modules(_UTP QUIET libutp)
endif() endif()
find_path(UTP_INCLUDE_DIR NAMES libutp/utp.h HINTS ${_UTP_INCLUDEDIR}) find_path(UTP_INCLUDE_DIR
find_library(UTP_LIBRARY NAMES utp HINTS ${_UTP_LIBDIR}) NAMES libutp/utp.h
HINTS ${_UTP_INCLUDEDIR})
find_library(UTP_LIBRARY
NAMES utp
HINTS ${_UTP_LIBDIR})
if(UTP_INCLUDE_DIR AND UTP_LIBRARY) if(UTP_INCLUDE_DIR AND UTP_LIBRARY)
include(CheckSymbolExists) include(CheckSymbolExists)
@ -36,8 +40,7 @@ if(UTP_INCLUDE_DIR AND UTP_LIBRARY)
utp_set_callback utp_set_callback
utp_set_userdata utp_set_userdata
utp_write utp_write
utp_writev utp_writev)
)
set(_UTP_OLD_CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES}") set(_UTP_OLD_CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES}")
set(_UTP_OLD_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") set(_UTP_OLD_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
@ -71,8 +74,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(UTP find_package_handle_standard_args(UTP
REQUIRED_VARS REQUIRED_VARS
UTP_LIBRARY UTP_LIBRARY
UTP_INCLUDE_DIR UTP_INCLUDE_DIR)
)
mark_as_advanced(UTP_INCLUDE_DIR UTP_LIBRARY) mark_as_advanced(UTP_INCLUDE_DIR UTP_LIBRARY)

View File

@ -12,13 +12,18 @@ if(UNIX)
pkg_check_modules(_WOLFSSL QUIET wolfssl) pkg_check_modules(_WOLFSSL QUIET wolfssl)
endif() endif()
find_path(WOLFSSL_INCLUDE_DIR NAMES wolfssl/version.h HINTS ${_WOLFSSL_INCLUDEDIR}) find_path(WOLFSSL_INCLUDE_DIR
find_library(WOLFSSL_LIBRARY NAMES wolfssl HINTS ${_WOLFSSL_LIBDIR}) NAMES wolfssl/version.h
HINTS ${_WOLFSSL_INCLUDEDIR})
find_library(WOLFSSL_LIBRARY
NAMES wolfssl
HINTS ${_WOLFSSL_LIBDIR})
if(_WOLFSSL_VERSION) if(_WOLFSSL_VERSION)
set(WOLFSSL_VERSION ${_WOLFSSL_VERSION}) set(WOLFSSL_VERSION ${_WOLFSSL_VERSION})
elseif(WOLFSSL_INCLUDE_DIR) 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 "\"([^\"]+)\"") if(WOLFSSL_VERSION_STR MATCHES "\"([^\"]+)\"")
set(WOLFSSL_VERSION "${CMAKE_MATCH_1}") set(WOLFSSL_VERSION "${CMAKE_MATCH_1}")
endif() endif()
@ -33,9 +38,7 @@ find_package_handle_standard_args(WolfSSL
REQUIRED_VARS REQUIRED_VARS
WOLFSSL_LIBRARY WOLFSSL_LIBRARY
WOLFSSL_INCLUDE_DIR WOLFSSL_INCLUDE_DIR
VERSION_VAR VERSION_VAR WOLFSSL_VERSION)
WOLFSSL_VERSION
)
mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY) mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY)

View File

@ -7,12 +7,11 @@ if(NOT DEFINED NO_LFS_MACROS_REQUIRED)
# We can't simply define LARGE_OFF_T to be 9223372036854775807, # We can't simply define LARGE_OFF_T to be 9223372036854775807,
# since some C++ compilers masquerading as C compilers # since some C++ compilers masquerading as C compilers
# incorrectly reject 9223372036854775807. # incorrectly reject 9223372036854775807.
set(LFS_TEST_PROGRAM " set(LFS_TEST_PROGRAM
#include <sys/types.h> "#include <sys/types.h>
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) #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 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) check_c_source_compiles("${LFS_TEST_PROGRAM}" NO_LFS_MACROS_REQUIRED)
if(NOT NO_LFS_MACROS_REQUIRED) if(NOT NO_LFS_MACROS_REQUIRED)

View File

@ -1,3 +1,6 @@
include(CheckFunctionExists)
include(CheckIncludeFile)
macro(tr_auto_option_changed NAME ACC VAL FIL STK) macro(tr_auto_option_changed NAME ACC VAL FIL STK)
if(NOT ("${VAL}" STREQUAL "AUTO" OR "${VAL}" STREQUAL "ON" OR "${VAL}" STREQUAL "OFF")) 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") 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() endmacro()
macro(tr_auto_option NAME DESC VAL) 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") set_property(CACHE ${NAME} PROPERTY STRINGS "AUTO;ON;OFF")
variable_watch(${NAME} tr_auto_option_changed) variable_watch(${NAME} tr_auto_option_changed)
endmacro() endmacro()
@ -57,7 +61,7 @@ endmacro()
macro(tr_get_required_flag IVAR OVAR) macro(tr_get_required_flag IVAR OVAR)
set(${OVAR}) set(${OVAR})
if (${IVAR} AND NOT ${IVAR} STREQUAL "AUTO") if(${IVAR} AND NOT ${IVAR} STREQUAL "AUTO")
set(${OVAR} REQUIRED) set(${OVAR} REQUIRED)
endif() endif()
endmacro() endmacro()
@ -69,6 +73,61 @@ function(tr_make_id INPUT OVAR)
set(${OVAR} "${ID}" PARENT_SCOPE) set(${OVAR} "${ID}" PARENT_SCOPE)
endfunction() 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) macro(tr_add_external_auto_library ID DIRNAME LIBNAME)
if(USE_SYSTEM_${ID}) if(USE_SYSTEM_${ID})
tr_get_required_flag(USE_SYSTEM_${ID} SYSTEM_${ID}_IS_REQUIRED) 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}_UPSTREAM_TARGET ${LIBNAME})
set(${ID}_PREFIX "${CMAKE_BINARY_DIR}/third-party/${${ID}_UPSTREAM_TARGET}") set(${ID}_PREFIX "${CMAKE_BINARY_DIR}/third-party/${${ID}_UPSTREAM_TARGET}")
set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include" CACHE INTERNAL "") set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include"
set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE INTERNAL "") 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}_INCLUDE_DIRS ${${ID}_INCLUDE_DIR})
set(${ID}_LIBRARIES ${${ID}_LIBRARY}) set(${ID}_LIBRARIES ${${ID}_LIBRARY})
@ -114,8 +175,7 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME)
"-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>" "-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>"
"-DCMAKE_INSTALL_LIBDIR:STRING=lib" "-DCMAKE_INSTALL_LIBDIR:STRING=lib"
${${ID}_EXT_PROJ_CMAKE_ARGS} ${${ID}_EXT_PROJ_CMAKE_ARGS}
BUILD_BYPRODUCTS "${${ID}_LIBRARY}" BUILD_BYPRODUCTS "${${ID}_LIBRARY}")
)
set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "third-party") set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "third-party")
endif() endif()
@ -129,7 +189,47 @@ function(tr_append_target_property TGT PROP VAL)
set_target_properties(${TGT} PROPERTIES ${PROP} "${VAL}") set_target_properties(${TGT} PROPERTIES ${PROP} "${VAL}")
endfunction() 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}
$<$<BOOL:${${H_ID}}>:${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}
$<$<BOOL:${${F_ID}}>:${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) if(NOT WIN32)
return() return()
endif() 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") 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() endfunction()
function(tr_select_library LIBNAMES FUNCNAME DIRS OVAR) 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}") set(DEP_BUNDLE_PATH "Contents/MacOS/${DEP_NAME}")
elseif(DEP_FULL_PATH MATCHES "^(.+)/(([^/]+[.]framework)/.+)$") elseif(DEP_FULL_PATH MATCHES "^(.+)/(([^/]+[.]framework)/.+)$")
set(DEP_NAME "${CMAKE_MATCH_2}") 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}") set(DEP_BUNDLE_PATH "Contents/Frameworks/${DEP_NAME}")
else() else()
message(FATAL_ERROR "Don't know how to fixup '${DEP_FULL_PATH}'") 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() endwhile()
endfunction() endfunction()
macro(tr_qt_wrap_ui) function(tr_glib_compile_resources TGT NAME INPUT_DIR INPUT_FILE OUTPUT_FILE_BASE)
if(Qt_VERSION_MAJOR EQUAL 6) if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE)
qt6_wrap_ui(${ARGN}) execute_process(
else() COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_resources
qt5_wrap_ui(${ARGN}) OUTPUT_VARIABLE GLIB_COMPILE_RESOURCES_EXECUTABLE
endif() OUTPUT_STRIP_TRAILING_WHITESPACE)
endmacro()
macro(tr_qt_add_resources) if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE)
if(Qt_VERSION_MAJOR EQUAL 6) message(SEND_ERROR "Unable to find glib-compile-resources executable")
qt6_add_resources(${ARGN}) endif()
else()
qt5_add_resources(${ARGN})
endif()
endmacro()
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 ">([^<]+)</file>")
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) 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) elseif(Qt_VERSION GREATER_EQUAL 5.11)
qt5_add_translation(${ARGN} OPTIONS -silent) qt5_add_translation(${OUTPUT_FILES_VAR} ${ARGN} OPTIONS -silent)
else() else()
qt5_add_translation(${ARGN}) qt5_add_translation(${OUTPUT_FILES_VAR} ${ARGN})
endif() endif()
source_group("Generated Files"
FILES ${${OUTPUT_FILES_VAR}})
endmacro() 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()

View File

@ -0,0 +1,6 @@
#include "winresrc.h"
#pragma code_page(1252)
LANGUAGE 0, 0
1 TYPELIB "${OUTPUT_FILE_BASE}.tlb"

View File

@ -1,58 +1,61 @@
project(trdaemon) add_executable(${TR_NAME}-daemon)
if(WITH_SYSTEMD) target_sources(${TR_NAME}-daemon
add_definitions(-DUSE_SYSTEMD) PRIVATE
endif() daemon.cc
daemon.h
daemon-posix.cc
daemon-win32.cc)
include_directories( tr_allow_compile_if(
${CMAKE_SOURCE_DIR} [=[[WIN32]]=]
) daemon-win32.cc
include_directories( [=[[NOT WIN32]]=]
SYSTEM daemon-posix.cc)
${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS}
)
set(${PROJECT_NAME}_SOURCES target_compile_definitions(${TR_NAME}-daemon
daemon.cc PRIVATE
daemon-posix.cc $<$<BOOL:${WITH_SYSTEMD}>:USE_SYSTEMD>)
daemon-win32.cc
)
if(WIN32) tr_target_compile_definitions_for_headers(${TR_NAME}-daemon
set_source_files_properties(daemon-posix.cc PROPERTIES HEADER_FILE_ONLY ON) PRIVATE
else() sys/signalfd.h)
set_source_files_properties(daemon-win32.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
set(${PROJECT_NAME}_HEADERS tr_target_compile_definitions_for_functions(${TR_NAME}-daemon
daemon.h 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}
$<$<BOOL:${WITH_SYSTEMD}>:${SYSTEMD_INCLUDE_DIRS}>)
target_link_libraries(${TR_NAME}-daemon
PRIVATE
${TR_NAME}
${EVENT2_LIBRARIES}
$<$<BOOL:${WITH_SYSTEMD}>:${SYSTEMD_LIBRARIES}>)
tr_win32_app_info(${TR_NAME}-daemon
"Transmission Daemon" "Transmission Daemon"
"${TR_NAME}-daemon" "${TR_NAME}-daemon"
"${TR_NAME}-daemon.exe") "${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) foreach(P daemon)
install(TARGETS ${TR_NAME}-${P} DESTINATION ${CMAKE_INSTALL_BINDIR}) install(
TARGETS ${TR_NAME}-${P}
DESTINATION ${CMAKE_INSTALL_BINDIR})
if(INSTALL_DOC) 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() endif()
endforeach() endforeach()

View File

@ -1,5 +1,3 @@
project(tr-dist-msi)
include(UtilityFunctions.cmake) include(UtilityFunctions.cmake)
if(CMAKE_SIZEOF_VOID_P EQUAL 8) if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@ -56,7 +54,9 @@ else()
set(TR_OPENSSL_SSL_NAME "ssleay32.dll") set(TR_OPENSSL_SSL_NAME "ssleay32.dll")
endif() 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(WEBSRCDIR "${CMAKE_INSTALL_PREFIX}/share/transmission/public_html")
set(TRQMSRCDIR "${CMAKE_INSTALL_PREFIX}/share/transmission/translations") 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(WebUi.wxs "${WEBSRCDIR}" WebUiComponents WEBINSTALLDIR var.WebSrcDir)
wix_heat(QtClientTranslations.wxs "${TRQMSRCDIR}" QtClientTranslationsComponents QMINSTALLDIR var.TrQmSrcDir) 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 wix_candle(WIX_OBJS
ARCHITECTURE ARCHITECTURE ${ARCH}
${ARCH}
SOURCES SOURCES
components/CliTools.wxs components/CliTools.wxs
components/CommonLibs.wxs components/CommonLibs.wxs
@ -95,14 +95,11 @@ wix_candle(${PROJECT_NAME}_OBJS
"MsvcCrtMsmFile=${TR_MSVC_CRT_MSM_FILE}" "MsvcCrtMsmFile=${TR_MSVC_CRT_MSM_FILE}"
"OpenSslCryptoName=${TR_OPENSSL_CRYPTO_NAME}" "OpenSslCryptoName=${TR_OPENSSL_CRYPTO_NAME}"
"OpenSslSslName=${TR_OPENSSL_SSL_NAME}" "OpenSslSslName=${TR_OPENSSL_SSL_NAME}"
EXTRA_DEPENDS EXTRA_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/TransmissionConfig.wxi")
"${CMAKE_CURRENT_BINARY_DIR}/TransmissionConfig.wxi")
wix_light(${PROJECT_NAME}_OUTPUT wix_light(WIX_OUTPUT
NAME NAME transmission-${MSI_FILENAME_VERSION}-${ARCH}
transmission-${MSI_FILENAME_VERSION}-${ARCH} OBJECTS ${WIX_OBJS}
OBJECTS
${${PROJECT_NAME}_OBJS}
EXTENSIONS EXTENSIONS
WixUIExtension WixUIExtension
WixUtilExtension WixUtilExtension
@ -119,5 +116,4 @@ add_custom_target(pack-msi
QtTranslations.xsl QtTranslations.xsl
Transmission.wxs Transmission.wxs
TransmissionConfig.wxi.in TransmissionConfig.wxi.in
DEPENDS DEPENDS "${WIX_OUTPUT}")
"${${PROJECT_NAME}_OUTPUT}")

View File

@ -22,8 +22,12 @@ function(find_msvc_crt_msm OUTPUT_VAR)
set(CMN_PF_DIR "CommonProgramFiles(x86)") set(CMN_PF_DIR "CommonProgramFiles(x86)")
find_file(${OUTPUT_VAR} find_file(${OUTPUT_VAR}
NAMES "${MSM_FILE}" NAMES "${MSM_FILE}"
PATHS ${VC_VER_DIRS} $ENV{${CMN_PF_DIR}} PATHS
PATH_SUFFIXES "MergeModules" "Merge Modules") ${VC_VER_DIRS}
$ENV{${CMN_PF_DIR}}
PATH_SUFFIXES
"MergeModules"
"Merge Modules")
message(STATUS " * Result: ${${OUTPUT_VAR}}") message(STATUS " * Result: ${${OUTPUT_VAR}}")
set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE)
@ -76,7 +80,9 @@ function(wix_candle OUTPUT_VAR)
add_custom_command( add_custom_command(
OUTPUT "${CANDLE_OUTPUT}" OUTPUT "${CANDLE_OUTPUT}"
COMMAND candle ${OPTIONS} "${F}" -out "${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}") list(APPEND ${OUTPUT_VAR} "${CANDLE_OUTPUT}")
endforeach() endforeach()
@ -96,7 +102,9 @@ function(wix_light OUTPUT_VAR)
OUTPUT ${LIGHT_OUTPUT} OUTPUT ${LIGHT_OUTPUT}
BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.wixpdb" BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.wixpdb"
COMMAND light ${OPTIONS} -out "${CMAKE_CURRENT_BINARY_DIR}/${LIGHT_NAME}.msi" ${LIGHT_OBJECTS} 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}) list(APPEND ${OUTPUT_VAR} ${LIGHT_OUTPUT})
set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE) set(${OUTPUT_VAR} "${${OUTPUT_VAR}}" PARENT_SCOPE)

View File

@ -1,279 +1,245 @@
project(trgtk)
if(ENABLE_WERROR)
add_compile_options($<IF:$<CXX_COMPILER_ID:MSVC>,/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) 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) if(GTK_VERSION EQUAL 4)
set(UI_SUBDIR ui/gtk4) set(UI_SUBDIR ui/gtk4)
else() else()
set(UI_SUBDIR ui/gtk3) set(UI_SUBDIR ui/gtk3)
endif() endif()
set(${PROJECT_NAME}_UI_FILES tr_target_glib_resources(${TR_NAME}-gtk
${UI_SUBDIR}/AddTrackerDialog.ui transmission.gresource.xml
${UI_SUBDIR}/DetailsDialog.ui ${UI_SUBDIR}/transmission-ui.gresource.xml)
${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}
)
if(ENABLE_NLS) if(ENABLE_NLS)
set(${PROJECT_NAME}_DESKTOP_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.desktop") set(DESKTOP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TR_NAME}-gtk.desktop")
add_custom_command( tr_gettext_msgfmt(${TR_NAME}-gtk
OUTPUT ${${PROJECT_NAME}_DESKTOP_FILE} ${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} ${CMAKE_CURRENT_SOURCE_DIR}/transmission-gtk.desktop.in)
DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in target_sources(${TR_NAME}-gtk
VERBATIM PRIVATE
) ${DESKTOP_FILE})
set(${PROJECT_NAME}_METAINFO_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.metainfo.xml") set(METAINFO_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TR_NAME}-gtk.metainfo.xml")
add_custom_command( tr_gettext_msgfmt(${TR_NAME}-gtk
OUTPUT ${${PROJECT_NAME}_METAINFO_FILE} ${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} ${CMAKE_CURRENT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in)
DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in target_sources(${TR_NAME}-gtk
VERBATIM PRIVATE
) ${METAINFO_FILE})
source_group("Generated Files" FILES ${${PROJECT_NAME}_DESKTOP_FILE} ${${PROJECT_NAME}_METAINFO_FILE})
endif() endif()
set(${PROJECT_NAME}_SOURCES target_compile_definitions(${TR_NAME}-gtk
Actions.cc PRIVATE
Application.cc TRANSMISSIONLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}"
DetailsDialog.cc GETTEXT_PACKAGE="${TR_NAME}-gtk"
Dialogs.cc G_DISABLE_DEPRECATED
FaviconCache.cc GDK_PIXBUF_DISABLE_DEPRECATED
FileList.cc GDK_DISABLE_DEPRECATED
FilterBar.cc GTK_DISABLE_DEPRECATED
FreeSpaceLabel.cc PANGO_DISABLE_DEPRECATED
IconCache.cc # FIXME: these break libnotify's headers
ListModelAdapter.cc # G_DISABLE_SINGLE_INCLUDES
main.cc # GTK_DISABLE_SINGLE_INCLUDES
MainWindow.cc GDKMM_DISABLE_DEPRECATED
MakeDialog.cc GIOMM_DISABLE_DEPRECATED
MessageLogWindow.cc GLIBMM_DISABLE_DEPRECATED
Notify.cc GTKMM_DISABLE_DEPRECATED
OptionsDialog.cc PANGOMM_DISABLE_DEPRECATED
PathButton.cc SIGCXX_DISABLE_DEPRECATED
Prefs.cc $<$<BOOL:${ENABLE_UTP}>:WITH_UTP>)
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
)
set(${PROJECT_NAME}_HEADERS target_compile_options(${TR_NAME}-gtk
Actions.h PRIVATE
Application.h ${GTK${GTK_VERSION}_CFLAGS_OTHER}
DetailsDialog.h $<$<BOOL:${ENABLE_WERROR}>:$<IF:$<CXX_COMPILER_ID:MSVC>,/WX,-Werror>>
Dialogs.h $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-exit-time-destructors>)
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
)
include_directories( target_include_directories(${TR_NAME}-gtk
${CMAKE_SOURCE_DIR} PRIVATE
${PROJECT_BINARY_DIR} ${CMAKE_SOURCE_DIR}
) ${CMAKE_CURRENT_BINARY_DIR})
include_directories( target_include_directories(${TR_NAME}-gtk SYSTEM
SYSTEM PRIVATE
${GTK${GTK_VERSION}_INCLUDE_DIRS} ${LIBFMT_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS} ${GTK${GTK_VERSION}_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS}
) ${EVENT2_INCLUDE_DIRS}
$<$<BOOL:${WITH_APPINDICATOR}>:${APPINDICATOR_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_link_libraries(${TR_NAME}-gtk target_link_libraries(${TR_NAME}-gtk
${TR_NAME} PRIVATE
${GTK${GTK_VERSION}_LIBRARIES} ${TR_NAME}
${CURL_LIBRARIES} ${GTK${GTK_VERSION}_LIBRARIES}
${EVENT2_LIBRARIES} ${CURL_LIBRARIES}
) ${EVENT2_LIBRARIES}
$<$<BOOL:${WITH_APPINDICATOR}>:${APPINDICATOR_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()
if(MSVC) if(MSVC)
tr_append_target_property(${TR_NAME}-gtk LINK_FLAGS "/ENTRY:mainCRTStartup") tr_append_target_property(${TR_NAME}-gtk LINK_FLAGS "/ENTRY:mainCRTStartup")
endif() 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.svg
hicolor_apps_scalable_transmission-devel.svg hicolor_apps_scalable_transmission-devel.svg
hicolor_apps_symbolic_transmission-symbolic.svg hicolor_apps_symbolic_transmission-symbolic.svg)
)
set(ICON_NAME_REGEX "^([^_]+)_([^_]+)_([^_]+)_(.+)$") 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} "\\1/\\3/\\2" ICON_DIR ${ICON})
string(REGEX REPLACE ${ICON_NAME_REGEX} "\\4" ICON_NAME ${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() endforeach()
if(INSTALL_DOC) 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() endif()
if(ENABLE_NLS) if(ENABLE_NLS)
install(FILES ${${PROJECT_NAME}_DESKTOP_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) install(
install(FILES ${${PROJECT_NAME}_METAINFO_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) FILES ${DESKTOP_FILE}
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(
FILES ${METAINFO_FILE}
DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
else() 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() endif()

View File

@ -1,321 +1,354 @@
project(libtr) include(CheckLibraryExists)
include(CheckSymbolExists)
configure_file( if(ENABLE_NLS)
version.h.in check_library_exists(intl libintl_gettext "" HAVE_LIBINTL)
version.h if(HAVE_LIBINTL)
) set(LIBINTL_LIBRARY intl)
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)
endif() endif()
endforeach()
if(WITH_INOTIFY)
add_definitions(-DWITH_INOTIFY)
else()
set_source_files_properties(watchdir-inotify.cc PROPERTIES HEADER_FILE_ONLY ON)
endif() endif()
if(WITH_KQUEUE) check_symbol_exists(SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT)
add_definitions(-DWITH_KQUEUE)
else()
set_source_files_properties(watchdir-kqueue.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
if(WIN32) add_library(${TR_NAME} STATIC)
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()
if(APPLE) target_sources(${TR_NAME}
set_source_files_properties(tr-assert.cc PROPERTIES HEADER_FILE_ONLY ON) PRIVATE
else() announce-list.cc
set_source_files_properties(tr-assert.mm PROPERTIES HEADER_FILE_ONLY ON) announce-list.h
endif() 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 configure_file(version.h.in version.h)
${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
)
set(${PROJECT_NAME}_PRIVATE_HEADERS target_sources(${TR_NAME}
announce-list.h PRIVATE
announcer-common.h ${CMAKE_CURRENT_BINARY_DIR}/version.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
)
if(NOT ENABLE_UTP) tr_allow_compile_if(
set_source_files_properties(tr-utp.cc PROPERTIES HEADER_FILE_ONLY ON) [=[[TRUE]]=]
endif() 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( foreach(UT
-D__TRANSMISSION__ ${EVENT2_UPSTREAM_TARGET}
-DWIDE_INTEGER_DISABLE_FLOAT_INTEROP ${NATPMP_UPSTREAM_TARGET}
-DWIDE_INTEGER_DISABLE_IOSTREAM ${MINIUPNPC_UPSTREAM_TARGET}
"-DPACKAGE_DATA_DIR=\"${CMAKE_INSTALL_FULL_DATAROOTDIR}\"" ${DHT_UPSTREAM_TARGET}
${NATPMP_DEFINITIONS} ${DEFLATE_UPSTREAM_TARGET}
${MINIUPNPC_DEFINITIONS} ${UTP_UPSTREAM_TARGET}
) ${PSL_UPSTREAM_TARGET}
${B64_UPSTREAM_TARGET})
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})
add_dependencies(${TR_NAME} ${UT}) add_dependencies(${TR_NAME} ${UT})
endforeach() endforeach()
target_compile_definitions(${TR_NAME}
PRIVATE
__TRANSMISSION__
WIDE_INTEGER_DISABLE_FLOAT_INTEROP
WIDE_INTEGER_DISABLE_IOSTREAM
PACKAGE_DATA_DIR="${CMAKE_INSTALL_FULL_DATAROOTDIR}"
$<$<BOOL:${WITH_INOTIFY}>:WITH_INOTIFY>
$<$<BOOL:${WITH_KQUEUE}>:WITH_KQUEUE>
$<$<BOOL:${ENABLE_LIGHTWEIGHT}>:TR_LIGHTWEIGHT>
$<$<BOOL:${ENABLE_UTP}>:WITH_UTP>
$<$<VERSION_LESS:${MINIUPNPC_VERSION},1.7>:MINIUPNPC_API_VERSION=${MINIUPNPC_API_VERSION}> # API version macro was only added in 1.7
$<$<BOOL:${USE_SYSTEM_B64}>:USE_SYSTEM_B64>
$<$<BOOL:${HAVE_SO_REUSEPORT}>:HAVE_SO_REUSEPORT=1>
$<$<BOOL:${ICONV_FOUND}>:HAVE_ICONV>
$<$<BOOL:${ICONV_SECOND_ARGUMENT_IS_CONST}>:ICONV_SECOND_ARGUMENT_IS_CONST>
${NATPMP_DEFINITIONS}
${MINIUPNPC_DEFINITIONS}
PUBLIC
$<$<NOT:$<BOOL:${ENABLE_NLS}>>: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
$<$<BOOL:${HAVE_LIBINTL}>:${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}
$<$<BOOL:${ICONV_FOUND}>:${ICONV_INCLUDE_DIRS}>
PUBLIC
${EVENT2_INCLUDE_DIRS}
${LIBFMT_INCLUDE_DIRS})
target_link_libraries(${TR_NAME} target_link_libraries(${TR_NAME}
${CMAKE_THREAD_LIBS_INIT} PRIVATE
${DEFLATE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}
${CRYPTO_LIBRARIES} ${DEFLATE_LIBRARIES}
${CURL_LIBRARIES} ${CRYPTO_LIBRARIES}
${EVENT2_LIBRARIES} ${CURL_LIBRARIES}
${PSL_LIBRARIES} ${EVENT2_LIBRARIES}
${NATPMP_LIBRARIES} ${PSL_LIBRARIES}
${MINIUPNPC_LIBRARIES} ${NATPMP_LIBRARIES}
${DHT_LIBRARIES} ${MINIUPNPC_LIBRARIES}
${UTP_LIBRARIES} ${DHT_LIBRARIES}
${B64_LIBRARIES} ${UTP_LIBRARIES}
${LIBINTL_LIBRARY} ${B64_LIBRARIES}
${LIBM_LIBRARY} ${LIBINTL_LIBRARY}
${TR_NETWORK_LIBRARIES} ${LIBM_LIBRARY}
jsonsl ${TR_NETWORK_LIBRARIES}
wildmat jsonsl
) wildmat
$<$<BOOL:${ICONV_FOUND}>:${ICONV_LIBRARIES}>
if(ICONV_FOUND) $<$<BOOL:${WIN32}>:crypt32>
target_link_libraries(${TR_NAME} ${ICONV_LIBRARIES}) $<$<BOOL:${WIN32}>:shlwapi>
endif() "$<$<BOOL:${APPLE}>:-framework Foundation>")
if(WIN32)
target_link_libraries(${TR_NAME} crypt32 shlwapi)
endif()
if(APPLE)
target_link_libraries(${TR_NAME} "-framework Foundation")
endif()
if(INSTALL_LIB) if(INSTALL_LIB)
install(TARGETS ${TR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(
install(FILES ${${PROJECT_NAME}_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TR_NAME}) 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() endif()

View File

@ -1,186 +1,176 @@
project(trmac)
if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS MACOS_SUPPORT_MINIMUM) 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})") 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() endif()
include_directories(${CMAKE_SOURCE_DIR}) set(MAC_BUNDLE_NAME Transmission)
add_compile_options( add_compile_options(
-fcxx-modules -fcxx-modules
-fmodules -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(ACTOOL_EXECUTABLE actool REQUIRED)
find_program(CODESIGN_EXECUTABLE codesign REQUIRED) find_program(CODESIGN_EXECUTABLE codesign REQUIRED)
find_program(IBTOOL_EXECUTABLE ibtool REQUIRED)
macro(tr_wrap_xib IFILE OFILE) add_subdirectory(QuickLookPlugin)
get_filename_component(twx_nib_dir "${OFILE}" DIRECTORY) add_subdirectory(VDKQueue)
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()
set(${PROJECT_NAME}_SOURCES add_executable(${TR_NAME}-mac MACOSX_BUNDLE)
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
)
set(${PROJECT_NAME}_HEADERS target_sources(${TR_NAME}-mac
AboutWindowController.h PRIVATE
AddMagnetWindowController.h AboutWindowController.h
AddWindowController.h AboutWindowController.mm
BadgeView.h AddMagnetWindowController.h
Badger.h AddMagnetWindowController.mm
BlocklistDownloader.h AddWindowController.h
BlocklistDownloaderViewController.h AddWindowController.mm
BlocklistScheduler.h Badger.h
BonjourController.h Badger.mm
ButtonToolbarItem.h BadgeView.h
CocoaCompatibility.h BadgeView.mm
ColorTextField.h BlocklistDownloader.h
Controller.h BlocklistDownloader.mm
CreatorWindowController.h BlocklistDownloaderViewController.h
DragOverlayView.h BlocklistDownloaderViewController.mm
DragOverlayWindow.h BlocklistScheduler.h
ExpandedPathToIconTransformer.h BlocklistScheduler.mm
ExpandedPathToPathTransformer.h BonjourController.h
FileListNode.h BonjourController.mm
FileNameCell.h ButtonToolbarItem.h
FileOutlineController.h ButtonToolbarItem.mm
FileOutlineView.h CocoaCompatibility.h
FilePriorityCell.h ColorTextField.h
FileRenameSheetController.h ColorTextField.mm
FilterBarController.h Controller.h
FilterBarView.h Controller.mm
FilterButton.h CreatorWindowController.h
GlobalOptionsPopoverViewController.h CreatorWindowController.mm
GroupPopUpButtonCell.h DragOverlayView.h
GroupTextCell.h DragOverlayView.mm
GroupToolbarItem.h DragOverlayWindow.h
GroupsController.h DragOverlayWindow.mm
GroupsPrefsController.h ExpandedPathToIconTransformer.h
InfoActivityViewController.h ExpandedPathToIconTransformer.mm
InfoFileViewController.h ExpandedPathToPathTransformer.h
InfoGeneralViewController.h ExpandedPathToPathTransformer.mm
InfoOptionsViewController.h FileListNode.h
InfoPeersViewController.h FileListNode.mm
InfoTextField.h FileNameCell.h
InfoTrackersViewController.h FileNameCell.mm
InfoViewController.h FileOutlineController.h
InfoWindowController.h FileOutlineController.mm
MessageWindowController.h FileOutlineView.h
NSApplicationAdditions.h FileOutlineView.mm
NSDataAdditions.h FilePriorityCell.h
NSImageAdditions.h FilePriorityCell.mm
NSKeyedUnarchiverAdditions.h FileRenameSheetController.h
NSMutableArrayAdditions.h FileRenameSheetController.mm
NSStringAdditions.h FilterBarController.h
PeerProgressIndicatorCell.h FilterBarController.mm
PeerTableView.h FilterBarView.h
PiecesView.h FilterBarView.mm
PortChecker.h FilterButton.h
PredicateEditorRowTemplateAny.h FilterButton.mm
PrefsController.h GlobalOptionsPopoverViewController.h
PrefsWindow.h GlobalOptionsPopoverViewController.mm
PriorityPopUpButtonCell.h GroupPopUpButtonCell.h
ProgressGradients.h GroupPopUpButtonCell.mm
ShareToolbarItem.h GroupsController.h
ShareTorrentFileHelper.h GroupsController.mm
StatsWindowController.h GroupsPrefsController.h
StatusBarController.h GroupsPrefsController.mm
StatusBarView.h GroupTextCell.h
Toolbar.h GroupTextCell.mm
Torrent.h GroupToolbarItem.h
TorrentCell.h GroupToolbarItem.mm
TorrentGroup.h InfoActivityViewController.h
TorrentTableView.h InfoActivityViewController.mm
TrackerCell.h InfoFileViewController.h
TrackerNode.h InfoFileViewController.mm
TrackerTableView.h InfoGeneralViewController.h
URLSheetWindowController.h InfoGeneralViewController.mm
WebSeedTableView.h 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 AboutWindow.xib
BlocklistStatusWindow.xib BlocklistStatusWindow.xib
FileRenameSheetController.xib FileRenameSheetController.xib
@ -192,24 +182,23 @@ set(${PROJECT_NAME}_XIB_FILES
MessageWindow.xib MessageWindow.xib
StatsWindow.xib StatsWindow.xib
StatusBar.xib StatusBar.xib
URLSheetWindow.xib URLSheetWindow.xib)
)
source_group(Resources FILES ${${PROJECT_NAME}_XIB_FILES})
set(${PROJECT_NAME}_RESOURCES set(RESOURCES
Defaults.plist Defaults.plist
Credits.rtf Credits.rtf
sparkle_dsa_pub.pem sparkle_dsa_pub.pem
../COPYING ../COPYING
Images/TransmissionDocument.icns Images/TransmissionDocument.icns)
) source_group(Resources
source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES}) FILES ${RESOURCES})
set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES set_source_files_properties(
MACOSX_PACKAGE_LOCATION Resources ${RESOURCES}
) PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
set(${PROJECT_NAME}_IMAGESETS set(IMAGESETS
ActionHover ActionHover
Bandwidth Bandwidth
CleanupTemplate CleanupTemplate
@ -267,8 +256,7 @@ set(${PROJECT_NAME}_IMAGESETS
UpArrowTemplate UpArrowTemplate
UploadBadge UploadBadge
YingYangGroupTemplate YingYangGroupTemplate
YingYangTemplate YingYangTemplate)
)
set(APPICON_NAME AppIcon) set(APPICON_NAME AppIcon)
@ -279,7 +267,7 @@ set(IMAGE_ASSETS
${IMAGE_ASSETS_DIR}/Contents.json ${IMAGE_ASSETS_DIR}/Contents.json
${APPICONSET_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") set(IMG_DIR "${IMAGE_ASSETS_DIR}/${IMG}.imageset")
list(APPEND IMAGE_ASSETS list(APPEND IMAGE_ASSETS
${IMG_DIR}/${IMG}.png ${IMG_DIR}/${IMG}.png
@ -301,7 +289,8 @@ add_custom_command(
OUTPUT OUTPUT
${COMPILED_IMAGE_ASSETS} ${COMPILED_IMAGE_ASSETS}
${APPICON_NAME}.Info.plist ${APPICON_NAME}.Info.plist
COMMAND ${ACTOOL_EXECUTABLE} COMMAND
${ACTOOL_EXECUTABLE}
--compile "${CMAKE_CURRENT_BINARY_DIR}" --compile "${CMAKE_CURRENT_BINARY_DIR}"
--platform macosx --platform macosx
--minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET} --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" --output-partial-info-plist "${CMAKE_CURRENT_BINARY_DIR}/${APPICON_NAME}.Info.plist"
${IMAGE_ASSETS_DIR} ${IMAGE_ASSETS_DIR}
DEPENDS ${IMAGE_ASSETS} DEPENDS ${IMAGE_ASSETS}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
) source_group("Generated Files"
source_group("Generated Files" FILES ${COMPILED_IMAGE_ASSETS} ${APPICON_NAME}.Info.plist) 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 set_source_files_properties(
MACOSX_PACKAGE_LOCATION Resources) ${COMPILED_IMAGE_ASSETS}
PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
set(${PROJECT_NAME}_LINGUAS set(LINGUAS
da da
de de
en en
@ -328,16 +322,15 @@ set(${PROJECT_NAME}_LINGUAS
nl nl
pt_PT pt_PT
ru ru
tr tr)
)
if(ENABLE_NLS) if(ENABLE_NLS)
set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) set(ENABLED_LINGUAS ${LINGUAS})
else() else()
set(${PROJECT_NAME}_ENABLED_LINGUAS en) set(ENABLED_LINGUAS en)
endif() endif()
set(${PROJECT_NAME}_LANG_XIB_FILES set(BASE_XIB_FILES
AddMagnetWindow.xib AddMagnetWindow.xib
AddWindow.xib AddWindow.xib
Creator.xib Creator.xib
@ -347,137 +340,102 @@ set(${PROJECT_NAME}_LANG_XIB_FILES
InfoGeneralView.xib InfoGeneralView.xib
InfoOptionsView.xib InfoOptionsView.xib
MainMenu.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 InfoPlist.strings
Localizable.strings Localizable.strings)
)
set(${PROJECT_NAME}_NIB_FILES) foreach(LANG ${ENABLED_LINGUAS})
foreach(F ${${PROJECT_NAME}_XIB_FILES}) set(${LANG}_STRINGS_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)
if(NOT LANG STREQUAL "en") 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) 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() endforeach()
endif() endif()
foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES}) foreach(F ${LANG_STRINGS_FILES})
list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F})
endforeach() endforeach()
source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) source_group(Resources/${LANG}.lproj
FILES ${${LANG}_STRINGS_FILES})
endforeach() endforeach()
include_directories( foreach(LANG ${ENABLED_LINGUAS})
${CMAKE_SOURCE_DIR}/libtransmission list(APPEND RESOURCES ${${LANG}_STRINGS_FILES})
${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})
set(STRINGS_FILES_RESOURCES_DIR Resources) set(STRINGS_FILES_RESOURCES_DIR Resources)
if(NOT CMAKE_GENERATOR STREQUAL Xcode) if(NOT CMAKE_GENERATOR STREQUAL Xcode)
string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj) string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj)
endif() endif()
set_source_files_properties(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES set_source_files_properties(
MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) ${${LANG}_STRINGS_FILES}
PROPERTIES
MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR})
endforeach() endforeach()
add_executable(${TR_NAME}-mac MACOSX_BUNDLE target_sources(${TR_NAME}-mac
${${PROJECT_NAME}_SOURCES} PRIVATE
${${PROJECT_NAME}_HEADERS} ${RESOURCES})
${${PROJECT_NAME}_XIB_FILES}
${${PROJECT_NAME}_NIB_FILES}
${${PROJECT_NAME}_BASE_XIB_FILES}
${${PROJECT_NAME}_BASE_NIB_FILES}
${${PROJECT_NAME}_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 target_link_libraries(${TR_NAME}-mac
${TR_NAME} PRIVATE
vdkqueue ${TR_NAME}
${SPARKLE_FRAMEWORK} vdkqueue
"-framework AppKit" ${SPARKLE_FRAMEWORK}
"-framework Carbon" "-framework AppKit"
"-framework Foundation" "-framework Carbon"
"-framework IOKit" "-framework Foundation"
"-framework Quartz" "-framework IOKit"
"-framework Security" "-framework Quartz"
"-weak_framework UserNotifications" "-framework Security"
) "-weak_framework UserNotifications")
if(NOT CMAKE_GENERATOR STREQUAL Xcode) 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 - $<TARGET_BUNDLE_DIR:${TR_NAME}-mac>) COMMAND ${CODESIGN_EXECUTABLE} -s - $<TARGET_BUNDLE_DIR:${TR_NAME}-mac>)
endif() 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 install(
OUTPUT_NAME ${MAC_BUNDLE_NAME} TARGETS ${TR_NAME}-mac
MACOSX_BUNDLE_GUI_IDENTIFIER "org.m0k.transmission" DESTINATION Applications)
MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/Info.plist.in
INSTALL_RPATH "@executable_path;@executable_path/../Frameworks"
)
add_subdirectory(QuickLookPlugin) install(
DIRECTORY TransmissionHelp
install(TARGETS ${TR_NAME}-mac DESTINATION Applications) 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) tr_install_web(Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources)
install(CODE " install(CODE
list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\") "list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")
include(TrMacros) include(TrMacros)
include(GetPrerequisites) 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}\")")

View File

@ -1,17 +1,14 @@
project(trmacql) add_library(${TR_NAME}-mac-ql MODULE)
set(${PROJECT_NAME}_SOURCES target_sources(${TR_NAME}-mac-ql
../NSDataAdditions.mm PRIVATE
../NSStringAdditions.mm ../NSDataAdditions.mm
GeneratePreviewForURL.mm ../NSStringAdditions.mm
GenerateThumbnailForURL.mm GeneratePreviewForURL.mm
main.cc GenerateThumbnailForURL.mm
) main.cc)
set(${PROJECT_NAME}_HEADERS set(LINGUAS
)
set(${PROJECT_NAME}_LINGUAS
da da
de de
en en
@ -21,77 +18,83 @@ set(${PROJECT_NAME}_LINGUAS
nl nl
pt_PT pt_PT
ru ru
tr tr)
)
if(ENABLE_NLS) if(ENABLE_NLS)
set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) set(ENABLED_LINGUAS ${LINGUAS})
else() else()
set(${PROJECT_NAME}_ENABLED_LINGUAS en) set(ENABLED_LINGUAS en)
endif() endif()
set(${PROJECT_NAME}_LANG_STRINGS_FILES set(LANG_STRINGS_FILES
Localizable.strings Localizable.strings)
)
set(${PROJECT_NAME}_RESOURCES set(RESOURCES
style.css style.css)
) source_group(Resources
source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES}) FILES ${RESOURCES})
set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES set_source_files_properties(
MACOSX_PACKAGE_LOCATION Resources) ${RESOURCES}
PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) foreach(LANG ${ENABLED_LINGUAS})
set(${PROJECT_NAME}_${LANG}_STRINGS_FILES) set(${LANG}_STRINGS_FILES)
set(STRINGS_FILES_RESOURCES_DIR Resources) set(STRINGS_FILES_RESOURCES_DIR Resources)
if(NOT CMAKE_GENERATOR STREQUAL Xcode) if(NOT CMAKE_GENERATOR STREQUAL Xcode)
string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj) string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj)
endif() endif()
foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES}) foreach(F ${LANG_STRINGS_FILES})
list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F}) list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F})
list(APPEND ${PROJECT_NAME}_RESOURCES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) list(APPEND RESOURCES ${${LANG}_STRINGS_FILES})
set_source_files_properties(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES set_source_files_properties(
MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR}) ${${LANG}_STRINGS_FILES}
PROPERTIES
MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR})
endforeach() endforeach()
source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES}) source_group(Resources/${LANG}.lproj
FILES ${${LANG}_STRINGS_FILES})
endforeach() endforeach()
add_library(${TR_NAME}-mac-ql MODULE target_sources(${TR_NAME}-mac-ql
${${PROJECT_NAME}_SOURCES} PRIVATE
${${PROJECT_NAME}_HEADERS} ${RESOURCES})
${${PROJECT_NAME}_RESOURCES}
)
set(MAC_QL_BUNDLE_NAME QuickLookPlugin) set(MAC_QL_BUNDLE_NAME QuickLookPlugin)
set_target_properties(${TR_NAME}-mac-ql PROPERTIES set_target_properties(
OUTPUT_NAME ${MAC_QL_BUNDLE_NAME} ${TR_NAME}-mac-ql
MACOSX_BUNDLE ON PROPERTIES
BUNDLE ON OUTPUT_NAME ${MAC_QL_BUNDLE_NAME}
BUNDLE_EXTENSION qlgenerator MACOSX_BUNDLE ON
MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/Info.plist.in" BUNDLE ON
INSTALL_RPATH "@loader_path/../../../../../MacOS;@loader_path/../../../../../Frameworks" 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 target_link_libraries(${TR_NAME}-mac-ql
${TR_NAME} PRIVATE
"-framework Foundation" ${TR_NAME}
"-framework CoreFoundation" "-framework Foundation"
"-framework CoreServices" "-framework CoreFoundation"
"-framework AppKit" "-framework CoreServices"
"-framework QuickLook" "-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 " install(CODE
list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\") "list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")
include(TrMacros) include(TrMacros)
include(GetPrerequisites) 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}\" \"\")")

View File

@ -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})

View File

@ -1,6 +1,4 @@
project(trpo) set(LINGUAS
set(${PROJECT_NAME}_LINGUAS
an an
ar ar
ast ast
@ -86,40 +84,37 @@ set(${PROJECT_NAME}_LINGUAS
vi vi
zh_CN zh_CN
zh_HK zh_HK
zh_TW zh_TW)
)
set(GETTEXT_PACKAGE ${TR_NAME}-gtk) set(GETTEXT_PACKAGE ${TR_NAME}-gtk)
if(ENABLE_NLS) if(ENABLE_NLS)
set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) set(ENABLED_LINGUAS ${LINGUAS})
else() else()
set(${PROJECT_NAME}_ENABLED_LINGUAS) set(ENABLED_LINGUAS)
endif() endif()
set(${PROJECT_NAME}_MO_FILES) set(MO_FILES)
foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) foreach(LANG ${ENABLED_LINGUAS})
set(msgfmt_INPUT_FILE ${LANG}.po) set(msgfmt_INPUT_FILE ${LANG}.po)
set(msgfmt_OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${GETTEXT_PACKAGE}-${LANG}.mo) set(msgfmt_OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${GETTEXT_PACKAGE}-${LANG}.mo)
add_custom_command( add_custom_command(
OUTPUT OUTPUT ${msgfmt_OUTPUT_FILE}
${msgfmt_OUTPUT_FILE} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --output-file=${msgfmt_OUTPUT_FILE} ${msgfmt_INPUT_FILE}
COMMAND WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
${GETTEXT_MSGFMT_EXECUTABLE} DEPENDS ${msgfmt_INPUT_FILE})
--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() endforeach()
if(${PROJECT_NAME}_MO_FILES) if(MO_FILES)
add_custom_target(${GETTEXT_PACKAGE}-po ALL DEPENDS ${${PROJECT_NAME}_MO_FILES}) add_custom_target(${GETTEXT_PACKAGE}-po
ALL
DEPENDS ${MO_FILES})
endif() endif()

View File

@ -1,154 +1,150 @@
project(trqt)
set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Generated Files") 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 add_executable(${TR_NAME}-qt WIN32)
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
)
if (NOT ENABLE_QT_COM_INTEROP) target_sources(${TR_NAME}-qt
set_source_files_properties(ComInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON) PRIVATE
endif() AboutDialog.cc
if (NOT ENABLE_QT_DBUS_INTEROP) AboutDialog.h
set_source_files_properties(DBusInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON) AddData.cc
endif() 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 tr_allow_compile_if(
AboutDialog.h [=[[ENABLE_QT_COM_INTEROP]]=]
AddData.h ComInteropHelper.cc
Application.h [=[[ENABLE_QT_DBUS_INTEROP]]=]
BaseDialog.h DBusInteropHelper.cc)
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
)
set(${PROJECT_NAME}_UI_FILES target_sources(${TR_NAME}-qt
AboutDialog.ui PRIVATE
DetailsDialog.ui AboutDialog.ui
LicenseDialog.ui DetailsDialog.ui
MainWindow.ui LicenseDialog.ui
MakeDialog.ui MainWindow.ui
MakeProgressDialog.ui MakeDialog.ui
OptionsDialog.ui MakeProgressDialog.ui
PrefsDialog.ui OptionsDialog.ui
RelocateDialog.ui PrefsDialog.ui
SessionDialog.ui RelocateDialog.ui
StatsDialog.ui SessionDialog.ui
TrackersDialog.ui StatsDialog.ui
) TrackersDialog.ui)
source_group(Ui FILES ${${PROJECT_NAME}_UI_FILES})
tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES ${${PROJECT_NAME}_UI_FILES}) source_group(Ui
source_group("Generated Files" FILES ${${PROJECT_NAME}_UI_SOURCES}) REGULAR_EXPRESSION [[.*\.ui$]])
target_sources(${TR_NAME}-qt
PRIVATE
application.qrc)
set(${PROJECT_NAME}_QRC_FILES application.qrc)
if(WIN32 OR APPLE) 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() endif()
source_group(Resources FILES ${${PROJECT_NAME}_QRC_FILES})
tr_qt_add_resources(${PROJECT_NAME}_QRC_SOURCES ${${PROJECT_NAME}_QRC_FILES}) source_group(Resources
source_group("Generated Files" FILES ${${PROJECT_NAME}_QRC_SOURCES}) REGULAR_EXPRESSION [[.*\.qrc$]])
set(${PROJECT_NAME}_LINGUAS set(LINGUAS
af af
ca ca
da da
@ -178,99 +174,99 @@ set(${PROJECT_NAME}_LINGUAS
sv sv
tr tr
uk uk
zh_CN zh_CN)
)
if(ENABLE_NLS) if(ENABLE_NLS)
set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) set(ENABLED_LINGUAS ${LINGUAS})
else() else()
set(${PROJECT_NAME}_ENABLED_LINGUAS) set(ENABLED_LINGUAS)
endif() endif()
set(${PROJECT_NAME}_TS_FILES) set(TS_FILES)
foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) foreach(LANG ${ENABLED_LINGUAS})
list(APPEND ${PROJECT_NAME}_TS_FILES translations/transmission_${LANG}.ts) list(APPEND TS_FILES translations/transmission_${LANG}.ts)
endforeach() endforeach()
if(${PROJECT_NAME}_TS_FILES) if(TS_FILES)
tr_qt_add_translation(${PROJECT_NAME}_QM_FILES ${${PROJECT_NAME}_TS_FILES}) tr_qt_add_translation(QM_FILES ${TS_FILES})
source_group("Generated Files" FILES ${${PROJECT_NAME}_QM_FILES})
endif() endif()
include_directories( target_sources(${TR_NAME}-qt
${CMAKE_SOURCE_DIR} PRIVATE
${PROJECT_SOURCE_DIR} ${QM_FILES})
)
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")
if(ENABLE_QT_COM_INTEROP) if(ENABLE_QT_COM_INTEROP)
add_custom_command( tr_target_idl_files(${TR_NAME}-qt
OUTPUT transmission-qt.idl)
${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)
endif() endif()
add_executable(${TR_NAME}-qt WIN32 target_include_directories(${TR_NAME}-qt
${${PROJECT_NAME}_SOURCES} PRIVATE
${${PROJECT_NAME}_UI_SOURCES} ${CMAKE_SOURCE_DIR}
${${PROJECT_NAME}_QRC_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR})
${${PROJECT_NAME}_HEADERS}
${${PROJECT_NAME}_QM_FILES} target_include_directories(${TR_NAME}-qt SYSTEM
${${PROJECT_NAME}_WIN32_RC_FILE} PRIVATE
) ${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS})
target_link_libraries(${TR_NAME}-qt target_link_libraries(${TR_NAME}-qt
${TR_NAME} PRIVATE
${QT_TARGETS} ${TR_NAME}
${CURL_LIBRARIES} ${QT_TARGETS}
${EVENT2_LIBRARIES} ${CURL_LIBRARIES}
) ${EVENT2_LIBRARIES})
target_compile_definitions(${TR_NAME}-qt PRIVATE target_compile_definitions(${TR_NAME}-qt
"TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\"" PRIVATE
QT_NO_CAST_FROM_ASCII "TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\""
$<$<BOOL:${ENABLE_QT_COM_INTEROP}>:ENABLE_COM_INTEROP> QT_NO_CAST_FROM_ASCII
$<$<BOOL:${ENABLE_QT_DBUS_INTEROP}>:ENABLE_DBUS_INTEROP>) $<$<BOOL:${ENABLE_QT_COM_INTEROP}>:ENABLE_COM_INTEROP>
$<$<BOOL:${ENABLE_QT_DBUS_INTEROP}>:ENABLE_DBUS_INTEROP>)
if(MSVC) if(MSVC)
tr_append_target_property(${TR_NAME}-qt LINK_FLAGS "/ENTRY:mainCRTStartup") tr_append_target_property(${TR_NAME}-qt LINK_FLAGS "/ENTRY:mainCRTStartup")
endif() 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) 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() endif()
install(FILES transmission-qt.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) install(
FILES transmission-qt.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
if(ENABLE_NLS) 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() endif()
if(WIN32) if(WIN32)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" CONTENT "") file(GENERATE
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" DESTINATION ${CMAKE_INSTALL_SYSCONFDIR} RENAME qt.conf) 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() endif()

View File

@ -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(gtest)
add_subdirectory(libtransmission) add_subdirectory(libtransmission)
add_subdirectory(utils) add_subdirectory(utils)

View File

@ -1,5 +1,16 @@
add_library(gtestall STATIC add_library(gtestall STATIC)
${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_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)

View File

@ -1,57 +1,62 @@
add_executable(libtransmission-test 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)
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 target_compile_definitions(libtransmission-test
PRIVATE PRIVATE
@ -65,6 +70,7 @@ target_include_directories(libtransmission-test
target_include_directories(libtransmission-test SYSTEM target_include_directories(libtransmission-test SYSTEM
PRIVATE PRIVATE
${LIBFMT_INCLUDE_DIRS}
${WIDE_INTEGER_INCLUDE_DIRS} ${WIDE_INTEGER_INCLUDE_DIRS}
${B64_INCLUDE_DIRS} ${B64_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS}
@ -72,8 +78,7 @@ target_include_directories(libtransmission-test SYSTEM
${EVENT2_INCLUDE_DIRS}) ${EVENT2_INCLUDE_DIRS})
target_compile_options(libtransmission-test target_compile_options(libtransmission-test
PRIVATE PRIVATE $<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wno-sign-compare>) # patches welcomed
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wno-sign-compare>) # patches welcomed
target_link_libraries(libtransmission-test target_link_libraries(libtransmission-test
PRIVATE PRIVATE
@ -88,14 +93,20 @@ add_custom_command(
TARGET libtransmission-test TARGET libtransmission-test
PRE_BUILD PRE_BUILD
COMMAND COMMAND
${CMAKE_COMMAND} -E copy_if_different ${CMAKE_COMMAND}
${CMAKE_CURRENT_SOURCE_DIR}/subprocess-test-script.cmd -E copy_if_different
$<TARGET_FILE_DIR:libtransmission-test>/subprocess-test.cmd) ${CMAKE_CURRENT_SOURCE_DIR}/subprocess-test-script.cmd
$<TARGET_FILE_DIR:libtransmission-test>/subprocess-test.cmd)
add_executable(subprocess-test add_executable(subprocess-test)
subprocess-test-program.cc)
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 target_include_directories(subprocess-test
PRIVATE PRIVATE

View File

@ -1,18 +1,18 @@
function(AddShowTest name file_basename) function(AddShowTest name file_basename)
add_test( add_test(
NAME ${name} NAME ${name}
COMMAND ${CMAKE_COMMAND} COMMAND
-D transmission_show:string=$<TARGET_FILE:transmission-show> ${CMAKE_COMMAND}
-D torrent_file:string=assets/${file_basename}.torrent -D transmission_show:string=$<TARGET_FILE:transmission-show>
-D reference_file:string=${CMAKE_CURRENT_SOURCE_DIR}/assets/${file_basename}.show -D torrent_file:string=assets/${file_basename}.torrent
-P "${CMAKE_CURRENT_SOURCE_DIR}/run_transmission_show.cmake" -D reference_file:string=${CMAKE_CURRENT_SOURCE_DIR}/assets/${file_basename}.show
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -P "${CMAKE_CURRENT_SOURCE_DIR}/run_transmission_show.cmake"
) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endfunction() endfunction()
# disabled AddShowTest(transmission-show-bittorrent-v2 bittorrent-v2-test) # disabled AddShowTest(transmission-show-bittorrent-v2 bittorrent-v2-test)
AddShowTest(transmission-show-bittorrent-v2-hybrid-test bittorrent-v2-hybrid-test) addshowtest(transmission-show-bittorrent-v2-hybrid-test bittorrent-v2-hybrid-test)
AddShowTest(transmission-show-inner-sanctum Inner_Sanctum_movie_archive) addshowtest(transmission-show-inner-sanctum Inner_Sanctum_movie_archive)
AddShowTest(transmission-show-thor Thor_and_the_Amazon_Women.avi) 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 ubuntu-20.04.3-desktop-amd64.iso)
AddShowTest(transmission-show-ubuntu-hybrid hybrid-single-ubuntu-20.04.3-desktop-amd64.iso) addshowtest(transmission-show-ubuntu-hybrid hybrid-single-ubuntu-20.04.3-desktop-amd64.iso)

View File

@ -1,52 +1,49 @@
# compare the output of transmission-show to a reference file. # 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) if(CMAKE_VERSION VERSION_LESS 3.14)
# --ignore-eol was introduced in CMake 3.14 # --ignore-eol was introduced in CMake 3.14
message(status "skipping transmission-show test; cmake version too old") message(status "skipping transmission-show test; cmake version too old")
else() else()
get_filename_component(torrent_basename "${torrent_file}" NAME) get_filename_component(torrent_basename "${torrent_file}" NAME)
set(output_file ${CMAKE_CURRENT_BINARY_DIR}/${torrent_basename}.out) set(output_file ${CMAKE_CURRENT_BINARY_DIR}/${torrent_basename}.out)
message(STATUS "transmission_show ${transmission_show}") message(STATUS "transmission_show ${transmission_show}")
message(STATUS " input_file ${torrent_file}") message(STATUS " input_file ${torrent_file}")
message(STATUS " output_file ${output_file}") message(STATUS " output_file ${output_file}")
message(STATUS " reference_file ${reference_file}") message(STATUS " reference_file ${reference_file}")
# The app's output includes timestamps, so fake our TZ to ensure # 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 # the test doesn't depend on the physical TZ of the test machine
set(ENV{TZ} "UTC") set(ENV{TZ} "UTC")
execute_process( execute_process(
COMMAND ${transmission_show} ${torrent_file} COMMAND ${transmission_show} ${torrent_file}
OUTPUT_FILE ${output_file} OUTPUT_FILE ${output_file})
)
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${reference_file} ${output_file} COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${reference_file} ${output_file}
RESULT_VARIABLE STATUS RESULT_VARIABLE STATUS)
)
if(STATUS AND NOT STATUS EQUAL 0) if(STATUS AND NOT STATUS EQUAL 0)
file(READ ${reference_file} CONTENTS) file(READ ${reference_file} CONTENTS)
message("EXPECTED CONTENTS (${reference_file}):") message("EXPECTED CONTENTS (${reference_file}):")
message(${CONTENTS}) message(${CONTENTS})
file(READ ${output_file} CONTENTS) file(READ ${output_file} CONTENTS)
message("RECEIVED CONTENTS (${output_file}):") message("RECEIVED CONTENTS (${output_file}):")
message(${CONTENTS}) message(${CONTENTS})
find_program(DIFF_EXEC diff) find_program(DIFF_EXEC diff)
if (DIFF_EXEC) if(DIFF_EXEC)
message("DIFF:") message("DIFF:")
execute_process(COMMAND ${DIFF_EXEC} -u ${output_file} ${reference_file}) execute_process(COMMAND ${DIFF_EXEC} -u ${output_file} ${reference_file})
endif() 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()
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() endif()

View File

@ -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) 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}')" "Transmission Utility ('${P}')"
"${TR_NAME}-${P}" "${TR_NAME}-${P}"
"${TR_NAME}-${P}.exe") "${TR_NAME}-${P}.exe")
add_executable(${TR_NAME}-${P} ${P}.cc ${${PROJECT_NAME}_${P}_WIN32_RC_FILE}) install(
target_link_libraries(${TR_NAME}-${P} ${TR_NAME}) TARGETS ${TR_NAME}-${P}
DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS ${TR_NAME}-${P} DESTINATION ${CMAKE_INSTALL_BINDIR})
if(INSTALL_DOC) 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() endif()
endforeach() endforeach()

View File

@ -1,65 +1,59 @@
project(trweb)
set(TRWEB_SRCS set(TRWEB_SRCS
src/about-dialog.js src/about-dialog.js
src/action-manager.js src/action-manager.js
src/alert-dialog.js src/alert-dialog.js
src/context-menu.js src/context-menu.js
src/file-row.js src/file-row.js
src/formatter.js src/formatter.js
src/inspector.js src/inspector.js
src/main.js src/main.js
src/move-dialog.js src/move-dialog.js
src/notifications.js src/notifications.js
src/open-dialog.js src/open-dialog.js
src/overflow-menu.js src/overflow-menu.js
src/prefs-dialog.js src/prefs-dialog.js
src/prefs.js src/prefs.js
src/remote.js src/remote.js
src/remove-dialog.js src/remove-dialog.js
src/rename-dialog.js src/rename-dialog.js
src/shortcuts-dialog.js src/shortcuts-dialog.js
src/statistics-dialog.js src/statistics-dialog.js
src/torrent.js src/torrent.js
src/torrent-row.js src/torrent-row.js
src/transmission.js src/transmission.js
src/utils.js src/utils.js
assets/css/transmission-app.scss assets/css/transmission-app.scss)
)
set(TRWEB_IMGS set(TRWEB_IMGS
assets/img/box.svg assets/img/box.svg
assets/img/film.svg assets/img/film.svg
assets/img/modern-tortoise-blue.png assets/img/modern-tortoise-blue.png
assets/img/modern-tortoise.png assets/img/modern-tortoise.png
assets/img/chevron-down.svg assets/img/chevron-down.svg
assets/img/chevron-up.svg assets/img/chevron-up.svg
assets/img/horizontal-rule.svg assets/img/horizontal-rule.svg
assets/img/lock-fill.svg assets/img/lock-fill.svg
assets/img/logo.png assets/img/logo.png
assets/img/image.svg assets/img/image.svg
assets/img/magnet.svg assets/img/magnet.svg
assets/img/music.svg assets/img/music.svg
assets/img/file-text.svg assets/img/file-text.svg
assets/img/package.svg assets/img/package.svg
assets/img/folder.svg assets/img/folder.svg
assets/img/pause-circle-active.svg assets/img/pause-circle-active.svg
assets/img/pause-circle-idle.svg assets/img/pause-circle-idle.svg
assets/img/play-circle-active.svg assets/img/play-circle-active.svg
assets/img/play-circle-idle.svg assets/img/play-circle-idle.svg
assets/img/router.svg assets/img/router.svg
assets/img/type.svg assets/img/type.svg)
)
add_custom_target( add_custom_target(trweb ALL
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}/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 ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/yarn.lock" "${CMAKE_CURRENT_BINARY_DIR}/yarn.lock" COMMAND yarn install
COMMAND yarn install COMMAND yarn webpack --config "${CMAKE_CURRENT_SOURCE_DIR}/webpack.config.js" --context "${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND yarn webpack --config "${CMAKE_CURRENT_SOURCE_DIR}/webpack.config.js" --context "${CMAKE_CURRENT_SOURCE_DIR}" BYPRODUCTS
BYPRODUCTS public_html/transmission-app.js
public_html/transmission-app.js public_html/transmission-app.js.LICENSE.txt
public_html/transmission-app.js.LICENSE.txt DEPENDS ${TRWEB_IMGS}
DEPENDS ${TRWEB_IMGS} SOURCES ${TRWEB_SRCS})
SOURCES ${TRWEB_SRCS}
)