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