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