From 0cb9884965a16fcd538f9f9d9f69ace18bb21b93 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Sat, 21 Jan 2017 15:09:59 +0100 Subject: [PATCH 1/2] 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 From 13d9dea8aca64da37811070efcb54c975420accd Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Sat, 21 Jan 2017 16:36:52 +0100 Subject: [PATCH 2/2] cmake: make LibtorrentRasterbar::LibTorrent public dependency of qbt_base If libtorrent include directory not in the compiler search path, we have to pass it to all qbt targets, because session.h includes libtorrent/version.hpp --- cmake/Modules/MacroLinkQtComponents.cmake | 16 ++++++++++++++-- src/base/CMakeLists.txt | 12 ++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/cmake/Modules/MacroLinkQtComponents.cmake b/cmake/Modules/MacroLinkQtComponents.cmake index a6c80ce1e..c8a1c941f 100644 --- a/cmake/Modules/MacroLinkQtComponents.cmake +++ b/cmake/Modules/MacroLinkQtComponents.cmake @@ -5,11 +5,23 @@ macro (target_link_qt_components target) if (QT4_FOUND) foreach(_cmp ${ARGN}) - list(APPEND _QT_CMPNTS "Qt4::Qt${_cmp}") + if ("${_cmp}" STREQUAL "PRIVATE" OR + "${_cmp}" STREQUAL "PUBLIC" OR + "${_cmp}" STREQUAL "INTERFACE") + list(APPEND _QT_CMPNTS "${_cmp}") + else() + list(APPEND _QT_CMPNTS "Qt4::Qt${_cmp}") + endif() endforeach() else (QT4_FOUND) foreach(_cmp ${ARGN}) - list(APPEND _QT_CMPNTS "Qt5::${_cmp}") + if ("${_cmp}" STREQUAL "PRIVATE" OR + "${_cmp}" STREQUAL "PUBLIC" OR + "${_cmp}" STREQUAL "INTERFACE") + list(APPEND _QT_CMPNTS "${_cmp}") + else() + list(APPEND _QT_CMPNTS "Qt5::${_cmp}") + endif() endforeach() endif (QT4_FOUND) target_link_libraries(${target} ${_QT_CMPNTS}) diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt index 7efcf4d2f..fa4ba824e 100644 --- a/src/base/CMakeLists.txt +++ b/src/base/CMakeLists.txt @@ -117,24 +117,24 @@ tristatebool.cpp ) add_library(qbt_base STATIC ${QBT_BASE_HEADERS} ${QBT_BASE_SOURCES}) -target_link_libraries(qbt_base ZLIB::ZLIB LibtorrentRasterbar::LibTorrent) -target_link_qt_components(qbt_base Core Network Xml) +target_link_libraries(qbt_base PRIVATE ZLIB::ZLIB PUBLIC LibtorrentRasterbar::LibTorrent) +target_link_qt_components(qbt_base PUBLIC Core Network Xml) if (QT4_FOUND) if (GUI) - target_link_libraries(qbt_base Qt4::QtGui) + target_link_libraries(qbt_base PUBLIC Qt4::QtGui) endif (GUI) else (QT4_FOUND) if (GUI) - target_link_libraries(qbt_base Qt5::Gui Qt5::Widgets) + target_link_libraries(qbt_base PUBLIC Qt5::Gui Qt5::Widgets) endif (GUI) endif (QT4_FOUND) if (DBUS) - target_link_qt_components(qbt_base DBus) + target_link_qt_components(qbt_base PRIVATE DBus) endif () if (APPLE) find_library(IOKit_LIBRARY IOKit) find_library(Carbon_LIBRARY Carbon) - target_link_libraries(qbt_base ${Carbon_LIBRARY} ${IOKit_LIBRARY}) + target_link_libraries(qbt_base PRIVATE ${Carbon_LIBRARY} ${IOKit_LIBRARY}) endif (APPLE)