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