Add Settings option to choose from bundled Icon Themes
[quassel.git] / CMakeLists.txt
1 # Main CMake file for building Quassel IRC
2 #
3 # See INSTALL for possible CMake options (or read the code, Luke)
4 #####################################################################
5
6 # General setup
7 #####################################################################
8
9 project(QuasselIRC)
10
11 # Versions
12 set(QUASSEL_MAJOR  0)
13 set(QUASSEL_MINOR 13)
14 set(QUASSEL_PATCH  0)
15 set(QUASSEL_VERSION_STRING "0.13-pre")
16
17 # We want to know CMake's version for debug reasons
18 message(STATUS "Using CMake ${CMAKE_VERSION}")
19
20 # Tell CMake about or own modules
21 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
22
23 # General conveniences
24 set(CMAKE_AUTOMOC ON)
25 set(CMAKE_INCLUDE_CURRENT_DIR ON)
26
27 # Include various CMake modules...
28 include(CMakePushCheckState)
29 include(CheckFunctionExists)
30 include(CheckIncludeFile)
31 include(CheckCXXSourceCompiles)
32 include(CMakeDependentOption)
33 include(FeatureSummary)
34
35 # ... and our own stuff
36 include(QuasselCompileSettings)
37 include(QuasselMacros)
38
39
40 # Options and variables that can be set on the command line
41 #####################################################################
42
43 # First, choose a Qt version. We support USE_QT4 and USE_QT5; if neither is set, prefer Qt4 for now
44 option(USE_QT5 "Enable support for Qt5 (disables KDE integration)" OFF)
45 if (USE_QT4) # takes precedence
46     set(USE_QT5 OFF)
47 else()
48     if (NOT USE_QT5)
49         set(USE_QT4 ON)
50     endif()
51 endif()
52
53 # Select the binaries to build
54 option(WANT_CORE     "Build the core (server) binary"           ON)
55 option(WANT_QTCLIENT "Build the client-only binary"             ON)
56 option(WANT_MONO     "Build the monolithic (all-in-one) binary" ON)
57 add_feature_info(WANT_CORE WANT_CORE "Build the core (server) binary")
58 add_feature_info(WANT_QTCLIENT WANT_QTCLIENT "Build the client-only binary (requires a core to connect to)")
59 add_feature_info(WANT_MONO WANT_MONO "Build the monolithic (all-in-one) binary")
60
61 # Whether to enable KDE integration (work in progress for Qt5 / KDE Frameworks)
62 # Note that when building with Qt5, WITH_KDE enables integration with higher-tier KDE frameworks that
63 # require runtime support. We still optionally make use of certain Tier 1 frameworks even if WITH_KDE
64 # is disabled.
65 if (USE_QT4)
66     option(WITH_KDE "KDE4 integration" OFF)
67     add_feature_info(WITH_KDE WITH_KDE "Enable KDE4 integration")
68 else()
69     option(WITH_KDE "Integration with the KDE Frameworks runtime environment")
70     add_feature_info(WITH_KDE WITH_KDE "Integrate with the KDE Frameworks runtime environment")
71 endif()
72
73 cmake_dependent_option(WITH_OXYGEN "Install Oxygen icon set (usually shipped with KDE)" ON "NOT WITH_KDE" OFF)
74 cmake_dependent_option(WITH_BREEZE "Install Breeze icon set (usually shipped with KDE)" OFF "NOT WITH_KDE" OFF)
75 cmake_dependent_option(WITH_BREEZE_DARK "Install Dark Breeze icon set (usually shipped with KDE)" OFF "NOT WITH_KDE" OFF)
76 if (NOT WITH_KDE)
77     add_feature_info(WITH_OXYGEN WITH_OXYGEN "Install Oxygen icon set")
78     add_feature_info(WITH_BREEZE WITH_BREEZE "Install Breeze icon set. Alternative to Oxygen.")
79     add_feature_info(WITH_BREEZE_DARK WITH_BREEZE_DARK "Install Dark Breeze icon set. Alternative to Oxygen.")
80 endif()
81
82 if (WITH_OXYGEN)
83     add_definitions(-DWITH_OXYGEN)
84 endif()
85 if (WITH_BREEZE)
86     add_definitions(-DWITH_BREEZE)
87 endif()
88 if (WITH_BREEZE_DARK)
89     add_definitions(-DWITH_BREEZE_DARK)
90 endif()
91
92 # For this, the feature info is added after we know if QtWebkit is installed
93 option(WITH_WEBKIT "WebKit support (for link previews) (legacy)" OFF)
94
95 # For this, the feature info is added after we know if QtWebEngine is installed
96 option(WITH_WEBENGINE "WebEngine support (for link previews)" ON)
97
98 if (APPLE)
99     # Notification Center is only available in > 10.8, which is Darwin v12
100     if (NOT CMAKE_SYSTEM_VERSION VERSION_LESS 12)
101         option(WITH_NOTIFICATION_CENTER "OS X Notification Center support" ON)
102         add_feature_info(WITH_NOTIFICATION_CENTER WITH_NOTIFICATION_CENTER "Use the OS X Notification Center")
103     endif()
104 endif()
105
106 # Always embed on Windows, OSX or for a static build; never embed when enabling KDE integration
107 set(EMBED_DEFAULT OFF)
108 if (STATIC OR WIN32 OR APPLE)
109     set(EMBED_DEFAULT ON)
110 endif()
111 cmake_dependent_option(EMBED_DATA "Embed icons and translations into the binaries instead of installing them" ${EMBED_DEFAULT}
112                                    "NOT STATIC;NOT WIN32;NOT WITH_KDE" ${EMBED_DEFAULT})
113 if (NOT EMBED_DEFAULT)
114     add_feature_info(EMBED_DATA EMBED_DATA "Embed icons and translations in the binaries instead of installing them")
115 endif()
116
117 # The following options are not for end-user consumption, so don't list them in the feature summary
118 cmake_dependent_option(DEPLOY "Add required libs to bundle resources and create a dmg. Note: requires Qt to be built with 10.4u SDK" OFF "APPLE" OFF)
119
120 # Static builds are not supported and require some manual setup! Don't enable unless you know what you're doing (we don't know either)
121 cmake_dependent_option(STATIC      "Enable static building (not supported)" OFF "NOT WITH_KDE" OFF)
122
123 # For static builds, arbitrary extra libs might need to be linked
124 # Define a comma-separated list here
125 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
126 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
127 if (LINK_EXTRA)
128     string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
129     link_libraries(${LINK_EXTRA})
130 endif()
131
132
133 # Setup CMake
134 #####################################################################
135
136 if (USE_QT5 AND WITH_KDE)
137     cmake_minimum_required(VERSION 2.8.12)
138 else()
139     cmake_minimum_required(VERSION 2.8.9)
140 endif()
141
142 # Setting COMPILE_DEFINITIONS_<CONFIG> is deprecated since CMake 3.0 in favor of generator expressions.
143 # These have existed since CMake 2.8.10; until we depend on that, we have to explicitly enable the old policy.
144 if (POLICY CMP0043)
145     cmake_policy(SET CMP0043 OLD)
146 endif()
147
148 # Honor visibility settings for all target types
149 if (POLICY CMP0063)
150     cmake_policy(SET CMP0063 NEW)
151 endif()
152
153
154 # Simplify later checks
155 #####################################################################
156
157 if (WANT_MONO OR WANT_QTCLIENT)
158     set(BUILD_GUI true)
159 endif()
160 if (WANT_MONO OR WANT_CORE)
161     set(BUILD_CORE true)
162 endif()
163
164
165 # Set up Qt
166 #####################################################################
167
168 # Find package dependencies
169 #
170 # Note that you can forcefully disable optional packages
171 # using -DCMAKE_DISABLE_FIND_PACKAGE_<PkgName>=TRUE
172 #####################################################################
173
174 if (USE_QT5)
175     message(STATUS "Building for Qt5...")
176     set(QT_MIN_VERSION "5.2.0")
177     add_definitions(-DHAVE_QT5)
178
179     find_package(Qt5Core ${QT_MIN_VERSION} QUIET)
180     set_package_properties(Qt5Core PROPERTIES TYPE REQUIRED
181         URL "http://qt.digia.com"
182         DESCRIPTION "contains core functionality for Qt"
183     )
184     # find_package without REQUIRED won't check for the version properly; also, older Qt5 versions
185     # used Qt5Core_VERSION_STRING... let's just make sure here that we bail out here if our Qt5 is not new enough.
186     if (NOT Qt5Core_VERSION OR Qt5Core_VERSION VERSION_LESS ${QT_MIN_VERSION})
187         message(FATAL_ERROR "Could NOT find Qt5 >= version ${QT_MIN_VERSION}!")
188     endif()
189
190     find_package(Qt5Network QUIET)
191     set_package_properties(Qt5Network PROPERTIES TYPE REQUIRED
192         DESCRIPTION "the network module for Qt5"
193     )
194
195     if (BUILD_GUI)
196         find_package(Qt5Gui QUIET)
197         set_package_properties(Qt5Gui PROPERTIES TYPE REQUIRED
198             DESCRIPTION "the GUI module for Qt5"
199         )
200         find_package(Qt5Widgets QUIET)
201         set_package_properties(Qt5Widgets PROPERTIES TYPE REQUIRED
202             DESCRIPTION "the widgets module for Qt5"
203         )
204
205         if (NOT WIN32)
206             find_package(Qt5DBus QUIET)
207             set_package_properties(Qt5DBus PROPERTIES TYPE RECOMMENDED
208                 URL "http://qt.digia.com"
209                 DESCRIPTION "D-Bus support for Qt5"
210                 PURPOSE     "Needed for supporting D-Bus-based notifications and tray icon, used by most modern desktop environments"
211             )
212             if (Qt5DBus_FOUND)
213                 find_package(dbusmenu-qt5 QUIET CONFIG)
214                 set_package_properties(dbusmenu-qt5 PROPERTIES TYPE RECOMMENDED
215                     URL "https://launchpad.net/libdbusmenu-qt"
216                     DESCRIPTION "a library implementing the DBusMenu specification"
217                     PURPOSE     "Required for having a context menu for the D-Bus-based tray icon"
218                 )
219             endif()
220         endif()
221
222         find_package(Qt5Multimedia QUIET)
223         set_package_properties(Qt5Multimedia PROPERTIES TYPE RECOMMENDED
224             URL "http://qt.digia.com"
225             DESCRIPTION "Multimedia support for Qt5"
226             PURPOSE     "Required for audio notifications"
227         )
228
229         if (NOT Qt5Multimedia_FOUND)
230             find_package(Phonon4Qt5 QUIET)
231             set_package_properties(Phonon4Qt5 PROPERTIES TYPE RECOMMENDED
232                 URL "https://projects.kde.org/projects/kdesupport/phonon"
233                 DESCRIPTION "a multimedia abstraction library"
234                 PURPOSE     "Required for audio notifications"
235             )
236         endif()
237
238         find_package(LibsnoreQt5 0.7.0 QUIET)
239         set_package_properties(LibsnoreQt5 PROPERTIES TYPE OPTIONAL
240             URL "https://projects.kde.org/projects/playground/libs/snorenotify"
241             DESCRIPTION "a cross-platform notification framework"
242             PURPOSE     "Enable support for the snorenotify framework"
243         )
244         if(LibsnoreQt5_FOUND)
245             find_package(LibsnoreSettingsQt5)
246             set_package_properties(LibsnoreSettingsQt5 PROPERTIES TYPE REQUIRED
247                 URL "https://projects.kde.org/projects/playground/libs/snorenotify"
248                 DESCRIPTION "a cross-platform notification framework"
249                 PURPOSE     "Enable support for the snorenotify framework"
250             )
251         endif()
252
253
254         if (WITH_WEBKIT)
255             find_package(Qt5WebKit QUIET)
256             set_package_properties(Qt5WebKit PROPERTIES TYPE RECOMMENDED
257                 URL "http://qt.digia.com"
258                 DESCRIPTION "a WebKit implementation for Qt"
259                 PURPOSE     "Needed for displaying previews for URLs in chat"
260             )
261             if (Qt5WebKit_FOUND)
262                 find_package(Qt5WebKitWidgets QUIET)
263                 set_package_properties(Qt5WebKitWidgets PROPERTIES TYPE RECOMMENDED
264                     URL "http://qt.digia.com"
265                     DESCRIPTION "widgets for Qt's WebKit implementation"
266                     PURPOSE     "Needed for displaying previews for URLs in chat"
267                 )
268             endif()
269         endif()
270
271         if (WITH_WEBKIT AND Qt5WebKitWidgets_FOUND)
272             set(HAVE_WEBKIT true)
273         endif()
274         add_feature_info("WITH_WEBKIT, QtWebKit and QtWebKitWidgets modules" HAVE_WEBKIT "Support showing previews for URLs in chat (legacy)")
275
276         if (WITH_WEBENGINE)
277             find_package(Qt5WebEngine QUIET)
278             set_package_properties(Qt5WebEngine PROPERTIES TYPE RECOMMENDED
279                 URL "http://qt.digia.com"
280                 DESCRIPTION "a WebEngine implementation for Qt"
281                 PURPOSE     "Needed for displaying previews for URLs in chat"
282             )
283             if (Qt5WebEngine_FOUND)
284                 find_package(Qt5WebEngineWidgets QUIET)
285                 set_package_properties(Qt5WebEngineWidgets PROPERTIES TYPE RECOMMENDED
286                     URL "http://qt.digia.com"
287                     DESCRIPTION "widgets for Qt's WebEngine implementation"
288                     PURPOSE     "Needed for displaying previews for URLs in chat"
289                 )
290             endif()
291         endif()
292
293         if (WITH_WEBENGINE AND Qt5WebEngineWidgets_FOUND)
294             set(HAVE_WEBENGINE true)
295         endif()
296         add_feature_info("WITH_WEBENGINE, QtWebEngine and QtWebEngineWidgets modules" HAVE_WEBENGINE "Support showing previews for URLs in chat")
297
298         # KDE Frameworks
299         ################
300
301         if (WITH_KDE)
302             set(ecm_find_type "REQUIRED")
303         else()
304             # Even with KDE integration disabled, we optionally use tier1 frameworks if we find them
305             set(ecm_find_type "RECOMMENDED")
306         endif()
307
308         # extra-cmake-modules
309         find_package(ECM NO_MODULE QUIET)
310         set_package_properties(ECM PROPERTIES TYPE ${ecm_find_type}
311             URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules"
312             DESCRIPTION "extra modules for CMake, maintained by the KDE project"
313             PURPOSE     "Required to find KDE Frameworks components"
314         )
315
316         if (ECM_FOUND)
317             list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
318             if (WITH_KDE)
319                 find_package(KF5 COMPONENTS ConfigWidgets CoreAddons Notifications NotifyConfig TextWidgets WidgetsAddons XmlGui QUIET)
320                 set_package_properties(KF5 PROPERTIES TYPE REQUIRED
321                     URL "http://www.kde.org"
322                     DESCRIPTION "KDE Frameworks"
323                     PURPOSE     "Required for integration into the Plasma desktop"
324                 )
325             else()
326                 find_package(KF5Sonnet QUIET)
327                 set_package_properties(KF5Sonnet PROPERTIES TYPE RECOMMENDED
328                     URL "http://api.kde.org/frameworks-api/frameworks5-apidocs/sonnet/html"
329                     DESCRIPTION "framework for providing spell-checking capabilities"
330                     PURPOSE "Enables spell-checking support in input widgets"
331                 )
332             endif()
333         endif()
334
335     endif()
336
337     if (BUILD_CORE)
338         find_package(Qt5Script QUIET)
339         set_package_properties(Qt5Script PROPERTIES TYPE REQUIRED
340             DESCRIPTION "provides scripting support for Qt5"
341         )
342         find_package(Qt5Sql QUIET)
343         set_package_properties(Qt5Sql PROPERTIES TYPE REQUIRED
344             DESCRIPTION "the database support module for Qt5"
345         )
346
347         find_package(QCA2-QT5)
348         set_package_properties(QCA2-QT5 PROPERTIES TYPE RECOMMENDED
349             URL "https://projects.kde.org/projects/kdesupport/qca"
350             DESCRIPTION "Qt Cryptographic Architecture"
351             PURPOSE "Required for encryption support"
352         )
353
354     endif()
355
356     find_package(Qt5LinguistTools QUIET)
357     set_package_properties(Qt5LinguistTools PROPERTIES TYPE RECOMMENDED
358                            DESCRIPTION "contains tools for handling translation files"
359                            PURPOSE "Required for having translations"
360     )
361
362     # Some Qt5 versions do not define a target for lconvert, so we need to find it ourselves
363     if (Qt5LinguistTools_FOUND)
364         if (NOT TARGET Qt5::lconvert AND TARGET Qt5::lrelease)
365             get_target_property(_lrelease_location Qt5::lrelease LOCATION)
366             get_filename_component(_lrelease_path ${_lrelease_location} PATH)
367             find_program(QT_LCONVERT_EXECUTABLE NAMES lconvert-qt5 lconvert PATHS ${_lrelease_path} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
368         elseif(TARGET Qt5::lconvert AND NOT Qt5_LCONVERT_EXECUTABLE)
369             # Newer Qt5 versions define the target, but not the Qt5_LCONVERT_EXECUTABLE variable for some reason
370             get_target_property(QT_LCONVERT_EXECUTABLE Qt5::lconvert LOCATION)
371         endif()
372
373         # Compatibility with the Qt4 variables
374         set(QT_LRELEASE_EXECUTABLE ${Qt5_LRELEASE_EXECUTABLE})
375         set(QT_LUPDATE_EXECUTABLE ${Qt5_LUPDATE_EXECUTABLE})
376         if (Qt5_LCONVERT_EXECUTABLE)
377             set(QT_LCONVERT_EXECUTABLE ${Qt5_LCONVERT_EXECUTABLE})
378         endif()
379     endif()
380
381 else()
382     message(STATUS "Building for Qt4...")
383     set(QT_MIN_VERSION "4.8.0")
384
385     find_package(Qt4 ${QT_MIN_VERSION} QUIET REQUIRED)
386
387     if (BUILD_GUI)
388         add_feature_info("QtDBus module" QT_QTDBUS_FOUND "Needed for supporting D-Bus-based notifications and tray icon, used by most modern desktop environments")
389         if (QT_QTDBUS_FOUND)
390             find_package(dbusmenu-qt QUIET CONFIG)
391             set_package_properties(dbusmenu-qt PROPERTIES TYPE RECOMMENDED
392                 URL "https://launchpad.net/libdbusmenu-qt"
393                 DESCRIPTION "a library implementing the DBusMenu specification"
394                 PURPOSE     "Required for having a context menu for the D-Bus-based tray icon"
395             )
396         endif()
397
398         if (WITH_WEBKIT AND QT_QTWEBKIT_FOUND)
399             set(HAVE_WEBKIT true)
400         endif()
401         add_feature_info("WITH_WEBKIT and QtWebKit module" HAVE_WEBKIT "Support showing previews for URLs in chat")
402
403         if (WITH_KDE)
404             # KDE has overzealous CFLAGS making miniz not compile, so save our old flags
405             set(_cflags ${CMAKE_C_FLAGS})
406             find_package(KDE4 4.4 QUIET)
407             set_package_properties(KDE4 PROPERTIES TYPE REQUIRED
408                 URL "http://www.kde.org"
409                 DESCRIPTION "a world-class desktop environment"
410                 PURPOSE "Enables various bits for improving integration with KDE"
411             )
412             set(CMAKE_C_FLAGS ${_cflags})
413
414         else()
415             find_package(Phonon QUIET)
416             set_package_properties(Phonon PROPERTIES TYPE RECOMMENDED
417                 URL "https://projects.kde.org/projects/kdesupport/phonon"
418                 DESCRIPTION "a multimedia abstraction library"
419                 PURPOSE     "Required for audio notifications"
420             )
421         endif()
422
423         find_package(IndicateQt QUIET)
424         set_package_properties(IndicateQt PROPERTIES TYPE OPTIONAL
425             URL "https://launchpad.net/libindicate-qt/"
426             DESCRIPTION "a library to raise flags on DBus for other components of the desktop to pick up and visualize"
427             PURPOSE     "Provides integration into the Ayatana notification system used by e.g. Ubuntu"
428         )
429
430     endif()
431
432     if (BUILD_CORE)
433
434         find_package(QCA2 QUIET)
435         set_package_properties(QCA2 PROPERTIES TYPE RECOMMENDED
436             URL "https://projects.kde.org/projects/kdesupport/qca"
437             DESCRIPTION "Qt Cryptographic Architecture"
438             PURPOSE     "Required for encryption support"
439         )
440
441
442     endif()
443
444     # Qt4 does not consider lconvert relevant, so they don't support finding it...
445     # Rather than shipping hacked buildsys files, let's just infer the path from lrelease
446     if (QT_LRELEASE_EXECUTABLE)
447         get_filename_component(_lrelease_path ${QT_LRELEASE_EXECUTABLE} PATH)
448         find_program(QT_LCONVERT_EXECUTABLE NAMES lconvert-qt4 lconvert PATHS ${_lrelease_path} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
449     endif()
450 endif()
451
452
453 # Non-Qt-based packages
454
455 # zlib for compression, however we can always fall back to miniz
456 find_package(ZLIB QUIET)
457 set_package_properties(ZLIB PROPERTIES TYPE RECOMMENDED
458     URL "http://www.zlib.net"
459     DESCRIPTION "a popular compression library"
460     PURPOSE     "Use the most common library for protocol compression, instead of the bundled miniz implementation"
461 )
462
463
464 if (NOT WIN32)
465     # Execinfo is needed for generating backtraces
466     find_package(ExecInfo QUIET)
467     set_package_properties(ExecInfo PROPERTIES TYPE OPTIONAL
468         DESCRIPTION "a library for inspecting backtraces"
469         PURPOSE "Used for generating backtraces in case of a crash"
470     )
471 endif()
472
473 # Check for SSL support in Qt
474 # As there's no easy way to get Qt's configuration in particular for Qt5, let's just compile
475 # a small test program checking the defines. This works for both Qt4 and Qt5.
476 cmake_push_check_state(RESET)
477 set(CMAKE_REQUIRED_INCLUDES ${QT_INCLUDES} ${Qt5Core_INCLUDE_DIRS})
478 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
479
480 if (USE_QT5 AND Qt5_POSITION_INDEPENDENT_CODE)
481     set(CMAKE_REQUIRED_FLAGS "-fPIC -DQT_NO_VERSION_TAGGING")
482 endif()
483
484 check_cxx_source_compiles("
485     #include \"qglobal.h\"
486     #if defined QT_NO_SSL
487     #  error \"No SSL support\"
488     #endif
489     int main() {}"
490     HAVE_SSL)
491 cmake_pop_check_state()
492
493 # Additional compile settings
494 #####################################################################
495
496 # This sets -fPIC and friends if required by the installed Qt5 library
497 if (USE_QT5 AND Qt5_POSITION_INDEPENDENT_CODE)
498     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
499 endif()
500
501 # Needed to compile with mingw without kde
502 if (MINGW AND NOT KDE4_FOUND)
503     add_definitions(-D_WIN32_WINNT=0x0500)
504     message(STATUS "Added _WIN32_WINNT=0x0500 definition for MinGW")
505     # workaround for bug in mingw gcc 4.0
506     add_definitions(-U__STRICT_ANSI__)
507 endif()
508
509 # Sanitize compiler flags - old versions of KDE set -ansi, which breaks -std=c++11
510 if (CMAKE_COMPILER_IS_GNUCXX)
511     string(REPLACE "-ansi" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
512 endif()
513
514
515 # Setup KDE / KDE Frameworks
516 #####################################################################
517
518 # We want to do this up here, so we have the necessary variables and defines set before
519 # compiling anything
520
521 if (KDE4_FOUND)
522     # We always use external icons for KDE4 support, since we use its iconloader rather than Qt's
523     set(EMBED_DATA OFF)
524
525     # Better have the compile flags global, even for the core, to avoid problems with linking the mono client
526     add_definitions(-DHAVE_KDE -DHAVE_KDE4 ${KDE4_DEFINITIONS})
527     set(WITH_KDE4 TRUE)
528 endif()
529
530 if (USE_QT5 AND WITH_KDE)
531     # If KDE Frameworks are present, they're most probably providing Qt5 integration including icon loading
532     set(EMBED_DATA OFF)
533
534     include(KDEInstallDirs)
535     include(KDECompilerSettings)
536     include(KDECMakeSettings)
537
538     add_definitions(-DHAVE_KDE -DHAVE_KF5)
539     set(WITH_KF5 TRUE)
540 endif()
541
542 # This needs to come after setting up KDE integration, so we can use KDE-specific paths
543 include(QuasselInstallDirs)
544
545 # Various config-dependent checks and settings
546 #####################################################################
547
548 if (NOT ZLIB_FOUND)
549     message(STATUS "zlib NOT found, using bundled miniz for compression")
550     if (${CMAKE_SIZEOF_VOID_P} EQUAL 4)
551         message(STATUS "WARNING: This may be slow on 32 bit systems!")
552     endif()
553 endif()
554
555 if (HAVE_SSL)
556     add_definitions(-DHAVE_SSL)
557 endif()
558 add_feature_info("SSL support in Qt" HAVE_SSL "Use secure network connections")
559
560 # Check for syslog support
561 if (NOT WIN32)
562     check_include_file(syslog.h HAVE_SYSLOG)
563     add_feature_info("syslog.h" HAVE_SYSLOG "Provide support for logging to the syslog")
564 endif()
565
566 add_feature_info("Qt Linguist Tools" QT_LCONVERT_EXECUTABLE "Translation support for Quassel")
567
568 if (EMBED_DATA)
569     message(STATUS "Embedding data files into the binary")
570 else()
571     message(STATUS "Installing data files separately")
572 endif()
573
574 if (INDICATEQT_FOUND)
575     add_definitions(-DXDG_APPS_INSTALL_DIR=${CMAKE_INSTALL_APPDIR})
576 endif()
577
578 if (NOT WIN32)
579     check_function_exists(umask HAVE_UMASK)
580     if(HAVE_UMASK)
581         add_definitions(-DHAVE_UMASK)
582     endif()
583 endif()
584
585
586 # Windows-specific stuff
587 #####################################################################
588
589 if (WIN32)
590     link_libraries(imm32 winmm dbghelp Secur32)  # missing by default :/
591     if (MSVC)
592         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DNOMINMAX")
593         set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO "/debug /INCREMENTAL:YES /NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt")
594         set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:YES /NODEFAULTLIB:libcmt")
595         set(CMAKE_EXE_LINKER_FLAGS_DEBUGFULL "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
596         link_libraries(Version dwmapi shlwapi)
597         if (USE_QT5)
598             set(QT_QTMAIN_LIBRARY Qt5::WinMain)
599         endif()
600     endif()
601     if(HAVE_SSL AND STATIC)
602         find_package(OpenSSL REQUIRED)
603         link_libraries(${OPENSSL_LIBRARIES} ${OPENSSL_EAY_LIBRARIES})
604     endif()
605 endif()
606
607
608 # Static builds (very much non-portable, so don't use -DSTATIC
609 # unless you know what you do!)
610 #####################################################################
611
612 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
613     set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
614     link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
615     if (HAVE_SSL)
616         set(QUASSEL_SSL_LIBRARIES ssl crypto)  # these miss in static builds
617     endif()
618 endif()
619
620
621 # Generate version information from Git
622 #####################################################################
623
624 include(GetGitRevisionDescription)
625 get_git_head_revision(GIT_REFSPEC GIT_HEAD)
626 git_describe(GIT_DESCRIBE --long)
627
628 # If in a Git repo we can get the commit-date from a git command
629 if (GIT_HEAD)
630     execute_process(
631         COMMAND git show -s --format=%ct
632         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
633         OUTPUT_VARIABLE GIT_COMMIT_DATE
634         OUTPUT_STRIP_TRAILING_WHITESPACE
635     )
636 endif()
637
638 # If not in a Git repo try to read GIT_HEAD and GIT_DESCRIBE from
639 # enviroment
640 if (NOT GIT_HEAD OR NOT GIT_DESCRIBE)
641   if (DEFINED ENV{GIT_HEAD})
642       set(GIT_HEAD $ENV{GIT_HEAD})
643   endif()
644   if (DEFINED ENV{GIT_DESCRIBE})
645      set(GIT_DESCRIBE $ENV{GIT_DESCRIBE})
646   endif()
647 endif()
648
649 # Sanitize things if we're not in a Git repo
650 if (NOT GIT_HEAD OR NOT GIT_DESCRIBE)
651     set(GIT_HEAD "")
652     set(GIT_DESCRIBE "")
653     set(GIT_COMMIT_DATE 0)
654 endif()
655
656 configure_file(version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY)
657
658 # Prepare the build
659 #####################################################################
660
661 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
662 set(COMMON_DEPS ${RC_WIN32})
663 set(CORE_DEPS )
664 set(CLIENT_DEPS )
665
666 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
667 add_subdirectory(data)
668 add_subdirectory(icons)
669 add_subdirectory(pics)
670 add_subdirectory(po)
671
672
673 # Set up and display feature summary
674 #####################################################################
675
676 feature_summary(WHAT ALL
677                 INCLUDE_QUIET_PACKAGES
678                 FATAL_ON_MISSING_REQUIRED_PACKAGES
679 )
680
681 # Finally, compile the sources
682 # We want this after displaying the feature summary to avoid ugly
683 # CMake backtraces in case a required Qt5 module is missing
684 #####################################################################
685
686 add_subdirectory(src)