/CMakeLists.txt

http://github.com/tomahawk-player/tomahawk · CMake · 392 lines · 259 code · 81 blank · 52 comment · 35 complexity · af4f400167dc3000d21a3cf73a615c8d MD5 · raw file

  1. PROJECT( tomahawk )
  2. CMAKE_MINIMUM_REQUIRED( VERSION 2.8.12 )
  3. CMAKE_POLICY(SET CMP0017 NEW)
  4. CMAKE_POLICY(SET CMP0022 NEW)
  5. IF(POLICY CMP0075)
  6. CMAKE_POLICY(SET CMP0075 NEW)
  7. ENDIF()
  8. # TODO:
  9. # Update to NEW and fix things up
  10. CMAKE_POLICY(SET CMP0023 NEW)
  11. # Let AUTOMOC and AUTOUIC process generated files
  12. IF(POLICY CMP0071)
  13. CMAKE_POLICY(SET CMP0071 NEW)
  14. ENDIF()
  15. # TODO:
  16. # Disable automatic qtmain linking
  17. CMAKE_POLICY(SET CMP0020 OLD)
  18. find_package(ECM 1.7.0 REQUIRED NO_MODULE)
  19. set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules" )
  20. INCLUDE(CMakeDependentOption)
  21. ###
  22. ### Tomahawk application info
  23. ###
  24. SET( TOMAHAWK_ORGANIZATION_NAME "Tomahawk" )
  25. SET( TOMAHAWK_ORGANIZATION_DOMAIN "tomahawk-player.org" )
  26. SET( TOMAHAWK_APPLICATION_NAME "Tomahawk" )
  27. SET( TOMAHAWK_DESCRIPTION_SUMMARY "The social media player" )
  28. SET( TOMAHAWK_APPLICATION_PACKAGE_NAME "org.tomahawk-player.Tomahawk")
  29. IF(APPLE)
  30. SET( TOMAHAWK_TARGET_NAME "Tomahawk" )
  31. ELSE()
  32. SET( TOMAHAWK_TARGET_NAME "tomahawk" )
  33. ENDIF()
  34. STRING(TOLOWER "${TOMAHAWK_TARGET_NAME}" TOMAHAWK_BASE_TARGET_NAME)
  35. IF( WIN32 )
  36. SET( TOMAHAWK_SYSTEM "Windows" )
  37. ELSEIF( APPLE )
  38. SET( TOMAHAWK_SYSTEM "OS X" )
  39. ELSEIF( UNIX )
  40. SET( TOMAHAWK_SYSTEM "Linux")
  41. ELSE()
  42. SET( TOMAHAWK_SYSTEM "Uknown Platform, please let the Tomahawk team know, this actually happened" )
  43. ENDIF()
  44. SET( TOMAHAWK_VERSION_MAJOR 0 )
  45. SET( TOMAHAWK_VERSION_MINOR 8 )
  46. SET( TOMAHAWK_VERSION_PATCH 99 )
  47. SET( TOMAHAWK_VERSION_RC 0 )
  48. SET( TOMAHAWK_TRANSLATION_LANGUAGES ar bg bn_IN ca cs da de en el es es_419 fi fr hi_IN hu gl id it ja lt nl pl pt_BR pt_PT ro ru sq sv th tr uk vi zh_CN zh_TW )
  49. # add_definitions is only in the scope of this directory and all directories
  50. # below it. Tomahawk Libraries and plugins that are built with Tomahawk are
  51. # not included in out-of-source build so we need to re-add_definitions there.
  52. macro(tomahawk_add_definitions DEFINITION)
  53. add_definitions( ${DEFINITION} )
  54. set( TOMAHAWK_DEFINITIONS "${TOMAHAWK_DEFINITIONS} ${DEFINITION}")
  55. endmacro()
  56. macro(tomahawk_add_cxx_flags FLAGS)
  57. set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}")
  58. set( TOMAHAWK_CXX_FLAGS "${TOMAHAWK_CXX_FLAGS} ${FLAGS}")
  59. endmacro()
  60. macro(tomahawk_add_c_flags FLAGS)
  61. set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}")
  62. set( TOMAHAWK_C_FLAGS "${TOMAHAWK_C_FLAGS} ${FLAGS}")
  63. endmacro()
  64. if(NOT WIN32)
  65. # enforce proper symbol exporting on all platforms but Windows
  66. tomahawk_add_cxx_flags( "-fvisibility=hidden" )
  67. tomahawk_add_c_flags( "-fvisibility=hidden" )
  68. endif()
  69. # enforce using constBegin, constEnd for const-iterators
  70. tomahawk_add_definitions( "-DQT_STRICT_ITERATORS" )
  71. # build options
  72. option(BUILD_RELEASE "Generate TOMAHAWK_VERSION without GIT info" OFF)
  73. if(BUILD_RELEASE)
  74. set(BUILD_NO_RELEASE OFF)
  75. else()
  76. set(BUILD_NO_RELEASE ON)
  77. endif()
  78. option(BUILD_GUI "Build Tomahawk with GUI" ON)
  79. option(BUILD_TESTS "Build Tomahawk with unit tests" ${BUILD_NO_RELEASE})
  80. option(BUILD_TOOLS "Build Tomahawk helper tools" ${BUILD_NO_RELEASE})
  81. option(BUILD_HATCHET "Build the Hatchet plugin" OFF)
  82. if(UNIX AND NOT APPLE)
  83. set(CRASHREPORTER_ENABLED_BY_DEFAULT OFF)
  84. else()
  85. set(CRASHREPORTER_ENABLED_BY_DEFAULT ON)
  86. endif()
  87. option(WITH_CRASHREPORTER "Build with CrashReporter" ${CRASHREPORTER_ENABLED_BY_DEFAULT})
  88. option(WITH_BINARY_ATTICA "Enable support for downloading binary resolvers automatically" ON)
  89. # build options for development purposes
  90. option(SANITIZE_ADDRESS "Enable Address Sanitizer for memory error detection" OFF)
  91. option(TOMAHAWK_FINEGRAINED_MESSAGES "Enable even more verbose logging (will hurt performance significantly" OFF)
  92. CMAKE_DEPENDENT_OPTION(WITH_UPOWER "Build with support for UPower events" ON
  93. "UNIX;NOT APPLE" OFF)
  94. CMAKE_DEPENDENT_OPTION(WITH_GNOMESHORTCUTHANDLER "Build with shortcut handler for GNOME" ON
  95. "UNIX;NOT APPLE" OFF)
  96. IF( CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libcrashreporter-qt/CMakeLists.txt")
  97. message(STATUS "Build of crashreporter disabled.")
  98. SET(WITH_CRASHREPORTER OFF)
  99. ENDIF()
  100. # generate version string
  101. # base string used in release and unstable builds
  102. SET( TOMAHAWK_VERSION_TMP "${TOMAHAWK_VERSION_MAJOR}.${TOMAHAWK_VERSION_MINOR}.${TOMAHAWK_VERSION_PATCH}")
  103. SET( TOMAHAWK_VERSION_SHORT "${TOMAHAWK_VERSION_TMP}" )
  104. IF( TOMAHAWK_VERSION_RC )
  105. SET( TOMAHAWK_VERSION_TMP "${TOMAHAWK_VERSION_TMP}rc${TOMAHAWK_VERSION_RC}")
  106. ENDIF()
  107. # additional info for non-release builds
  108. IF( NOT BUILD_RELEASE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/" )
  109. INCLUDE( CMakeDateStamp )
  110. SET( TOMAHAWK_VERSION_DATE "${CMAKE_DATESTAMP_YEAR}${CMAKE_DATESTAMP_MONTH}${CMAKE_DATESTAMP_DAY}" )
  111. IF( TOMAHAWK_VERSION_DATE GREATER 0 )
  112. SET( TOMAHAWK_VERSION_TMP ${TOMAHAWK_VERSION_TMP}.${TOMAHAWK_VERSION_DATE} )
  113. ENDIF()
  114. INCLUDE( CMakeVersionSource )
  115. IF( CMAKE_VERSION_SOURCE )
  116. SET( TOMAHAWK_VERSION_TMP ${TOMAHAWK_VERSION_TMP}-${CMAKE_VERSION_SOURCE} )
  117. ENDIF()
  118. ENDIF()
  119. # write Tomahawk version to cache
  120. SET(TOMAHAWK_VERSION "${TOMAHAWK_VERSION_TMP}" CACHE STRING "Tomahawk Version")
  121. # set paths
  122. SET( THIRDPARTY_DIR "${CMAKE_SOURCE_DIR}/thirdparty" )
  123. SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" )
  124. SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" )
  125. SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" )
  126. # make predefined install dirs available everywhere
  127. INCLUDE( GNUInstallDirs )
  128. # installer creation
  129. INCLUDE( TomahawkCPack.cmake )
  130. # deps
  131. INCLUDE( MacroOptionalFindPackage )
  132. INCLUDE( MacroLogFeature )
  133. message( STATUS "Building Tomahawk ${TOMAHAWK_VERSION} ***" )
  134. find_package(Qt5Core REQUIRED)
  135. find_package(Qt5Concurrent REQUIRED)
  136. find_package(Qt5Gui REQUIRED)
  137. find_package(Qt5Network REQUIRED)
  138. find_package(Qt5Sql REQUIRED)
  139. find_package(Qt5Svg REQUIRED)
  140. find_package(Qt5UiTools REQUIRED)
  141. find_package(Qt5WebKitWidgets REQUIRED)
  142. find_package(Qt5Widgets REQUIRED)
  143. find_package(Qt5Xml REQUIRED)
  144. find_package(Qt5X11Extras NO_MODULE QUIET)
  145. if(Qt5X11Extras_FOUND)
  146. set(HAVE_X11 TRUE)
  147. else()
  148. set(HAVE_X11 FALSE)
  149. endif()
  150. if( UNIX AND NOT APPLE )
  151. # We need this to find the paths to qdbusxml2cpp and co
  152. find_package(Qt5DBus REQUIRED)
  153. endif()
  154. if(APPLE)
  155. find_package(Qt5MacExtras REQUIRED)
  156. endif()
  157. if(WIN32)
  158. find_package(Qt5WinExtras REQUIRED)
  159. endif()
  160. find_package(Qt5LinguistTools REQUIRED)
  161. set(QT_RCC_EXECUTABLE "${Qt5Core_RCC_EXECUTABLE}")
  162. # FIXME: CrashReporter depends on deprecated QHttp
  163. set(CMAKE_CXX_STANDARD 11)
  164. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  165. set(CMAKE_CXX_EXTENSIONS OFF)
  166. find_package(Boost REQUIRED COMPONENTS filesystem system)
  167. macro_log_feature(Boost_FOUND "Boost" "Provides free peer-reviewed portable C++ source libraries" "http://www.boost.org" TRUE "" "") #FIXME: give useful explanation
  168. macro_optional_find_package(Lucene++ 3.0.0)
  169. macro_log_feature(LUCENEPP_FOUND "Lucene++" "The open-source, C++ search engine" "https://github.com/luceneplusplus/LucenePlusPlus/" TRUE "" "Lucene++ is used for indexing the collection")
  170. macro_optional_find_package(Taglib 1.8.0)
  171. macro_log_feature(TAGLIB_FOUND "TagLib" "Audio Meta-Data Library" "http://developer.kde.org/~wheeler/taglib.html" TRUE "" "taglib is needed for reading meta data from audio files")
  172. include( CheckTagLibFileName )
  173. check_taglib_filename( COMPLEX_TAGLIB_FILENAME )
  174. macro_optional_find_package(Sparsehash)
  175. macro_log_feature(SPARSEHASH_FOUND "Sparsehash"
  176. "An extremely memory-efficient hash_map implementation."
  177. "https://code.google.com/p/sparsehash/" TRUE ""
  178. "Sparsehash is needed for reading metadata of mediastreams and fast
  179. forward/backward seeking in HTTP streams")
  180. macro_optional_find_package(GnuTLS)
  181. macro_log_feature(GNUTLS_FOUND "GnuTLS"
  182. "GnuTLS is a secure communications library implementing the SSL, TLS and DTLS protocols and technologies around them."
  183. "http://gnutls.org/" TRUE ""
  184. "GnuTLS is needed for serving the Playdar/HTTP API via TLS")
  185. macro_optional_find_package(Qca-qt5)
  186. if(Qca-qt5_DIR)
  187. set(QCA2_FOUND ON CACHE BOOL "QCA2 was found")
  188. set(QCA2_LIBRARIES "qca-qt5" CACHE STRING "QCA2 Qt5 target")
  189. endif()
  190. macro_log_feature(QCA2_FOUND "QCA2" "Provides encryption and signing functions necessary for some resolvers and accounts" "http://delta.affinix.com/qca/" TRUE "" "")
  191. macro_optional_find_package(KF5Attica 1.0.0)
  192. set(LIBATTICA_FOUND ${KF5Attica_FOUND})
  193. macro_log_feature(LIBATTICA_FOUND "libattica" "Provides support for installation of resolvers from the Tomahawk website" "http://download.kde.org/stable/attica/" TRUE "" "")
  194. macro_optional_find_package(QuaZip)
  195. macro_log_feature(QUAZIP_FOUND "QuaZip" "Provides support for extracting downloaded resolvers automatically." "http://quazip.sourceforge.net/" TRUE "" "")
  196. macro_optional_find_package(Jreen 1.0.5)
  197. macro_log_feature(JREEN_FOUND "Jreen" "Qt XMPP Library" "http://qutim.org/jreen / https://github.com/euroelessar/jreen" FALSE "" "Jreen is needed for the Jabber SIP plugin.\n")
  198. if( PC_JREEN_VERSION STREQUAL "1.1.0" )
  199. message(FATAL_ERROR "Jreen 1.1.0 has a very annoying bug that breaks accepting auth requests in Tomahawk. Please upgrade to 1.1.1 or downgrade to 1.0.5.")
  200. endif()
  201. macro_optional_find_package(LibLastFm 1.0.0)
  202. macro_log_feature(LIBLASTFM_FOUND "liblastfm" "Qt library for the Last.fm webservices" "https://github.com/lastfm/liblastfm" TRUE "" "liblastfm is needed for scrobbling tracks to Last.fm and fetching cover artwork")
  203. if( NOT APPLE )
  204. macro_optional_find_package(Qt5Keychain 0.1.0)
  205. macro_log_feature(Qt5Keychain_FOUND "QtKeychain" "Provides support for secure credentials storage" "https://github.com/frankosterfeld/qtkeychain" TRUE "" "")
  206. endif()
  207. if( UNIX AND NOT APPLE )
  208. macro_optional_find_package(TelepathyQt 0.9.3)
  209. macro_log_feature(TelepathyQt5_FOUND "Telepathy-Qt" "Telepathy-Qt is a Qt high-level binding for Telepathy, a D-Bus framework for unifying real time communication." FALSE "" "Telepathy-Qt is needed for sharing Jabber/GTalk accounts with Telepathy.\n")
  210. endif()
  211. # we need pthreads too
  212. macro_optional_find_package(Threads)
  213. macro_log_feature(THREADS_FOUND "Threads" "Threading Library" "" TRUE "" "Platform specific library for threading")
  214. ### QtSparkle
  215. if( WIN32 )
  216. macro_optional_find_package(QtSparkle)
  217. macro_log_feature(QTSPARKLE_FOUND "qtsparkle" "Library for creating auto updaters written in Qt" "https://github.com/davidsansome/qtsparkle" FALSE "" "")
  218. endif( WIN32 )
  219. if( WIN32 OR APPLE )
  220. macro_optional_find_package(LibsnoreQt5 0.6.0 QUIET)
  221. macro_log_feature(LibsnoreQt5_FOUND "Libsnore" "Library for notifications" "https://projects.kde.org/projects/playground/libs/snorenotify" FALSE "" "")
  222. endif()
  223. find_package(LIBVLC REQUIRED 2.1.0)
  224. macro_log_feature(LIBVLC_FOUND "LibVLC" "Provides audio output" "https://www.videolan.org/vlc/" TRUE "" "")
  225. set(QXTWEB_FOUND TRUE)
  226. set(QXTWEB_LIBRARIES qxtweb-standalone)
  227. set(QXTWEB_INCLUDE_DIRS ${THIRDPARTY_DIR}/qxt/qxtweb-standalone/web ${THIRDPARTY_DIR}/qxt/qxtweb-standalone/network ${THIRDPARTY_DIR}/qxt/qxtweb-standalone/core ${CMAKE_CURRENT_BINARY_DIR})
  228. ### libportfwd
  229. set(LIBPORTFWD_INCLUDE_DIR ${THIRDPARTY_DIR}/libportfwd/include)
  230. set(LIBPORTFWD_LIBRARY tomahawk_portfwd)
  231. set(LIBPORTFWD_LIBRARIES ${LIBPORTFWD_LIBRARY})
  232. add_subdirectory(${THIRDPARTY_DIR}/libportfwd)
  233. #### submodules start
  234. # automatically init submodules here, don't delete this code we may add submodules again
  235. # this installs headers and such and should really be handled in a separate package by packagers
  236. # IF( FALSE )
  237. # IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.gitmodules)
  238. # EXECUTE_PROCESS(COMMAND git submodule init WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
  239. # EXECUTE_PROCESS(COMMAND git submodule update WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
  240. # ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.gitmodules)
  241. # ENDIF()
  242. #### submodules end
  243. SET( CLEAN_C_FLAGS ${CMAKE_C_FLAGS} )
  244. #show dep log
  245. macro_display_feature_log()
  246. SET( INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" )
  247. # make uninstall support
  248. CONFIGURE_FILE(
  249. "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  250. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  251. IMMEDIATE @ONLY)
  252. IF( ( NOT APPLE ) AND ( NOT SANITIZE_ADDRESS ))
  253. # Make linking as strict on linux as it is on osx. Then we don't break linking on mac so often
  254. #
  255. # On using Address Sanitizer, we cannot link to the ASAN lib, so
  256. # --no-undefined would break the build.
  257. SET( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
  258. SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined" )
  259. ENDIF()
  260. IF ( SANITIZE_ADDRESS )
  261. SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
  262. SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
  263. ENDIF()
  264. # Early configure these files as we need them later on
  265. configure_file(TomahawkUse.cmake.in "${PROJECT_BINARY_DIR}/TomahawkUse.cmake" @ONLY)
  266. file(COPY TomahawkAddPlugin.cmake DESTINATION "${PROJECT_BINARY_DIR}")
  267. file(COPY TomahawkAddLibrary.cmake DESTINATION "${PROJECT_BINARY_DIR}")
  268. SET( TOMAHAWK_LIBRARY ${TOMAHAWK_BASE_TARGET_NAME}lib )
  269. SET( TOMAHAWK_LIBRARIES ${TOMAHAWK_LIBRARY} )
  270. SET( TOMAHAWK_WIDGETS_LIBRARIES ${TOMAHAWK_BASE_TARGET_NAME}-widgets )
  271. SET( TOMAHAWK_PLAYDARAPI_LIBRARIES ${TOMAHAWK_BASE_TARGET_NAME}-playdarapi )
  272. ADD_SUBDIRECTORY( thirdparty )
  273. ADD_SUBDIRECTORY( src )
  274. ADD_SUBDIRECTORY( admin )
  275. IF(BUILD_TESTS)
  276. find_package(Qt5Test REQUIRED)
  277. enable_testing()
  278. ADD_SUBDIRECTORY( src/tests )
  279. ENDIF()
  280. # Add all targets to the build-tree export set
  281. set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/Tomahawk" CACHE PATH "Installation directory for CMake files")
  282. set(CMAKE_INSTALL_FULL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}")
  283. export(TARGETS ${TOMAHAWK_LIBRARY}
  284. FILE "${PROJECT_BINARY_DIR}/TomahawkLibraryDepends.cmake")
  285. # Export the package for use from the build-tree
  286. # (this registers the build-tree with a global CMake-registry)
  287. export(PACKAGE Tomahawk)
  288. # Create a TomahawkBuildTreeSettings.cmake file for the use from the build tree
  289. configure_file(TomahawkBuildTreeSettings.cmake.in "${PROJECT_BINARY_DIR}/TomahawkBuildTreeSettings.cmake" @ONLY)
  290. # Create the TomahawkConfig.cmake and TomahawkConfigVersion files
  291. file(RELATIVE_PATH CONF_REL_INCLUDE_DIR "${CMAKE_INSTALL_FULL_CMAKEDIR}" "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
  292. configure_file(TomahawkConfig.cmake.in "${PROJECT_BINARY_DIR}/TomahawkConfig.cmake" @ONLY)
  293. configure_file(TomahawkConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/TomahawkConfigVersion.cmake" @ONLY)
  294. # Install the cmake files
  295. install(
  296. FILES
  297. "${PROJECT_BINARY_DIR}/TomahawkConfig.cmake"
  298. "${PROJECT_BINARY_DIR}/TomahawkConfigVersion.cmake"
  299. "${PROJECT_BINARY_DIR}/TomahawkUse.cmake"
  300. "${PROJECT_BINARY_DIR}/TomahawkAddPlugin.cmake"
  301. "${PROJECT_BINARY_DIR}/TomahawkAddLibrary.cmake"
  302. DESTINATION
  303. "${CMAKE_INSTALL_CMAKEDIR}"
  304. )
  305. # Install the export set for use with the install-tree
  306. install(
  307. EXPORT
  308. TomahawkLibraryDepends
  309. DESTINATION
  310. "${CMAKE_INSTALL_CMAKEDIR}"
  311. )