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)
cmake_policy(SET CMP0092 NEW)
@ -10,7 +10,9 @@ set(MACOS_SUPPORT_MINIMUM 10.13)
# The value of this variable should be set prior to the first project() command invocation.
# See: https://cmake.org/cmake/help/latest/variable/CMAKE_OSX_DEPLOYMENT_TARGET.html
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOS_SUPPORT_MINIMUM} CACHE STRING "Minimum macOS version to target for deployment" FORCE)
set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOS_SUPPORT_MINIMUM}
CACHE STRING "Minimum macOS version to target for deployment"
FORCE)
endif()
project(transmission)
@ -23,60 +25,60 @@ include(CheckIncludeFile)
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckLibraryExists)
include(CheckSymbolExists)
include(ExternalProject)
include(GNUInstallDirs)
include(TrMacros)
set(CURL_MINIMUM 7.28.0)
set(WOLFSSL_MINIMUM 3.4)
set(DEFLATE_MINIMUM 1.10)
set(EVENT2_MINIMUM 2.1.0)
set(GIOMM_MINIMUM 2.26.0)
set(GLIBMM_MINIMUM 2.60.0)
set(GTKMM_MINIMUM 3.24.0)
set(OPENSSL_MINIMUM 0.9.7)
set(MBEDTLS_MINIMUM 1.3)
set(PSL_MINIMUM 0.21.1)
set(QT_MINIMUM 5.6)
set(CURL_MINIMUM 7.28.0)
set(WOLFSSL_MINIMUM 3.4)
set(DEFLATE_MINIMUM 1.10)
set(EVENT2_MINIMUM 2.1.0)
set(GIOMM_MINIMUM 2.26.0)
set(GLIBMM_MINIMUM 2.60.0)
set(GTKMM_MINIMUM 3.24.0)
set(OPENSSL_MINIMUM 0.9.7)
set(MBEDTLS_MINIMUM 1.3)
set(PSL_MINIMUM 0.21.1)
set(QT_MINIMUM 5.6)
option(ENABLE_DAEMON "Build daemon" ON)
tr_auto_option(ENABLE_GTK "Build GTK client" AUTO)
tr_auto_option(ENABLE_QT "Build Qt client" AUTO)
tr_auto_option(ENABLE_MAC "Build Mac client" AUTO)
option(ENABLE_WEB "Build Web client" OFF)
option(ENABLE_UTILS "Build utils (create, edit, show)" ON)
option(ENABLE_CLI "Build command-line client" OFF)
option(ENABLE_TESTS "Build unit tests" ON)
option(ENABLE_LIGHTWEIGHT "Optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc." OFF)
option(ENABLE_UTP "Build µTP support" ON)
option(ENABLE_WERROR "Treat warnings as errors" OFF)
option(ENABLE_NLS "Enable native language support" ON)
option(INSTALL_DOC "Build/install documentation" ON)
option(INSTALL_LIB "Install the library" OFF)
tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" AUTO)
tr_auto_option(USE_SYSTEM_EVENT2 "Use system event2 library" AUTO)
tr_auto_option(USE_SYSTEM_DEFLATE "Use system deflate library" AUTO)
tr_auto_option(USE_SYSTEM_DHT "Use system dht library" AUTO)
option(ENABLE_DAEMON "Build daemon" ON)
tr_auto_option(ENABLE_GTK "Build GTK client" AUTO)
tr_auto_option(ENABLE_QT "Build Qt client" AUTO)
tr_auto_option(ENABLE_MAC "Build Mac client" AUTO)
option(ENABLE_WEB "Build Web client" OFF)
option(ENABLE_UTILS "Build utils (create, edit, show)" ON)
option(ENABLE_CLI "Build command-line client" OFF)
option(ENABLE_TESTS "Build unit tests" ON)
option(ENABLE_LIGHTWEIGHT
"Optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc."
OFF)
option(ENABLE_UTP "Build µTP support" ON)
option(ENABLE_WERROR "Treat warnings as errors" OFF)
option(ENABLE_NLS "Enable native language support" ON)
option(INSTALL_DOC "Build/install documentation" ON)
option(INSTALL_LIB "Install the library" OFF)
tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" AUTO)
tr_auto_option(USE_SYSTEM_EVENT2 "Use system event2 library" AUTO)
tr_auto_option(USE_SYSTEM_DEFLATE "Use system deflate library" AUTO)
tr_auto_option(USE_SYSTEM_DHT "Use system dht library" AUTO)
tr_auto_option(USE_SYSTEM_MINIUPNPC "Use system miniupnpc library" AUTO)
tr_auto_option(USE_SYSTEM_NATPMP "Use system natpmp library" AUTO)
tr_auto_option(USE_SYSTEM_UTP "Use system utp library" AUTO)
tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO)
tr_auto_option(USE_SYSTEM_PSL "Use system psl library" AUTO)
tr_list_option(USE_GTK_VERSION "Use specific GTK version" AUTO 3 4)
tr_list_option(USE_QT_VERSION "Use specific Qt version" AUTO 5 6)
tr_list_option(WITH_CRYPTO "Use specified crypto library" AUTO ccrypto mbedtls openssl wolfssl)
tr_auto_option(WITH_INOTIFY "Enable inotify support (on systems that support it)" AUTO)
tr_auto_option(WITH_KQUEUE "Enable kqueue support (on systems that support it)" AUTO)
tr_auto_option(WITH_APPINDICATOR "Use appindicator for system tray icon in GTK client (GTK+ 3 only)" AUTO)
tr_auto_option(WITH_SYSTEMD "Add support for systemd startup notification (on systems that support it)" AUTO)
tr_auto_option(USE_SYSTEM_NATPMP "Use system natpmp library" AUTO)
tr_auto_option(USE_SYSTEM_UTP "Use system utp library" AUTO)
tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO)
tr_auto_option(USE_SYSTEM_PSL "Use system psl library" AUTO)
tr_list_option(USE_GTK_VERSION "Use specific GTK version" AUTO 3 4)
tr_list_option(USE_QT_VERSION "Use specific Qt version" AUTO 5 6)
tr_list_option(WITH_CRYPTO "Use specified crypto library" AUTO ccrypto mbedtls openssl wolfssl)
tr_auto_option(WITH_INOTIFY "Enable inotify support (on systems that support it)" AUTO)
tr_auto_option(WITH_KQUEUE "Enable kqueue support (on systems that support it)" AUTO)
tr_auto_option(WITH_APPINDICATOR "Use appindicator for system tray icon in GTK client (GTK+ 3 only)" AUTO)
tr_auto_option(WITH_SYSTEMD "Add support for systemd startup notification (on systems that support it)" AUTO)
set(TR_NAME ${PROJECT_NAME})
# major.minor.patch[-[beta.N.]dev]+commit_hash
# dev builds come between releases, e.g. autobuilds from CI
# these should be the only five lines you need to change
set(TR_VERSION_MAJOR "4")
set(TR_VERSION_MINOR "0")
@ -85,9 +87,9 @@ set(TR_VERSION_BETA_NUMBER "2") # empty string for not beta
set(TR_VERSION_DEV TRUE)
# derived from above: release type
if (TR_VERSION_DEV)
if(TR_VERSION_DEV)
set(TR_NIGHTLY_RELEASE 1)
elseif (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
elseif(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
set(TR_BETA_RELEASE 1)
else()
set(TR_STABLE_RELEASE 1)
@ -99,15 +101,15 @@ endif()
# '4.0.0-beta.2'
# '4.0.0'
set(TR_SEMVER "${TR_VERSION_MAJOR}.${TR_VERSION_MINOR}.${TR_VERSION_PATCH}")
if (TR_VERSION_DEV OR NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
if(TR_VERSION_DEV OR NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
string(APPEND TR_SEMVER "-")
if (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
if(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
string(APPEND TR_SEMVER "beta.${TR_VERSION_BETA_NUMBER}")
endif()
if (TR_VERSION_DEV AND NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
if(TR_VERSION_DEV AND NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
string(APPEND TR_SEMVER ".")
endif()
if (TR_VERSION_DEV)
if(TR_VERSION_DEV)
string(APPEND TR_SEMVER "dev")
endif()
endif()
@ -127,16 +129,15 @@ string(SUBSTRING "${BASE62}" "${TR_VERSION_MINOR}" 1 TMPSTR)
string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}")
string(SUBSTRING "${BASE62}" "${TR_VERSION_PATCH}" 1 TMPSTR)
string(APPEND TR_PEER_ID_PREFIX "${TMPSTR}")
if (TR_VERSION_DEV)
if(TR_VERSION_DEV)
string(APPEND TR_PEER_ID_PREFIX "Z")
elseif (NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
elseif(NOT "${TR_VERSION_BETA_NUMBER}" STREQUAL "")
string(APPEND TR_PEER_ID_PREFIX "B")
else()
string(APPEND TR_PEER_ID_PREFIX "0")
endif()
string(APPEND TR_PEER_ID_PREFIX "-")
set(TR_VCS_REVISION_FILE "${CMAKE_SOURCE_DIR}/REVISION")
if(EXISTS ${CMAKE_SOURCE_DIR}/.git)
@ -149,14 +150,10 @@ elseif(NOT "$ENV{TEAMCITY_PROJECT_NAME}" STREQUAL "" AND NOT "$ENV{BUILD_VCS_NUM
set(TR_VCS_REVISION "$ENV{BUILD_VCS_NUMBER}")
elseif(GIT_FOUND)
execute_process(
COMMAND
${GIT_EXECUTABLE} rev-list --max-count=1 HEAD
WORKING_DIRECTORY
${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE
TR_VCS_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
COMMAND ${GIT_EXECUTABLE} rev-list --max-count=1 HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE TR_VCS_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if("${TR_VCS_REVISION}" STREQUAL "" AND EXISTS "${TR_VCS_REVISION_FILE}")
@ -196,9 +193,12 @@ if(WIN32)
endforeach()
endif()
set(CMAKE_FOLDER "third-party")
find_package(Fmt)
add_definitions(-DFMT_HEADER_ONLY -DFMT_EXCEPTIONS=0)
include_directories(SYSTEM ${LIBFMT_INCLUDE_DIRS})
add_definitions(
-DFMT_HEADER_ONLY
-DFMT_EXCEPTIONS=0)
find_package(WideInteger)
find_package(FastFloat)
@ -221,7 +221,9 @@ endif()
set(CRYPTO_PKG "")
if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "ccrypto")
tr_get_required_flag(WITH_CRYPTO CCRYPTO_IS_REQUIRED)
find_path(CCRYPTO_INCLUDE_DIR NAMES CommonCrypto/CommonCrypto.h ${CCRYPTO_IS_REQUIRED})
find_path(CCRYPTO_INCLUDE_DIR
NAMES CommonCrypto/CommonCrypto.h
${CCRYPTO_IS_REQUIRED})
mark_as_advanced(CCRYPTO_INCLUDE_DIR)
tr_fixup_list_option(WITH_CRYPTO "ccrypto" CCRYPTO_INCLUDE_DIR "AUTO" CCRYPTO_IS_REQUIRED)
if(WITH_CRYPTO STREQUAL "ccrypto")
@ -318,8 +320,17 @@ if(ENABLE_QT)
set(ENABLE_QT_COM_INTEROP OFF)
set(ENABLE_QT_DBUS_INTEROP OFF)
set(QT_REQUIRED_MODULES Core Gui Widgets Network Svg LinguistTools)
set(QT_OPTIONAL_MODULES DBus AxContainer AxServer)
set(QT_REQUIRED_MODULES
Core
Gui
Widgets
Network
Svg
LinguistTools)
set(QT_OPTIONAL_MODULES
DBus
AxContainer
AxServer)
set(MISSING_QT_MODULE)
set(Qt_NAMES Qt6 Qt5)
@ -413,7 +424,7 @@ tr_add_external_auto_library(EVENT2 libevent event
tr_add_external_auto_library(NATPMP libnatpmp natpmp)
if(NOT USE_SYSTEM_NATPMP)
set(NATPMP_DEFINITIONS -DNATPMP_STATICLIB)
set(NATPMP_DEFINITIONS NATPMP_STATICLIB)
endif()
tr_add_external_auto_library(MINIUPNPC miniupnpc miniupnpc
@ -421,9 +432,9 @@ tr_add_external_auto_library(MINIUPNPC miniupnpc miniupnpc
-DUPNPC_BUILD_STATIC=ON
-DUPNPC_BUILD_SHARED=OFF
-DUPNPC_BUILD_TESTS=OFF)
set(MINIUPNPC_DEFINITIONS -DSYSTEM_MINIUPNP)
set(MINIUPNPC_DEFINITIONS SYSTEM_MINIUPNP)
if(NOT USE_SYSTEM_MINIUPNPC)
list(APPEND MINIUPNPC_DEFINITIONS -DMINIUPNP_STATICLIB)
list(APPEND MINIUPNPC_DEFINITIONS MINIUPNP_STATICLIB)
set(MINIUPNPC_VERSION 1.9)
set(MINIUPNPC_API_VERSION 12)
endif()
@ -437,15 +448,18 @@ tr_add_external_auto_library(PSL libpsl psl)
if(ENABLE_UTP)
tr_add_external_auto_library(UTP libutp utp
CMAKE_ARGS
-DLIBUTP_BUILD_PROGRAMS=OFF)
CMAKE_ARGS -DLIBUTP_BUILD_PROGRAMS=OFF)
if(UTP_UPSTREAM_TARGET)
# Use C++ linker for anything that depends on static libutp
# TODO: switch to imported targets for all the dependencies
add_library(UTP::UTP STATIC IMPORTED)
set_property(TARGET UTP::UTP PROPERTY IMPORTED_LOCATION "${UTP_LIBRARIES}")
set_property(TARGET UTP::UTP PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX")
set_property(
TARGET UTP::UTP
PROPERTY IMPORTED_LOCATION "${UTP_LIBRARIES}")
set_property(
TARGET UTP::UTP
PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX")
set(UTP_LIBRARIES UTP::UTP)
endif()
endif()
@ -484,8 +498,6 @@ if(WITH_SYSTEMD)
tr_fixup_auto_option(WITH_SYSTEMD SYSTEMD_FOUND SYSTEMD_IS_REQUIRED)
endif()
include_directories(${CMAKE_BINARY_DIR})
if(WIN32)
foreach(L C CXX)
# Filter out needless definitions
@ -493,6 +505,8 @@ if(WIN32)
endforeach()
endif()
unset(CMAKE_FOLDER)
## Compiler standard version
set(CMAKE_C_STANDARD 11)
@ -509,8 +523,7 @@ include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
if(MSVC)
set(WARNING_CANDIDATES
/W4)
set(WARNING_CANDIDATES /W4)
foreach(FLAG ${WARNING_CANDIDATES})
list(APPEND C_WARNING_FLAGS ${FLAG})
@ -573,7 +586,7 @@ else()
set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}")
string(TOLOWER "${CACHE_ID}" CACHE_ID)
check_c_compiler_flag(${FLAG} ${CACHE_ID})
if (${CACHE_ID})
if(${CACHE_ID})
# Make sure the next loop only adds flags that are relevant for a particular language
set(CMAKE_REQUIRED_FLAGS ${FLAG})
break()
@ -587,7 +600,7 @@ else()
set(CACHE_ID "${CMAKE_C_COMPILER_ID}_C_HAS${FLAG_ID}")
string(TOLOWER "${CACHE_ID}" CACHE_ID)
check_c_compiler_flag(${FLAG} ${CACHE_ID})
if (${CACHE_ID})
if(${CACHE_ID})
list(APPEND C_WARNING_FLAGS ${FLAG})
endif()
@ -595,7 +608,7 @@ else()
set(CACHE_ID "${CMAKE_CXX_COMPILER_ID}_CXX_HAS${FLAG_ID}")
string(TOLOWER "${CACHE_ID}" CACHE_ID)
check_cxx_compiler_flag(${FLAG} ${CACHE_ID})
if (${CACHE_ID})
if(${CACHE_ID})
list(APPEND CXX_WARNING_FLAGS ${FLAG})
endif()
@ -616,83 +629,11 @@ add_compile_options(
include(LargeFileSupport)
set(NEEDED_HEADERS
sys/signalfd.h
sys/statvfs.h
xfs/xfs.h
xlocale.h)
if(ENABLE_NLS)
check_library_exists(intl libintl_gettext "" HAVE_LIBINTL)
if(HAVE_LIBINTL)
set(LIBINTL_LIBRARY intl)
# check_function_exists() below may need this
# when looking for gettext() and ngettext()
list(APPEND CMAKE_REQUIRED_LIBRARIES intl)
endif()
list(APPEND NEEDED_HEADERS libintl.h)
endif()
foreach(H ${NEEDED_HEADERS})
tr_make_id("${H}" H_ID)
check_include_file(${H} HAVE_${H_ID})
if(HAVE_${H_ID})
add_definitions(-DHAVE_${H_ID})
endif()
endforeach()
set(NEEDED_FUNCTIONS
_configthreadlocale
copy_file_range
copyfile
daemon
fallocate64
flock
getmntent
gettext
htonll
mkdtemp
ngettext
ntohll
posix_fadvise
posix_fallocate
pread
pwrite
sendfile64
statvfs
strlcpy
syslog)
foreach(F ${NEEDED_FUNCTIONS})
tr_make_id("${F}" F_ID)
check_function_exists(${F} HAVE_${F_ID})
if(HAVE_${F_ID})
add_definitions(-DHAVE_${F_ID})
endif()
endforeach()
if(ICONV_FOUND)
add_definitions(-DHAVE_ICONV)
if(ICONV_SECOND_ARGUMENT_IS_CONST)
add_definitions(-DICONV_SECOND_ARGUMENT_IS_CONST)
endif()
endif()
# if(MINGW)
# check_function_exists(__mingw_printf HAVE_MINGW_PRINTF)
# if(HAVE_MINGW_PRINTF)
# add_definitions(-D__USE_MINGW_ANSI_STDIO=1 -D__STDC_FORMAT_MACROS=1)
# endif()
# endif()
check_library_exists(m sqrt "" HAVE_LIBM)
if(HAVE_LIBM)
set(LIBM_LIBRARY m)
endif()
check_symbol_exists(SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT)
set(TR_NETWORK_LIBRARIES)
if(WIN32)
list(APPEND TR_NETWORK_LIBRARIES iphlpapi ws2_32)
@ -709,7 +650,7 @@ else()
endif()
if(RUN_CLANG_TIDY STREQUAL "AUTO")
if (DEFINED ENV{LGTM_SRC} OR DEFINED ENV{APPVEYOR}) # skip clang-tidy on LGTM/appveyor
if(DEFINED ENV{LGTM_SRC} OR DEFINED ENV{APPVEYOR}) # skip clang-tidy on LGTM/appveyor
set(RUN_CLANG_TIDY OFF)
else()
set(RUN_CLANG_TIDY ON)
@ -719,7 +660,7 @@ endif()
if(RUN_CLANG_TIDY)
message(STATUS "Looking for clang-tidy")
find_program(CLANG_TIDY clang-tidy)
if (CLANG_TIDY STREQUAL "CLANG_TIDY-NOTFOUND")
if(CLANG_TIDY STREQUAL "CLANG_TIDY-NOTFOUND")
message(STATUS "Looking for clang-tidy - not found")
else()
message(STATUS "Looking for clang-tidy - found")
@ -733,7 +674,9 @@ if(ENABLE_TESTS)
endif()
function(tr_install_web DST_DIR)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/web/public_html DESTINATION ${DST_DIR})
install(
DIRECTORY ${CMAKE_SOURCE_DIR}/web/public_html
DESTINATION ${DST_DIR})
endfunction()
add_subdirectory(libtransmission)
@ -760,8 +703,17 @@ if(ENABLE_DAEMON OR ENABLE_GTK OR ENABLE_QT)
endif()
if(INSTALL_DOC)
install(FILES AUTHORS COPYING README.md docs/rpc-spec.md extras/send-email-when-torrent-done.sh DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(DIRECTORY news DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(
FILES
AUTHORS
COPYING
README.md
docs/rpc-spec.md
extras/send-email-when-torrent-done.sh
DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(
DIRECTORY news
DESTINATION ${CMAKE_INSTALL_DOCDIR})
endif()
if(MSVC AND ENABLE_DAEMON AND ENABLE_QT AND ENABLE_UTILS AND WITH_CRYPTO STREQUAL "openssl")
@ -781,33 +733,27 @@ endif()
list(APPEND CPACK_SOURCE_IGNORE_FILES
"${CMAKE_BINARY_DIR}"
"[.]git"
"node_modules"
)
"node_modules")
## Code Formatting
if(GIT_FOUND)
execute_process(COMMAND
"${GIT_EXECUTABLE}" rev-parse --show-toplevel
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-parse --show-toplevel
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE TR_GIT_ROOT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(TR_GIT_ROOT AND IS_DIRECTORY "${TR_GIT_ROOT}/.git")
configure_file(
"${CMAKE_SOURCE_DIR}/extras/pre-commit"
"${TR_GIT_ROOT}/.git/hooks/pre-commit"
COPYONLY
)
configure_file("${CMAKE_SOURCE_DIR}/extras/pre-commit" "${TR_GIT_ROOT}/.git/hooks/pre-commit" COPYONLY)
add_custom_target(check-format
COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" --check
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
)
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
add_custom_target(format
COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
)
set_property(TARGET check-format format PROPERTY FOLDER "utility")
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
set_property(
TARGET check-format format
PROPERTY FOLDER "utility")
endif()
unset(TR_GIT_ROOT)
endif()

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)"
"${TR_NAME}-cli"
"${TR_NAME}-cli.exe")
add_executable(${TR_NAME}-cli cli.cc ${${PROJECT_NAME}_WIN32_RC_FILE})
include_directories(${TR_NAME}-cli ${CURL_INCLUDE_DIRS})
target_link_libraries(${TR_NAME}-cli ${TR_NAME})
install(TARGETS ${TR_NAME}-cli DESTINATION ${CMAKE_INSTALL_BINDIR})
install(
TARGETS ${TR_NAME}-cli
DESTINATION ${CMAKE_INSTALL_BINDIR})
if(INSTALL_DOC)
install(FILES ${TR_NAME}-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
install(
FILES ${TR_NAME}-cli.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
endif()

View File

@ -1,8 +1,14 @@
find_package(PkgConfig QUIET)
pkg_check_modules(PC_AYATANA_APPINDICATOR QUIET ayatana-appindicator3-0.1)
find_path(AYATANA_APPINDICATOR_INCLUDE_DIR NAMES libayatana-appindicator/app-indicator.h HINTS ${PC_AYATANA_APPINDICATOR_INCLUDE_DIRS})
find_library(AYATANA_APPINDICATOR_LIBRARY NAMES ayatana-appindicator3 ayatana-appindicator HINTS ${PC_AYATANA_APPINDICATOR_LIBRARY_DIRS})
find_path(AYATANA_APPINDICATOR_INCLUDE_DIR
NAMES libayatana-appindicator/app-indicator.h
HINTS ${PC_AYATANA_APPINDICATOR_INCLUDE_DIRS})
find_library(AYATANA_APPINDICATOR_LIBRARY
NAMES
ayatana-appindicator3
ayatana-appindicator
HINTS ${PC_AYATANA_APPINDICATOR_LIBRARY_DIRS})
if(AYATANA_APPINDICATOR_INCLUDE_DIR AND AYATANA_APPINDICATOR_LIBRARY)
set(APPINDICATOR_INCLUDE_DIR ${AYATANA_APPINDICATOR_INCLUDE_DIR})
@ -10,8 +16,14 @@ if(AYATANA_APPINDICATOR_INCLUDE_DIR AND AYATANA_APPINDICATOR_LIBRARY)
set(APPINDICATOR_IS_AYATANA ON)
else()
pkg_check_modules(PC_APPINDICATOR QUIET appindicator3-0.1)
find_path(APPINDICATOR_INCLUDE_DIR NAMES libappindicator/app-indicator.h HINTS ${PC_APPINDICATOR_INCLUDE_DIRS})
find_library(APPINDICATOR_LIBRARY NAMES appindicator3 appindicator HINTS ${PC_APPINDICATOR_LIBRARY_DIRS})
find_path(APPINDICATOR_INCLUDE_DIR
NAMES libappindicator/app-indicator.h
HINTS ${PC_APPINDICATOR_INCLUDE_DIRS})
find_library(APPINDICATOR_LIBRARY
NAMES
appindicator3
appindicator
HINTS ${PC_APPINDICATOR_LIBRARY_DIRS})
set(APPINDICATOR_IS_AYATANA OFF)
endif()
@ -20,8 +32,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(APPINDICATOR
REQUIRED_VARS
APPINDICATOR_LIBRARY
APPINDICATOR_INCLUDE_DIR
)
APPINDICATOR_INCLUDE_DIR)
mark_as_advanced(AYATANA_APPINDICATOR_INCLUDE_DIR AYATANA_APPINDICATOR_LIBRARY)
mark_as_advanced(APPINDICATOR_INCLUDE_DIR APPINDICATOR_LIBRARY)

View File

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

View File

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

View File

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

View File

@ -8,18 +8,25 @@ if(EVENT2_PREFER_STATIC_LIB)
endif()
if(UNIX)
find_package(PkgConfig QUIET)
pkg_check_modules(_EVENT2 QUIET libevent)
find_package(PkgConfig QUIET)
pkg_check_modules(_EVENT2 QUIET libevent)
endif()
find_path(EVENT2_INCLUDE_DIR NAMES event2/event.h HINTS ${_EVENT2_INCLUDEDIR})
find_library(EVENT2_LIBRARY NAMES event-2.1 event HINTS ${_EVENT2_LIBDIR})
find_path(EVENT2_INCLUDE_DIR
NAMES event2/event.h
HINTS ${_EVENT2_INCLUDEDIR})
find_library(EVENT2_LIBRARY
NAMES
event-2.1
event
HINTS ${_EVENT2_LIBDIR})
if(EVENT2_INCLUDE_DIR)
if(_EVENT2_VERSION)
set(EVENT2_VERSION ${_EVENT2_VERSION})
else()
file(STRINGS "${EVENT2_INCLUDE_DIR}/event2/event-config.h" EVENT2_VERSION_STR REGEX "^#define[\t ]+_EVENT_VERSION[\t ]+\"[^\"]+\"")
file(STRINGS "${EVENT2_INCLUDE_DIR}/event2/event-config.h" EVENT2_VERSION_STR
REGEX "^#define[\t ]+_EVENT_VERSION[\t ]+\"[^\"]+\"")
if(EVENT2_VERSION_STR MATCHES "\"([^\"]+)\"")
set(EVENT2_VERSION "${CMAKE_MATCH_1}")
endif()
@ -35,9 +42,7 @@ find_package_handle_standard_args(EVENT2
REQUIRED_VARS
EVENT2_LIBRARY
EVENT2_INCLUDE_DIR
VERSION_VAR
EVENT2_VERSION
)
VERSION_VAR EVENT2_VERSION)
mark_as_advanced(EVENT2_INCLUDE_DIR EVENT2_LIBRARY)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,12 +7,11 @@ if(NOT DEFINED NO_LFS_MACROS_REQUIRED)
# We can't simply define LARGE_OFF_T to be 9223372036854775807,
# since some C++ compilers masquerading as C compilers
# incorrectly reject 9223372036854775807.
set(LFS_TEST_PROGRAM "
#include <sys/types.h>
set(LFS_TEST_PROGRAM
"#include <sys/types.h>
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
int main() { return 0; }
")
int main() { return 0; }")
check_c_source_compiles("${LFS_TEST_PROGRAM}" NO_LFS_MACROS_REQUIRED)
if(NOT NO_LFS_MACROS_REQUIRED)

View File

@ -1,3 +1,6 @@
include(CheckFunctionExists)
include(CheckIncludeFile)
macro(tr_auto_option_changed NAME ACC VAL FIL STK)
if(NOT ("${VAL}" STREQUAL "AUTO" OR "${VAL}" STREQUAL "ON" OR "${VAL}" STREQUAL "OFF"))
if("${VAL}" STREQUAL "0" OR "${VAL}" STREQUAL "NO" OR "${VAL}" STREQUAL "FALSE" OR "${VAL}" STREQUAL "N")
@ -11,7 +14,8 @@ macro(tr_auto_option_changed NAME ACC VAL FIL STK)
endmacro()
macro(tr_auto_option NAME DESC VAL)
set(${NAME} "${VAL}" CACHE STRING "${DESC}")
set(${NAME} "${VAL}"
CACHE STRING "${DESC}")
set_property(CACHE ${NAME} PROPERTY STRINGS "AUTO;ON;OFF")
variable_watch(${NAME} tr_auto_option_changed)
endmacro()
@ -57,7 +61,7 @@ endmacro()
macro(tr_get_required_flag IVAR OVAR)
set(${OVAR})
if (${IVAR} AND NOT ${IVAR} STREQUAL "AUTO")
if(${IVAR} AND NOT ${IVAR} STREQUAL "AUTO")
set(${OVAR} REQUIRED)
endif()
endmacro()
@ -69,6 +73,61 @@ function(tr_make_id INPUT OVAR)
set(${OVAR} "${ID}" PARENT_SCOPE)
endfunction()
function(tr_string_unindent RESULT_VAR TEXT)
if(TEXT MATCHES [==[^([ ]+)]==])
string(REGEX REPLACE "(^|\n)${CMAKE_MATCH_1}($|.)" "\\1\\2" TEXT "${TEXT}")
endif()
set(${RESULT_VAR} "${TEXT}" PARENT_SCOPE)
endfunction()
macro(tr_eval SCRIPT)
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
cmake_language(EVAL CODE "${SCRIPT}")
else()
tr_string_unindent(_TR_EVAL_SCRIPT "${SCRIPT}")
string(SHA1 _TR_EVAL_TMP_FILE "${_TR_EVAL_SCRIPT}")
string(SUBSTRING "${_TR_EVAL_TMP_FILE}" 0 10 _TR_EVAL_TMP_FILE)
set(_TR_EVAL_TMP_FILE "${CMAKE_BINARY_DIR}/.tr-cache/tr_eval.${_TR_EVAL_TMP_FILE}.cmake")
if(NOT EXISTS "${_TR_EVAL_TMP_FILE}")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/.tr-cache")
file(WRITE "${_TR_EVAL_TMP_FILE}" "${_TR_EVAL_SCRIPT}")
endif()
include("${_TR_EVAL_TMP_FILE}")
unset(_TR_EVAL_TMP_FILE)
unset(_TR_EVAL_SCRIPT)
endif()
endmacro()
function(tr_process_list_conditions VAR_PREFIX)
set(ALLOWED_ITEMS)
set(DISALLOWED_ITEMS)
set(ALLOW TRUE)
foreach(ARG IN LISTS ARGN)
if(ARG MATCHES [==[^\[(.+)\]$]==])
set(COND "${CMAKE_MATCH_1}")
string(STRIP "${COND}" COND)
tr_eval("\
if(${COND})
set(ALLOW TRUE)
else()
set(ALLOW FALSE)
endif()")
elseif(ALLOW)
list(APPEND ALLOWED_ITEMS "${ARG}")
else()
list(APPEND DISALLOWED_ITEMS "${ARG}")
endif()
endforeach()
set(${VAR_PREFIX}_ALLOWED "${ALLOWED_ITEMS}" PARENT_SCOPE)
set(${VAR_PREFIX}_DISALLOWED "${DISALLOWED_ITEMS}" PARENT_SCOPE)
endfunction()
macro(tr_add_external_auto_library ID DIRNAME LIBNAME)
if(USE_SYSTEM_${ID})
tr_get_required_flag(USE_SYSTEM_${ID} SYSTEM_${ID}_IS_REQUIRED)
@ -82,8 +141,10 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME)
set(${ID}_UPSTREAM_TARGET ${LIBNAME})
set(${ID}_PREFIX "${CMAKE_BINARY_DIR}/third-party/${${ID}_UPSTREAM_TARGET}")
set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include" CACHE INTERNAL "")
set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE INTERNAL "")
set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include"
CACHE INTERNAL "")
set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}"
CACHE INTERNAL "")
set(${ID}_INCLUDE_DIRS ${${ID}_INCLUDE_DIR})
set(${ID}_LIBRARIES ${${ID}_LIBRARY})
@ -114,8 +175,7 @@ macro(tr_add_external_auto_library ID DIRNAME LIBNAME)
"-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>"
"-DCMAKE_INSTALL_LIBDIR:STRING=lib"
${${ID}_EXT_PROJ_CMAKE_ARGS}
BUILD_BYPRODUCTS "${${ID}_LIBRARY}"
)
BUILD_BYPRODUCTS "${${ID}_LIBRARY}")
set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "third-party")
endif()
@ -129,7 +189,47 @@ function(tr_append_target_property TGT PROP VAL)
set_target_properties(${TGT} PROPERTIES ${PROP} "${VAL}")
endfunction()
function(tr_win32_app_info OVAR DESCR INTNAME ORIGFNAME)
function(tr_target_compile_definitions_for_headers TGT)
cmake_parse_arguments(ARG "" "" "PRIVATE;PUBLIC" ${ARGN})
foreach(VISIBILITY IN ITEMS PRIVATE PUBLIC)
foreach(H IN LISTS ARG_${VISIBILITY})
tr_make_id("HAVE_${H}" H_ID)
check_include_file(${H} ${H_ID})
target_compile_definitions(${TGT}
${VISIBILITY}
$<$<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)
return()
endif()
@ -143,7 +243,9 @@ function(tr_win32_app_info OVAR DESCR INTNAME ORIGFNAME)
configure_file("${CMAKE_SOURCE_DIR}/cmake/Transmission.rc.in" "${INTNAME}-app-info.rc")
set(${OVAR} "${CMAKE_CURRENT_BINARY_DIR}/${INTNAME}-app-info.rc" PARENT_SCOPE)
target_sources(${TGT}
PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/${INTNAME}-app-info.rc")
endfunction()
function(tr_select_library LIBNAMES FUNCNAME DIRS OVAR)
@ -180,7 +282,10 @@ function(tr_fixup_bundle_item BUNDLE_DIR BUNDLE_ITEMS DEP_DIRS)
set(DEP_BUNDLE_PATH "Contents/MacOS/${DEP_NAME}")
elseif(DEP_FULL_PATH MATCHES "^(.+)/(([^/]+[.]framework)/.+)$")
set(DEP_NAME "${CMAKE_MATCH_2}")
file(COPY "${CMAKE_MATCH_1}/${CMAKE_MATCH_3}" DESTINATION "${BUNDLE_DIR}/Contents/Frameworks/" PATTERN "Headers" EXCLUDE)
file(
COPY "${CMAKE_MATCH_1}/${CMAKE_MATCH_3}"
DESTINATION "${BUNDLE_DIR}/Contents/Frameworks/"
PATTERN "Headers" EXCLUDE)
set(DEP_BUNDLE_PATH "Contents/Frameworks/${DEP_NAME}")
else()
message(FATAL_ERROR "Don't know how to fixup '${DEP_FULL_PATH}'")
@ -198,28 +303,221 @@ function(tr_fixup_bundle_item BUNDLE_DIR BUNDLE_ITEMS DEP_DIRS)
endwhile()
endfunction()
macro(tr_qt_wrap_ui)
if(Qt_VERSION_MAJOR EQUAL 6)
qt6_wrap_ui(${ARGN})
else()
qt5_wrap_ui(${ARGN})
endif()
endmacro()
function(tr_glib_compile_resources TGT NAME INPUT_DIR INPUT_FILE OUTPUT_FILE_BASE)
if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE)
execute_process(
COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_resources
OUTPUT_VARIABLE GLIB_COMPILE_RESOURCES_EXECUTABLE
OUTPUT_STRIP_TRAILING_WHITESPACE)
macro(tr_qt_add_resources)
if(Qt_VERSION_MAJOR EQUAL 6)
qt6_add_resources(${ARGN})
else()
qt5_add_resources(${ARGN})
endif()
endmacro()
if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE)
message(SEND_ERROR "Unable to find glib-compile-resources executable")
endif()
macro(tr_qt_add_translation)
set(GLIB_COMPILE_RESOURCES_EXECUTABLE "${GLIB_COMPILE_RESOURCES_EXECUTABLE}"
CACHE STRING "glib-compile-resources executable")
endif()
set_property(
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
"${INPUT_DIR}/${INPUT_FILE}")
file(STRINGS "${INPUT_DIR}/${INPUT_FILE}" INPUT_LINES)
set(OUTPUT_DEPENDS)
foreach(INPUT_LINE IN LISTS INPUT_LINES)
if(INPUT_LINE MATCHES ">([^<]+)</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)
qt6_add_translation(${ARGN} OPTIONS -silent)
qt6_add_translation(${OUTPUT_FILES_VAR} ${ARGN} OPTIONS -silent)
elseif(Qt_VERSION GREATER_EQUAL 5.11)
qt5_add_translation(${ARGN} OPTIONS -silent)
qt5_add_translation(${OUTPUT_FILES_VAR} ${ARGN} OPTIONS -silent)
else()
qt5_add_translation(${ARGN})
qt5_add_translation(${OUTPUT_FILES_VAR} ${ARGN})
endif()
source_group("Generated Files"
FILES ${${OUTPUT_FILES_VAR}})
endmacro()
function(tr_wrap_idl TGT INPUT_FILE OUTPUT_FILE_BASE)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb
COMMAND ${MIDL_EXECUTABLE} /tlb ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb ${INPUT_FILE}
DEPENDS ${INPUT_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
configure_file("${CMAKE_SOURCE_DIR}/cmake/Transmission.tlb.rc.in" ${OUTPUT_FILE_BASE}.tlb.rc)
target_sources(${TGT}
PRIVATE
${INPUT_FILE}
${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb
${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb.rc)
source_group("Generated Files"
FILES
${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb
${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb.rc)
tr_disable_source_files_compile(
${INPUT_FILE}
${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.tlb)
endfunction()
function(tr_target_idl_files TGT)
foreach(ARG IN LISTS ARGN)
get_filename_component(ARG_PATH "${ARG}" ABSOLUTE)
string(SHA1 ARG_HASH "${ARG_PATH}")
string(SUBSTRING "${ARG_HASH}" 0 10 ARG_HASH)
get_filename_component(ARG_NAME_WE "${ARG}" NAME_WE)
string(MAKE_C_IDENTIFIER "${ARG_NAME_WE}" ARG_ID)
tr_wrap_idl(${TGT}
"${ARG}"
"${ARG_ID}-${ARG_HASH}")
endforeach()
endfunction()
function(tr_wrap_xib TGT INPUT_FILE OUTPUT_FILE OUTPUT_FOLDER)
if(NOT IBTOOL_EXECUTABLE)
find_program(IBTOOL_EXECUTABLE ibtool REQUIRED)
endif()
if(OUTPUT_FOLDER)
string(PREPEND OUTPUT_FOLDER "/")
endif()
get_filename_component(OUTPUT_FILE_DIR "${OUTPUT_FILE}" DIRECTORY)
add_custom_command(
OUTPUT ${OUTPUT_FILE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_FILE_DIR}
COMMAND ${IBTOOL_EXECUTABLE} --compile ${OUTPUT_FILE} ${INPUT_FILE}
DEPENDS ${INPUT_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM)
target_sources(${TGT}
PRIVATE
${INPUT_FILE}
${OUTPUT_FILE})
set(RESOURCES_DIR Resources)
if(NOT CMAKE_GENERATOR STREQUAL Xcode)
string(APPEND RESOURCES_DIR "${OUTPUT_FOLDER}")
endif()
set_source_files_properties(
${OUTPUT_FILE}
PROPERTIES
MACOSX_PACKAGE_LOCATION "${RESOURCES_DIR}")
source_group("Resources${OUTPUT_FOLDER}"
FILES ${INPUT_FILE})
source_group("Generated Files${OUTPUT_FOLDER}"
FILES ${OUTPUT_FILE})
endfunction()
function(tr_target_xib_files TGT)
foreach(ARG IN LISTS ARGN)
get_filename_component(ARG_DIR "${ARG}" DIRECTORY)
get_filename_component(ARG_NAME_WLE "${ARG}" NAME_WLE)
tr_wrap_xib(${TGT}
"${ARG}"
"${CMAKE_CURRENT_BINARY_DIR}/${ARG_DIR}/${ARG_NAME_WLE}.nib"
"${ARG_DIR}")
endforeach()
endfunction()

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

View File

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

View File

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

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)
add_executable(${TR_NAME}-gtk WIN32)
target_sources(${TR_NAME}-gtk
PRIVATE
Actions.cc
Actions.h
Application.cc
Application.h
DetailsDialog.cc
DetailsDialog.h
Dialogs.cc
Dialogs.h
FaviconCache.cc
FaviconCache.h
FileList.cc
FileList.h
FilterBar.cc
FilterBar.h
Flags.h
FreeSpaceLabel.cc
FreeSpaceLabel.h
GtkCompat.h
HigWorkarea.h
IconCache.cc
IconCache.h
ListModelAdapter.cc
ListModelAdapter.h
main.cc
MainWindow.cc
MainWindow.h
MakeDialog.cc
MakeDialog.h
MessageLogWindow.cc
MessageLogWindow.h
Notify.cc
Notify.h
OptionsDialog.cc
OptionsDialog.h
PathButton.cc
PathButton.h
Prefs.cc
Prefs.h
PrefsDialog.cc
PrefsDialog.h
RelocateDialog.cc
RelocateDialog.h
Session.cc
Session.h
StatsDialog.cc
StatsDialog.h
SystemTrayIcon.cc
SystemTrayIcon.h
Torrent.cc
Torrent.h
TorrentCellRenderer.cc
TorrentCellRenderer.h
TorrentFilter.cc
TorrentFilter.h
TorrentSorter.cc
TorrentSorter.h
Utils.cc
Utils.h)
target_sources(${TR_NAME}-gtk
PRIVATE
ui/gtk3/AddTrackerDialog.ui
ui/gtk3/DetailsDialog.ui
ui/gtk3/EditTrackersDialog.ui
ui/gtk3/FilterBar.ui
ui/gtk3/MainWindow.ui
ui/gtk3/MakeDialog.ui
ui/gtk3/MakeProgressDialog.ui
ui/gtk3/MessageLogWindow.ui
ui/gtk3/OptionsDialog.ui
ui/gtk3/PrefsDialog.ui
ui/gtk3/RelocateDialog.ui
ui/gtk3/StatsDialog.ui
ui/gtk3/TorrentUrlChooserDialog.ui)
source_group(Ui/GTK3
REGULAR_EXPRESSION [[ui/gtk3/.*\.ui$]])
target_sources(${TR_NAME}-gtk
PRIVATE
ui/gtk4/AddTrackerDialog.ui
ui/gtk4/DetailsDialog.ui
ui/gtk4/EditTrackersDialog.ui
ui/gtk4/FilterBar.ui
ui/gtk4/MainWindow.ui
ui/gtk4/MakeDialog.ui
ui/gtk4/MakeProgressDialog.ui
ui/gtk4/MessageLogWindow.ui
ui/gtk4/OptionsDialog.ui
ui/gtk4/PrefsDialog.ui
ui/gtk4/RelocateDialog.ui
ui/gtk4/StatsDialog.ui
ui/gtk4/TorrentUrlChooserDialog.ui)
source_group(Ui/GTK4
REGULAR_EXPRESSION [[ui/gtk4/.*\.ui$]])
target_link_directories(${TR_NAME}-gtk
PRIVATE
${GTK${GTK_VERSION}_LIBRARY_DIRS})
if(WITH_APPINDICATOR)
set_property(
SOURCE SystemTrayIcon.cc
APPEND
PROPERTY COMPILE_DEFINITIONS
HAVE_APPINDICATOR)
if(APPINDICATOR_IS_AYATANA)
set_property(
SOURCE SystemTrayIcon.cc
APPEND
PROPERTY COMPILE_DEFINITIONS
APPINDICATOR_IS_AYATANA)
endif()
endif()
if(GTK_VERSION EQUAL 4)
set(UI_SUBDIR ui/gtk4)
else()
set(UI_SUBDIR ui/gtk3)
endif()
set(${PROJECT_NAME}_UI_FILES
${UI_SUBDIR}/AddTrackerDialog.ui
${UI_SUBDIR}/DetailsDialog.ui
${UI_SUBDIR}/EditTrackersDialog.ui
${UI_SUBDIR}/FilterBar.ui
${UI_SUBDIR}/MainWindow.ui
${UI_SUBDIR}/MakeDialog.ui
${UI_SUBDIR}/MakeProgressDialog.ui
${UI_SUBDIR}/MessageLogWindow.ui
${UI_SUBDIR}/OptionsDialog.ui
${UI_SUBDIR}/PrefsDialog.ui
${UI_SUBDIR}/RelocateDialog.ui
${UI_SUBDIR}/StatsDialog.ui
${UI_SUBDIR}/TorrentUrlChooserDialog.ui
)
macro(gtr_compile_resources NAME INPUT_DIR INPUT_FILE OUTPUT_FILE_BASE)
add_custom_command(
OUTPUT
"${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c"
"${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h"
COMMAND
"${GLIB_COMPILE_RESOURCES_EXECUTABLE}"
"--target=${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.c"
"--sourcedir=${INPUT_DIR}"
--generate-source
--c-name "${NAME}"
"${INPUT_DIR}/${INPUT_FILE}"
COMMAND
"${GLIB_COMPILE_RESOURCES_EXECUTABLE}"
"--target=${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILE_BASE}.h"
"--sourcedir=${INPUT_DIR}"
--generate-header
--c-name "${NAME}"
"${INPUT_DIR}/${INPUT_FILE}"
DEPENDS
"${INPUT_DIR}/${INPUT_FILE}"
${ARGN}
WORKING_DIRECTORY
"${INPUT_DIR}"
)
endmacro()
gtr_compile_resources(transmission ${CMAKE_CURRENT_SOURCE_DIR} transmission.gresource.xml transmission-resources
icons/hicolor_apps_scalable_transmission.svg
icons/lock.svg
icons/options-symbolic.svg
icons/ratio-symbolic.svg
icons/turtle-symbolic.svg
transmission-ui.css
transmission-ui.xml
)
gtr_compile_resources(transmission_ui ${CMAKE_CURRENT_SOURCE_DIR}/${UI_SUBDIR} transmission-ui.gresource.xml transmission-ui-resources
${${PROJECT_NAME}_UI_FILES}
)
tr_target_glib_resources(${TR_NAME}-gtk
transmission.gresource.xml
${UI_SUBDIR}/transmission-ui.gresource.xml)
if(ENABLE_NLS)
set(${PROJECT_NAME}_DESKTOP_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.desktop")
add_custom_command(
OUTPUT ${${PROJECT_NAME}_DESKTOP_FILE}
COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --desktop -d ${CMAKE_SOURCE_DIR}/po --template ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in -o ${${PROJECT_NAME}_DESKTOP_FILE}
DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in
VERBATIM
)
set(DESKTOP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TR_NAME}-gtk.desktop")
tr_gettext_msgfmt(${TR_NAME}-gtk
${DESKTOP_FILE}
${CMAKE_CURRENT_SOURCE_DIR}/transmission-gtk.desktop.in)
target_sources(${TR_NAME}-gtk
PRIVATE
${DESKTOP_FILE})
set(${PROJECT_NAME}_METAINFO_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.metainfo.xml")
add_custom_command(
OUTPUT ${${PROJECT_NAME}_METAINFO_FILE}
COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --xml -d ${CMAKE_SOURCE_DIR}/po --template ${PROJECT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in -o ${${PROJECT_NAME}_METAINFO_FILE}
DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in
VERBATIM
)
source_group("Generated Files" FILES ${${PROJECT_NAME}_DESKTOP_FILE} ${${PROJECT_NAME}_METAINFO_FILE})
set(METAINFO_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TR_NAME}-gtk.metainfo.xml")
tr_gettext_msgfmt(${TR_NAME}-gtk
${METAINFO_FILE}
${CMAKE_CURRENT_SOURCE_DIR}/transmission-gtk.metainfo.xml.in)
target_sources(${TR_NAME}-gtk
PRIVATE
${METAINFO_FILE})
endif()
set(${PROJECT_NAME}_SOURCES
Actions.cc
Application.cc
DetailsDialog.cc
Dialogs.cc
FaviconCache.cc
FileList.cc
FilterBar.cc
FreeSpaceLabel.cc
IconCache.cc
ListModelAdapter.cc
main.cc
MainWindow.cc
MakeDialog.cc
MessageLogWindow.cc
Notify.cc
OptionsDialog.cc
PathButton.cc
Prefs.cc
PrefsDialog.cc
RelocateDialog.cc
Session.cc
StatsDialog.cc
SystemTrayIcon.cc
Torrent.cc
TorrentCellRenderer.cc
TorrentFilter.cc
TorrentSorter.cc
Utils.cc
${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.c
${CMAKE_CURRENT_BINARY_DIR}/transmission-ui-resources.c
)
target_compile_definitions(${TR_NAME}-gtk
PRIVATE
TRANSMISSIONLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}"
GETTEXT_PACKAGE="${TR_NAME}-gtk"
G_DISABLE_DEPRECATED
GDK_PIXBUF_DISABLE_DEPRECATED
GDK_DISABLE_DEPRECATED
GTK_DISABLE_DEPRECATED
PANGO_DISABLE_DEPRECATED
# FIXME: these break libnotify's headers
# G_DISABLE_SINGLE_INCLUDES
# GTK_DISABLE_SINGLE_INCLUDES
GDKMM_DISABLE_DEPRECATED
GIOMM_DISABLE_DEPRECATED
GLIBMM_DISABLE_DEPRECATED
GTKMM_DISABLE_DEPRECATED
PANGOMM_DISABLE_DEPRECATED
SIGCXX_DISABLE_DEPRECATED
$<$<BOOL:${ENABLE_UTP}>:WITH_UTP>)
set(${PROJECT_NAME}_HEADERS
Actions.h
Application.h
DetailsDialog.h
Dialogs.h
FaviconCache.h
FileList.h
FilterBar.h
Flags.h
FreeSpaceLabel.h
GtkCompat.h
HigWorkarea.h
IconCache.h
ListModelAdapter.h
MainWindow.h
MakeDialog.h
MessageLogWindow.h
Notify.h
OptionsDialog.h
PathButton.h
Prefs.h
PrefsDialog.h
RelocateDialog.h
Session.h
StatsDialog.h
SystemTrayIcon.h
Torrent.h
TorrentCellRenderer.h
TorrentFilter.h
TorrentSorter.h
Utils.h
${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.h
${CMAKE_CURRENT_BINARY_DIR}/transmission-ui-resources.h
)
target_compile_options(${TR_NAME}-gtk
PRIVATE
${GTK${GTK_VERSION}_CFLAGS_OTHER}
$<$<BOOL:${ENABLE_WERROR}>:$<IF:$<CXX_COMPILER_ID:MSVC>,/WX,-Werror>>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-exit-time-destructors>)
include_directories(
${CMAKE_SOURCE_DIR}
${PROJECT_BINARY_DIR}
)
target_include_directories(${TR_NAME}-gtk
PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR})
include_directories(
SYSTEM
${GTK${GTK_VERSION}_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS}
)
if(WITH_APPINDICATOR)
include_directories(SYSTEM ${APPINDICATOR_INCLUDE_DIRS})
endif()
link_directories(
${GTK${GTK_VERSION}_LIBRARY_DIRS}
)
add_definitions(
"-DTRANSMISSIONLOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\""
"-DGETTEXT_PACKAGE=\"${TR_NAME}-gtk\""
-DG_DISABLE_DEPRECATED
-DGDK_PIXBUF_DISABLE_DEPRECATED
-DGDK_DISABLE_DEPRECATED
-DGTK_DISABLE_DEPRECATED
-DPANGO_DISABLE_DEPRECATED
# FIXME: these break libnotify's headers
# -DG_DISABLE_SINGLE_INCLUDES
# -DGTK_DISABLE_SINGLE_INCLUDES
-DGDKMM_DISABLE_DEPRECATED
-DGIOMM_DISABLE_DEPRECATED
-DGLIBMM_DISABLE_DEPRECATED
-DGTKMM_DISABLE_DEPRECATED
-DPANGOMM_DISABLE_DEPRECATED
-DSIGCXX_DISABLE_DEPRECATED
${GTK${GTK_VERSION}_CFLAGS_OTHER}
)
if(ENABLE_UTP)
add_definitions(-DWITH_UTP)
endif()
if(WITH_APPINDICATOR)
set_property(SOURCE SystemTrayIcon.cc APPEND PROPERTY COMPILE_DEFINITIONS HAVE_APPINDICATOR)
if(APPINDICATOR_IS_AYATANA)
set_property(SOURCE SystemTrayIcon.cc APPEND PROPERTY COMPILE_DEFINITIONS APPINDICATOR_IS_AYATANA)
endif()
endif()
tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE
"Transmission GTK+ Client"
"${TR_NAME}-gtk"
"${TR_NAME}-gtk.exe"
"${TR_NAME}.ico")
add_executable(${TR_NAME}-gtk WIN32
${${PROJECT_NAME}_SOURCES}
${${PROJECT_NAME}_HEADERS}
${${PROJECT_NAME}_DESKTOP_FILE}
${${PROJECT_NAME}_METAINFO_FILE}
${${PROJECT_NAME}_WIN32_RC_FILE}
)
target_include_directories(${TR_NAME}-gtk SYSTEM
PRIVATE
${LIBFMT_INCLUDE_DIRS}
${GTK${GTK_VERSION}_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS}
$<$<BOOL:${WITH_APPINDICATOR}>:${APPINDICATOR_INCLUDE_DIRS}>)
target_link_libraries(${TR_NAME}-gtk
${TR_NAME}
${GTK${GTK_VERSION}_LIBRARIES}
${CURL_LIBRARIES}
${EVENT2_LIBRARIES}
)
if(WITH_APPINDICATOR)
target_link_libraries(${TR_NAME}-gtk ${APPINDICATOR_LIBRARIES})
endif()
if(NOT MSVC)
target_compile_options(${TR_NAME}-gtk PRIVATE -Wno-exit-time-destructors)
endif()
PRIVATE
${TR_NAME}
${GTK${GTK_VERSION}_LIBRARIES}
${CURL_LIBRARIES}
${EVENT2_LIBRARIES}
$<$<BOOL:${WITH_APPINDICATOR}>:${APPINDICATOR_LIBRARIES}>)
if(MSVC)
tr_append_target_property(${TR_NAME}-gtk LINK_FLAGS "/ENTRY:mainCRTStartup")
endif()
install(TARGETS ${TR_NAME}-gtk DESTINATION ${CMAKE_INSTALL_BINDIR})
tr_win32_app_info(${TR_NAME}-gtk
"Transmission GTK+ Client"
"${TR_NAME}-gtk"
"${TR_NAME}-gtk.exe"
"${TR_NAME}.ico")
set(${PROJECT_NAME}_PUBLIC_ICONS
install(
TARGETS ${TR_NAME}-gtk
DESTINATION ${CMAKE_INSTALL_BINDIR})
set(PUBLIC_ICONS
hicolor_apps_scalable_transmission.svg
hicolor_apps_scalable_transmission-devel.svg
hicolor_apps_symbolic_transmission-symbolic.svg
)
hicolor_apps_symbolic_transmission-symbolic.svg)
set(ICON_NAME_REGEX "^([^_]+)_([^_]+)_([^_]+)_(.+)$")
foreach(ICON ${${PROJECT_NAME}_PUBLIC_ICONS})
foreach(ICON ${PUBLIC_ICONS})
string(REGEX REPLACE ${ICON_NAME_REGEX} "\\1/\\3/\\2" ICON_DIR ${ICON})
string(REGEX REPLACE ${ICON_NAME_REGEX} "\\4" ICON_NAME ${ICON})
install(FILES icons/${ICON} DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/${ICON_DIR}/ RENAME ${ICON_NAME})
install(
FILES icons/${ICON}
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/${ICON_DIR}/
RENAME ${ICON_NAME})
endforeach()
if(INSTALL_DOC)
install(FILES ${TR_NAME}-gtk.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
install(
FILES ${TR_NAME}-gtk.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
endif()
if(ENABLE_NLS)
install(FILES ${${PROJECT_NAME}_DESKTOP_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES ${${PROJECT_NAME}_METAINFO_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
install(
FILES ${DESKTOP_FILE}
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(
FILES ${METAINFO_FILE}
DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
else()
install(FILES transmission-gtk.desktop.in DESTINATION ${CMAKE_INSTALL_DATADIR}/applications RENAME ${TR_NAME}-gtk.desktop)
install(
FILES transmission-gtk.desktop.in
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
RENAME ${TR_NAME}-gtk.desktop)
endif()

View File

@ -1,321 +1,354 @@
project(libtr)
include(CheckLibraryExists)
include(CheckSymbolExists)
configure_file(
version.h.in
version.h
)
set(${PROJECT_NAME}_SOURCES
announce-list.cc
announcer-http.cc
announcer-udp.cc
announcer.cc
bandwidth.cc
bitfield.cc
block-info.cc
blocklist.cc
cache.cc
clients.cc
completion.cc
crypto-utils-ccrypto.cc
crypto-utils-fallback.cc
crypto-utils-mbedtls.cc
crypto-utils-openssl.cc
crypto-utils-wolfssl.cc
crypto-utils.cc
error.cc
file-piece-map.cc
file-posix.cc
file-win32.cc
file.cc
handshake.cc
inout.cc
log.cc
magnet-metainfo.cc
makemeta.cc
net.cc
open-files.cc
peer-io.cc
peer-mgr-active-requests.cc
peer-mgr-wishlist.cc
peer-mgr.cc
peer-mse.cc
peer-msgs.cc
peer-socket.cc
platform-quota.cc
platform.cc
port-forwarding-natpmp.cc
port-forwarding-upnp.cc
port-forwarding.cc
quark.cc
resume.cc
rpc-server.cc
rpcimpl.cc
session-id.cc
session-alt-speeds.cc
session-settings.cc
session-thread.cc
session.cc
stats.cc
subprocess-posix.cc
subprocess-win32.cc
timer-ev.cc
torrent-ctor.cc
torrent-files.cc
torrent-magnet.cc
torrent-metainfo.cc
torrent.cc
torrents.cc
tr-assert.cc
tr-assert.mm
tr-dht.cc
tr-getopt.cc
tr-lpd.cc
tr-udp.cc
tr-utp.cc
utils.cc
variant-benc.cc
variant-json.cc
variant.cc
variant-converters.cc
verify.cc
watchdir-generic.cc
watchdir-inotify.cc
watchdir-kqueue.cc
watchdir-win32.cc
watchdir.cc
web-utils.cc
web.cc
webseed.cc
)
set_source_files_properties(crypto-utils-fallback.cc PROPERTIES HEADER_FILE_ONLY ON)
foreach(CP ccrypto mbedtls openssl wolfssl)
if(NOT CP STREQUAL CRYPTO_PKG)
set_source_files_properties(crypto-utils-${CP}.cc PROPERTIES HEADER_FILE_ONLY ON)
if(ENABLE_NLS)
check_library_exists(intl libintl_gettext "" HAVE_LIBINTL)
if(HAVE_LIBINTL)
set(LIBINTL_LIBRARY intl)
endif()
endforeach()
if(WITH_INOTIFY)
add_definitions(-DWITH_INOTIFY)
else()
set_source_files_properties(watchdir-inotify.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
if(WITH_KQUEUE)
add_definitions(-DWITH_KQUEUE)
else()
set_source_files_properties(watchdir-kqueue.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
check_symbol_exists(SO_REUSEPORT "sys/types.h;sys/socket.h" HAVE_SO_REUSEPORT)
if(WIN32)
set_source_files_properties(file-posix.cc subprocess-posix.cc PROPERTIES HEADER_FILE_ONLY ON)
else()
set_source_files_properties(file-win32.cc subprocess-win32.cc watchdir-win32.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
add_library(${TR_NAME} STATIC)
if(APPLE)
set_source_files_properties(tr-assert.cc PROPERTIES HEADER_FILE_ONLY ON)
else()
set_source_files_properties(tr-assert.mm PROPERTIES HEADER_FILE_ONLY ON)
endif()
target_sources(${TR_NAME}
PRIVATE
announce-list.cc
announce-list.h
announcer-common.h
announcer-http.cc
announcer-udp.cc
announcer.cc
announcer.h
bandwidth.cc
bandwidth.h
benc.h
bitfield.cc
bitfield.h
block-info.cc
block-info.h
blocklist.cc
blocklist.h
cache.cc
cache.h
clients.cc
clients.h
completion.cc
completion.h
crypto-utils-ccrypto.cc
crypto-utils-fallback.cc
crypto-utils-mbedtls.cc
crypto-utils-openssl.cc
crypto-utils-wolfssl.cc
crypto-utils.cc
crypto-utils.h
error-types.h
error.cc
error.h
file-piece-map.cc
file-piece-map.h
file-posix.cc
file-win32.cc
file.cc
file.h
handshake.cc
handshake.h
history.h
inout.cc
inout.h
log.cc
log.h
lru-cache.h
magnet-metainfo.cc
magnet-metainfo.h
makemeta.cc
makemeta.h
mime-types.h
net.cc
net.h
open-files.cc
open-files.h
peer-common.h
peer-io.cc
peer-io.h
peer-mgr-active-requests.cc
peer-mgr-active-requests.h
peer-mgr-wishlist.cc
peer-mgr-wishlist.h
peer-mgr.cc
peer-mgr.h
peer-mse.cc
peer-mse.h
peer-msgs.cc
peer-msgs.h
peer-socket.cc
peer-socket.h
platform-quota.cc
platform-quota.h
platform.cc
platform.h
port-forwarding-natpmp.cc
port-forwarding-natpmp.h
port-forwarding-upnp.cc
port-forwarding-upnp.h
port-forwarding.cc
port-forwarding.h
quark.cc
quark.h
resume.cc
resume.h
rpc-server.cc
rpc-server.h
rpcimpl.cc
rpcimpl.h
session-alt-speeds.cc
session-alt-speeds.h
session-id.cc
session-id.h
session-settings.cc
session-thread.cc
session-thread.h
session.cc
session.h
stats.cc
stats.h
subprocess-posix.cc
subprocess-win32.cc
subprocess.h
timer-ev.cc
timer-ev.h
timer.h
torrent-ctor.cc
torrent-files.cc
torrent-files.h
torrent-magnet.cc
torrent-magnet.h
torrent-metainfo.cc
torrent-metainfo.h
torrent.cc
torrent.h
torrents.cc
torrents.h
tr-assert.cc
tr-assert.h
tr-assert.mm
tr-buffer.h
tr-dht.cc
tr-dht.h
tr-getopt.cc
tr-getopt.h
tr-lpd.cc
tr-lpd.h
tr-macros.h
tr-strbuf.h
tr-udp.cc
tr-utp.cc
tr-utp.h
transmission.h
utils-ev.h
utils.cc
utils.h
variant-benc.cc
variant-common.h
variant-converters.cc
variant-json.cc
variant.cc
variant.h
verify.cc
verify.h
version.h.in
watchdir-base.h
watchdir-generic.cc
watchdir-inotify.cc
watchdir-kqueue.cc
watchdir-win32.cc
watchdir.cc
watchdir.h
web-utils.cc
web-utils.h
web.cc
web.h
webseed.cc
webseed.h)
set(${PROJECT_NAME}_PUBLIC_HEADERS
${PROJECT_BINARY_DIR}/version.h
error-types.h
error.h
file.h
log.h
makemeta.h
quark.h
rpcimpl.h
session-id.h
timer-ev.h
timer.h
tr-assert.h
tr-getopt.h
tr-macros.h
tr-strbuf.h
tr-buffer.h
transmission.h
utils.h
variant.h
watchdir.h
web-utils.h
web.h
)
configure_file(version.h.in version.h)
set(${PROJECT_NAME}_PRIVATE_HEADERS
announce-list.h
announcer-common.h
announcer.h
bandwidth.h
benc.h
bitfield.h
block-info.h
blocklist.h
cache.h
clients.h
completion.h
crypto-utils.h
file-piece-map.h
handshake.h
history.h
inout.h
lru-cache.h
magnet-metainfo.h
mime-types.h
net.h
open-files.h
peer-common.h
peer-io.h
peer-mgr-active-requests.h
peer-mgr-wishlist.h
peer-mgr.h
peer-mse.h
peer-msgs.h
peer-socket.h
platform-quota.h
platform.h
port-forwarding-natpmp.h
port-forwarding-upnp.h
port-forwarding.h
resume.h
rpc-server.h
session-alt-speeds.h
session-thread.h
session.h
stats.h
subprocess.h
torrent-files.h
torrent-magnet.h
torrent-metainfo.h
torrent.h
torrents.h
tr-dht.h
tr-lpd.h
tr-utp.h
utils-ev.h
variant-common.h
verify.h
version.h
watchdir-base.h
webseed.h
)
target_sources(${TR_NAME}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/version.h)
if(NOT ENABLE_UTP)
set_source_files_properties(tr-utp.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
tr_allow_compile_if(
[=[[TRUE]]=]
crypto-utils-fallback.cc
[=[[CRYPTO_PKG STREQUAL "ccrypto"]]=]
crypto-utils-ccrypto.cc
[=[[CRYPTO_PKG STREQUAL "mbedtls"]]=]
crypto-utils-mbedtls.cc
[=[[CRYPTO_PKG STREQUAL "openssl"]]=]
crypto-utils-openssl.cc
[=[[CRYPTO_PKG STREQUAL "wolfssl"]]=]
crypto-utils-wolfssl.cc
[=[[ENABLE_UTP]]=]
tr-utp.cc
[=[[WITH_INOTIFY]]=]
watchdir-inotify.cc
[=[[WITH_KQUEUE]]=]
watchdir-kqueue.cc
[=[[APPLE]]=]
tr-assert.mm
[=[[NOT APPLE]]=]
tr-assert.cc
[=[[WIN32]]=]
file-win32.cc
subprocess-win32.cc
watchdir-win32.cc
[=[[NOT WIN32]]=]
file-posix.cc
subprocess-posix.cc)
add_definitions(
-D__TRANSMISSION__
-DWIDE_INTEGER_DISABLE_FLOAT_INTEROP
-DWIDE_INTEGER_DISABLE_IOSTREAM
"-DPACKAGE_DATA_DIR=\"${CMAKE_INSTALL_FULL_DATAROOTDIR}\""
${NATPMP_DEFINITIONS}
${MINIUPNPC_DEFINITIONS}
)
if(ENABLE_LIGHTWEIGHT)
add_definitions(-DTR_LIGHTWEIGHT)
endif()
if(NOT ENABLE_NLS)
add_definitions(-DDISABLE_GETTEXT)
endif()
if(ENABLE_UTP)
add_definitions(-DWITH_UTP)
endif()
if(MINIUPNPC_VERSION VERSION_LESS 1.7)
# API version macro was only added in 1.7
add_definitions(-DMINIUPNPC_API_VERSION=${MINIUPNPC_API_VERSION})
endif()
if(USE_SYSTEM_B64)
add_definitions(-DUSE_SYSTEM_B64)
endif()
if(HAVE_SO_REUSEPORT)
add_definitions(-DHAVE_SO_REUSEPORT=1)
endif()
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}
)
include_directories(
SYSTEM
${WIDE_INTEGER_INCLUDE_DIRS}
${UTFCPP_INCLUDE_DIRS}
${DEFLATE_INCLUDE_DIRS}
${FAST_FLOAT_INCLUDE_DIRS}
${CRYPTO_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS}
${PSL_INCLUDE_DIRS}
${NATPMP_INCLUDE_DIRS}
${MINIUPNPC_INCLUDE_DIRS}
${DHT_INCLUDE_DIRS}
${UTP_INCLUDE_DIRS}
${B64_INCLUDE_DIRS}
)
if(ICONV_FOUND)
include_directories(SYSTEM ${ICONV_INCLUDE_DIRS})
endif()
add_library(${TR_NAME} STATIC
${${PROJECT_NAME}_SOURCES}
${${PROJECT_NAME}_PUBLIC_HEADERS}
${${PROJECT_NAME}_PRIVATE_HEADERS}
)
foreach(UT ${EVENT2_UPSTREAM_TARGET}
${NATPMP_UPSTREAM_TARGET}
${MINIUPNPC_UPSTREAM_TARGET}
${DHT_UPSTREAM_TARGET}
${DEFLATE_UPSTREAM_TARGET}
${UTP_UPSTREAM_TARGET}
${PSL_UPSTREAM_TARGET}
${B64_UPSTREAM_TARGET})
foreach(UT
${EVENT2_UPSTREAM_TARGET}
${NATPMP_UPSTREAM_TARGET}
${MINIUPNPC_UPSTREAM_TARGET}
${DHT_UPSTREAM_TARGET}
${DEFLATE_UPSTREAM_TARGET}
${UTP_UPSTREAM_TARGET}
${PSL_UPSTREAM_TARGET}
${B64_UPSTREAM_TARGET})
add_dependencies(${TR_NAME} ${UT})
endforeach()
target_compile_definitions(${TR_NAME}
PRIVATE
__TRANSMISSION__
WIDE_INTEGER_DISABLE_FLOAT_INTEROP
WIDE_INTEGER_DISABLE_IOSTREAM
PACKAGE_DATA_DIR="${CMAKE_INSTALL_FULL_DATAROOTDIR}"
$<$<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}
${CMAKE_THREAD_LIBS_INIT}
${DEFLATE_LIBRARIES}
${CRYPTO_LIBRARIES}
${CURL_LIBRARIES}
${EVENT2_LIBRARIES}
${PSL_LIBRARIES}
${NATPMP_LIBRARIES}
${MINIUPNPC_LIBRARIES}
${DHT_LIBRARIES}
${UTP_LIBRARIES}
${B64_LIBRARIES}
${LIBINTL_LIBRARY}
${LIBM_LIBRARY}
${TR_NETWORK_LIBRARIES}
jsonsl
wildmat
)
if(ICONV_FOUND)
target_link_libraries(${TR_NAME} ${ICONV_LIBRARIES})
endif()
if(WIN32)
target_link_libraries(${TR_NAME} crypt32 shlwapi)
endif()
if(APPLE)
target_link_libraries(${TR_NAME} "-framework Foundation")
endif()
PRIVATE
${CMAKE_THREAD_LIBS_INIT}
${DEFLATE_LIBRARIES}
${CRYPTO_LIBRARIES}
${CURL_LIBRARIES}
${EVENT2_LIBRARIES}
${PSL_LIBRARIES}
${NATPMP_LIBRARIES}
${MINIUPNPC_LIBRARIES}
${DHT_LIBRARIES}
${UTP_LIBRARIES}
${B64_LIBRARIES}
${LIBINTL_LIBRARY}
${LIBM_LIBRARY}
${TR_NETWORK_LIBRARIES}
jsonsl
wildmat
$<$<BOOL:${ICONV_FOUND}>:${ICONV_LIBRARIES}>
$<$<BOOL:${WIN32}>:crypt32>
$<$<BOOL:${WIN32}>:shlwapi>
"$<$<BOOL:${APPLE}>:-framework Foundation>")
if(INSTALL_LIB)
install(TARGETS ${TR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES ${${PROJECT_NAME}_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TR_NAME})
install(
TARGETS ${TR_NAME}
DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(
FILES
error-types.h
error.h
file.h
log.h
makemeta.h
quark.h
rpcimpl.h
session-id.h
timer-ev.h
timer.h
tr-assert.h
tr-buffer.h
tr-getopt.h
tr-macros.h
tr-strbuf.h
transmission.h
utils.h
variant.h
watchdir.h
web-utils.h
web.h
${CMAKE_CURRENT_BINARY_DIR}/version.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TR_NAME})
endif()

View File

@ -1,186 +1,176 @@
project(trmac)
if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS MACOS_SUPPORT_MINIMUM)
message(FATAL_ERROR "Targeting macOS versions before ${MACOS_SUPPORT_MINIMUM} is not supported for the macOS project, please adjust CMAKE_OSX_DEPLOYMENT_TARGET (${CMAKE_OSX_DEPLOYMENT_TARGET})")
endif()
include_directories(${CMAKE_SOURCE_DIR})
set(MAC_BUNDLE_NAME Transmission)
add_compile_options(
-fcxx-modules
-fmodules
-fobjc-arc)
-fobjc-arc
# #warnings are good practice in development
"-Wno-#warnings"
# GNU extensions are good practice in Objective-C
-Wno-gnu)
find_program(ACTOOL_EXECUTABLE actool REQUIRED)
find_program(CODESIGN_EXECUTABLE codesign REQUIRED)
find_program(IBTOOL_EXECUTABLE ibtool REQUIRED)
macro(tr_wrap_xib IFILE OFILE)
get_filename_component(twx_nib_dir "${OFILE}" DIRECTORY)
add_custom_command(
OUTPUT ${OFILE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${twx_nib_dir}
COMMAND ${IBTOOL_EXECUTABLE} --compile ${OFILE} ${IFILE}
DEPENDS ${IFILE}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
VERBATIM
)
source_group("Generated Files" FILES ${OFILE})
endmacro()
add_subdirectory(QuickLookPlugin)
add_subdirectory(VDKQueue)
set(${PROJECT_NAME}_SOURCES
AboutWindowController.mm
AddMagnetWindowController.mm
AddWindowController.mm
BadgeView.mm
Badger.mm
BlocklistDownloader.mm
BlocklistDownloaderViewController.mm
BlocklistScheduler.mm
BonjourController.mm
ButtonToolbarItem.mm
ColorTextField.mm
Controller.mm
CreatorWindowController.mm
DragOverlayView.mm
DragOverlayWindow.mm
ExpandedPathToIconTransformer.mm
ExpandedPathToPathTransformer.mm
FileListNode.mm
FileNameCell.mm
FileOutlineController.mm
FileOutlineView.mm
FilePriorityCell.mm
FileRenameSheetController.mm
FilterBarController.mm
FilterBarView.mm
FilterButton.mm
GlobalOptionsPopoverViewController.mm
GroupPopUpButtonCell.mm
GroupTextCell.mm
GroupToolbarItem.mm
GroupsController.mm
GroupsPrefsController.mm
InfoActivityViewController.mm
InfoFileViewController.mm
InfoGeneralViewController.mm
InfoOptionsViewController.mm
InfoPeersViewController.mm
InfoTextField.mm
InfoTrackersViewController.mm
InfoWindowController.mm
main.mm
MessageWindowController.mm
NSApplicationAdditions.mm
NSDataAdditions.mm
NSImageAdditions.mm
NSKeyedUnarchiverAdditions.mm
NSMutableArrayAdditions.mm
NSStringAdditions.mm
PeerProgressIndicatorCell.mm
PeerTableView.mm
PiecesView.mm
PortChecker.mm
PredicateEditorRowTemplateAny.mm
PrefsController.mm
PrefsWindow.mm
PriorityPopUpButtonCell.mm
ProgressGradients.mm
ShareToolbarItem.mm
ShareTorrentFileHelper.mm
SparkleProxy.mm
StatsWindowController.mm
StatusBarController.mm
StatusBarView.mm
Toolbar.mm
Torrent.mm
TorrentCell.mm
TorrentGroup.mm
TorrentTableView.mm
TrackerCell.mm
TrackerNode.mm
TrackerTableView.mm
URLSheetWindowController.mm
WebSeedTableView.mm
)
add_executable(${TR_NAME}-mac MACOSX_BUNDLE)
set(${PROJECT_NAME}_HEADERS
AboutWindowController.h
AddMagnetWindowController.h
AddWindowController.h
BadgeView.h
Badger.h
BlocklistDownloader.h
BlocklistDownloaderViewController.h
BlocklistScheduler.h
BonjourController.h
ButtonToolbarItem.h
CocoaCompatibility.h
ColorTextField.h
Controller.h
CreatorWindowController.h
DragOverlayView.h
DragOverlayWindow.h
ExpandedPathToIconTransformer.h
ExpandedPathToPathTransformer.h
FileListNode.h
FileNameCell.h
FileOutlineController.h
FileOutlineView.h
FilePriorityCell.h
FileRenameSheetController.h
FilterBarController.h
FilterBarView.h
FilterButton.h
GlobalOptionsPopoverViewController.h
GroupPopUpButtonCell.h
GroupTextCell.h
GroupToolbarItem.h
GroupsController.h
GroupsPrefsController.h
InfoActivityViewController.h
InfoFileViewController.h
InfoGeneralViewController.h
InfoOptionsViewController.h
InfoPeersViewController.h
InfoTextField.h
InfoTrackersViewController.h
InfoViewController.h
InfoWindowController.h
MessageWindowController.h
NSApplicationAdditions.h
NSDataAdditions.h
NSImageAdditions.h
NSKeyedUnarchiverAdditions.h
NSMutableArrayAdditions.h
NSStringAdditions.h
PeerProgressIndicatorCell.h
PeerTableView.h
PiecesView.h
PortChecker.h
PredicateEditorRowTemplateAny.h
PrefsController.h
PrefsWindow.h
PriorityPopUpButtonCell.h
ProgressGradients.h
ShareToolbarItem.h
ShareTorrentFileHelper.h
StatsWindowController.h
StatusBarController.h
StatusBarView.h
Toolbar.h
Torrent.h
TorrentCell.h
TorrentGroup.h
TorrentTableView.h
TrackerCell.h
TrackerNode.h
TrackerTableView.h
URLSheetWindowController.h
WebSeedTableView.h
)
target_sources(${TR_NAME}-mac
PRIVATE
AboutWindowController.h
AboutWindowController.mm
AddMagnetWindowController.h
AddMagnetWindowController.mm
AddWindowController.h
AddWindowController.mm
Badger.h
Badger.mm
BadgeView.h
BadgeView.mm
BlocklistDownloader.h
BlocklistDownloader.mm
BlocklistDownloaderViewController.h
BlocklistDownloaderViewController.mm
BlocklistScheduler.h
BlocklistScheduler.mm
BonjourController.h
BonjourController.mm
ButtonToolbarItem.h
ButtonToolbarItem.mm
CocoaCompatibility.h
ColorTextField.h
ColorTextField.mm
Controller.h
Controller.mm
CreatorWindowController.h
CreatorWindowController.mm
DragOverlayView.h
DragOverlayView.mm
DragOverlayWindow.h
DragOverlayWindow.mm
ExpandedPathToIconTransformer.h
ExpandedPathToIconTransformer.mm
ExpandedPathToPathTransformer.h
ExpandedPathToPathTransformer.mm
FileListNode.h
FileListNode.mm
FileNameCell.h
FileNameCell.mm
FileOutlineController.h
FileOutlineController.mm
FileOutlineView.h
FileOutlineView.mm
FilePriorityCell.h
FilePriorityCell.mm
FileRenameSheetController.h
FileRenameSheetController.mm
FilterBarController.h
FilterBarController.mm
FilterBarView.h
FilterBarView.mm
FilterButton.h
FilterButton.mm
GlobalOptionsPopoverViewController.h
GlobalOptionsPopoverViewController.mm
GroupPopUpButtonCell.h
GroupPopUpButtonCell.mm
GroupsController.h
GroupsController.mm
GroupsPrefsController.h
GroupsPrefsController.mm
GroupTextCell.h
GroupTextCell.mm
GroupToolbarItem.h
GroupToolbarItem.mm
InfoActivityViewController.h
InfoActivityViewController.mm
InfoFileViewController.h
InfoFileViewController.mm
InfoGeneralViewController.h
InfoGeneralViewController.mm
InfoOptionsViewController.h
InfoOptionsViewController.mm
InfoPeersViewController.h
InfoPeersViewController.mm
InfoTextField.h
InfoTextField.mm
InfoTrackersViewController.h
InfoTrackersViewController.mm
InfoViewController.h
InfoWindowController.h
InfoWindowController.mm
main.mm
MessageWindowController.h
MessageWindowController.mm
NSApplicationAdditions.h
NSApplicationAdditions.mm
NSDataAdditions.h
NSDataAdditions.mm
NSImageAdditions.h
NSImageAdditions.mm
NSKeyedUnarchiverAdditions.h
NSKeyedUnarchiverAdditions.mm
NSMutableArrayAdditions.h
NSMutableArrayAdditions.mm
NSStringAdditions.h
NSStringAdditions.mm
PeerProgressIndicatorCell.h
PeerProgressIndicatorCell.mm
PeerTableView.h
PeerTableView.mm
PiecesView.h
PiecesView.mm
PortChecker.h
PortChecker.mm
PredicateEditorRowTemplateAny.h
PredicateEditorRowTemplateAny.mm
PrefsController.h
PrefsController.mm
PrefsWindow.h
PrefsWindow.mm
PriorityPopUpButtonCell.h
PriorityPopUpButtonCell.mm
ProgressGradients.h
ProgressGradients.mm
ShareToolbarItem.h
ShareToolbarItem.mm
ShareTorrentFileHelper.h
ShareTorrentFileHelper.mm
SparkleProxy.mm
StatsWindowController.h
StatsWindowController.mm
StatusBarController.h
StatusBarController.mm
StatusBarView.h
StatusBarView.mm
Toolbar.h
Toolbar.mm
Torrent.h
Torrent.mm
TorrentCell.h
TorrentCell.mm
TorrentGroup.h
TorrentGroup.mm
TorrentTableView.h
TorrentTableView.mm
TrackerCell.h
TrackerCell.mm
TrackerNode.h
TrackerNode.mm
TrackerTableView.h
TrackerTableView.mm
URLSheetWindowController.h
URLSheetWindowController.mm
WebSeedTableView.h
WebSeedTableView.mm)
set(${PROJECT_NAME}_XIB_FILES
set(XIB_FILES
AboutWindow.xib
BlocklistStatusWindow.xib
FileRenameSheetController.xib
@ -192,24 +182,23 @@ set(${PROJECT_NAME}_XIB_FILES
MessageWindow.xib
StatsWindow.xib
StatusBar.xib
URLSheetWindow.xib
)
source_group(Resources FILES ${${PROJECT_NAME}_XIB_FILES})
URLSheetWindow.xib)
set(${PROJECT_NAME}_RESOURCES
set(RESOURCES
Defaults.plist
Credits.rtf
sparkle_dsa_pub.pem
../COPYING
Images/TransmissionDocument.icns
)
source_group(Resources FILES ${${PROJECT_NAME}_RESOURCES})
Images/TransmissionDocument.icns)
source_group(Resources
FILES ${RESOURCES})
set_source_files_properties(${${PROJECT_NAME}_RESOURCES} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources
)
set_source_files_properties(
${RESOURCES}
PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
set(${PROJECT_NAME}_IMAGESETS
set(IMAGESETS
ActionHover
Bandwidth
CleanupTemplate
@ -267,8 +256,7 @@ set(${PROJECT_NAME}_IMAGESETS
UpArrowTemplate
UploadBadge
YingYangGroupTemplate
YingYangTemplate
)
YingYangTemplate)
set(APPICON_NAME AppIcon)
@ -279,7 +267,7 @@ set(IMAGE_ASSETS
${IMAGE_ASSETS_DIR}/Contents.json
${APPICONSET_DIR}/Contents.json)
foreach(IMG IN LISTS ${PROJECT_NAME}_IMAGESETS)
foreach(IMG IN LISTS IMAGESETS)
set(IMG_DIR "${IMAGE_ASSETS_DIR}/${IMG}.imageset")
list(APPEND IMAGE_ASSETS
${IMG_DIR}/${IMG}.png
@ -301,7 +289,8 @@ add_custom_command(
OUTPUT
${COMPILED_IMAGE_ASSETS}
${APPICON_NAME}.Info.plist
COMMAND ${ACTOOL_EXECUTABLE}
COMMAND
${ACTOOL_EXECUTABLE}
--compile "${CMAKE_CURRENT_BINARY_DIR}"
--platform macosx
--minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET}
@ -309,16 +298,21 @@ add_custom_command(
--output-partial-info-plist "${CMAKE_CURRENT_BINARY_DIR}/${APPICON_NAME}.Info.plist"
${IMAGE_ASSETS_DIR}
DEPENDS ${IMAGE_ASSETS}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
source_group("Generated Files" FILES ${COMPILED_IMAGE_ASSETS} ${APPICON_NAME}.Info.plist)
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
source_group("Generated Files"
FILES
${COMPILED_IMAGE_ASSETS}
${APPICON_NAME}.Info.plist)
list(APPEND ${PROJECT_NAME}_RESOURCES ${COMPILED_IMAGE_ASSETS})
list(APPEND RESOURCES
${COMPILED_IMAGE_ASSETS})
set_source_files_properties(${COMPILED_IMAGE_ASSETS} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
set_source_files_properties(
${COMPILED_IMAGE_ASSETS}
PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
set(${PROJECT_NAME}_LINGUAS
set(LINGUAS
da
de
en
@ -328,16 +322,15 @@ set(${PROJECT_NAME}_LINGUAS
nl
pt_PT
ru
tr
)
tr)
if(ENABLE_NLS)
set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS})
set(ENABLED_LINGUAS ${LINGUAS})
else()
set(${PROJECT_NAME}_ENABLED_LINGUAS en)
set(ENABLED_LINGUAS en)
endif()
set(${PROJECT_NAME}_LANG_XIB_FILES
set(BASE_XIB_FILES
AddMagnetWindow.xib
AddWindow.xib
Creator.xib
@ -347,137 +340,102 @@ set(${PROJECT_NAME}_LANG_XIB_FILES
InfoGeneralView.xib
InfoOptionsView.xib
MainMenu.xib
PrefsWindow.xib
)
PrefsWindow.xib)
list(TRANSFORM BASE_XIB_FILES
PREPEND Base.lproj/)
set(${PROJECT_NAME}_LANG_STRINGS_FILES
set(LANG_STRINGS_FILES
InfoPlist.strings
Localizable.strings
)
Localizable.strings)
set(${PROJECT_NAME}_NIB_FILES)
foreach(F ${${PROJECT_NAME}_XIB_FILES})
get_filename_component(F_BASE "${F}" NAME_WE)
set(F_NIB "${PROJECT_BINARY_DIR}/${F_BASE}.nib")
tr_wrap_xib("${F}" "${F_NIB}")
list(APPEND ${PROJECT_NAME}_NIB_FILES "${F_NIB}")
endforeach()
set_source_files_properties(${${PROJECT_NAME}_NIB_FILES} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
set(${PROJECT_NAME}_BASE_XIB_FILES)
set(${PROJECT_NAME}_BASE_NIB_FILES)
foreach(F ${${PROJECT_NAME}_LANG_XIB_FILES})
set(F_XIB "Base.lproj/${F}")
get_filename_component(F_BASE "${F}" NAME_WE)
set(F_NIB "${PROJECT_BINARY_DIR}/Base.lproj/${F_BASE}.nib")
tr_wrap_xib("${F_XIB}" "${F_NIB}")
list(APPEND ${PROJECT_NAME}_BASE_XIB_FILES "${F_XIB}")
list(APPEND ${PROJECT_NAME}_BASE_NIB_FILES "${F_NIB}")
source_group(Resources/Base.lproj FILES ${F_XIB})
endforeach()
foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS})
set(${PROJECT_NAME}_${LANG}_STRINGS_FILES)
foreach(LANG ${ENABLED_LINGUAS})
set(${LANG}_STRINGS_FILES)
if(NOT LANG STREQUAL "en")
foreach(F ${${PROJECT_NAME}_LANG_XIB_FILES})
foreach(F ${BASE_XIB_FILES})
get_filename_component(F_BASE "${F}" NAME_WE)
list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F_BASE}.strings)
list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F_BASE}.strings)
endforeach()
endif()
foreach(F ${${PROJECT_NAME}_LANG_STRINGS_FILES})
list(APPEND ${PROJECT_NAME}_${LANG}_STRINGS_FILES ${LANG}.lproj/${F})
foreach(F ${LANG_STRINGS_FILES})
list(APPEND ${LANG}_STRINGS_FILES ${LANG}.lproj/${F})
endforeach()
source_group(Resources/${LANG}.lproj FILES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES})
source_group(Resources/${LANG}.lproj
FILES ${${LANG}_STRINGS_FILES})
endforeach()
include_directories(
${CMAKE_SOURCE_DIR}/libtransmission
${CMAKE_BINARY_DIR}/libtransmission
${PROJECT_SOURCE_DIR}/VDKQueue
)
add_compile_options(
# #warnings are good practice in development
"-Wno-#warnings"
# GNU extensions are good practice in Objective-C
-Wno-gnu
)
add_library(vdkqueue STATIC
VDKQueue/VDKQueue.mm
VDKQueue/VDKQueue.h
)
set_property(TARGET vdkqueue PROPERTY FOLDER "third-party")
set(BASE_NIB_FILES_RESOURCES_DIR Resources)
if(NOT CMAKE_GENERATOR STREQUAL Xcode)
string(APPEND BASE_NIB_FILES_RESOURCES_DIR /Base.lproj)
endif()
set_source_files_properties(${${PROJECT_NAME}_BASE_NIB_FILES} PROPERTIES
MACOSX_PACKAGE_LOCATION ${BASE_NIB_FILES_RESOURCES_DIR})
foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS})
list(APPEND ${PROJECT_NAME}_RESOURCES ${${PROJECT_NAME}_${LANG}_STRINGS_FILES})
foreach(LANG ${ENABLED_LINGUAS})
list(APPEND RESOURCES ${${LANG}_STRINGS_FILES})
set(STRINGS_FILES_RESOURCES_DIR Resources)
if(NOT CMAKE_GENERATOR STREQUAL Xcode)
string(APPEND STRINGS_FILES_RESOURCES_DIR /${LANG}.lproj)
endif()
set_source_files_properties(${${PROJECT_NAME}_${LANG}_STRINGS_FILES} PROPERTIES
MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR})
set_source_files_properties(
${${LANG}_STRINGS_FILES}
PROPERTIES
MACOSX_PACKAGE_LOCATION ${STRINGS_FILES_RESOURCES_DIR})
endforeach()
add_executable(${TR_NAME}-mac MACOSX_BUNDLE
${${PROJECT_NAME}_SOURCES}
${${PROJECT_NAME}_HEADERS}
${${PROJECT_NAME}_XIB_FILES}
${${PROJECT_NAME}_NIB_FILES}
${${PROJECT_NAME}_BASE_XIB_FILES}
${${PROJECT_NAME}_BASE_NIB_FILES}
${${PROJECT_NAME}_RESOURCES}
)
target_sources(${TR_NAME}-mac
PRIVATE
${RESOURCES})
find_library(SPARKLE_FRAMEWORK Sparkle PATHS ${PROJECT_SOURCE_DIR} NO_DEFAULT_PATHS)
tr_target_xib_files(${TR_NAME}-mac
${XIB_FILES}
${BASE_XIB_FILES})
target_include_directories(${TR_NAME}-mac
PRIVATE
${CMAKE_SOURCE_DIR})
target_include_directories(${TR_NAME}-mac SYSTEM
PRIVATE
${LIBFMT_INCLUDE_DIRS})
find_library(SPARKLE_FRAMEWORK Sparkle
PATHS ${CMAKE_CURRENT_SOURCE_DIR}
NO_DEFAULT_PATHS)
target_link_libraries(${TR_NAME}-mac
${TR_NAME}
vdkqueue
${SPARKLE_FRAMEWORK}
"-framework AppKit"
"-framework Carbon"
"-framework Foundation"
"-framework IOKit"
"-framework Quartz"
"-framework Security"
"-weak_framework UserNotifications"
)
PRIVATE
${TR_NAME}
vdkqueue
${SPARKLE_FRAMEWORK}
"-framework AppKit"
"-framework Carbon"
"-framework Foundation"
"-framework IOKit"
"-framework Quartz"
"-framework Security"
"-weak_framework UserNotifications")
if(NOT CMAKE_GENERATOR STREQUAL Xcode)
add_custom_command(TARGET ${TR_NAME}-mac POST_BUILD
add_custom_command(
TARGET ${TR_NAME}-mac
POST_BUILD
COMMAND ${CODESIGN_EXECUTABLE} -s - $<TARGET_BUNDLE_DIR:${TR_NAME}-mac>)
endif()
set(MAC_BUNDLE_NAME Transmission)
set_target_properties(
${TR_NAME}-mac
PROPERTIES
OUTPUT_NAME ${MAC_BUNDLE_NAME}
MACOSX_BUNDLE_GUI_IDENTIFIER "org.m0k.transmission"
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
INSTALL_RPATH "@executable_path;@executable_path/../Frameworks")
set_target_properties(${TR_NAME}-mac PROPERTIES
OUTPUT_NAME ${MAC_BUNDLE_NAME}
MACOSX_BUNDLE_GUI_IDENTIFIER "org.m0k.transmission"
MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/Info.plist.in
INSTALL_RPATH "@executable_path;@executable_path/../Frameworks"
)
install(
TARGETS ${TR_NAME}-mac
DESTINATION Applications)
add_subdirectory(QuickLookPlugin)
install(TARGETS ${TR_NAME}-mac DESTINATION Applications)
install(DIRECTORY TransmissionHelp DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources)
install(
DIRECTORY TransmissionHelp
DESTINATION Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources)
tr_install_web(Applications/${MAC_BUNDLE_NAME}.app/Contents/Resources)
install(CODE "
list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")
install(CODE
"list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")
include(TrMacros)
include(GetPrerequisites)
tr_fixup_bundle_item(\"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\" \"Contents/MacOS/${MAC_BUNDLE_NAME}\" \"${PROJECT_SOURCE_DIR}\")
")
tr_fixup_bundle_item(
\"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/Applications/${MAC_BUNDLE_NAME}.app\"
\"Contents/MacOS/${MAC_BUNDLE_NAME}\" \"${CMAKE_CURRENT_SOURCE_DIR}\")")

View File

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

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

View File

@ -1,154 +1,150 @@
project(trqt)
set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Generated Files")
set_property(GLOBAL PROPERTY AUTOMOC_SOURCE_GROUP "Generated Files")
set_property(GLOBAL PROPERTY AUTORCC_SOURCE_GROUP "Generated Files")
set_property(GLOBAL PROPERTY AUTOUIC_SOURCE_GROUP "Generated Files")
set(${PROJECT_NAME}_SOURCES
AboutDialog.cc
AddData.cc
Application.cc
ColumnResizer.cc
ComInteropHelper.cc
DBusInteropHelper.cc
DetailsDialog.cc
FaviconCache.cc
FileTreeDelegate.cc
FileTreeItem.cc
FileTreeModel.cc
FileTreeView.cc
FilterBar.cc
FilterBarComboBox.cc
FilterBarComboBoxDelegate.cc
Filters.cc
Formatter.cc
FreeSpaceLabel.cc
IconCache.cc
IconToolButton.cc
InteropHelper.cc
InteropObject.cc
LicenseDialog.cc
MainWindow.cc
MakeDialog.cc
OptionsDialog.cc
PathButton.cc
Prefs.cc
PrefsDialog.cc
RelocateDialog.cc
RpcClient.cc
RpcQueue.cc
Session.cc
SessionDialog.cc
SqueezeLabel.cc
StatsDialog.cc
StyleHelper.cc
Torrent.cc
TorrentDelegate.cc
TorrentDelegateMin.cc
TorrentFilter.cc
TorrentModel.cc
TorrentView.cc
TrackerDelegate.cc
TrackerModel.cc
TrackerModelFilter.cc
Utils.cc
VariantHelpers.cc
WatchDir.cc
)
add_executable(${TR_NAME}-qt WIN32)
if (NOT ENABLE_QT_COM_INTEROP)
set_source_files_properties(ComInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
if (NOT ENABLE_QT_DBUS_INTEROP)
set_source_files_properties(DBusInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON)
endif()
target_sources(${TR_NAME}-qt
PRIVATE
AboutDialog.cc
AboutDialog.h
AddData.cc
AddData.h
Application.cc
Application.h
BaseDialog.h
ColumnResizer.cc
ColumnResizer.h
ComInteropHelper.cc
ComInteropHelper.h
CustomVariantType.h
DBusInteropHelper.cc
DBusInteropHelper.h
DetailsDialog.cc
DetailsDialog.h
FaviconCache.cc
FaviconCache.h
FileTreeDelegate.cc
FileTreeDelegate.h
FileTreeItem.cc
FileTreeItem.h
FileTreeModel.cc
FileTreeModel.h
FileTreeView.cc
FileTreeView.h
FilterBar.cc
FilterBar.h
FilterBarComboBox.cc
FilterBarComboBox.h
FilterBarComboBoxDelegate.cc
FilterBarComboBoxDelegate.h
Filters.cc
Filters.h
Formatter.cc
Formatter.h
FreeSpaceLabel.cc
FreeSpaceLabel.h
IconCache.cc
IconCache.h
IconToolButton.cc
IconToolButton.h
InteropHelper.cc
InteropHelper.h
InteropObject.cc
InteropObject.h
LicenseDialog.cc
LicenseDialog.h
MainWindow.cc
MainWindow.h
MakeDialog.cc
MakeDialog.h
OptionsDialog.cc
OptionsDialog.h
PathButton.cc
PathButton.h
Prefs.cc
Prefs.h
PrefsDialog.cc
PrefsDialog.h
RelocateDialog.cc
RelocateDialog.h
RpcClient.cc
RpcClient.h
RpcQueue.cc
RpcQueue.h
Session.cc
Session.h
SessionDialog.cc
SessionDialog.h
Speed.h
SqueezeLabel.cc
SqueezeLabel.h
StatsDialog.cc
StatsDialog.h
StyleHelper.cc
StyleHelper.h
Torrent.cc
Torrent.h
TorrentDelegate.cc
TorrentDelegate.h
TorrentDelegateMin.cc
TorrentDelegateMin.h
TorrentFilter.cc
TorrentFilter.h
TorrentModel.cc
TorrentModel.h
TorrentView.cc
TorrentView.h
TrackerDelegate.cc
TrackerDelegate.h
TrackerModel.cc
TrackerModel.h
TrackerModelFilter.cc
TrackerModelFilter.h
Typedefs.h
Utils.cc
Utils.h
VariantHelpers.cc
VariantHelpers.h
WatchDir.cc
WatchDir.h)
set(${PROJECT_NAME}_HEADERS
AboutDialog.h
AddData.h
Application.h
BaseDialog.h
ColumnResizer.h
ComInteropHelper.h
CustomVariantType.h
DBusInteropHelper.h
DetailsDialog.h
FaviconCache.h
FileTreeDelegate.h
FileTreeItem.h
FileTreeModel.h
FileTreeView.h
FilterBar.h
FilterBarComboBox.h
FilterBarComboBoxDelegate.h
Filters.h
Formatter.h
FreeSpaceLabel.h
IconCache.h
IconToolButton.h
InteropHelper.h
InteropObject.h
LicenseDialog.h
MainWindow.h
MakeDialog.h
OptionsDialog.h
PathButton.h
Prefs.h
PrefsDialog.h
RelocateDialog.h
RpcClient.h
RpcQueue.h
Session.h
SessionDialog.h
Speed.h
SqueezeLabel.h
StatsDialog.h
StyleHelper.h
Torrent.h
TorrentDelegate.h
TorrentDelegateMin.h
TorrentFilter.h
TorrentModel.h
TorrentView.h
TrackerDelegate.h
TrackerModel.h
TrackerModelFilter.h
Typedefs.h
Utils.h
VariantHelpers.h
WatchDir.h
)
tr_allow_compile_if(
[=[[ENABLE_QT_COM_INTEROP]]=]
ComInteropHelper.cc
[=[[ENABLE_QT_DBUS_INTEROP]]=]
DBusInteropHelper.cc)
set(${PROJECT_NAME}_UI_FILES
AboutDialog.ui
DetailsDialog.ui
LicenseDialog.ui
MainWindow.ui
MakeDialog.ui
MakeProgressDialog.ui
OptionsDialog.ui
PrefsDialog.ui
RelocateDialog.ui
SessionDialog.ui
StatsDialog.ui
TrackersDialog.ui
)
source_group(Ui FILES ${${PROJECT_NAME}_UI_FILES})
target_sources(${TR_NAME}-qt
PRIVATE
AboutDialog.ui
DetailsDialog.ui
LicenseDialog.ui
MainWindow.ui
MakeDialog.ui
MakeProgressDialog.ui
OptionsDialog.ui
PrefsDialog.ui
RelocateDialog.ui
SessionDialog.ui
StatsDialog.ui
TrackersDialog.ui)
tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES ${${PROJECT_NAME}_UI_FILES})
source_group("Generated Files" FILES ${${PROJECT_NAME}_UI_SOURCES})
source_group(Ui
REGULAR_EXPRESSION [[.*\.ui$]])
target_sources(${TR_NAME}-qt
PRIVATE
application.qrc)
set(${PROJECT_NAME}_QRC_FILES application.qrc)
if(WIN32 OR APPLE)
list(APPEND ${PROJECT_NAME}_QRC_FILES icons/Faenza/Faenza.qrc)
target_sources(${TR_NAME}-qt
PRIVATE
icons/Faenza/Faenza.qrc)
endif()
source_group(Resources FILES ${${PROJECT_NAME}_QRC_FILES})
tr_qt_add_resources(${PROJECT_NAME}_QRC_SOURCES ${${PROJECT_NAME}_QRC_FILES})
source_group("Generated Files" FILES ${${PROJECT_NAME}_QRC_SOURCES})
source_group(Resources
REGULAR_EXPRESSION [[.*\.qrc$]])
set(${PROJECT_NAME}_LINGUAS
set(LINGUAS
af
ca
da
@ -178,99 +174,99 @@ set(${PROJECT_NAME}_LINGUAS
sv
tr
uk
zh_CN
)
zh_CN)
if(ENABLE_NLS)
set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS})
set(ENABLED_LINGUAS ${LINGUAS})
else()
set(${PROJECT_NAME}_ENABLED_LINGUAS)
set(ENABLED_LINGUAS)
endif()
set(${PROJECT_NAME}_TS_FILES)
foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS})
list(APPEND ${PROJECT_NAME}_TS_FILES translations/transmission_${LANG}.ts)
set(TS_FILES)
foreach(LANG ${ENABLED_LINGUAS})
list(APPEND TS_FILES translations/transmission_${LANG}.ts)
endforeach()
if(${PROJECT_NAME}_TS_FILES)
tr_qt_add_translation(${PROJECT_NAME}_QM_FILES ${${PROJECT_NAME}_TS_FILES})
source_group("Generated Files" FILES ${${PROJECT_NAME}_QM_FILES})
if(TS_FILES)
tr_qt_add_translation(QM_FILES ${TS_FILES})
endif()
include_directories(
${CMAKE_SOURCE_DIR}
${PROJECT_SOURCE_DIR}
)
include_directories(
SYSTEM
${PROJECT_BINARY_DIR}
${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS}
)
tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE
"Transmission Qt Client"
"transmission-qt"
"transmission-qt.exe"
"qtr.ico")
target_sources(${TR_NAME}-qt
PRIVATE
${QM_FILES})
if(ENABLE_QT_COM_INTEROP)
add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb
COMMAND
${MIDL_EXECUTABLE} /tlb ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb transmission-qt.idl
DEPENDS
transmission-qt.idl
WORKING_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR}
)
list(APPEND ${PROJECT_NAME}_WIN32_RC_FILE transmission-qt.tlb.rc transmission-qt.idl ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb)
set_source_files_properties(transmission-qt.idl ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb PROPERTIES HEADER_FILE_ONLY ON)
tr_target_idl_files(${TR_NAME}-qt
transmission-qt.idl)
endif()
add_executable(${TR_NAME}-qt WIN32
${${PROJECT_NAME}_SOURCES}
${${PROJECT_NAME}_UI_SOURCES}
${${PROJECT_NAME}_QRC_SOURCES}
${${PROJECT_NAME}_HEADERS}
${${PROJECT_NAME}_QM_FILES}
${${PROJECT_NAME}_WIN32_RC_FILE}
)
target_include_directories(${TR_NAME}-qt
PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(${TR_NAME}-qt SYSTEM
PRIVATE
${CURL_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS})
target_link_libraries(${TR_NAME}-qt
${TR_NAME}
${QT_TARGETS}
${CURL_LIBRARIES}
${EVENT2_LIBRARIES}
)
PRIVATE
${TR_NAME}
${QT_TARGETS}
${CURL_LIBRARIES}
${EVENT2_LIBRARIES})
target_compile_definitions(${TR_NAME}-qt PRIVATE
"TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\""
QT_NO_CAST_FROM_ASCII
$<$<BOOL:${ENABLE_QT_COM_INTEROP}>:ENABLE_COM_INTEROP>
$<$<BOOL:${ENABLE_QT_DBUS_INTEROP}>:ENABLE_DBUS_INTEROP>)
target_compile_definitions(${TR_NAME}-qt
PRIVATE
"TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\""
QT_NO_CAST_FROM_ASCII
$<$<BOOL:${ENABLE_QT_COM_INTEROP}>:ENABLE_COM_INTEROP>
$<$<BOOL:${ENABLE_QT_DBUS_INTEROP}>:ENABLE_DBUS_INTEROP>)
if(MSVC)
tr_append_target_property(${TR_NAME}-qt LINK_FLAGS "/ENTRY:mainCRTStartup")
endif()
set_target_properties(${TR_NAME}-qt PROPERTIES AUTOMOC TRUE)
set_target_properties(
${TR_NAME}-qt
PROPERTIES
AUTOMOC ON
AUTORCC ON
AUTOUIC ON)
install(TARGETS ${TR_NAME}-qt DESTINATION ${CMAKE_INSTALL_BINDIR})
tr_win32_app_info(${TR_NAME}-qt
"Transmission Qt Client"
"transmission-qt"
"transmission-qt.exe"
"qtr.ico")
install(
TARGETS ${TR_NAME}-qt
DESTINATION ${CMAKE_INSTALL_BINDIR})
if(INSTALL_DOC)
install(FILES ${TR_NAME}-qt.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
install(
FILES ${TR_NAME}-qt.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
endif()
install(FILES transmission-qt.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(
FILES transmission-qt.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
if(ENABLE_NLS)
install(FILES ${${PROJECT_NAME}_QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${TR_NAME}/translations)
install(
FILES ${QM_FILES}
DESTINATION ${CMAKE_INSTALL_DATADIR}/${TR_NAME}/translations)
endif()
if(WIN32)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" CONTENT "")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf" DESTINATION ${CMAKE_INSTALL_SYSCONFDIR} RENAME qt.conf)
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf"
CONTENT "")
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/dist-qt.conf"
DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}
RENAME qt.conf)
endif()

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

View File

@ -1,5 +1,16 @@
add_library(gtestall STATIC
${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
${THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc)
add_library(gtestall STATIC)
set_property(TARGET gtestall PROPERTY FOLDER "third-party")
target_sources(gtestall
PRIVATE
${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
${THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc)
set_property(
TARGET gtestall
PROPERTY FOLDER "third-party")
target_include_directories(gtestall SYSTEM
PRIVATE
${THIRD_PARTY_DIR}/googletest/googletest
PUBLIC
${THIRD_PARTY_DIR}/googletest/googletest/include)

View File

@ -1,57 +1,62 @@
add_executable(libtransmission-test
announce-list-test.cc
announcer-test.cc
announcer-udp-test.cc
benc-test.cc
bitfield-test.cc
block-info-test.cc
blocklist-test.cc
buffer-test.cc
clients-test.cc
completion-test.cc
copy-test.cc
crypto-test-ref.h
crypto-test.cc
error-test.cc
dht-test.cc
file-piece-map-test.cc
file-test.cc
getopt-test.cc
handshake-test.cc
history-test.cc
json-test.cc
lpd-test.cc
magnet-metainfo-test.cc
makemeta-test.cc
move-test.cc
net-test.cc
open-files-test.cc
peer-mgr-active-requests-test.cc
peer-mgr-wishlist-test.cc
peer-msgs-test.cc
platform-test.cc
quark-test.cc
remove-test.cc
rename-test.cc
rpc-test.cc
session-test.cc
session-alt-speeds-test.cc
settings-test.cc
strbuf-test.cc
subprocess-test-script.cmd
subprocess-test.cc
test-fixtures.h
timer-test.cc
torrent-files-test.cc
torrent-magnet-test.cc
torrent-metainfo-test.cc
torrents-test.cc
utils-test.cc
variant-test.cc
watchdir-test.cc
web-utils-test.cc)
add_executable(libtransmission-test)
set_property(TARGET libtransmission-test PROPERTY FOLDER "tests")
target_sources(libtransmission-test
PRIVATE
announce-list-test.cc
announcer-test.cc
announcer-udp-test.cc
benc-test.cc
bitfield-test.cc
block-info-test.cc
blocklist-test.cc
buffer-test.cc
clients-test.cc
completion-test.cc
copy-test.cc
crypto-test-ref.h
crypto-test.cc
error-test.cc
dht-test.cc
file-piece-map-test.cc
file-test.cc
getopt-test.cc
handshake-test.cc
history-test.cc
json-test.cc
lpd-test.cc
magnet-metainfo-test.cc
makemeta-test.cc
move-test.cc
net-test.cc
open-files-test.cc
peer-mgr-active-requests-test.cc
peer-mgr-wishlist-test.cc
peer-msgs-test.cc
platform-test.cc
quark-test.cc
remove-test.cc
rename-test.cc
rpc-test.cc
session-test.cc
session-alt-speeds-test.cc
settings-test.cc
strbuf-test.cc
subprocess-test-script.cmd
subprocess-test.cc
test-fixtures.h
timer-test.cc
torrent-files-test.cc
torrent-magnet-test.cc
torrent-metainfo-test.cc
torrents-test.cc
utils-test.cc
variant-test.cc
watchdir-test.cc
web-utils-test.cc)
set_property(
TARGET libtransmission-test
PROPERTY FOLDER "tests")
target_compile_definitions(libtransmission-test
PRIVATE
@ -65,6 +70,7 @@ target_include_directories(libtransmission-test
target_include_directories(libtransmission-test SYSTEM
PRIVATE
${LIBFMT_INCLUDE_DIRS}
${WIDE_INTEGER_INCLUDE_DIRS}
${B64_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
@ -72,8 +78,7 @@ target_include_directories(libtransmission-test SYSTEM
${EVENT2_INCLUDE_DIRS})
target_compile_options(libtransmission-test
PRIVATE
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wno-sign-compare>) # patches welcomed
PRIVATE $<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wno-sign-compare>) # patches welcomed
target_link_libraries(libtransmission-test
PRIVATE
@ -88,14 +93,20 @@ add_custom_command(
TARGET libtransmission-test
PRE_BUILD
COMMAND
${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/subprocess-test-script.cmd
$<TARGET_FILE_DIR:libtransmission-test>/subprocess-test.cmd)
${CMAKE_COMMAND}
-E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/subprocess-test-script.cmd
$<TARGET_FILE_DIR:libtransmission-test>/subprocess-test.cmd)
add_executable(subprocess-test
subprocess-test-program.cc)
add_executable(subprocess-test)
set_property(TARGET subprocess-test PROPERTY FOLDER "tests")
target_sources(subprocess-test
PRIVATE
subprocess-test-program.cc)
set_property(
TARGET subprocess-test
PROPERTY FOLDER "tests")
target_include_directories(subprocess-test
PRIVATE

View File

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

View File

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

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)
tr_win32_app_info(${PROJECT_NAME}_${P}_WIN32_RC_FILE
add_executable(${TR_NAME}-${P})
target_sources(${TR_NAME}-${P}
PRIVATE
${P}.cc)
target_include_directories(${TR_NAME}-${P}
PRIVATE
${CMAKE_SOURCE_DIR})
target_include_directories(${TR_NAME}-${P} SYSTEM
PRIVATE
${LIBFMT_INCLUDE_DIRS}
${EVENT2_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS})
target_link_libraries(${TR_NAME}-${P}
PRIVATE
${TR_NAME}
${CURL_LIBRARIES})
tr_win32_app_info(${TR_NAME}-${P}
"Transmission Utility ('${P}')"
"${TR_NAME}-${P}"
"${TR_NAME}-${P}.exe")
add_executable(${TR_NAME}-${P} ${P}.cc ${${PROJECT_NAME}_${P}_WIN32_RC_FILE})
target_link_libraries(${TR_NAME}-${P} ${TR_NAME})
install(TARGETS ${TR_NAME}-${P} DESTINATION ${CMAKE_INSTALL_BINDIR})
install(
TARGETS ${TR_NAME}-${P}
DESTINATION ${CMAKE_INSTALL_BINDIR})
if(INSTALL_DOC)
install(FILES ${TR_NAME}-${P}.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
install(
FILES ${TR_NAME}-${P}.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
endif()
endforeach()

View File

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