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_OXYGEN=(ON|OFF) : Whether to install Oxygen icons (default: yes, unless KDE > 4.3.0 is present and enabled)
15 # -DEMBED_DATA=ON : Embed all data files in icons the binary, rather than installing them separately
17 # -DQT=/path/to/qt : Choose a Qt4 installation to use instead of the system Qt4
18 # -DSTATIC=ON : Enable static building of Quassel. Use with care.
19 # -DDEPLOY=ON : Mac OS X only. Use only for creating Quassel Packages!
21 # NOTE: You should remove CMakeCache.txt if you plan to change any of these values!
25 # cmake 2.6.2 is required for KDE >=4.2 and should be widespread enough now
26 cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR)
28 if(COMMAND cmake_policy)
29 cmake_policy(SET CMP0003 NEW)
30 endif(COMMAND cmake_policy)
32 # Use our own (well, and KDE's) version of some modules
33 # In particular cmake's own FindQt4 and FindOpenSSL are quite buggy
34 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
35 include(QuasselMacros)
37 # Various options and variables that can be set on the command line
38 option(WANT_CORE "Build the core (server) binary" ON)
39 option(WANT_QTCLIENT "Build the Qt4 GUI client binary" ON)
40 option(WANT_MONO "Build the monolithic (all-in-one) binary" ON)
42 option(WITH_OPENSSL "Enable OpenSSL support if present on the system" ON)
43 option(WITH_DBUS "Enable D-Bus support if present on the system" ON)
44 option(WITH_WEBKIT "Enable WebKit support (for link previews)" ON)
45 option(WITH_PHONON "Enable Phonon support (for audio notifications)" ON)
46 option(WITH_LIBINDICATE "Enable Ayatana notification support" ON)
47 option(WITH_KDE "Enable KDE4 integration" OFF)
48 option(WITH_CRYPT "Enable encryption support if present on system" ON)
50 # We use icon paths from KDE 4.3.x, which are partially invalid on older and possibly
51 # even on newer KDE versions. Do not disable this unless you are sure that your Quassel will
52 # run on a matching KDE version only.
53 set(WITH_OXYGEN AUTO CACHE STRING "Install Oxygen icons (default is \"AUTO\" to install when KDE 4.3 or later is present")
55 option(STATIC "Enable static building (might not be portable)" OFF)
58 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)
61 # Default to embedding data in the static case
65 set(EMBED_DEFAULT ON) # should be OFF as soon as everything works
66 endif(STATIC OR WIN32)
68 option(EMBED_DATA "Embed all data files in the binary (rather than installing them separately)" ${EMBED_DEFAULT})
70 set(QT "" CACHE STRING "Path to a Qt installation to use instead of the system Qt (e.g. for static builds)")
72 # Some settings imply others
74 add_definitions(-DSTATIC)
75 set(WITH_KDE OFF CACHE BOOL "Static building with KDE is not supported")
79 # We don't support separately installed resources yet on Win32
83 # For static builds, arbitrary extra libs might need to be linked
84 # Define a comma-separated list here
85 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
86 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
88 string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
89 link_libraries(${LINK_EXTRA})
93 # We need to make sure it's not empty
94 # Supported: Release, RelWithDebugInfo, Debug, Debugfull
96 # On WIN32, only Release seems to work correctly (?)
98 set(DEFAULT_BUILD_TYPE "Release")
100 set(DEFAULT_BUILD_TYPE "RelWithDebugInfo")
103 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type")
104 if(NOT CMAKE_BUILD_TYPE)
105 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type" FORCE)
106 endif(NOT CMAKE_BUILD_TYPE)
108 # Enable various flags on gcc
109 if(CMAKE_COMPILER_IS_GNUCXX)
110 # Let's just hope that all gccs support these options and skip the tests...
111 # -fno-strict-aliasing is needed apparently for Qt < 4.6
112 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi -Wall -Wextra -Wnon-virtual-dtor -fno-strict-aliasing")
113 set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS}")
114 set(CMAKE_CXX_FLAGS_RELWITHDEBUGINFO "-g -O2 ${CMAKE_CXX_FLAGS}")
115 set(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb -fno-reorder-blocks -fno-schedule-insns -fno-inline ${CMAKE_CXX_FLAGS}")
116 set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 ${CMAKE_CXX_FLAGS_DEBUG}")
117 endif(CMAKE_COMPILER_IS_GNUCXX)
119 string(TOUPPER ${CMAKE_BUILD_TYPE} upper_build_type)
120 if(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
121 add_definitions(-DNDEBUG -DQT_NO_DEBUG)
122 else(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
124 endif(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
126 if(WANT_MONO OR WANT_QTCLIENT)
127 set(QT_MIN_VERSION "4.6.0")
128 else(WANT_MONO OR WANT_QTCLIENT)
129 set(QT_MIN_VERSION "4.4.0")
130 endif(WANT_MONO OR WANT_QTCLIENT)
133 set(CMAKE_OSX_ARCHITECTURES "i386;ppc")
134 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4")
135 set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
136 add_definitions(-DMAC_10_4_SDK)
137 endif(APPLE AND DEPLOY)
139 # Execinfo is needed for generating backtraces
140 find_package(ExecInfo)
142 add_definitions(-DHAVE_EXECINFO)
143 include_directories(${EXECINFO_INCLUDES})
144 link_libraries(${EXECINFO_LIBRARIES})
145 endif(EXECINFO_FOUND)
147 # Select a Qt installation here, if you don't want to use system Qt
149 # FindQt4 will look for the qmake binary in $PATH, so we just prepend the Qt dir
150 set(ENV{PATH} ${QT}/bin:$ENV{PATH})
153 # Now that we have the correct $PATH, lets find Qt!
154 find_package(Qt4 REQUIRED)
156 set(QT_DONT_USE_QTGUI 1)
157 include(${QT_USE_FILE})
158 include_directories(${QT_INCLUDES})
161 # We don't link to or include OpenSSL ourselves, but use exclusively the Qt API.
162 # Thus, we simply check if OpenSSL support is present in Qt's config and enable our
163 # own SSL stuff in this case. Qt should care for adding what it needs itself.
165 if(QT_QCONFIG MATCHES "openssl")
166 message(STATUS "Found OpenSSL support in Qt, enabling SSL")
167 add_definitions(-DHAVE_SSL)
169 else(QT_QCONFIG MATCHES "openssl")
170 message(STATUS "No OpenSSL support found in Qt, disabling SSL")
171 add_definitions(-DQT_NO_OPENSSL)
172 endif(QT_QCONFIG MATCHES "openssl")
174 message(STATUS "Not enabling OpenSSL support")
177 # Setup D-Bus support
180 message(STATUS "Found QtDBus, enabling D-Bus support")
181 add_definitions(-DHAVE_DBUS)
182 set(CLIENT_QT4_VARS ${CLIENT_QT4_VARS} DBUS)
183 set(CLIENT_COMPILE_FLAGS "${CLIENT_COMPILE_FLAGS} -DQT_DBUS_LIB")
185 else(QT_QTDBUS_FOUND)
186 message(STATUS "QtDBus not found, disabling D-Bus support")
187 endif(QT_QTDBUS_FOUND)
189 message(STATUS "Not enabling D-Bus support")
192 # Setup QtWebKit support
194 if(QT_QTWEBKIT_FOUND)
195 message(STATUS "Found QtWebKit, enabling WebKit support")
196 add_definitions(-DHAVE_WEBKIT)
197 set(CLIENT_QT4_VARS ${CLIENT_QT4_VARS} WEBKIT XMLPATTERNS)
198 set(CLIENT_COMPILE_FLAGS "${CLIENT_COMPILE_FLAGS} -DQT_WEBKIT_LIB -DQT_XMLPATTERNS_LIB")
199 set(HAVE_WEBKIT true)
200 else(QT_QTWEBKIT_FOUND)
201 message(STATUS "QtWebKit not found, disabling WebKit support")
202 endif(QT_QTWEBKIT_FOUND)
204 message(STATUS "Not enabling WebKit support")
211 message(STATUS "Enabling KDE4 integration")
212 include_directories(${KDE4_INCLUDES})
213 add_definitions(-DHAVE_KDE ${KDE4_DEFINITIONS})
215 set(QUASSEL_KDE_LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBRARY} ${KDE4_SOLID_LIBS} knotifyconfig)
216 # We always use external icons for KDE4 support, since we use its iconloader rather than our own
219 message(STATUS "KDE4 not found, disabling KDE integration")
222 message(STATUS "Not enabling KDE4 integration")
225 # needed to compile with mingw without kde
226 if(MINGW AND NOT HAVE_KDE)
227 add_definitions(-D_WIN32_WINNT=0x0500)
228 message(STATUS "Added _WIN32_WINNT=0x0500 definition for MinGW")
229 # workaround for bug in mingw gcc 4.0
230 add_definitions(-U__STRICT_ANSI__)
231 endif(MINGW AND NOT HAVE_KDE)
233 # Setup Phonon support - we only need this if we don't have or want KDE4
238 message(STATUS "Enabling Phonon support")
239 add_definitions(-DHAVE_PHONON)
240 set(HAVE_PHONON true)
242 message(STATUS "Phonon not found, disabling audio notifications")
245 message(STATUS "Not enabling Phonon support")
249 # Setup libindicate-qt support
251 find_package(PkgConfig QUIET)
253 pkg_check_modules(INDICATEQT indicate-qt>=0.2.1)
255 message(STATUS "Enabling Ayatana notification support")
256 set(HAVE_INDICATEQT true)
257 add_definitions(-DHAVE_INDICATEQT)
258 else(INDICATEQT_FOUND)
259 message(STATUS "Disabling Ayatana notification support")
260 endif(INDICATEQT_FOUND)
261 endif(PKG_CONFIG_FOUND)
262 else(WITH_LIBINDICATE)
263 message(STATUS "Not enabling Ayatana notification support")
264 # We don't want to link against it even if another package has found it
265 set(INDICATEQT_LIBRARIES "")
266 endif(WITH_LIBINDICATE)
268 # Setup encyption support
272 message(STATUS "Found QCA2, enabling encryption support")
273 add_definitions(-DHAVE_QCA2)
276 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_QCA2)
278 message(STATUS "QCA2 not found, disabling encryption support")
281 message(STATUS "Not enabling encryption support")
284 # Now set up install locations; those are set by KDE if integration is enabled
287 set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path for binaries")
288 set(DATA_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/apps CACHE FILEPATH "Install path for data files")
289 set(ICON_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/icons CACHE FILEPATH "Global icon install path")
290 set(XDG_APPS_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/applications CACHE FILEPATH "Install path for .desktop files")
292 set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin CACHE FILEPATH "Install path for binaries")
293 set(DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/apps CACHE FILEPATH "Install path for data files")
294 set(ICON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/icons CACHE FILEPATH "Global icon install path")
295 set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications CACHE FILEPATH "Install path for .desktop files")
300 message(STATUS "Embedding data files into the binary")
302 message(STATUS "Installing data files separately")
305 # RPATH needs to be set correctly
306 # Do this down here, since otherwise KDE wants to handle it itself, and fails
307 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)
308 set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
310 # Set global buildflags
311 # This is very much non-portable, so don't use -DSTATIC until you know what
313 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
314 set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
315 link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
317 set(QUASSEL_SSL_LIBRARIES ssl crypto) # these miss in static builds
319 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
322 link_libraries(imm32 winmm dbghelp Secur32) # missing by default :/
324 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO "/debug /INCREMENTAL:YES /NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt")
325 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO}")
326 set(CMAKE_EXE_LINKER_FLAGS_DEBUGFULL "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBUGINFO}")
327 link_libraries(Version dwmapi shlwapi)
329 if(HAVE_SSL AND STATIC)
330 find_package(OpenSSL REQUIRED)
331 link_libraries(${OPENSSL_LIBRARIES} ${OPENSSL_EAY_LIBRARIES})
332 endif(HAVE_SSL AND STATIC)
336 add_definitions(-DXDG_APPS_INSTALL_DIR=${XDG_APPS_INSTALL_DIR})
337 endif(HAVE_INDICATEQT)
339 # We need to create a version.gen
340 # For this, we create our genversion binary and make sure it is run every time.
341 add_executable(genversion ${CMAKE_SOURCE_DIR}/src/common/genversion.cpp)
342 target_link_libraries(genversion ${QT_LIBRARIES} ${QT_CORE_LIB_DEPENDENCIES})
344 get_target_property(GENVERSION_EXECUTABLE genversion LOCATION)
345 add_custom_target(genversion_run ALL ${GENVERSION_EXECUTABLE}
346 ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/version.gen)
347 add_dependencies(genversion_run genversion)
349 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
350 set(COMMON_DEPS ${RC_WIN32})
354 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
355 add_subdirectory(data)
356 add_subdirectory(icons)
357 add_subdirectory(pics)
359 add_subdirectory(src)