Remove obsolete CMake options
[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 cmake_minimum_required(VERSION 2.8.9)
10 project(QuasselIRC)
11
12 # Versions
13 set(QUASSEL_MAJOR  0)
14 set(QUASSEL_MINOR 11)
15 set(QUASSEL_PATCH  0)
16 set(QUASSEL_VERSION_STRING "0.11-pre")
17
18 # Tell CMake about or own modules
19 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
20
21 # General conveniences
22 set(CMAKE_AUTOMOC ON)
23 set(CMAKE_INCLUDE_CURRENT_DIR ON)
24
25 # Moar stuff
26 include(CheckFunctionExists)
27 include(CheckIncludeFile)
28
29 include(QuasselCompileSettings)
30 include(QuasselMacros)
31
32 include(CMakeDependentOption)
33 include(FeatureSummary)
34
35
36 # Options and variables that can be set on the command line
37 #####################################################################
38
39 # First, choose a Qt version. We support USE_QT4 and USE_QT5; if neither is set, prefer Qt4 for now
40 option(USE_QT5 "Enable support for Qt5 (disables KDE integration)" OFF)
41 if (USE_QT4) # takes precedence
42     set(USE_QT5 OFF)
43 else()
44     if (NOT USE_QT5)
45         set(USE_QT4 ON)
46     endif()
47 endif()
48
49 # Select the binaries to build
50 option(WANT_CORE     "Build the core (server) binary"           ON)
51 option(WANT_QTCLIENT "Build the client-only binary"             ON)
52 option(WANT_MONO     "Build the monolithic (all-in-one) binary" ON)
53 add_feature_info(WANT_CORE WANT_CORE "Build the core (server) binary")
54 add_feature_info(WANT_QTCLIENT WANT_QTCLIENT "Build the client-only binary (requires a core to connect to)")
55 add_feature_info(WANT_MONO WANT_MONO "Build the monolithic (all-in-one) binary")
56
57 # Whether to enable KDE integration (pulls in kdelibs and friends as a dependency); requires Qt4 for now
58 cmake_dependent_option(WITH_KDE "KDE4 integration" OFF "USE_QT4" OFF)
59 add_feature_info(WITH_KDE WITH_KDE "Enable KDE4 integration")
60
61 cmake_dependent_option(WITH_OXYGEN "Install Oxygen icon set (usually shipped with KDE)" ON "NOT WITH_KDE" OFF)
62 if (NOT WITH_KDE)
63     add_feature_info(WITH_OXYGEN WITH_OXYGEN "Install Oxygen icon set")
64 endif()
65
66 # For this, the feature info is added after we know if QtWebkit is installed
67 option(WITH_WEBKIT "WebKit support (for link previews)" ON)
68
69 if (APPLE)
70     # Notification Center is only available in > 10.8, which is Darwin v12
71     if (CMAKE_SYSTEM_VERSION VERSION_GREATER "11.9.9")
72         option(WITH_NOTIFICATION_CENTER "OS X Notification Center support" ON)
73         add_feature_info(WITH_NOTIFICATION_CENTER WITH_NOTIFICATION_CENTER "Use the OS X Notification Center")
74     endif()
75 endif()
76
77 # Always embed on Windows, OSX or for a static build; never embed when enabling KDE integration
78 set(EMBED_DEFAULT OFF)
79 if (STATIC OR WIN32 OR APPLE)
80     set(EMBED_DEFAULT ON)
81 endif()
82 cmake_dependent_option(EMBED_DATA "Embed icons and translations into the binaries instead of installing them" ${EMBED_DEFAULT}
83                                    "NOT STATIC;NOT WIN32;NOT WITH_KDE" ${EMBED_DEFAULT})
84 if (NOT EMBED_DEFAULT)
85     add_feature_info(EMBED_DATA EMBED_DATA "Embed icons and translations in the binaries instead of installing them")
86 endif()
87
88 # The following options are not for end-user consumption, so don't list them in the feature summary
89 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)
90
91 # Handle with care
92 set(QT_PATH "" CACHE PATH "Path to a Qt4 installation to use instead of the system Qt (e.g. for static builds)")
93
94 # 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)
95 cmake_dependent_option(STATIC      "Enable static building (not supported)" OFF "NOT WITH_KDE" OFF)
96
97 # For static builds, arbitrary extra libs might need to be linked
98 # Define a comma-separated list here
99 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
100 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
101 if (LINK_EXTRA)
102     string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
103     link_libraries(${LINK_EXTRA})
104 endif()
105
106
107 # Simplify later checks
108 #####################################################################
109
110 if (WANT_MONO OR WANT_QTCLIENT)
111     set(BUILD_GUI true)
112 endif()
113 if (WANT_MONO OR WANT_CORE)
114     set(BUILD_CORE true)
115 endif()
116
117
118 # Set up Qt
119 #####################################################################
120
121 if (USE_QT5)
122     message(STATUS "Building with the Qt5 libraries...")
123     set(QT_MIN_VERSION "5.2.0")
124     add_definitions(-DHAVE_QT5)
125 else()
126     message(STATUS "Building with the Qt4 libraries...")
127     if (BUILD_GUI)
128         set(QT_MIN_VERSION "4.6.0")
129     else()
130         set(QT_MIN_VERSION "4.4.0")
131     endif()
132 endif()
133
134 if (USE_QT5)
135     find_package(Qt5Core ${QT_MIN_VERSION} QUIET REQUIRED)
136
137     # Contains lconvert and friends
138     find_package(Qt5LinguistTools QUIET)
139     set_package_properties(Qt5LinguistTools PROPERTIES TYPE RECOMMENDED
140                            PURPOSE "Required for localization support"
141     )
142 else()
143     # Select a Qt installation here, if you don't want to use system Qt
144     if(QT_PATH)
145         # FindQt4 will look for the qmake binary in $PATH, so we just prepend QT_PATH
146         set(ENV{PATH} ${QT_PATH}/bin:$ENV{PATH})
147     endif()
148
149     # Now that we have the correct $PATH, lets find Qt!
150     find_package(Qt4 ${QT_MIN_VERSION} QUIET REQUIRED)
151 endif()
152
153 # Neither Qt4 nor Qt5 consider lconvert relevant, so they don't support finding it...
154 # Rather than shipping hacked buildsys files, let's just infer the path from lrelease
155 if (QT_LRELEASE_EXECUTABLE)
156     get_filename_component(_lrelease_path ${QT_LRELEASE_EXECUTABLE} PATH)
157     if (USE_QT5)
158         find_program(QT_LCONVERT_EXECUTABLE NAMES lconvert-qt5 lconvert PATHS ${_lrelease_path} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
159     else()
160         find_program(QT_LCONVERT_EXECUTABLE NAMES lconvert-qt4 lconvert PATHS ${_lrelease_path} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
161     endif()
162 endif()
163
164 add_feature_info("Qt Linguist Tools" QT_LRELEASE_EXECUTABLE "Translation support for Quassel")
165
166 # Optional Dependencies
167 #
168 # Note that you can forcefully disable optional packages
169 # using -DCMAKE_DISABLE_FIND_PACKAGE_<PkgName>=TRUE
170 #####################################################################
171
172 if(USE_QT5)
173     if (BUILD_GUI)
174         find_package(Qt5DBus QUIET)
175         set_package_properties(Qt5DBus PROPERTIES TYPE RECOMMENDED
176             URL "http://qt.digia.com"
177             DESCRIPTION "D-Bus support for Qt5"
178             PURPOSE     "Needed for supporting D-Bus-based notifications and tray icon, used by most modern desktop environments"
179         )
180         if (Qt5DBus_FOUND)
181             find_package(dbusmenu-qt5 QUIET)
182             set_package_properties(dbusmenu-qt5 PROPERTIES TYPE RECOMMENDED
183                 URL "https://launchpad.net/libdbusmenu-qt"
184                 DESCRIPTION "a library implementing the DBusMenu specification"
185                 PURPOSE     "Required for having a context menu for the D-Bus-based tray icon"
186             )
187         endif()
188
189         find_package(Phonon4Qt5 QUIET)
190         set_package_properties(Phonon4Qt5 PROPERTIES TYPE RECOMMENDED
191             URL "https://projects.kde.org/projects/kdesupport/phonon"
192             DESCRIPTION "a multimedia abstraction library"
193             PURPOSE     "Required for audio notifications"
194         )
195
196         if (WITH_WEBKIT)
197             find_package(Qt5Webkit QUIET)
198             set_package_properties(Qt5Webkit PROPERTIES TYPE RECOMMENDED
199                 URL "http://qt.digia.com"
200                 DESCRIPTION "a Webkit implementation for Qt"
201                 PURPOSE     "Needed for displaying previews for URLs in chat"
202             )
203         endif()
204         add_feature_info("WITH_WEBKIT and QtWebkit module" Qt5Webkit_FOUND "Support showing previews for URLs in chat")
205
206     endif(BUILD_GUI)
207     if (BUILD_CORE)
208         # While QCA2 seems to support Qt5, it is not actually co-installable or distinguishable from the Qt4 version...
209         # In order to avoid linking against the Qt4 version (which is probably the one installed), disable this for now
210         #find_package(QCA2 QUIET)
211         #set_package_properties(QCA2 PROPERTIES TYPE RECOMMENDED
212         #    URL "https://projects.kde.org/projects/kdesupport/qca"
213         #    DESCRIPTION "Qt Cryptographic Architecture"
214         #    PURPOSE "Required for encryption support"
215         #)
216
217     endif(BUILD_CORE)
218
219 else(USE_QT5)
220     if (BUILD_GUI)
221         add_feature_info("QtDBus module" QT_QTDBUS_FOUND "Needed for supporting D-Bus-based notifications and tray icon, used by most modern desktop environments")
222         if (QT_QTDBUS_FOUND)
223             find_package(libdbusmenu-qt QUIET)
224             set_package_properties(dbusmenu-qt 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
231         if (WITH_WEBKIT AND QT_QTWEBKIT_FOUND)
232             set(HAVE_WEBKIT true)
233         endif()
234         add_feature_info("WITH_WEBKIT and QtWebkit module" HAVE_WEBKIT "Support showing previews for URLs in chat")
235
236         if (WITH_KDE)
237             # KDE has overzealous CFLAGS making miniz not compile, so save our old flags
238             set(_cflags ${CMAKE_C_FLAGS})
239             find_package(KDE4 4.4 QUIET)
240             set_package_properties(KDE4 PROPERTIES TYPE REQUIRED
241                 URL "http://www.kde.org"
242                 DESCRIPTION "a world-class desktop environment"
243                 PURPOSE "Enables various bits for improving integration with KDE"
244             )
245             set(CMAKE_C_FLAGS ${_cflags})
246
247         else(WITH_KDE)
248             find_package(Phonon QUIET)
249             set_package_properties(Phonon PROPERTIES TYPE RECOMMENDED
250                 URL "https://projects.kde.org/projects/kdesupport/phonon"
251                 DESCRIPTION "a multimedia abstraction library"
252                 PURPOSE     "Required for audio notifications"
253             )
254
255             find_package(Libsnore QUIET)
256             set_package_properties(Libsnore PROPERTIES TYPE OPTIONAL
257                 URL "https://github.com/TheOneRing/Snorenotify"
258                 DESCRIPTION "a cross-platform notification framework"
259                 PURPOSE     "Enable support for the snorenotify framework"
260             )
261         endif(WITH_KDE)
262
263         find_package(IndicateQt QUIET)
264         set_package_properties(IndicateQt PROPERTIES TYPE OPTIONAL
265             URL "https://launchpad.net/libindicate-qt/"
266             DESCRIPTION "a library to raise flags on DBus for other components of the desktop to pick up and visualize"
267             PURPOSE     "Provides integration into the Ayatana notification system used by e.g. Ubuntu"
268         )
269
270     endif(BUILD_GUI)
271     if (BUILD_CORE)
272
273         find_package(QCA2 QUIET)
274         set_package_properties(QCA2 PROPERTIES TYPE RECOMMENDED
275             URL "https://projects.kde.org/projects/kdesupport/qca"
276             DESCRIPTION "Qt Cryptographic Architecture"
277             PURPOSE     "Required for encryption support"
278         )
279
280
281     endif()
282 endif()
283
284 # Non-Qt-based packages
285
286 # zlib for compression, however we can always fall back to miniz
287 find_package(ZLIB QUIET)
288 set_package_properties(ZLIB PROPERTIES TYPE RECOMMENDED
289     URL "http://www.zlib.net"
290     DESCRIPTION "a popular compression library"
291     PURPOSE     "Use the most common library for protocol compression, instead of the bundled miniz implementation"
292 )
293
294
295 if (NOT WIN32)
296     # Execinfo is needed for generating backtraces
297     find_package(ExecInfo QUIET)
298     set_package_properties(ExecInfo PROPERTIES TYPE OPTIONAL
299         DESCRIPTION "a library for inspecting backtraces"
300         PURPOSE "Used for generating backtraces in case of a crash"
301     )
302 endif()
303
304
305 # Various checks
306 #####################################################################
307
308 if (NOT ZLIB_FOUND)
309     message(STATUS "zlib NOT found, using bundled miniz for compression")
310     if (${CMAKE_SIZEOF_VOID_P} EQUAL 4)
311         message(STATUS "WARNING: This may be slow on 32 bit systems!")
312     endif()
313 endif()
314
315 if (KDE4_FOUND)
316     # We always use external icons for KDE4 support, since we use its iconloader rather than our own
317     set(EMBED_DATA OFF)
318
319     # Better have the compile flags global, even for the core, to avoid problems with linking the mono client
320     add_definitions(-DHAVE_KDE ${KDE4_DEFINITIONS})
321 endif()
322
323 # Check for SSL support in Qt (broken for Qt5 currently)
324 # We don't link to the OpenSSL libraries ourselves.
325 if (QT_QCONFIG MATCHES "openssl")
326     set(HAVE_SSL true)
327     add_definitions(-DHAVE_SSL)
328 endif()
329 add_feature_info("SSL support in Qt" HAVE_SSL "Use secure network connections")
330
331 # Check for syslog support
332 if (NOT WIN32)
333     check_include_file(syslog.h HAVE_SYSLOG)
334     add_feature_info("syslog.h" HAVE_SYSLOG "Provide support for logging to the syslog")
335 endif()
336
337
338 # Various settings
339 ##################
340
341 # needed to compile with mingw without kde
342 if (MINGW AND NOT KDE4_FOUND)
343     add_definitions(-D_WIN32_WINNT=0x0500)
344     message(STATUS "Added _WIN32_WINNT=0x0500 definition for MinGW")
345 # workaround for bug in mingw gcc 4.0
346     add_definitions(-U__STRICT_ANSI__)
347 endif()
348
349 # Now set up install locations; those are set by KDE if integration is enabled
350 if(NOT KDE4_FOUND)
351   if(WIN32)
352     set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path for binaries")
353     set(DATA_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/apps CACHE FILEPATH "Install path for data files")
354     set(ICON_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/icons CACHE FILEPATH "Global icon install path")
355     set(XDG_APPS_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/applications CACHE FILEPATH "Install path for .desktop files")
356   else(WIN32)
357     set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin CACHE FILEPATH "Install path for binaries")
358     set(DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/apps CACHE FILEPATH "Install path for data files")
359     set(ICON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/icons CACHE FILEPATH "Global icon install path")
360     set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications CACHE FILEPATH "Install path for .desktop files")
361   endif(WIN32)
362 endif()
363
364 if(EMBED_DATA)
365   message(STATUS "Embedding data files into the binary")
366 else(EMBED_DATA)
367   message(STATUS "Installing data files separately")
368 endif(EMBED_DATA)
369
370 # RPATH needs to be set correctly
371 # Do this down here, since otherwise KDE wants to handle it itself, and fails
372 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)
373 set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
374
375 # Set global buildflags
376 # This is very much non-portable, so don't use -DSTATIC until you know what
377 # you do.
378 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
379   set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
380   link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
381   if(HAVE_SSL)
382     set(QUASSEL_SSL_LIBRARIES ssl crypto)  # these miss in static builds
383   endif(HAVE_SSL)
384 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
385
386 if(WIN32)
387   link_libraries(imm32 winmm dbghelp Secur32)  # missing by default :/
388   if(MSVC)
389     set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO "/debug /INCREMENTAL:YES /NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt")
390     set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /INCREMENTAL:YES /NODEFAULTLIB:libcmt")
391     set(CMAKE_EXE_LINKER_FLAGS_DEBUGFULL "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
392     link_libraries(Version dwmapi shlwapi)
393   endif(MSVC)
394   if(HAVE_SSL AND STATIC)
395      find_package(OpenSSL REQUIRED)
396      link_libraries(${OPENSSL_LIBRARIES} ${OPENSSL_EAY_LIBRARIES})
397   endif(HAVE_SSL AND STATIC)
398 endif(WIN32)
399
400 if(INDICATEQT_FOUND)
401   add_definitions(-DXDG_APPS_INSTALL_DIR=${XDG_APPS_INSTALL_DIR})
402 endif()
403
404 if(NOT WIN32)
405   check_function_exists(umask HAVE_UMASK)
406   if(HAVE_UMASK)
407     add_definitions(-DHAVE_UMASK)
408   endif(HAVE_UMASK)
409 endif(NOT WIN32)
410
411 # Generate version information from Git
412 include(GetGitRevisionDescription)
413 get_git_head_revision(GIT_REFSPEC GIT_HEAD)
414 git_describe(GIT_DESCRIBE --long)
415
416 # Sanitize things if we're not in a Git repo
417 if(NOT GIT_HEAD OR NOT GIT_DESCRIBE)
418     set(GIT_HEAD "")
419     set(GIT_DESCRIBE "")
420 endif()
421
422 configure_file(version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY)
423
424 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
425 set(COMMON_DEPS ${RC_WIN32})
426 set(CORE_DEPS )
427 set(CLIENT_DEPS )
428
429 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
430 add_subdirectory(data)
431 add_subdirectory(icons)
432 add_subdirectory(pics)
433 add_subdirectory(po)
434 add_subdirectory(src)
435
436 # Set up and display feature summary
437 #####################################################################
438
439 feature_summary(WHAT ALL
440                 INCLUDE_QUIET_PACKAGES
441                 FATAL_ON_MISSING_REQUIRED_PACKAGES
442 )