From 0cb9884965a16fcd538f9f9d9f69ace18bb21b93 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Sat, 21 Jan 2017 15:09:59 +0100 Subject: [PATCH] cmake: get and use only actual boost dependencies of libtorrent With pkg-config we can get a list of Boost components from Libtorrent dependencies and make qBittorrent depend only on these libraries in turn. For Windows user may provide a custom list via LibtorrentRasterbar_CUSTOM_BOOST_DEPENDENCIES variable or use generic list which consists of date_time, system, chrono, random, thread. As a note: in case of using fully C++11 build, the actual list contains only boost system library. --- cmake/Modules/FindLibtorrentRasterbar.cmake | 45 ++++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/cmake/Modules/FindLibtorrentRasterbar.cmake b/cmake/Modules/FindLibtorrentRasterbar.cmake index de96bd1ad..6c8d18bb9 100644 --- a/cmake/Modules/FindLibtorrentRasterbar.cmake +++ b/cmake/Modules/FindLibtorrentRasterbar.cmake @@ -14,6 +14,11 @@ find_package(Threads REQUIRED) find_package(PkgConfig QUIET) +macro(_detect_boost_components _outComponets librariesList) + string(REGEX MATCHALL "boost_[a-z_]+[-a-z]*" _boost_libraries "${librariesList}") + string(REGEX REPLACE "boost_([a-z_]+)[-a-z]*" "\\1" ${_outComponets} "${_boost_libraries}") +endmacro() + if(PKG_CONFIG_FOUND) pkg_check_modules(PC_LIBTORRENT_RASTERBAR QUIET libtorrent-rasterbar) endif() @@ -62,13 +67,34 @@ endif() set(LibtorrentRasterbar_LIBRARIES ${LibtorrentRasterbar_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) set(LibtorrentRasterbar_INCLUDE_DIRS ${LibtorrentRasterbar_INCLUDE_DIR}) -if(NOT Boost_SYSTEM_FOUND OR NOT Boost_CHRONO_FOUND OR NOT Boost_RANDOM_FOUND) - find_package(Boost REQUIRED COMPONENTS date_time system chrono random thread) - set(LibtorrentRasterbar_LIBRARIES - ${LibtorrentRasterbar_LIBRARIES} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) - set(LibtorrentRasterbar_INCLUDE_DIRS - ${LibtorrentRasterbar_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}) -endif() +# Without pkg-config, we can't possibly figure out the correct boost dependencies +if (LibtorrentRasterbar_CUSTOM_BOOST_DEPENDENCIES) + string(REPLACE ";" " " _boost_components "${LibtorrentRasterbar_CUSTOM_BOOST_DEPENDENCIES}") +else(LibtorrentRasterbar_CUSTOM_BOOST_DEPENDENCIES) + if(PC_LIBTORRENT_RASTERBAR_FOUND) + _detect_boost_components(_boost_cmpnts "${PC_LIBTORRENT_RASTERBAR_LIBRARIES}") + else() + # all possible boost dependencies + set(_boost_cmpnts + date_time + system + chrono + random + thread + ) + endif() + list(SORT _boost_cmpnts) + message(STATUS "Libtorrent Boost dependencies: ${_boost_cmpnts}") + string(REPLACE ";" " " _boost_components "${_boost_cmpnts}") +endif(LibtorrentRasterbar_CUSTOM_BOOST_DEPENDENCIES) + +find_package(Boost REQUIRED COMPONENTS ${_boost_components}) +set(LibtorrentRasterbar_LIBRARIES ${LibtorrentRasterbar_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) +foreach(_boost_cmpnt IN LISTS _boost_components) + list(APPEND LibtorrentRasterbar_LIBRARIES "Boost::${_boost_cmpnt}") +endforeach(_boost_cmpnt) + +set(LibtorrentRasterbar_INCLUDE_DIRS ${LibtorrentRasterbar_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}) list(FIND LibtorrentRasterbar_DEFINITIONS -DTORRENT_USE_OPENSSL LibtorrentRasterbar_ENCRYPTION_INDEX) if(LibtorrentRasterbar_ENCRYPTION_INDEX GREATER -1) @@ -83,10 +109,7 @@ include(FindPackageHandleStandardArgs) # if all listed variables are TRUE find_package_handle_standard_args(LibtorrentRasterbar DEFAULT_MSG LibtorrentRasterbar_LIBRARY - LibtorrentRasterbar_INCLUDE_DIR - Boost_SYSTEM_FOUND - Boost_CHRONO_FOUND - Boost_RANDOM_FOUND) + LibtorrentRasterbar_INCLUDE_DIR) mark_as_advanced(LibtorrentRasterbar_INCLUDE_DIR LibtorrentRasterbar_LIBRARY LibtorrentRasterbar_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES