1 # This is the cmake-based build system for Quassel IRC.
3 # You may pass various options to cmake:
4 # -DWANT_(CORE|QTCLIENT|MONO)=(ON|OFF)
5 # : select binaries to build
6 # -DWITH_OPENSSL=OFF : Disable OpenSSL support
7 # -DWITH_DBUS=OFF : Disable D-Bus support (dbus notifications)
8 # -DWITH_WEBKIT=OFF : Disable WebKit support (link previews)
9 # -DWITH_PHONON=OFF : Disable Phonon support (audio notifications)
10 # -DWITH_LIBINDICATE=OFF : Disable libindicate support (Ayatana notifications)
11 # -DWITH_KDE=ON : Enable KDE4 support
12 # -DWITH_CRYPT=OFF : Disable encryption support
13 # -DWITH_QML=ON : Enable the QML-based UI (requires Qt 4.7+)
14 # -DWITH_OXYGEN=(ON|OFF) : Whether to install Oxygen icons (default: yes, unless KDE > 4.3.0 is present and enabled)
16 # -DEMBED_DATA=ON : Embed all data files in icons the binary, rather than installing them separately
18 # -DQT=/path/to/qt : Choose a Qt4 installation to use instead of the system Qt4
19 # -DSTATIC=ON : Enable static building of Quassel. Use with care.
20 # -DDEPLOY=ON : Mac OS X only. Use only for creating Quassel Packages!
22 # NOTE: You should remove CMakeCache.txt if you plan to change any of these values!
26 # cmake 2.6.2 is required for KDE >=4.2 and should be widespread enough now
27 cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR)
29 if(COMMAND cmake_policy)
30 cmake_policy(SET CMP0003 NEW)
31 endif(COMMAND cmake_policy)
33 # Use our own (well, and KDE's) version of some modules
34 # In particular cmake's own FindQt4 and FindOpenSSL are quite buggy
35 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
36 include(QuasselMacros)
38 # Various options and variables that can be set on the command line
39 option(WANT_CORE "Build the core (server) binary" ON)
40 option(WANT_QTCLIENT "Build the Qt4 GUI client binary" ON)
41 option(WANT_MONO "Build the monolithic (all-in-one) binary" ON)
43 option(WITH_OPENSSL "Enable OpenSSL support if present on the system" ON)
44 option(WITH_DBUS "Enable D-Bus support if present on the system" ON)
45 option(WITH_WEBKIT "Enable WebKit support (for link previews)" ON)
46 option(WITH_PHONON "Enable Phonon support (for audio notifications)" ON)
47 option(WITH_LIBINDICATE "Enable Ayatana notification support" ON)
48 option(WITH_KDE "Enable KDE4 integration" OFF)
49 option(WITH_CRYPT "Enable encryption support if present on system" ON)
50 option(WITH_QML "Enable the QML-based UI" OFF)
52 # We use icon paths from KDE 4.3.x, which are partially invalid on older and possibly
53 # even on newer KDE versions. Do not disable this unless you are sure that your Quassel will
54 # run on a matching KDE version only.
55 set(WITH_OXYGEN AUTO CACHE STRING "Install Oxygen icons (default is \"AUTO\" to install when KDE 4.3 or later is present")
57 option(STATIC "Enable static building (might not be portable)" OFF)
60 option(DEPLOY "Mac OS X only! Adds required libs to bundle resources and create a dmg. Note: requires Qt to be built with 10.4u SDK" OFF)
63 # Default to embedding data in the static case
67 set(EMBED_DEFAULT ON) # should be OFF as soon as everything works
68 endif(STATIC OR WIN32)
70 option(EMBED_DATA "Embed all data files in the binary (rather than installing them separately)" ${EMBED_DEFAULT})
72 set(QT "" CACHE STRING "Path to a Qt installation to use instead of the system Qt (e.g. for static builds)")
74 # Some settings imply others
76 add_definitions(-DSTATIC)
77 set(WITH_KDE OFF CACHE BOOL "Static building with KDE is not supported")
81 # We don't support separately installed resources yet on Win32
85 # For static builds, arbitrary extra libs might need to be linked
86 # Define a comma-separated list here
87 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
88 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
90 string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
91 link_libraries(${LINK_EXTRA})
95 # We need to make sure it's not empty
96 # Supported: Release, RelWithDebugInfo, Debug, Debugfull
98 # On WIN32, only Release seems to work correctly (?)
100 set(DEFAULT_BUILD_TYPE "Release")
102 set(DEFAULT_BUILD_TYPE "RelWithDebugInfo")
105 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type")
106 if(NOT CMAKE_BUILD_TYPE)
107 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type" FORCE)
108 endif(NOT CMAKE_BUILD_TYPE)
110 # Enable various flags on gcc
111 if(CMAKE_COMPILER_IS_GNUCXX)
112 # Let's just hope that all gccs support these options and skip the tests...
113 # -fno-strict-aliasing is needed apparently for Qt < 4.6
114 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi -Wall -Wextra -Wnon-virtual-dtor -fno-strict-aliasing")
115 set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS}")
116 set(CMAKE_CXX_FLAGS_RELWITHDEBUGINFO "-g -O2 ${CMAKE_CXX_FLAGS}")
117 set(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb -fno-reorder-blocks -fno-schedule-insns -fno-inline ${CMAKE_CXX_FLAGS}")
118 set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 ${CMAKE_CXX_FLAGS_DEBUG}")
119 endif(CMAKE_COMPILER_IS_GNUCXX)
121 string(TOUPPER ${CMAKE_BUILD_TYPE} upper_build_type)
122 if(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
123 add_definitions(-DNDEBUG -DQT_NO_DEBUG)
124 else(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
126 endif(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
129 set(CMAKE_OSX_ARCHITECTURES "i386;ppc")
130 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4")
131 set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
132 add_definitions(-DMAC_10_4_SDK)
133 endif(APPLE AND DEPLOY)
136 if(WANT_MONO OR WANT_QTCLIENT)
138 endif(WANT_MONO OR WANT_QTCLIENT)
139 if(WANT_MONO OR WANT_CORE)
141 endif(WANT_MONO OR WANT_CORE)
146 # GUI stuff needs some new features
149 set(QT_MIN_VERSION "4.7.4")
151 set(QT_MIN_VERSION "4.6.0")
154 set(QT_MIN_VERSION "4.4.0")
157 # Execinfo is needed for generating backtraces
158 find_package(ExecInfo)
160 add_definitions(-DHAVE_EXECINFO)
161 include_directories(${EXECINFO_INCLUDES})
162 link_libraries(${EXECINFO_LIBRARIES})
163 endif(EXECINFO_FOUND)
165 # Select a Qt installation here, if you don't want to use system Qt
167 # FindQt4 will look for the qmake binary in $PATH, so we just prepend the Qt dir
168 set(ENV{PATH} ${QT}/bin:$ENV{PATH})
171 # Now that we have the correct $PATH, lets find Qt!
172 find_package(Qt4 REQUIRED)
174 set(QT_DONT_USE_QTGUI 1)
175 include(${QT_USE_FILE})
176 include_directories(${QT_INCLUDES})
178 # PkgConfig isn't strictly required.
179 # However, some optional deps might not be found if it's not present, so warn!
180 find_package(PkgConfig)
181 if(NOT PKG_CONFIG_FOUND)
182 message(STATUS "WARNING: PkgConfig not available! Some dependencies for optional features might not be found.")
183 message(STATUS " Affected features might include encryption support, DBus menus and Ayatana notifications.")
184 endif(NOT PKG_CONFIG_FOUND)
187 # We don't link to or include OpenSSL ourselves, but use exclusively the Qt API.
188 # Thus, we simply check if OpenSSL support is present in Qt's config and enable our
189 # own SSL stuff in this case. Qt should care for adding what it needs itself.
191 if(QT_QCONFIG MATCHES "openssl")
192 message(STATUS "Found OpenSSL support in Qt, enabling SSL")
193 add_definitions(-DHAVE_SSL)
195 else(QT_QCONFIG MATCHES "openssl")
196 message(STATUS "No OpenSSL support found in Qt, disabling SSL")
197 add_definitions(-DQT_NO_OPENSSL)
198 endif(QT_QCONFIG MATCHES "openssl")
200 message(STATUS "Not enabling OpenSSL support")
203 # Check for GUI specific stuff
206 # Setup D-Bus support
209 message(STATUS "Found QtDBus, enabling D-Bus support")
210 add_definitions(-DHAVE_DBUS)
211 set(CLIENT_QT4_VARS ${CLIENT_QT4_VARS} DBUS)
212 set(CLIENT_COMPILE_FLAGS "${CLIENT_COMPILE_FLAGS} -DQT_DBUS_LIB")
215 # check if we have dbusmenu as well
216 find_package(DBusMenuQt)
218 message(STATUS "Enabling support for exporting the tray menu via D-Bus")
219 add_definitions(-DHAVE_DBUSMENU)
220 include_directories(${DBUSMENUQT_INCLUDE_DIR})
221 set(CLIENT_LIBRARIES ${CLIENT_LIBRARIES} ${DBUSMENUQT_LIBRARIES})
222 set(CLIENT_COMPILE_FLAGS "${CLIENT_COMPILE_FLAGS} ${DBUSMENUQT_DEFINITIONS}")
223 else(DBUSMENUQT_FOUND)
224 message(STATUS "Disabling support for exporting the tray menu via D-Bus")
225 endif(DBUSMENUQT_FOUND)
227 else(QT_QTDBUS_FOUND)
228 message(STATUS "QtDBus not found, disabling D-Bus support")
229 endif(QT_QTDBUS_FOUND)
231 message(STATUS "Not enabling D-Bus support")
234 # Setup QtWebKit support
236 if(QT_QTWEBKIT_FOUND)
237 message(STATUS "Found QtWebKit, enabling WebKit support")
238 add_definitions(-DHAVE_WEBKIT)
239 set(CLIENT_QT4_VARS ${CLIENT_QT4_VARS} WEBKIT XMLPATTERNS)
240 set(CLIENT_COMPILE_FLAGS "${CLIENT_COMPILE_FLAGS} -DQT_WEBKIT_LIB -DQT_XMLPATTERNS_LIB")
241 set(HAVE_WEBKIT true)
242 else(QT_QTWEBKIT_FOUND)
243 message(STATUS "QtWebKit not found, disabling WebKit support")
244 endif(QT_QTWEBKIT_FOUND)
246 message(STATUS "Not enabling WebKit support")
251 if(QT_QTDECLARATIVE_FOUND)
252 message(STATUS "Found QtDeclarative, enabling the QML-based UI")
253 add_definitions(-DHAVE_QML)
254 set(CLIENT_QT4_VARS ${CLIENT_QT4_VARS} DECLARATIVE)
255 set(CLIENT_COMPILE_FLAGS "${CLIENT_COMPILE_FLAGS} -DQT_DECLARATIVE_LIB")
257 else(QT_QTDECLARATIVE_FOUND)
258 message(STATUS "QtDeclarative not found, disabling the QML-based UI")
259 endif(QT_QTDECLARATIVE_FOUND)
261 message(STATUS "Not enabling the QML-based UI")
268 message(STATUS "Enabling KDE4 integration")
269 include_directories(${KDE4_INCLUDES})
270 add_definitions(-DHAVE_KDE ${KDE4_DEFINITIONS})
272 set(CLIENT_LIBRARIES ${CLIENT_LIBRARIES} ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBRARY} ${KDE4_SOLID_LIBS} knotifyconfig)
273 # We always use external icons for KDE4 support, since we use its iconloader rather than our own
276 message(STATUS "KDE4 not found, disabling KDE integration")
279 message(STATUS "Not enabling KDE4 integration")
282 # Setup Phonon support - we only need this if we don't have or want KDE4
287 message(STATUS "Enabling Phonon support")
288 add_definitions(-DHAVE_PHONON)
289 include_directories(${PHONON_INCLUDES})
290 set(CLIENT_LIBRARIES ${CLIENT_LIBRARIES} ${PHONON_LIBS})
291 set(HAVE_PHONON true)
293 message(STATUS "Phonon not found, disabling audio notifications")
296 message(STATUS "Not enabling Phonon support")
300 # Setup libindicate-qt support
302 pkg_check_modules(INDICATEQT QUIET indicate-qt>=0.2.1)
304 message(STATUS "Enabling Ayatana notification support")
305 set(HAVE_INDICATEQT true)
306 add_definitions(-DHAVE_INDICATEQT)
307 link_directories(${INDICATEQT_LIBRARY_DIRS})
308 set(CLIENT_LIBRARIES ${CLIENT_LIBRARIES} ${INDICATEQT_LIBRARIES})
309 else(INDICATEQT_FOUND)
310 message(STATUS "Disabling Ayatana notification support")
311 endif(INDICATEQT_FOUND)
312 else(WITH_LIBINDICATE)
313 message(STATUS "Not enabling Ayatana notification support")
314 # We don't want to link against it even if another package has found it
315 set(INDICATEQT_LIBRARIES "")
316 endif(WITH_LIBINDICATE)
323 # Setup encryption support
327 message(STATUS "Found QCA2, enabling encryption support")
328 add_definitions(-DHAVE_QCA2)
331 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_QCA2)
333 message(STATUS "QCA2 not found, disabling encryption support")
336 message(STATUS "Not enabling encryption support")
341 # needed to compile with mingw without kde
342 if(MINGW AND NOT HAVE_KDE)
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(MINGW AND NOT HAVE_KDE)
349 # Now set up install locations; those are set by KDE if integration is enabled
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")
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")
365 message(STATUS "Embedding data files into the binary")
367 message(STATUS "Installing data files separately")
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)
375 # Set global buildflags
376 # This is very much non-portable, so don't use -DSTATIC until you know what
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
382 set(QUASSEL_SSL_LIBRARIES ssl crypto) # these miss in static builds
384 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
387 link_libraries(imm32 winmm dbghelp Secur32) # missing by default :/
389 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO "/debug /INCREMENTAL:YES /NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt")
390 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO}")
391 set(CMAKE_EXE_LINKER_FLAGS_DEBUGFULL "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO}")
392 link_libraries(Version dwmapi shlwapi)
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)
401 add_definitions(-DXDG_APPS_INSTALL_DIR=${XDG_APPS_INSTALL_DIR})
402 endif(HAVE_INDICATEQT)
404 # We need to create a version.gen
405 # For this, we create our genversion binary and make sure it is run every time.
406 add_executable(genversion ${CMAKE_SOURCE_DIR}/src/common/genversion.cpp)
407 target_link_libraries(genversion ${QT_LIBRARIES} ${QT_CORE_LIB_DEPENDENCIES})
409 get_target_property(GENVERSION_EXECUTABLE genversion LOCATION)
410 add_custom_target(genversion_run ALL ${GENVERSION_EXECUTABLE}
411 ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/version.gen)
412 add_dependencies(genversion_run genversion)
414 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
415 set(COMMON_DEPS ${RC_WIN32})
419 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
420 add_subdirectory(data)
421 add_subdirectory(icons)
422 add_subdirectory(pics)
424 add_subdirectory(qml)
425 add_subdirectory(src)