cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) # Configurable policies: <= CMP0097 cmake_policy(SET CMP0091 NEW) cmake_policy(SET CMP0092 NEW) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) include(LibtorrentMacros) read_version("${CMAKE_CURRENT_SOURCE_DIR}/include/libtorrent/version.hpp" VER_MAJOR VER_MINOR VER_TINY) project(libtorrent DESCRIPTION "Bittorrent library" VERSION ${VER_MAJOR}.${VER_MINOR}.${VER_TINY} ) set (SOVERSION "10") include(GNUInstallDirs) include(GeneratePkgConfig) set(libtorrent_include_files add_torrent_params.hpp address.hpp alert.hpp alert_manager.hpp alert_types.hpp announce_entry.hpp assert.hpp bandwidth_limit.hpp bandwidth_manager.hpp bandwidth_queue_entry.hpp bandwidth_socket.hpp bdecode.hpp bencode.hpp bitfield.hpp block_cache.hpp bloom_filter.hpp broadcast_socket.hpp bt_peer_connection.hpp buffer.hpp chained_buffer.hpp choker.hpp close_reason.hpp config.hpp copy_ptr.hpp crc32c.hpp create_torrent.hpp deadline_timer.hpp debug.hpp disk_buffer_holder.hpp disk_buffer_pool.hpp disk_interface.hpp disk_io_job.hpp disk_io_thread.hpp disk_io_thread_pool.hpp disk_job_pool.hpp disk_observer.hpp download_priority.hpp ed25519.hpp entry.hpp enum_net.hpp error.hpp error_code.hpp extensions.hpp file.hpp file_pool.hpp file_storage.hpp fingerprint.hpp flags.hpp fwd.hpp gzip.hpp hasher.hpp heterogeneous_queue.hpp hex.hpp http_connection.hpp http_parser.hpp http_seed_connection.hpp http_stream.hpp http_tracker_connection.hpp i2p_stream.hpp identify_client.hpp index_range.hpp invariant_check.hpp io.hpp io_service.hpp io_service_fwd.hpp ip_filter.hpp ip_voter.hpp lazy_entry.hpp link.hpp linked_list.hpp lsd.hpp magnet_uri.hpp natpmp.hpp netlink.hpp operations.hpp optional.hpp packet_buffer.hpp packet_pool.hpp parse_url.hpp part_file.hpp peer.hpp peer_class.hpp peer_class_set.hpp peer_class_type_filter.hpp peer_connection.hpp peer_connection_handle.hpp peer_connection_interface.hpp peer_id.hpp peer_info.hpp peer_list.hpp peer_request.hpp performance_counters.hpp pex_flags.hpp piece_block.hpp piece_block_progress.hpp piece_picker.hpp platform_util.hpp portmap.hpp proxy_base.hpp puff.hpp random.hpp read_resume_data.hpp receive_buffer.hpp request_blocks.hpp resolve_links.hpp resolver.hpp resolver_interface.hpp session.hpp session_handle.hpp session_settings.hpp session_stats.hpp session_status.hpp session_types.hpp settings_pack.hpp sha1.hpp sha1_hash.hpp sha512.hpp sliding_average.hpp socket.hpp socket_io.hpp socks5_stream.hpp span.hpp ssl_stream.hpp stack_allocator.hpp stat.hpp stat_cache.hpp storage.hpp storage_defs.hpp string_util.hpp string_view.hpp tailqueue.hpp time.hpp timestamp_history.hpp torrent.hpp torrent_flags.hpp torrent_handle.hpp torrent_info.hpp torrent_peer.hpp torrent_peer_allocator.hpp torrent_status.hpp tracker_manager.hpp udp_socket.hpp udp_tracker_connection.hpp union_endpoint.hpp units.hpp upnp.hpp utf8.hpp utp_socket_manager.hpp utp_stream.hpp vector_utils.hpp version.hpp web_connection_base.hpp web_peer_connection.hpp write_resume_data.hpp xml_parse.hpp ) set(libtorrent_kademlia_include_files announce_flags.hpp dht_observer.hpp dht_settings.hpp dht_state.hpp dht_storage.hpp dht_tracker.hpp direct_request.hpp dos_blocker.hpp ed25519.hpp find_data.hpp get_item.hpp get_peers.hpp io.hpp item.hpp msg.hpp node.hpp node_entry.hpp node_id.hpp observer.hpp put_data.hpp refresh.hpp routing_table.hpp rpc_manager.hpp sample_infohashes.hpp traversal_algorithm.hpp types.hpp ) set(libtorrent_extensions_include_files smart_ban.hpp ut_metadata.hpp ut_pex.hpp ) set(libtorrent_aux_include_files aligned_storage.hpp aligned_union.hpp alloca.hpp allocating_handler.hpp array.hpp bind_to_device.hpp block_cache_reference.hpp byteswap.hpp cppint_import_export.hpp cpuid.hpp deferred_handler.hpp deprecated.hpp deque.hpp dev_random.hpp disable_warnings_pop.hpp disable_warnings_push.hpp disk_job_fence.hpp escape_string.hpp export.hpp ffs.hpp file_progress.hpp has_block.hpp instantiate_connection.hpp io.hpp ip_notifier.hpp keepalive.hpp listen_socket_handle.hpp lsd.hpp merkle.hpp noexcept_movable.hpp numeric_cast.hpp openssl.hpp path.hpp pool.hpp portmap.hpp proxy_settings.hpp range.hpp route.h scope_end.hpp session_call.hpp session_impl.hpp session_interface.hpp session_settings.hpp session_udp_sockets.hpp set_socket_buffer.hpp socket_type.hpp storage_piece_set.hpp storage_utils.hpp string_ptr.hpp suggest_piece.hpp throw.hpp time.hpp torrent_impl.hpp unique_ptr.hpp vector.hpp win_crypto_provider.hpp win_util.hpp ) set(sources add_torrent_params.cpp alert.cpp alert_manager.cpp announce_entry.cpp assert.cpp bandwidth_limit.cpp bandwidth_manager.cpp bandwidth_queue_entry.cpp bdecode.cpp bitfield.cpp block_cache.cpp bloom_filter.cpp broadcast_socket.cpp bt_peer_connection.cpp chained_buffer.cpp choker.cpp close_reason.cpp cpuid.cpp crc32c.cpp create_torrent.cpp disk_buffer_holder.cpp disk_buffer_pool.cpp disk_io_job.cpp disk_io_thread.cpp disk_io_thread_pool.cpp disk_job_fence.cpp disk_job_pool.cpp entry.cpp enum_net.cpp error_code.cpp escape_string.cpp ffs.cpp file.cpp file_pool.cpp file_progress.cpp file_storage.cpp fingerprint.cpp generate_peer_id.cpp gzip.cpp hasher.cpp hex.cpp http_connection.cpp http_parser.cpp http_seed_connection.cpp http_stream.cpp http_tracker_connection.cpp i2p_stream.cpp identify_client.cpp instantiate_connection.cpp ip_filter.cpp ip_notifier.cpp ip_voter.cpp lazy_bdecode.cpp listen_socket_handle.cpp lsd.cpp magnet_uri.cpp merkle.cpp natpmp.cpp openssl.cpp packet_buffer.cpp parse_url.cpp part_file.cpp path.cpp peer_class.cpp peer_class_set.cpp peer_connection.cpp peer_connection_handle.cpp peer_info.cpp peer_list.cpp performance_counters.cpp piece_picker.cpp platform_util.cpp proxy_base.cpp proxy_settings.cpp puff.cpp random.cpp read_resume_data.cpp receive_buffer.cpp request_blocks.cpp resolve_links.cpp resolver.cpp session.cpp session_call.cpp session_handle.cpp session_impl.cpp session_settings.cpp session_stats.cpp settings_pack.cpp sha1.cpp sha1_hash.cpp socket_io.cpp socket_type.cpp socks5_stream.cpp stack_allocator.cpp stat.cpp stat_cache.cpp storage.cpp storage_piece_set.cpp storage_utils.cpp string_util.cpp time.cpp timestamp_history.cpp torrent.cpp torrent_handle.cpp torrent_info.cpp torrent_peer.cpp torrent_peer_allocator.cpp torrent_status.cpp tracker_manager.cpp udp_socket.cpp udp_tracker_connection.cpp upnp.cpp utf8.cpp utp_socket_manager.cpp utp_stream.cpp version.cpp web_connection_base.cpp web_peer_connection.cpp write_resume_data.cpp xml_parse.cpp # -- extensions -- smart_ban.cpp ut_pex.cpp ut_metadata.cpp ) # -- kademlia -- set(kademlia_sources dht_settings.cpp dht_state.cpp dht_storage.cpp dht_tracker.cpp dos_blocker.cpp ed25519.cpp find_data.cpp get_item.cpp get_peers.cpp item.cpp msg.cpp node.cpp node_entry.cpp node_id.cpp put_data.cpp refresh.cpp routing_table.cpp rpc_manager.cpp sample_infohashes.cpp traversal_algorithm.cpp ) # -- ed25519 -- set(ed25519_sources add_scalar.cpp fe.cpp ge.cpp key_exchange.cpp keypair.cpp sc.cpp sign.cpp verify.cpp ) 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) find_public_dependency(Threads REQUIRED) if(CMAKE_CXX_COMPILER_ID MATCHES Clang) add_compile_options( -Weverything -Wno-c++98-compat-pedantic -Wno-documentation -Wno-exit-time-destructors -Wno-global-constructors -Wno-padded -Wno-weak-vtables ) elseif(CMAKE_CXX_COMPILER_ID MATCHES GNU) add_compile_options( -Wall -Wc++11-compat -Wextra -Wno-format-zero-length -Wparentheses -Wpedantic -Wvla -ftemplate-depth=512 ) elseif(MSVC) add_compile_options( /utf-8 # https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ /Zc:__cplusplus /W4 # C4251: 'identifier' : class 'type' needs to have dll-interface to be # used by clients of class 'type2' /wd4251 # C4268: 'identifier' : 'const' static/global data initialized # with compiler generated default constructor fills the object with zeros /wd4268 # C4275: non DLL-interface classkey 'identifier' used as base for # DLL-interface classkey 'identifier' /wd4275 # C4373: virtual function overrides, previous versions of the compiler # did not override when parameters only differed by const/volatile qualifiers /wd4373 # C4503: 'identifier': decorated name length exceeded, name was truncated /wd4503 ) endif() if(static_runtime) if (MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") else() include(ucm_flags) ucm_set_runtime(STATIC) endif() set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME ON) set(OPENSSL_MSVC_STATIC_RT ON) endif() if (NOT BUILD_SHARED_LIBS) set(Boost_USE_STATIC_LIBS ON) set(OPENSSL_USE_STATIC_LIBS ON) endif() add_library(torrent-rasterbar ${sources} ${libtorrent_include_files} ${libtorrent_extensions_include_files} ${libtorrent_aux_include_files} ) # C++ 11 support is required target_compile_features(torrent-rasterbar PUBLIC cxx_std_11 cxx_alias_templates cxx_alignas cxx_alignof cxx_attributes cxx_auto_type cxx_constexpr cxx_decltype cxx_default_function_template_args cxx_defaulted_functions cxx_defaulted_move_initializers cxx_delegating_constructors cxx_deleted_functions cxx_enum_forward_declarations cxx_explicit_conversions cxx_extended_friend_declarations cxx_extern_templates cxx_final cxx_generalized_initializers cxx_inheriting_constructors cxx_inline_namespaces cxx_lambdas cxx_local_type_template_args cxx_noexcept cxx_nonstatic_member_init cxx_nullptr cxx_override cxx_range_for cxx_raw_string_literals cxx_reference_qualified_functions cxx_right_angle_brackets cxx_rvalue_references cxx_sizeof_member cxx_static_assert cxx_strong_enums cxx_trailing_return_types cxx_unrestricted_unions cxx_user_literals cxx_variadic_templates ) if (BUILD_SHARED_LIBS) target_compile_definitions(torrent-rasterbar PRIVATE TORRENT_BUILDING_SHARED INTERFACE TORRENT_LINKING_SHARED ) endif() set_target_properties(torrent-rasterbar PROPERTIES CXX_VISIBILITY_PRESET "hidden" VISIBILITY_INLINES_HIDDEN "true" VERSION ${PROJECT_VERSION} SOVERSION ${SOVERSION} ) target_include_directories(torrent-rasterbar PUBLIC $ $ ) target_compile_definitions(torrent-rasterbar PUBLIC $<$:TORRENT_USE_ASSERTS> BOOST_ASIO_ENABLE_CANCELIO PRIVATE TORRENT_BUILDING_LIBRARY _FILE_OFFSET_BITS=64 BOOST_EXCEPTION_DISABLE BOOST_ASIO_HAS_STD_CHRONO ) target_link_libraries(torrent-rasterbar PUBLIC Threads::Threads ) # Unconditional platform-specific settings if (WIN32) target_link_libraries(torrent-rasterbar PRIVATE wsock32 ws2_32 iphlpapi debug dbghelp crypt32 ) add_definitions(-D_WIN32_WINNT=0x0600) # target Windows Vista or later target_compile_definitions(torrent-rasterbar PUBLIC WIN32_LEAN_AND_MEAN # prevent winsock1 to be included ) if (MSVC) target_compile_definitions(torrent-rasterbar PUBLIC BOOST_ALL_NO_LIB _SCL_SECURE_NO_DEPRECATE _CRT_SECURE_NO_DEPRECATE # disable bogus deprecation warnings on msvc8 ) target_compile_options(torrent-rasterbar PRIVATE /Zc:wchar_t /Zc:forScope # these compiler settings just make the compiler standard conforming /MP # for multi-core compilation /bigobj # increase the number of sections for obj files ) set_target_properties(torrent-rasterbar PROPERTIES LINK_FLAGS_RELEASE "/OPT:ICF=5 /OPT:REF") endif() endif() if (ANDROID) target_link_libraries(torrent-rasterbar PRIVATE ${CMAKE_DL_LIBS}) endif() if (APPLE) # for ip_notifier target_link_libraries(torrent-rasterbar PRIVATE "-framework CoreFoundation" "-framework SystemConfiguration") endif() # check if we need to link with libatomic (not needed on MSVC) if (NOT Windows) # TODO: migrate to CheckSourceCompiles in CMake >= 3.19 include(CheckCXXSourceCompiles) set(ATOMICS_TEST_SOURCE [=[ #include #include std::atomic x{0}; int main() { x.fetch_add(1, std::memory_order_relaxed); return 0; } ]=]) string(REPLACE "std::atomic" "std::atomic" ATOMICS64_TEST_SOURCE "${ATOMICS_TEST_SOURCE}") if(APPLE) set(CMAKE_REQUIRED_FLAGS "-std=c++11") endif() check_cxx_source_compiles("${ATOMICS_TEST_SOURCE}" HAVE_CXX_ATOMICS_WITHOUT_LIB) check_cxx_source_compiles("${ATOMICS64_TEST_SOURCE}" HAVE_CXX_ATOMICS64_WITHOUT_LIB) if((NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) OR (NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)) set(CMAKE_REQUIRED_LIBRARIES "atomic") check_cxx_source_compiles("${ATOMICS_TEST_SOURCE}" HAVE_CXX_ATOMICS_WITH_LIB) check_cxx_source_compiles("${ATOMICS64_TEST_SOURCE}" HAVE_CXX_ATOMICS64_WITH_LIB) if ((NOT HAVE_CXX_ATOMICS_WITH_LIB) OR (NOT HAVE_CXX_ATOMICS64_WITH_LIB)) message(FATAL_ERROR "No native support for std::atomic, or libatomic not found!") else() message(STATUS "Linking with libatomic for atomics support") unset(CMAKE_REQUIRED_LIBRARIES) target_link_libraries(torrent-rasterbar PUBLIC atomic) endif() endif() if(APPLE) unset(CMAKE_REQUIRED_FLAGS) endif() endif() feature_option(build_tests "build tests" OFF) feature_option(build_examples "build examples" OFF) feature_option(build_tools "build tools" OFF) feature_option(python-bindings "build python bindings" OFF) feature_option(python-egg-info "generate python egg info" OFF) feature_option(python-install-system-dir "Install python bindings to the system installation directory rather than the CMake installation prefix" OFF) feature_option(iconv "build libtorrent with iconv support" ON) # these options require existing target feature_option(dht "enable support for Mainline DHT" ON) target_optional_compile_definitions(torrent-rasterbar PUBLIC FEATURE NAME deprecated-functions DEFAULT ON DESCRIPTION "enable deprecated functions for backwards compatibility" DISABLED TORRENT_NO_DEPRECATE) feature_option(encryption "Enables encryption in libtorrent" ON) feature_option(exceptions "build with exception support" ON) target_optional_compile_definitions(torrent-rasterbar PUBLIC FEATURE NAME extensions DEFAULT ON DESCRIPTION "Enables protocol extensions" DISABLED TORRENT_DISABLE_EXTENSIONS) target_optional_compile_definitions(torrent-rasterbar PUBLIC FEATURE NAME i2p DEFAULT ON DESCRIPTION "build with I2P support" DISABLED TORRENT_USE_I2P=0) target_optional_compile_definitions(torrent-rasterbar PUBLIC FEATURE NAME logging DEFAULT ON DESCRIPTION "build with logging" DISABLED TORRENT_DISABLE_LOGGING) target_optional_compile_definitions(torrent-rasterbar PUBLIC FEATURE NAME mutable-torrents DEFAULT ON DESCRIPTION "Enables mutable torrent support" DISABLED TORRENT_DISABLE_MUTABLE_TORRENTS) target_optional_compile_definitions(torrent-rasterbar PUBLIC FEATURE NAME streaming DEFAULT ON DESCRIPTION "Enables support for piece deadline" DISABLED TORRENT_DISABLE_STREAMING) if(iconv) find_public_dependency(Iconv) if(MSVC) set(iconv_package_type OPTIONAL) else() set(iconv_package_type RECOMMENDED) endif() set_package_properties(Iconv PROPERTIES URL "https://www.gnu.org/software/libiconv/" DESCRIPTION "GNU encoding conversion library" TYPE ${iconv_package_type} PURPOSE "Convert strings between various encodings" ) endif() if(Iconv_FOUND) target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_ICONV) target_link_libraries(torrent-rasterbar PRIVATE Iconv::Iconv) endif() find_public_dependency(OpenSSL) set_package_properties(OpenSSL PROPERTIES URL "https://www.openssl.org/" DESCRIPTION "Full-strength general purpose cryptography library" TYPE RECOMMENDED PURPOSE "Provides HTTPS support to libtorrent" ) if(TARGET OpenSSL::SSL) # TODO: needed until https://gitlab.kitware.com/cmake/cmake/issues/19263 is fixed if(WIN32 AND OPENSSL_USE_STATIC_LIBS) target_link_libraries(torrent-rasterbar PRIVATE crypt32) endif() target_link_libraries(torrent-rasterbar PUBLIC OpenSSL::SSL) target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_OPENSSL) endif() if(TARGET OpenSSL::Crypto) target_link_libraries(torrent-rasterbar PUBLIC OpenSSL::Crypto) target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_LIBCRYPTO) else() find_public_dependency(LibGcrypt) set_package_properties(LibGcrypt PROPERTIES URL "https://www.gnupg.org/software/libgcrypt/index.html" DESCRIPTION "A general purpose cryptographic library" TYPE RECOMMENDED PURPOSE "Use GCrypt instead of the built-in functions for RC4 and SHA1" ) if (LibGcrypt_FOUND) target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_LIBGCRYPT) target_link_libraries(torrent-rasterbar PRIVATE LibGcrypt::LibGcrypt) endif() endif() if (encryption) target_sources(torrent-rasterbar PRIVATE include/libtorrent/pe_crypto.hpp src/pe_crypto.cpp) else() target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_DISABLE_ENCRYPTION) endif() if (dht) target_sources(torrent-rasterbar PRIVATE ${libtorrent_kademlia_include_files} include/libtorrent/hasher512.hpp ${kademlia_sources} ${ed25519_sources} src/hasher512.cpp src/sha512.cpp ) else() target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_DISABLE_DHT) endif() # Boost find_public_dependency(Boost REQUIRED) target_include_directories(torrent-rasterbar PUBLIC ${Boost_INCLUDE_DIRS}) if (Boost_MAJOR_VERSION LESS_EQUAL 1 AND Boost_MINOR_VERSION LESS 69) find_package(Boost REQUIRED COMPONENTS system) target_link_libraries(torrent-rasterbar PUBLIC ${Boost_SYSTEM_LIBRARY}) endif() if (exceptions) if (MSVC) target_compile_options(torrent-rasterbar PUBLIC /EHsc) else (MSVC) target_compile_options(torrent-rasterbar PUBLIC -fexceptions) endif (MSVC) else() if (MSVC) target_compile_definitions(torrent-rasterbar PUBLIC _HAS_EXCEPTIONS=0) else (MSVC) target_compile_options(torrent-rasterbar PUBLIC -fno-exceptions) endif (MSVC) endif() # developer options option(developer-options "Activates options useful for a developer") if(developer-options) set(asserts "auto" CACHE STRING "use assertions") set_property(CACHE asserts PROPERTY STRINGS auto on off production system) if ("${asserts}" MATCHES "on|production|system") target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_ASSERTS=1) endif() if ("${asserts}" STREQUAL "production") target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_PRODUCTION_ASSERTS=1) elseif("${asserts}" STREQUAL "system") target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_SYSTEM_ASSERTS=1) endif() target_optional_compile_definitions(torrent-rasterbar PUBLIC NAME asio-debugging DEFAULT OFF ENABLED TORRENT_ASIO_DEBUGGING) target_optional_compile_definitions(torrent-rasterbar PUBLIC NAME picker-debugging DEFAULT OFF ENABLED TORRENT_DEBUG_REFCOUNTS) set(invariant-checks "off" CACHE STRING "") set_property(CACHE invariant-checks PROPERTY STRINGS off on full) if (invariant-checks MATCHES "on|full") target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_USE_INVARIANT_CHECKS=1) endif() if (invariant-checks STREQUAL "full") target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_EXPENSIVE_INVARIANT_CHECKS) endif() target_optional_compile_definitions(torrent-rasterbar PUBLIC NAME utp-log DEFAULT OFF ENABLED TORRENT_UTP_LOG_ENABLE) target_optional_compile_definitions(torrent-rasterbar PUBLIC NAME simulate-slow-read DEFAULT OFF ENABLED TORRENT_SIMULATE_SLOW_READ) option(debug-iterators "" OFF) if (debug-iterators) if (MSVC) target_compile_definitions(torrent-rasterbar PUBLIC _ITERATOR_DEBUG_LEVEL=2) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") target_compile_definitions(torrent-rasterbar PUBLIC _GLIBCXX_DEBUG _GLIBCXX_DEBUG_PEDANTIC) endif() endif() target_optional_compile_definitions(torrent-rasterbar PUBLIC NAME profile-calls DEFAULT OFF ENABLED TORRENT_PROFILE_CALLS=1) endif() # This is best effort attempt to propagate whether the library was built with # C++11 or not. It affects the ABI of entry. A client building with C++14 and # linking against a libtorrent binary built with C++11 can still define # TORRENT_CXX11_ABI if ("${CMAKE_CXX_STANDARD}" STREQUAL "11") target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_CXX11_ABI) endif() # There is little to none support for using pkg-config with MSVC and most users won't bother with it. # However, msys is a linux-like platform on Windows that do support/prefer using pkg-config. if (NOT MSVC) generate_and_install_pkg_config_file(torrent-rasterbar libtorrent-rasterbar) endif() include(CheckCXXCompilerFlag) add_subdirectory(bindings) install(TARGETS torrent-rasterbar EXPORT LibtorrentRasterbarTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(DIRECTORY include/libtorrent DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h*") # === generate a CMake Config File === include(CMakePackageConfigHelpers) 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}") write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/LibtorrentRasterbar/LibtorrentRasterbarConfigVersion.cmake" VERSION ${libtorrent_VERSION} COMPATIBILITY AnyNewerVersion ) export(EXPORT LibtorrentRasterbarTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/LibtorrentRasterbar/LibtorrentRasterbarTargets.cmake" NAMESPACE LibtorrentRasterbar:: ) configure_package_config_file(LibtorrentRasterbarConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/LibtorrentRasterbar/LibtorrentRasterbarConfig.cmake" INSTALL_DESTINATION "${ConfigPackageLocation}" NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO ) install(EXPORT LibtorrentRasterbarTargets NAMESPACE LibtorrentRasterbar:: DESTINATION ${ConfigPackageLocation} ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/LibtorrentRasterbar/LibtorrentRasterbarConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/LibtorrentRasterbar/LibtorrentRasterbarConfigVersion.cmake" DESTINATION ${ConfigPackageLocation} ) install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/examples/cmake/FindLibtorrentRasterbar.cmake DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/Modules ) # === build tools === if (build_tools) add_subdirectory(tools) endif() # === build examples === if (build_examples) add_subdirectory(examples) endif() # === build tests === if(build_tests) enable_testing() # this will make some internal functions available in the DLL interface target_compile_definitions(torrent-rasterbar PUBLIC TORRENT_EXPORT_EXTRA) add_subdirectory(test) endif() feature_summary(DEFAULT_DESCRIPTION WHAT ALL)