2021-11-03 05:13:44 +00:00
|
|
|
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
|
|
|
|
|
|
|
|
# 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(CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "")
|
|
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10")
|
|
|
|
endif()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
project(transmission)
|
|
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
|
|
|
|
|
2016-09-10 17:08:58 +00:00
|
|
|
set(CMAKE_MACOSX_RPATH ON)
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
include(CheckIncludeFile)
|
|
|
|
include(CheckIncludeFiles)
|
|
|
|
include(CheckFunctionExists)
|
|
|
|
include(CheckLibraryExists)
|
|
|
|
include(ExternalProject)
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
include(TrMacros)
|
|
|
|
|
|
|
|
option(ENABLE_DAEMON "Build daemon" ON)
|
|
|
|
tr_auto_option(ENABLE_GTK "Build GTK+ client" AUTO)
|
|
|
|
tr_auto_option(ENABLE_QT "Build Qt client" AUTO)
|
2016-09-10 17:08:58 +00:00
|
|
|
tr_auto_option(ENABLE_MAC "Build Mac client" AUTO)
|
2020-10-24 01:04:25 +00:00
|
|
|
option(ENABLE_WEB "Build Web client" OFF)
|
2014-12-01 19:55:22 +00:00
|
|
|
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_NLS "Enable native language support" ON)
|
|
|
|
option(INSTALL_DOC "Build/install documentation" ON)
|
|
|
|
option(INSTALL_LIB "Install the library" OFF)
|
2021-09-12 19:36:51 +00:00
|
|
|
tr_auto_option(RUN_CLANG_TIDY "Run clang-tidy on the code" AUTO)
|
2014-12-01 19:55:22 +00:00
|
|
|
tr_auto_option(USE_SYSTEM_EVENT2 "Use system event2 library" AUTO)
|
2022-01-17 16:20:12 +00:00
|
|
|
tr_auto_option(USE_SYSTEM_DEFLATE "Use system deflate library" AUTO)
|
2014-12-01 19:55:22 +00:00
|
|
|
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)
|
2015-01-01 21:16:36 +00:00
|
|
|
tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO)
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
tr_auto_option(USE_QT_VERSION "Use specific Qt version" AUTO 5 6)
|
2021-10-24 18:19:57 +00:00
|
|
|
tr_list_option(WITH_CRYPTO "Use specified crypto library" AUTO openssl cyassl polarssl ccrypto)
|
2014-12-01 19:55:22 +00:00
|
|
|
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)
|
2016-11-27 19:17:07 +00:00
|
|
|
tr_auto_option(WITH_LIBAPPINDICATOR "Use libappindicator in GTK+ client" AUTO)
|
2014-12-01 19:55:22 +00:00
|
|
|
tr_auto_option(WITH_SYSTEMD "Add support for systemd startup notification (on systems that support it)" AUTO)
|
|
|
|
|
|
|
|
set(TR_NAME ${PROJECT_NAME})
|
|
|
|
|
|
|
|
# convention: -TR MAJOR MINOR MAINT STATUS - (each a single char)
|
|
|
|
# STATUS: "X" for prerelease beta builds,
|
|
|
|
# "Z" for unsupported trunk builds,
|
|
|
|
# "0" for stable, supported releases
|
|
|
|
# these should be the only two lines you need to change
|
2020-05-16 00:38:43 +00:00
|
|
|
set(TR_USER_AGENT_PREFIX "3.00+")
|
|
|
|
set(TR_PEER_ID_PREFIX "-TR300Z-")
|
2014-12-01 19:55:22 +00:00
|
|
|
|
|
|
|
string(REGEX MATCH "^([0-9]+)\\.([0-9]+).*" TR_VERSION "${TR_USER_AGENT_PREFIX}")
|
|
|
|
set(TR_VERSION_MAJOR "${CMAKE_MATCH_1}")
|
|
|
|
set(TR_VERSION_MINOR "${CMAKE_MATCH_2}")
|
|
|
|
|
|
|
|
if(TR_PEER_ID_PREFIX MATCHES "X-$")
|
|
|
|
set(TR_BETA_RELEASE 1)
|
|
|
|
elseif(TR_PEER_ID_PREFIX MATCHES "Z-$")
|
|
|
|
set(TR_NIGHTLY_RELEASE 1)
|
|
|
|
else()
|
|
|
|
set(TR_STABLE_RELEASE 1)
|
|
|
|
endif()
|
|
|
|
|
2016-09-02 19:02:51 +00:00
|
|
|
set(TR_VCS_REVISION_FILE "${CMAKE_SOURCE_DIR}/REVISION")
|
2015-04-24 19:14:56 +00:00
|
|
|
|
2020-10-13 00:15:19 +00:00
|
|
|
if(EXISTS ${CMAKE_SOURCE_DIR}/.git)
|
2020-09-14 02:41:32 +00:00
|
|
|
find_package(Git)
|
|
|
|
endif()
|
|
|
|
|
2017-01-14 21:54:56 +00:00
|
|
|
if(NOT "$ENV{JENKINS_URL}" STREQUAL "" AND NOT "$ENV{GIT_COMMIT}" STREQUAL "")
|
|
|
|
set(TR_VCS_REVISION "$ENV{GIT_COMMIT}")
|
|
|
|
elseif(NOT "$ENV{TEAMCITY_PROJECT_NAME}" STREQUAL "" AND NOT "$ENV{BUILD_VCS_NUMBER}" STREQUAL "")
|
|
|
|
set(TR_VCS_REVISION "$ENV{BUILD_VCS_NUMBER}")
|
2020-09-14 02:41:32 +00:00
|
|
|
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
|
|
|
|
)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
2016-09-02 19:02:51 +00:00
|
|
|
if("${TR_VCS_REVISION}" STREQUAL "" AND EXISTS "${TR_VCS_REVISION_FILE}")
|
|
|
|
file(READ "${TR_VCS_REVISION_FILE}" TR_VCS_REVISION)
|
2015-04-24 19:14:56 +00:00
|
|
|
endif()
|
|
|
|
|
2017-01-14 21:54:56 +00:00
|
|
|
string(STRIP "${TR_VCS_REVISION}" TR_VCS_REVISION)
|
|
|
|
|
2016-09-02 19:45:03 +00:00
|
|
|
if(NOT "${TR_VCS_REVISION}" STREQUAL "")
|
2017-01-14 21:54:56 +00:00
|
|
|
file(WRITE "${TR_VCS_REVISION_FILE}" "${TR_VCS_REVISION}\n")
|
2015-04-24 19:14:56 +00:00
|
|
|
else()
|
2016-09-02 19:45:03 +00:00
|
|
|
set(TR_VCS_REVISION 0)
|
|
|
|
file(REMOVE "${TR_VCS_REVISION_FILE}")
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
2017-01-14 21:54:56 +00:00
|
|
|
string(SUBSTRING "${TR_VCS_REVISION}" 0 10 TR_VCS_REVISION)
|
|
|
|
|
2015-04-14 22:46:40 +00:00
|
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
|
2020-07-29 02:38:27 +00:00
|
|
|
set(CURL_MINIMUM 7.28.0)
|
2015-01-07 02:04:08 +00:00
|
|
|
set(CYASSL_MINIMUM 3.0)
|
2022-01-17 16:20:12 +00:00
|
|
|
set(DEFLATE_MINIMUM 1.9)
|
2022-01-28 23:56:46 +00:00
|
|
|
set(EVENT2_MINIMUM 2.1.0)
|
2014-12-01 19:55:22 +00:00
|
|
|
set(GIO_MINIMUM 2.26.0)
|
2022-01-17 16:20:12 +00:00
|
|
|
set(GLIB_MINIMUM 2.50.1)
|
|
|
|
set(GTK_MINIMUM 3.24.0)
|
2014-12-01 19:55:22 +00:00
|
|
|
set(LIBAPPINDICATOR_MINIMUM 0.4.90)
|
2022-01-17 16:20:12 +00:00
|
|
|
set(OPENSSL_MINIMUM 0.9.7)
|
|
|
|
set(POLARSSL_MINIMUM 1.2)
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
set(QT_MINIMUM 5.6)
|
2022-01-17 16:20:12 +00:00
|
|
|
set(ZLIB_MINIMUM 1.2.3)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
|
|
|
if(WIN32)
|
|
|
|
foreach(L C CXX)
|
2020-08-11 18:11:55 +00:00
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -DWIN32")
|
2014-12-01 19:55:22 +00:00
|
|
|
# Target version (Vista and up)
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -DWINVER=0x0600 -D_WIN32_WINNT=0x0600")
|
|
|
|
# Use Unicode API (although we always use W or A names explicitly)
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -DUNICODE -D_UNICODE")
|
|
|
|
# Ignore various deprecation and security warnings (at least for now)
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS")
|
|
|
|
# Increase maximum FD_SET size
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -DFD_SETSIZE=1024")
|
|
|
|
if(MSVC)
|
|
|
|
# Reduce noise (at least for now)
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} /wd4244 /wd4267")
|
|
|
|
endif()
|
2015-12-31 12:41:17 +00:00
|
|
|
|
|
|
|
if(MINGW)
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -D__USE_MINGW_ANSI_STDIO=1")
|
|
|
|
endif()
|
2014-12-01 19:55:22 +00:00
|
|
|
endforeach()
|
|
|
|
endif()
|
|
|
|
|
2021-11-30 21:13:56 +00:00
|
|
|
find_package(UtfCpp)
|
2014-12-01 19:55:22 +00:00
|
|
|
find_package(Threads)
|
|
|
|
find_package(PkgConfig QUIET)
|
|
|
|
|
|
|
|
find_package(CURL ${CURL_MINIMUM} REQUIRED)
|
2020-08-18 06:56:50 +00:00
|
|
|
if(TARGET CURL::libcurl)
|
|
|
|
set(CURL_LIBRARIES CURL::libcurl)
|
|
|
|
set(CURL_INCLUDE_DIRS)
|
|
|
|
endif()
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2016-02-07 11:54:01 +00:00
|
|
|
find_package(ICONV)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2017-02-23 20:18:45 +00:00
|
|
|
set(CRYPTO_PKG "")
|
2021-10-24 18:19:57 +00:00
|
|
|
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})
|
|
|
|
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")
|
|
|
|
set(CRYPTO_PKG "ccrypto")
|
|
|
|
set(CRYPTO_INCLUDE_DIRS)
|
|
|
|
set(CRYPTO_LIBRARIES)
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-01-07 02:04:08 +00:00
|
|
|
if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "openssl")
|
|
|
|
tr_get_required_flag(WITH_CRYPTO OPENSSL_IS_REQUIRED)
|
|
|
|
find_package(OpenSSL ${OPENSSL_MINIMUM} ${OPENSSL_IS_REQUIRED})
|
|
|
|
tr_fixup_list_option(WITH_CRYPTO "openssl" OPENSSL_FOUND "AUTO" OPENSSL_IS_REQUIRED)
|
|
|
|
if(WITH_CRYPTO STREQUAL "openssl")
|
|
|
|
set(CRYPTO_PKG "openssl")
|
|
|
|
set(CRYPTO_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
|
|
|
|
set(CRYPTO_LIBRARIES ${OPENSSL_LIBRARIES})
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "cyassl")
|
|
|
|
tr_get_required_flag(WITH_CRYPTO CYASSL_IS_REQUIRED)
|
|
|
|
find_package(CyaSSL ${CYASSL_MINIMUM} ${CYASSL_IS_REQUIRED})
|
|
|
|
tr_fixup_list_option(WITH_CRYPTO "cyassl" CYASSL_FOUND "AUTO" CYASSL_IS_REQUIRED)
|
|
|
|
if(WITH_CRYPTO STREQUAL "cyassl")
|
|
|
|
set(CRYPTO_PKG "cyassl")
|
|
|
|
set(CRYPTO_INCLUDE_DIRS ${CYASSL_INCLUDE_DIRS})
|
|
|
|
set(CRYPTO_LIBRARIES ${CYASSL_LIBRARIES})
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-01-07 13:19:00 +00:00
|
|
|
if(WITH_CRYPTO STREQUAL "AUTO" OR WITH_CRYPTO STREQUAL "polarssl")
|
|
|
|
tr_get_required_flag(WITH_CRYPTO POLARSSL_IS_REQUIRED)
|
|
|
|
find_package(PolarSSL ${POLARSSL_MINIMUM} ${POLARSSL_IS_REQUIRED})
|
|
|
|
tr_fixup_list_option(WITH_CRYPTO "polarssl" POLARSSL_FOUND "AUTO" POLARSSL_IS_REQUIRED)
|
|
|
|
if(WITH_CRYPTO STREQUAL "polarssl")
|
|
|
|
set(CRYPTO_PKG "polarssl")
|
|
|
|
set(CRYPTO_INCLUDE_DIRS ${POLARSSL_INCLUDE_DIRS})
|
|
|
|
set(CRYPTO_LIBRARIES ${POLARSSL_LIBRARIES})
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-01-07 02:04:08 +00:00
|
|
|
# We should have found the library by now
|
|
|
|
if(CRYPTO_PKG STREQUAL "")
|
|
|
|
if(WITH_CRYPTO STREQUAL "AUTO")
|
|
|
|
message(FATAL_ERROR "Unable to find any supported crypto library.")
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Requested crypto library '${WITH_CRYPTO}' is not supported.")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
if(ENABLE_GTK)
|
|
|
|
tr_get_required_flag(ENABLE_GTK GTK_IS_REQUIRED)
|
|
|
|
|
|
|
|
pkg_check_modules(GTK ${GTK_IS_REQUIRED}
|
2021-10-18 20:22:31 +00:00
|
|
|
gtkmm-3.0>=${GTK_MINIMUM}
|
|
|
|
glibmm-2.4>=${GLIB_MINIMUM}
|
|
|
|
giomm-2.4>=${GIO_MINIMUM})
|
2014-12-01 19:55:22 +00:00
|
|
|
|
|
|
|
tr_fixup_auto_option(ENABLE_GTK GTK_FOUND GTK_IS_REQUIRED)
|
|
|
|
|
2016-11-27 19:17:07 +00:00
|
|
|
if(ENABLE_GTK AND WITH_LIBAPPINDICATOR)
|
|
|
|
tr_get_required_flag(WITH_LIBAPPINDICATOR LIBAPPINDICATOR_IS_REQUIRED)
|
2014-12-01 19:55:22 +00:00
|
|
|
pkg_check_modules(LIBAPPINDICATOR appindicator3-0.1>=${LIBAPPINDICATOR_MINIMUM})
|
2016-11-27 19:17:07 +00:00
|
|
|
tr_fixup_auto_option(WITH_LIBAPPINDICATOR LIBAPPINDICATOR_FOUND LIBAPPINDICATOR_IS_REQUIRED)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
2016-11-27 19:17:07 +00:00
|
|
|
else()
|
|
|
|
set(WITH_LIBAPPINDICATOR OFF)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
|
|
|
if(ENABLE_QT)
|
|
|
|
tr_get_required_flag(ENABLE_QT QT_IS_REQUIRED)
|
|
|
|
|
|
|
|
if(POLICY CMP0020)
|
|
|
|
cmake_policy(SET CMP0020 NEW)
|
|
|
|
endif()
|
|
|
|
|
2015-12-16 18:46:06 +00:00
|
|
|
set(QT_TARGETS)
|
2015-12-17 18:10:43 +00:00
|
|
|
set(ENABLE_QT_COM_INTEROP OFF)
|
|
|
|
set(ENABLE_QT_DBUS_INTEROP OFF)
|
|
|
|
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
set(QT_REQUIRED_MODULES Core Gui Widgets Network LinguistTools)
|
|
|
|
set(QT_OPTIONAL_MODULES DBus AxContainer AxServer)
|
|
|
|
set(MISSING_QT_MODULE)
|
2017-02-11 10:24:42 +00:00
|
|
|
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
set(Qt_NAMES Qt6 Qt5)
|
|
|
|
if(NOT USE_QT_VERSION STREQUAL "AUTO")
|
|
|
|
set(Qt_NAMES Qt${USE_QT_VERSION})
|
2017-02-11 17:48:13 +00:00
|
|
|
endif()
|
|
|
|
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
find_package(Qt NAMES ${Qt_NAMES} ${QT_MINIMUM} QUIET)
|
|
|
|
if(Qt_FOUND)
|
|
|
|
if(WIN32 AND Qt_VERSION_MAJOR EQUAL 5)
|
|
|
|
list(APPEND QT_REQUIRED_MODULES WinExtras)
|
2015-12-16 20:01:03 +00:00
|
|
|
endif()
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
|
|
|
|
foreach(M ${QT_REQUIRED_MODULES})
|
|
|
|
find_package(Qt${Qt_VERSION_MAJOR}${M} ${QT_MINIMUM} QUIET)
|
|
|
|
if(Qt${Qt_VERSION_MAJOR}${M}_FOUND)
|
|
|
|
if(NOT M STREQUAL "LinguistTools")
|
|
|
|
list(APPEND QT_TARGETS Qt${Qt_VERSION_MAJOR}::${M})
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
set(QT_TARGETS)
|
|
|
|
set(MISSING_QT_MODULE "${M}")
|
|
|
|
break()
|
|
|
|
endif()
|
|
|
|
endforeach()
|
|
|
|
endif()
|
2017-02-11 10:24:42 +00:00
|
|
|
|
|
|
|
if(QT_TARGETS)
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
foreach(M ${QT_OPTIONAL_MODULES})
|
|
|
|
find_package(Qt${Qt_VERSION_MAJOR}${M} ${QT_MINIMUM} QUIET)
|
|
|
|
if(Qt${Qt_VERSION_MAJOR}${M}_FOUND)
|
|
|
|
list(APPEND QT_TARGETS Qt${Qt_VERSION_MAJOR}::${M})
|
2015-12-16 18:46:06 +00:00
|
|
|
endif()
|
|
|
|
endforeach()
|
2017-02-11 10:24:42 +00:00
|
|
|
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
if(Qt${Qt_VERSION_MAJOR}AxContainer_FOUND AND Qt${Qt_VERSION_MAJOR}AxServer_FOUND)
|
2017-02-11 10:24:42 +00:00
|
|
|
set(ENABLE_QT_COM_INTEROP ON)
|
|
|
|
|
|
|
|
find_program(MIDL_EXECUTABLE midl)
|
|
|
|
if(NOT MIDL_EXECUTABLE)
|
|
|
|
set(ENABLE_QT_COM_INTEROP OFF)
|
2015-12-17 18:10:43 +00:00
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
if(Qt${Qt_VERSION_MAJOR}DBus_FOUND)
|
2017-02-11 10:24:42 +00:00
|
|
|
set(ENABLE_QT_DBUS_INTEROP ON)
|
2015-12-16 20:01:03 +00:00
|
|
|
endif()
|
2015-12-16 18:46:06 +00:00
|
|
|
endif()
|
|
|
|
|
|
|
|
set(QT_FOUND ON)
|
2015-12-17 18:10:43 +00:00
|
|
|
if(NOT QT_TARGETS OR NOT (ENABLE_QT_COM_INTEROP OR ENABLE_QT_DBUS_INTEROP))
|
2015-12-16 18:46:06 +00:00
|
|
|
if(QT_IS_REQUIRED)
|
Qt 6 support (#2069)
* Bump minimum Qt version to 5.6
* Switch from QRegExp to QRegularExpression
While still available, QRegExp has been moved to Qt6::Core5Compat module
and is not part of Qt6::Core.
* Use qIsEffectiveTLD instead of QUrl::topLevelDomain
The latter is not part of Qt6::Core. The former is a private utility in
Qt6::Network; using it for now, until (and if) we switch to something
non-Qt-specific.
* Use QStyle::State_Horizontal state when drawing progress bars
Although available for a long time, this state either didn't apply to
progress bars before Qt 6, or was deduced based on bar size. With Qt 6,
failing to specify it results in bad rendering.
* Don't use QStringRef (and associated methods)
While still available, QStringRef has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core. Related method (e.g.
QString::midRef) have been removed in Qt 6.
* Use Qt::ItemIsAutoTristate instead of Qt::ItemIsTristate
The latter was deprecated and replaced with the former in Qt 5.6.
* Don't use QApplication::globalStrut
This property has been deprecated in Qt 5.15 and removed in Qt 6.
* Use QImage::fromHICON instead of QtWin::fromHICON
WinExtras module (providind the latter helper) has been removed in Qt 6.
* Use QStringDecoder instead of QTextCodec
While still available, QTextCodec has been moved to Qt6::Core5Compat
module and is not part of Qt6::Core.
* Don't forward-declare QStringList
Instead of being a standalone class, its definition has changed to
QList<QString> template specialization in Qt 6.
* Use explicit (since Qt 6) QFileInfo constructor
* Use QDateTime's {to,from}SecsSinceEpoch instead of {to,from}Time_t
The latter was deprecated in Qt 5.8 and removed in Qt 6.
* Don't use QFuture<>'s operator==
It has been removed in Qt 6. Since the original issue this code was
solving was caused by future reuse, just don't reuse futures and create
new finished ones when necessary.
* Use std::vector<> instead of QVector<>
The latter has been changed to a typedef for QList<>, which might not be
what one wants, and which also changed behavior a bit leading to
compilation errors.
* Don't use + for flags, cast to int explicitly
Operator+ for enum values has been deleted in Qt 6, so using operator|
instead. Then, there's no conversion from QFlags<> to QVariant, so need
to cast to int.
* Support Qt 6 in CMake and for MSI packaging
* Remove extra (empty) CMake variable use when constructing Qt target names
* Simplify logic in tr_qt_add_translation CMake helper
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2021-11-03 21:20:11 +00:00
|
|
|
message(FATAL_ERROR "Unable to find required Qt libraries (Qt${Qt_VERSION_MAJOR}${MISSING_QT_MODULE})")
|
2015-12-16 18:46:06 +00:00
|
|
|
endif()
|
|
|
|
set(QT_FOUND OFF)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
|
|
|
tr_fixup_auto_option(ENABLE_QT QT_FOUND QT_IS_REQUIRED)
|
|
|
|
endif()
|
|
|
|
|
2016-09-10 17:08:58 +00:00
|
|
|
if(ENABLE_MAC)
|
|
|
|
tr_get_required_flag(ENABLE_MAC MAC_IS_REQUIRED)
|
|
|
|
|
|
|
|
if(APPLE)
|
|
|
|
set(MAC_FOUND ON)
|
|
|
|
else()
|
|
|
|
set(MAC_FOUND OFF)
|
|
|
|
if(MAC_IS_REQUIRED)
|
|
|
|
message(SEND_ERROR "Mac build is impossible on non-Mac system.")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
tr_fixup_auto_option(ENABLE_MAC MAC_FOUND MAC_IS_REQUIRED)
|
|
|
|
endif()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
find_package(ZLIB ${ZLIB_MINIMUM})
|
|
|
|
if(ZLIB_FOUND)
|
|
|
|
add_definitions(-DHAVE_ZLIB)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
set(THIRD_PARTY_DIR ${CMAKE_SOURCE_DIR}/third-party)
|
|
|
|
|
2022-01-17 16:20:12 +00:00
|
|
|
tr_add_external_auto_library(DEFLATE libdeflate deflate)
|
|
|
|
if(NOT USE_SYSTEM_DEFLATE)
|
|
|
|
set(DEFLATE_VERSION 1.9)
|
|
|
|
endif()
|
|
|
|
|
2021-10-25 08:14:04 +00:00
|
|
|
tr_add_external_auto_library(EVENT2 libevent event
|
|
|
|
CMAKE_ARGS
|
|
|
|
-DEVENT__DISABLE_OPENSSL:BOOL=ON
|
|
|
|
-DEVENT__DISABLE_BENCHMARK:BOOL=ON
|
|
|
|
-DEVENT__DISABLE_TESTS:BOOL=ON
|
|
|
|
-DEVENT__DISABLE_REGRESS:BOOL=ON
|
|
|
|
-DEVENT__DISABLE_SAMPLES:BOOL=ON
|
|
|
|
-DEVENT__LIBRARY_TYPE:STRING=STATIC)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2017-01-01 18:40:11 +00:00
|
|
|
tr_add_external_auto_library(NATPMP libnatpmp natpmp)
|
2014-12-01 19:55:22 +00:00
|
|
|
if(NOT USE_SYSTEM_NATPMP)
|
|
|
|
set(NATPMP_DEFINITIONS -DNATPMP_STATICLIB)
|
|
|
|
endif()
|
|
|
|
|
2017-01-01 18:40:11 +00:00
|
|
|
tr_add_external_auto_library(MINIUPNPC miniupnpc miniupnpc
|
2014-12-01 19:55:22 +00:00
|
|
|
CMAKE_ARGS
|
|
|
|
-DUPNPC_BUILD_STATIC=ON
|
|
|
|
-DUPNPC_BUILD_SHARED=OFF
|
|
|
|
-DUPNPC_BUILD_TESTS=OFF)
|
|
|
|
set(MINIUPNPC_DEFINITIONS -DSYSTEM_MINIUPNP)
|
|
|
|
if(NOT USE_SYSTEM_MINIUPNPC)
|
|
|
|
list(APPEND MINIUPNPC_DEFINITIONS -DMINIUPNP_STATICLIB)
|
|
|
|
set(MINIUPNPC_VERSION 1.9)
|
2015-04-21 13:56:17 +00:00
|
|
|
set(MINIUPNPC_API_VERSION 12)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
2017-01-01 18:40:11 +00:00
|
|
|
tr_add_external_auto_library(DHT dht dht)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
|
|
|
if(ENABLE_UTP)
|
2017-01-01 18:40:11 +00:00
|
|
|
tr_add_external_auto_library(UTP libutp utp)
|
2017-05-20 10:04:49 +00:00
|
|
|
|
|
|
|
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(UTP_LIBRARIES UTP::UTP)
|
|
|
|
endif()
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
2017-01-01 18:40:11 +00:00
|
|
|
tr_add_external_auto_library(B64 libb64 b64)
|
2015-01-01 21:16:36 +00:00
|
|
|
|
2021-09-12 03:47:29 +00:00
|
|
|
add_subdirectory(third-party/arc4)
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
if(WITH_INOTIFY)
|
|
|
|
tr_get_required_flag(WITH_INOTIFY INOTIFY_IS_REQUIRED)
|
|
|
|
|
|
|
|
set(INOTIFY_FOUND OFF)
|
|
|
|
check_include_file(sys/inotify.h HAVE_SYS_INOTIFY_H)
|
|
|
|
check_function_exists(inotify_init HAVE_INOTIFY_INIT)
|
|
|
|
if(HAVE_SYS_INOTIFY_H AND HAVE_INOTIFY_INIT)
|
|
|
|
set(INOTIFY_FOUND ON)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
tr_fixup_auto_option(WITH_INOTIFY INOTIFY_FOUND INOTIFY_IS_REQUIRED)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(WITH_KQUEUE)
|
|
|
|
tr_get_required_flag(WITH_KQUEUE KQUEUE_IS_REQUIRED)
|
|
|
|
|
|
|
|
set(KQUEUE_FOUND OFF)
|
|
|
|
check_include_files("sys/types.h;sys/event.h" HAVE_SYS_EVENT_H)
|
|
|
|
check_function_exists(kqueue HAVE_KQUEUE)
|
|
|
|
if(HAVE_SYS_EVENT_H AND HAVE_KQUEUE)
|
|
|
|
set(KQUEUE_FOUND ON)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
tr_fixup_auto_option(WITH_KQUEUE KQUEUE_FOUND KQUEUE_IS_REQUIRED)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(WITH_SYSTEMD)
|
|
|
|
tr_get_required_flag(WITH_SYSTEMD SYSTEMD_IS_REQUIRED)
|
2016-12-19 02:53:19 +00:00
|
|
|
find_package(SYSTEMD)
|
2016-04-23 16:13:25 +00:00
|
|
|
tr_fixup_auto_option(WITH_SYSTEMD SYSTEMD_FOUND SYSTEMD_IS_REQUIRED)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
|
|
|
include_directories(${CMAKE_BINARY_DIR})
|
|
|
|
|
2015-04-23 21:32:00 +00:00
|
|
|
if(WIN32)
|
|
|
|
foreach(L C CXX)
|
|
|
|
# Filter out needless definitions
|
|
|
|
set(CMAKE_${L}_FLAGS "${CMAKE_${L}_FLAGS} -DWIN32_LEAN_AND_MEAN -DNOMINMAX")
|
|
|
|
endforeach()
|
|
|
|
endif()
|
|
|
|
|
2020-08-11 18:11:55 +00:00
|
|
|
## Compiler standard version
|
|
|
|
|
2021-11-03 05:13:44 +00:00
|
|
|
set(CMAKE_C_STANDARD 11)
|
|
|
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2020-08-11 18:11:55 +00:00
|
|
|
### Compiler Warnings
|
|
|
|
|
|
|
|
set(C_WARNING_FLAGS)
|
|
|
|
set(CXX_WARNING_FLAGS)
|
|
|
|
|
|
|
|
include(CheckCCompilerFlag)
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
if(MSVC)
|
|
|
|
set(WARNING_CANDIDATES
|
|
|
|
/W4)
|
2020-08-11 18:11:55 +00:00
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
foreach(FLAG ${WARNING_CANDIDATES})
|
|
|
|
list(APPEND C_WARNING_FLAGS ${FLAG})
|
|
|
|
list(APPEND CXX_WARNING_FLAGS ${FLAG})
|
|
|
|
endforeach()
|
|
|
|
else()
|
|
|
|
set(WARNING_CANDIDATES
|
|
|
|
-W
|
|
|
|
-Wall
|
|
|
|
-Wextra
|
|
|
|
-Wcast-align
|
|
|
|
-Wduplicated-cond
|
|
|
|
-Wexit-time-destructors
|
|
|
|
-Wextra-semi
|
|
|
|
-Wextra-semi-stmt
|
|
|
|
-Wextra-tokens
|
|
|
|
-Wfloat-equal
|
|
|
|
-Wgnu
|
|
|
|
-Winit-self
|
|
|
|
-Wint-in-bool-context
|
|
|
|
-Wlogical-op
|
|
|
|
-Wmissing-format-attribute
|
|
|
|
-Wnull-dereference
|
|
|
|
-Wpointer-arith
|
|
|
|
-Wredundant-decls
|
|
|
|
-Wredundant-move
|
|
|
|
-Wreorder-ctor
|
|
|
|
-Wrestrict
|
|
|
|
-Wreturn-std-move
|
|
|
|
-Wself-assign
|
|
|
|
-Wself-move
|
|
|
|
-Wsemicolon-before-method-body
|
|
|
|
-Wsentinel
|
|
|
|
-Wshadow
|
|
|
|
-Wsign-compare
|
|
|
|
-Wsometimes-uninitialized
|
|
|
|
-Wstring-conversion
|
|
|
|
-Wsuggest-destructor-override
|
|
|
|
-Wsuggest-override
|
|
|
|
-Wuninitialized
|
|
|
|
-Wunreachable-code
|
|
|
|
-Wunused
|
|
|
|
-Wunused-const-variable
|
|
|
|
-Wunused-parameter
|
|
|
|
-Wunused-result
|
|
|
|
-Wwrite-strings)
|
|
|
|
|
|
|
|
if(MINGW)
|
|
|
|
# Disable excessive warnings since we're using __USE_MINGW_ANSI_STDIO
|
|
|
|
# Hopefully, any potential issues will be spotted on other platforms
|
|
|
|
list(APPEND WARNING_CANDIDATES -Wno-format)
|
|
|
|
else()
|
|
|
|
list(APPEND WARNING_CANDIDATES -Wformat-security)
|
2020-08-18 07:37:39 +00:00
|
|
|
endif()
|
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
set(CMAKE_REQUIRED_FLAGS)
|
2020-08-11 18:11:55 +00:00
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
foreach(FLAG -Werror /WX)
|
|
|
|
tr_make_id("${FLAG}" FLAG_ID)
|
|
|
|
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})
|
|
|
|
# Make sure the next loop only adds flags that are relevant for a particular language
|
|
|
|
set(CMAKE_REQUIRED_FLAGS ${FLAG})
|
|
|
|
break()
|
|
|
|
endif()
|
|
|
|
endforeach()
|
2014-12-11 05:11:02 +00:00
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
foreach(FLAG ${WARNING_CANDIDATES})
|
|
|
|
tr_make_id("${FLAG}" FLAG_ID)
|
2016-01-09 18:24:43 +00:00
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
# if available, add to C warnings
|
|
|
|
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})
|
|
|
|
list(APPEND C_WARNING_FLAGS ${FLAG})
|
|
|
|
endif()
|
2020-08-11 18:11:55 +00:00
|
|
|
|
2020-08-18 07:54:25 +00:00
|
|
|
# if available, add to CXX warnings
|
|
|
|
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})
|
|
|
|
list(APPEND CXX_WARNING_FLAGS ${FLAG})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
unset(CACHE_ID)
|
|
|
|
unset(FLAG_ID)
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
unset(CMAKE_REQUIRED_FLAGS)
|
|
|
|
endif()
|
2020-08-11 18:11:55 +00:00
|
|
|
|
|
|
|
###
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2015-03-10 22:31:09 +00:00
|
|
|
include(LargeFileSupport)
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
set(NEEDED_HEADERS
|
|
|
|
sys/statvfs.h
|
2015-06-01 05:25:14 +00:00
|
|
|
xfs/xfs.h
|
|
|
|
xlocale.h)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2014-12-20 22:28:43 +00:00
|
|
|
if(ENABLE_NLS)
|
|
|
|
list(APPEND NEEDED_HEADERS libintl.h)
|
|
|
|
endif()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
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
|
2015-06-01 18:52:14 +00:00
|
|
|
_configthreadlocale
|
2014-12-06 16:28:53 +00:00
|
|
|
canonicalize_file_name
|
Add in-kernel file copying for several platforms. (#1092)
* Add in-kernel copying support for Linux (sendfile64(2), copy_file_range(2)), FreeBSD 13 (copy_file_range(2)), MacOS (copyfile(2)), and Windows (CopyFileExA).
* Fix macro name USE_COPY_FILE_RANGE.
* Minor bugfixes for userspace fallback.
* Fix linux sendfile64 bugs.
* Remove some overzealous asserts.
* Allow transmission-test-copy to take an optional argument for an external reference file.
* Fix return value error of tr_sys_path_copy.
* Use COPYFILE_ALL for Macs without COPYFILE_CLONE.
* Add in-kernel file copying for several platforms.
Numerous operating systems now have support for copying files directly in the
kernel, which is generally more efficient than copying in a userspace read(2)/
write(2) loop. (This becomes particularly relevant for 4th gen PCI-E storage,
which approaches the latency of DRAM.) For Linux I use sendfile64(2), and, for
later kernels, copy_file_range(2). FreeBSD 13 will also support
copy_file_range(2). MacOS has copyfile(2), and Windows has CopyFileExA.
Operating systems lacking such a syscall continue to use the existing
read(2)/write(2) loop.
* Appease uncrustify.
* Appease uncrustify.
* copy-test: generate random content at run time.
* copy-test: Stylistic changes and more check()s.
* copy-test: files_are_identical should follow test idioms
* tr_sys_path_copy: numerous tweaks as requested by review.
* s/old file/source file; s/new file/destination file.
* tr_sys_path_copy: handle win32 wide characters in paths.
* Uncrustify.
* test-copy: Use non-string create_file_with_contents.
* tr_sys_path_copy: numerous fixes.
Per review: generate test file content at runtime; tidy use of check();
fix style; re-measure file sizes in the copy; define a macro when the
system does not provide it; use Unicode APIs on Windows; and fix
documentation.
* Updated as per comments.
* Rebase kernel-copy changes onto 3.0 with gtest.
* Undo irrelevant comment change.
* Fix syntax error.
* Use tr_malloc() instead of tr_valloc().
* Use EXPECT instead of TR_ASSERT in gtest.
* Add error handling.
* Acceptable coding style has changed again.
Now it's camelCase. Also use nullptr instead of NULL, etc.
* Fix east/west const.
Co-authored-by: Mike Gelfand <mikedld@users.noreply.github.com>
2021-08-07 09:04:03 +00:00
|
|
|
copy_file_range
|
|
|
|
copyfile
|
2014-12-01 19:55:22 +00:00
|
|
|
daemon
|
|
|
|
fallocate64
|
2019-07-13 19:53:04 +00:00
|
|
|
flock
|
2014-12-01 19:55:22 +00:00
|
|
|
getmntent
|
2020-09-11 21:07:45 +00:00
|
|
|
gmtime_r
|
|
|
|
gmtime_s
|
2014-12-01 19:55:22 +00:00
|
|
|
htonll
|
|
|
|
localtime_r
|
2020-09-11 21:07:45 +00:00
|
|
|
localtime_s
|
2014-12-01 19:55:22 +00:00
|
|
|
memmem
|
|
|
|
mkdtemp
|
|
|
|
ntohll
|
|
|
|
posix_fadvise
|
|
|
|
posix_fallocate
|
|
|
|
pread
|
|
|
|
pwrite
|
Add in-kernel file copying for several platforms. (#1092)
* Add in-kernel copying support for Linux (sendfile64(2), copy_file_range(2)), FreeBSD 13 (copy_file_range(2)), MacOS (copyfile(2)), and Windows (CopyFileExA).
* Fix macro name USE_COPY_FILE_RANGE.
* Minor bugfixes for userspace fallback.
* Fix linux sendfile64 bugs.
* Remove some overzealous asserts.
* Allow transmission-test-copy to take an optional argument for an external reference file.
* Fix return value error of tr_sys_path_copy.
* Use COPYFILE_ALL for Macs without COPYFILE_CLONE.
* Add in-kernel file copying for several platforms.
Numerous operating systems now have support for copying files directly in the
kernel, which is generally more efficient than copying in a userspace read(2)/
write(2) loop. (This becomes particularly relevant for 4th gen PCI-E storage,
which approaches the latency of DRAM.) For Linux I use sendfile64(2), and, for
later kernels, copy_file_range(2). FreeBSD 13 will also support
copy_file_range(2). MacOS has copyfile(2), and Windows has CopyFileExA.
Operating systems lacking such a syscall continue to use the existing
read(2)/write(2) loop.
* Appease uncrustify.
* Appease uncrustify.
* copy-test: generate random content at run time.
* copy-test: Stylistic changes and more check()s.
* copy-test: files_are_identical should follow test idioms
* tr_sys_path_copy: numerous tweaks as requested by review.
* s/old file/source file; s/new file/destination file.
* tr_sys_path_copy: handle win32 wide characters in paths.
* Uncrustify.
* test-copy: Use non-string create_file_with_contents.
* tr_sys_path_copy: numerous fixes.
Per review: generate test file content at runtime; tidy use of check();
fix style; re-measure file sizes in the copy; define a macro when the
system does not provide it; use Unicode APIs on Windows; and fix
documentation.
* Updated as per comments.
* Rebase kernel-copy changes onto 3.0 with gtest.
* Undo irrelevant comment change.
* Fix syntax error.
* Use tr_malloc() instead of tr_valloc().
* Use EXPECT instead of TR_ASSERT in gtest.
* Add error handling.
* Acceptable coding style has changed again.
Now it's camelCase. Also use nullptr instead of NULL, etc.
* Fix east/west const.
Co-authored-by: Mike Gelfand <mikedld@users.noreply.github.com>
2021-08-07 09:04:03 +00:00
|
|
|
sendfile64
|
2014-12-01 19:55:22 +00:00
|
|
|
statvfs
|
2019-03-17 14:37:52 +00:00
|
|
|
strcasestr
|
2014-12-01 19:55:22 +00:00
|
|
|
strlcpy
|
|
|
|
strsep
|
|
|
|
syslog
|
2020-11-15 21:53:42 +00:00
|
|
|
uselocale)
|
2014-12-01 19:55:22 +00:00
|
|
|
|
|
|
|
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()
|
|
|
|
|
2016-02-07 11:54:01 +00:00
|
|
|
if(ICONV_FOUND)
|
2016-02-23 03:00:12 +00:00
|
|
|
add_definitions(-DHAVE_ICONV)
|
2016-02-23 05:07:43 +00:00
|
|
|
if(ICONV_SECOND_ARGUMENT_IS_CONST)
|
|
|
|
add_definitions(-DICONV_SECOND_ARGUMENT_IS_CONST)
|
|
|
|
endif()
|
2016-02-07 11:54:01 +00:00
|
|
|
endif()
|
|
|
|
|
2014-12-13 16:00:14 +00:00
|
|
|
# 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()
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2014-12-20 22:28:43 +00:00
|
|
|
if(ENABLE_NLS)
|
|
|
|
check_library_exists(intl libintl_gettext "" HAVE_LIBINTL)
|
|
|
|
if(HAVE_LIBINTL)
|
|
|
|
set(LIBINTL_LIBRARY intl)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
check_library_exists(m sqrt "" HAVE_LIBM)
|
|
|
|
if(HAVE_LIBM)
|
|
|
|
set(LIBM_LIBRARY m)
|
|
|
|
endif()
|
|
|
|
|
2016-12-24 17:11:27 +00:00
|
|
|
set(TR_NETWORK_LIBRARIES)
|
|
|
|
if(WIN32)
|
|
|
|
list(APPEND TR_NETWORK_LIBRARIES iphlpapi ws2_32)
|
|
|
|
else()
|
|
|
|
tr_select_library("c;socket;net" socket "" LIB)
|
|
|
|
if(NOT LIB MATCHES "^(|c)$")
|
|
|
|
list(APPEND TR_NETWORK_LIBRARIES ${LIB})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
tr_select_library("c;nsl;bind" gethostbyname "" LIB)
|
|
|
|
if(NOT LIB MATCHES "^(|c)$")
|
|
|
|
list(APPEND TR_NETWORK_LIBRARIES ${LIB})
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2021-09-12 19:36:51 +00:00
|
|
|
if(RUN_CLANG_TIDY STREQUAL "AUTO")
|
|
|
|
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)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(RUN_CLANG_TIDY)
|
2020-08-11 18:11:55 +00:00
|
|
|
message(STATUS "Looking for clang-tidy")
|
|
|
|
find_program(CLANG_TIDY clang-tidy)
|
|
|
|
if (CLANG_TIDY STREQUAL "CLANG_TIDY-NOTFOUND")
|
|
|
|
message(STATUS "Looking for clang-tidy - not found")
|
|
|
|
else()
|
|
|
|
message(STATUS "Looking for clang-tidy - found")
|
|
|
|
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY}")
|
|
|
|
endif()
|
2020-05-20 01:32:51 +00:00
|
|
|
endif()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
if(ENABLE_TESTS)
|
2020-08-11 18:11:55 +00:00
|
|
|
include(CTest)
|
2014-12-01 19:55:22 +00:00
|
|
|
enable_testing()
|
2020-08-11 18:11:55 +00:00
|
|
|
add_subdirectory(tests)
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
2016-09-10 17:08:58 +00:00
|
|
|
function(tr_install_web DST_DIR)
|
2020-10-24 01:04:25 +00:00
|
|
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/web/public_html DESTINATION ${DST_DIR})
|
2016-09-10 17:08:58 +00:00
|
|
|
endfunction()
|
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
add_subdirectory(libtransmission)
|
|
|
|
|
2016-09-10 17:08:58 +00:00
|
|
|
set(MAC_PROJECT_DIR macosx)
|
|
|
|
|
2018-04-18 09:25:13 +00:00
|
|
|
if(ENABLE_GTK AND ENABLE_NLS)
|
|
|
|
find_package(Gettext 0.19.7 REQUIRED)
|
|
|
|
add_subdirectory(po)
|
|
|
|
endif()
|
|
|
|
|
2020-10-24 01:04:25 +00:00
|
|
|
foreach(P cli daemon gtk mac qt utils web)
|
2014-12-01 19:55:22 +00:00
|
|
|
string(TOUPPER "${P}" P_ID)
|
|
|
|
if(ENABLE_${P_ID})
|
2016-09-10 17:08:58 +00:00
|
|
|
if(DEFINED ${P_ID}_PROJECT_DIR)
|
|
|
|
set(P ${${P_ID}_PROJECT_DIR})
|
|
|
|
endif()
|
2014-12-01 19:55:22 +00:00
|
|
|
add_subdirectory(${P})
|
|
|
|
endif()
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
if(ENABLE_DAEMON OR ENABLE_GTK OR ENABLE_QT)
|
2016-09-10 17:08:58 +00:00
|
|
|
tr_install_web(${CMAKE_INSTALL_DATAROOTDIR}/${TR_NAME})
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
|
|
|
if(INSTALL_DOC)
|
2020-05-03 23:33:57 +00:00
|
|
|
install(FILES AUTHORS COPYING NEWS.md README.md extras/rpc-spec.txt extras/send-email-when-torrent-done.sh DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
2014-12-01 19:55:22 +00:00
|
|
|
endif()
|
|
|
|
|
2017-02-11 10:24:42 +00:00
|
|
|
if(MSVC AND ENABLE_DAEMON AND ENABLE_QT AND ENABLE_UTILS AND WITH_CRYPTO STREQUAL "openssl")
|
2016-04-02 18:01:01 +00:00
|
|
|
add_subdirectory(dist/msi)
|
|
|
|
endif()
|
|
|
|
|
2020-10-13 00:15:19 +00:00
|
|
|
set(CPACK_SOURCE_GENERATOR TXZ)
|
2014-12-01 19:55:22 +00:00
|
|
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${TR_NAME}-${TR_USER_AGENT_PREFIX}")
|
2020-10-13 00:15:19 +00:00
|
|
|
if(NOT TR_STABLE_RELEASE)
|
|
|
|
string(APPEND CPACK_SOURCE_PACKAGE_FILE_NAME "-r${TR_VCS_REVISION}")
|
|
|
|
endif()
|
2020-10-24 01:04:25 +00:00
|
|
|
list(APPEND CPACK_SOURCE_IGNORE_FILES
|
|
|
|
"${CMAKE_BINARY_DIR}"
|
|
|
|
"[.]git"
|
|
|
|
"node_modules"
|
|
|
|
)
|
2020-10-13 00:15:19 +00:00
|
|
|
set(CPACK_INSTALL_SCRIPTS "${CMAKE_CURRENT_LIST_DIR}/cmake/CPackSourceFixDirLinks.cmake")
|
2014-12-01 19:55:22 +00:00
|
|
|
|
2020-09-14 02:41:32 +00:00
|
|
|
## Code Formatting
|
|
|
|
|
|
|
|
if(GIT_FOUND)
|
|
|
|
execute_process(COMMAND
|
|
|
|
"${GIT_EXECUTABLE}" rev-parse --show-toplevel
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
|
|
OUTPUT_VARIABLE TR_GIT_ROOT
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
)
|
2020-10-13 00:15:19 +00:00
|
|
|
if(TR_GIT_ROOT AND IS_DIRECTORY "${TR_GIT_ROOT}/.git")
|
2020-09-14 02:41:32 +00:00
|
|
|
configure_file(
|
2020-09-20 20:41:45 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/extras/pre-commit"
|
2020-09-14 02:41:32 +00:00
|
|
|
"${TR_GIT_ROOT}/.git/hooks/pre-commit"
|
|
|
|
COPYONLY
|
|
|
|
)
|
|
|
|
add_custom_target(check-format
|
2021-08-15 22:08:56 +00:00
|
|
|
COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh" --check
|
2020-09-14 02:41:32 +00:00
|
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
|
|
)
|
|
|
|
add_custom_target(format
|
2021-08-15 22:08:56 +00:00
|
|
|
COMMAND "${CMAKE_SOURCE_DIR}/code_style.sh"
|
2020-09-14 02:41:32 +00:00
|
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
|
|
)
|
2020-10-13 00:15:19 +00:00
|
|
|
endif()
|
2020-09-14 02:41:32 +00:00
|
|
|
unset(TR_GIT_ROOT)
|
2020-10-13 00:15:19 +00:00
|
|
|
endif()
|
2020-09-14 02:41:32 +00:00
|
|
|
|
2014-12-01 19:55:22 +00:00
|
|
|
include(CPack)
|