diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3cb8beb8d..05b390c2f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.11.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)
project(libtorrent
DESCRIPTION "Bittorrent library"
@@ -7,9 +7,9 @@ project(libtorrent
set (SOVERSION "10")
list(APPEND CMAKE_MODULE_PATH ${libtorrent_SOURCE_DIR}/cmake/Modules)
-include(FeatureSummary)
include(GNUInstallDirs)
include(GeneratePkgConfig)
+include(LibtorrentMacros)
set(libtorrent_include_files
add_torrent_params
@@ -428,46 +428,18 @@ set(ed25519_sources
verify
)
-function(target_optional_compile_definitions _target _scope)
- set(options FEATURE)
- set(oneValueArgs NAME DESCRIPTION DEFAULT)
- set(multiValueArgs ENABLED DISABLED)
- cmake_parse_arguments(TOCD ${options} "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
- option(${TOCD_NAME} "${TOCD_DESCRIPTION}" ${TOCD_DEFAULT})
- if (${${TOCD_NAME}})
- target_compile_definitions(${_target} ${_scope} ${TOCD_ENABLED})
- else()
- target_compile_definitions(${_target} ${_scope} ${TOCD_DISABLED})
- endif()
- if(${TOCD_FEATURE})
- add_feature_info(${TOCD_NAME} ${TOCD_NAME} "${TOCD_DESCRIPTION}")
- endif()
-endfunction()
-
-macro(feature_option _name _description _default)
- option(${_name} "${_description}" ${_default})
- add_feature_info(${_name} ${_name} "${_description}")
-endmacro()
+list(TRANSFORM sources PREPEND "src/")
+list(TRANSFORM kademlia_sources PREPEND "src/kademlia/")
+list(TRANSFORM ed25519_sources PREPEND "ed25519/src/")
+list(TRANSFORM libtorrent_include_files PREPEND "include/libtorrent/")
+list(TRANSFORM libtorrent_extensions_include_files PREPEND "include/libtorrent/extensions/")
+list(TRANSFORM libtorrent_aux_include_files PREPEND "include/libtorrent/aux_/")
+list(TRANSFORM libtorrent_kademlia_include_files PREPEND "include/libtorrent/kademlia/")
# these options control target creation and thus have to be declared before the add_library() call
feature_option(BUILD_SHARED_LIBS "build libtorrent as a shared library" ON)
feature_option(static_runtime "build libtorrent with static runtime" OFF)
-macro(find_public_dependency _name)
- find_package(${_name} ${ARGN})
- string(TOUPPER "${_name}" _name_uppercased)
- if (${_name}_FOUND OR ${_name_uppercased}_FOUND)
- # Dependencies to be used below for generating Config.cmake file
- # We don't need the 'REQUIRED' argument there
- set(_args "${_name}")
- list(APPEND _args "${ARGN}")
- list(REMOVE_ITEM _args "REQUIRED")
- list(REMOVE_ITEM _args "") # just in case
- string(REPLACE ";" " " _args "${_args}")
- list(APPEND _package_dependencies "${_args}")
- endif()
-endmacro()
-
find_public_dependency(Threads REQUIRED)
if(CMAKE_CXX_COMPILER_ID MATCHES Clang)
@@ -522,12 +494,14 @@ if (NOT BUILD_SHARED_LIBS)
endif()
add_library(torrent-rasterbar
- src/$
- include/libtorrent/$
- include/libtorrent/extensions/$
- include/libtorrent/aux_/$
+ ${sources}
+ ${libtorrent_include_files}
+ ${libtorrent_extensions_include_files}
+ ${libtorrent_aux_include_files}
)
+select_cxx_standard(torrent-rasterbar 11)
+
if (BUILD_SHARED_LIBS)
target_compile_definitions(torrent-rasterbar
PRIVATE TORRENT_BUILDING_SHARED
@@ -543,14 +517,6 @@ set_target_properties(torrent-rasterbar
SOVERSION ${SOVERSION}
)
-if (cxx_std_14 IN_LIST CMAKE_CXX_COMPILE_FEATURES)
- target_compile_features(torrent-rasterbar PUBLIC cxx_std_14)
- message(STATUS "Building in C++14 mode")
-else()
- target_compile_features(torrent-rasterbar PUBLIC cxx_std_11)
- message(STATUS "Building in C++11 mode")
-endif()
-
target_include_directories(torrent-rasterbar PUBLIC
$
$
@@ -580,8 +546,9 @@ if (WIN32)
debug dbghelp
)
+ add_definitions(-D_WIN32_WINNT=0x0600) # target Windows Vista or later
+
target_compile_definitions(torrent-rasterbar
- PRIVATE _WIN32_WINNT=0x0600 # target Windows Vista or later
PUBLIC WIN32_LEAN_AND_MEAN # prevent winsock1 to be included
)
@@ -696,9 +663,9 @@ endif()
if (dht)
target_sources(torrent-rasterbar PRIVATE
- src/kademlia/$
- ed25519/src/$
- include/libtorrent/kademlia/$
+ ${kademlia_sources}
+ ${ed25519_sources}
+ ${libtorrent_kademlia_include_files}
src/hasher512
)
target_include_directories(torrent-rasterbar PRIVATE ed25519/src)
@@ -792,16 +759,10 @@ set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/LibtorrentRasterbar)
string(REGEX REPLACE "([^;]+)" "find_dependency(\\1)" _find_dependency_calls "${_package_dependencies}")
string(REPLACE ";" "\n" _find_dependency_calls "${_find_dependency_calls}")
-if(CMAKE_VERSION VERSION_LESS "3.11.0")
- set(_compatibility ExactVersion)
-else()
- set(_compatibility SameMinorVersion)
-endif()
-
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/LibtorrentRasterbar/LibtorrentRasterbarConfigVersion.cmake"
VERSION ${libtorrent_VERSION}
- COMPATIBILITY ${_compatibility}
+ COMPATIBILITY SameMinorVersion
)
export(EXPORT LibtorrentRasterbarTargets
diff --git a/cmake/Modules/LibtorrentMacros.cmake b/cmake/Modules/LibtorrentMacros.cmake
new file mode 100644
index 000000000..e73eb0e1f
--- /dev/null
+++ b/cmake/Modules/LibtorrentMacros.cmake
@@ -0,0 +1,82 @@
+# Various helper function and macros for building libtorrent
+
+include(FeatureSummary)
+
+# macro for issuing option() and add_feature_info() in a single call.
+# Synopsis:
+# feature_option( )
+macro(feature_option _name _description _default)
+ option(${_name} "${_description}" ${_default})
+ add_feature_info(${_name} ${_name} "${_description}")
+endmacro()
+
+# function to add a simple build option which controls compile definition(s) for a target.
+# Synopsis:
+# target_optional_compile_definitions( [FEATURE]
+# NAME DESCRIPTION DEFAULT
+# [ENABLED [enabled_compile_definitions...]]
+# [DISABLED [disabled_compile_defnitions...]]
+# )
+# NAME, DESCRIPTION and DEFAULT are passed to option() call
+# if FEATURE is given, they are passed to add_feature_info()
+# ENABLED lists compile definitions that will be set on when option is enabled,
+# DISABLED lists definitions that will be set otherwise
+function(target_optional_compile_definitions _target _scope)
+ set(options FEATURE)
+ set(oneValueArgs NAME DESCRIPTION DEFAULT)
+ set(multiValueArgs ENABLED DISABLED)
+ cmake_parse_arguments(TOCD ${options} "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+ option(${TOCD_NAME} "${TOCD_DESCRIPTION}" ${TOCD_DEFAULT})
+ if (${${TOCD_NAME}})
+ target_compile_definitions(${_target} ${_scope} ${TOCD_ENABLED})
+ else()
+ target_compile_definitions(${_target} ${_scope} ${TOCD_DISABLED})
+ endif()
+ if(${TOCD_FEATURE})
+ add_feature_info(${TOCD_NAME} ${TOCD_NAME} "${TOCD_DESCRIPTION}")
+ endif()
+endfunction()
+
+# a helper macro that calls find_package() and appends the package (if found) to the
+# _package_dependencies list, which can be used later to generate package config file
+macro(find_public_dependency _name)
+ find_package(${_name} ${ARGN})
+ string(TOUPPER "${_name}" _name_uppercased)
+ if (${_name}_FOUND OR ${_name_uppercased}_FOUND)
+ # Dependencies to be used below for generating Config.cmake file
+ # We don't need the 'REQUIRED' argument there
+ set(_args "${_name}")
+ list(APPEND _args "${ARGN}")
+ list(REMOVE_ITEM _args "REQUIRED")
+ list(REMOVE_ITEM _args "") # just in case
+ string(REPLACE ";" " " _args "${_args}")
+ list(APPEND _package_dependencies "${_args}")
+ endif()
+endmacro()
+
+function(select_cxx_standard _target _minimal_supported_version)
+ message(STATUS "Compiler default is C++${CMAKE_CXX_STANDARD_DEFAULT}")
+ # make the CXX_STANDARD property public to ensure it makes it into the pkg-config file
+ get_target_property(_std ${_target} CXX_STANDARD)
+ # if it is unset, select the default if it is sufficient or the ${_minimal_supported_version}
+ if (NOT ${_std})
+ if (${CMAKE_CXX_STANDARD_DEFAULT} GREATER_EQUAL ${_minimal_supported_version})
+ set(_std ${CMAKE_CXX_STANDARD_DEFAULT})
+ else()
+ set(_std ${_minimal_supported_version})
+ endif()
+ else()
+ if (${_std} LESS ${_minimal_supported_version})
+ message(FATAL_ERROR "Sorry, C++${_std} is not supported by libtorrent")
+ endif()
+ endif()
+
+ if (cxx_std_${_std} IN_LIST CMAKE_CXX_COMPILE_FEATURES)
+ # force this standard
+ target_compile_features(${_target} PUBLIC cxx_std_${_std})
+ else()
+ message(FATAL_ERROR "Requested C++ standard version (${_std}) is not supported by the compiler")
+ endif()
+
+ message(STATUS "Building in C++${_std} mode")
+endfunction()