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_OXYGEN=(ON|OFF) : Whether to install Oxygen icons (default: yes, unless KDE > 4.3.0 is present and enabled)
14 # -DEMBED_DATA=ON : Embed all data files in icons the binary, rather than installing them separately
16 # -DQT=/path/to/qt : Choose a Qt4 installation to use instead of the system Qt4
17 # -DSTATIC=ON : Enable static building of Quassel. Use with care.
18 # -DDEPLOY=ON : Mac OS X only. Use only for creating Quassel Packages!
20 # NOTE: You should remove CMakeCache.txt if you plan to change any of these values!
24 cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
26 if(COMMAND cmake_policy)
27 cmake_policy(SET CMP0003 NEW)
28 endif(COMMAND cmake_policy)
30 # Use our own (well, and KDE's) version of some modules
31 # In particular cmake's own FindQt4 and FindOpenSSL are quite buggy
32 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
33 include(QuasselMacros)
35 # Various options and variables that can be set on the command line
36 option(WANT_CORE "Build the core (server) binary" ON)
37 option(WANT_QTCLIENT "Build the Qt4 GUI client binary" ON)
38 option(WANT_MONO "Build the monolithic (all-in-one) binary" ON)
40 option(WITH_OPENSSL "Enable OpenSSL support if present on the system" ON)
41 option(WITH_DBUS "Enable D-Bus support if present on the system" ON)
42 option(WITH_WEBKIT "Enable WebKit support (for link previews)" ON)
43 option(WITH_PHONON "Enable Phonon support (for audio notifications)" ON)
44 option(WITH_LIBINDICATE "Enable Ayatana notification support" ON)
45 option(WITH_KDE "Enable KDE4 integration" OFF)
47 # We use icon paths from KDE 4.3.x, which are partially invalid on older and possibly
48 # even on newer KDE versions. Do not disable this unless you are sure that your Quassel will
49 # run on a matching KDE version only.
50 set(WITH_OXYGEN AUTO CACHE STRING "Install Oxygen icons (default is \"AUTO\" to install when KDE 4.3 or later is present")
52 option(STATIC "Enable static building (might not be portable)" OFF)
55 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)
58 # Default to embedding data in the static case
62 set(EMBED_DEFAULT ON) # should be OFF as soon as everything works
63 endif(STATIC OR WIN32)
65 option(EMBED_DATA "Embed all data files in the binary (rather than installing them separately)" ${EMBED_DEFAULT})
67 set(QT "" CACHE STRING "Path to a Qt installation to use instead of the system Qt (e.g. for static builds)")
69 # Some settings imply others
71 add_definitions(-DSTATIC)
72 set(WITH_KDE OFF CACHE BOOL "Static building with KDE is not supported")
76 # We don't support separately installed resources yet on Win32
80 # For static builds, arbitrary extra libs might need to be linked
81 # Define a comma-separated list here
82 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
83 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
85 string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
86 link_libraries(${LINK_EXTRA})
90 # We need to make sure it's not empty
91 # Supported: Release, RelWithDebugInfo, Debug, Debugfull
93 # On WIN32, only Release seems to work correctly (?)
95 set(DEFAULT_BUILD_TYPE "Release")
97 set(DEFAULT_BUILD_TYPE "RelWithDebugInfo")
100 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type")
101 if(NOT CMAKE_BUILD_TYPE)
102 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type" FORCE)
103 endif(NOT CMAKE_BUILD_TYPE)
105 # Enable various flags on gcc
106 if(CMAKE_COMPILER_IS_GNUCXX)
107 # Let's just hope that all gccs support these options and skip the tests...
108 # -fno-strict-aliasing is needed apparently for Qt < 4.6
109 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi -Wall -Wextra -Wnon-virtual-dtor -fno-strict-aliasing")
110 set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS}")
111 set(CMAKE_CXX_FLAGS_RELWITHDEBUGINFO "-g -O2 ${CMAKE_CXX_FLAGS}")
112 set(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb -fno-reorder-blocks -fno-schedule-insns -fno-inline ${CMAKE_CXX_FLAGS}")
113 set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 ${CMAKE_CXX_FLAGS_DEBUG}")
114 endif(CMAKE_COMPILER_IS_GNUCXX)
116 string(TOUPPER ${CMAKE_BUILD_TYPE} upper_build_type)
117 if(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
118 add_definitions(-DNDEBUG -DQT_NO_DEBUG)
119 else(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
121 endif(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
123 if(WANT_MONO OR WANT_QTCLIENT)
124 set(QT_MIN_VERSION "4.5.0")
125 else(WANT_MONO OR WANT_QTCLIENT)
126 set(QT_MIN_VERSION "4.4.0")
127 endif(WANT_MONO OR WANT_QTCLIENT)
130 set(CMAKE_OSX_ARCHITECTURES "i386;ppc")
131 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4")
132 set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
133 add_definitions(-DMAC_10_4_SDK)
134 endif(APPLE AND DEPLOY)
136 # Execinfo is needed for generating backtraces
137 find_package(ExecInfo)
139 add_definitions(-DHAVE_EXECINFO)
140 include_directories(${EXECINFO_INCLUDES})
141 link_libraries(${EXECINFO_LIBRARIES})
142 endif(EXECINFO_FOUND)
144 # Select a Qt installation here, if you don't want to use system Qt
146 # FindQt4 will look for the qmake binary in $PATH, so we just prepend the Qt dir
147 set(ENV{PATH} ${QT}/bin:$ENV{PATH})
150 # Now that we have the correct $PATH, lets find Qt!
151 find_package(Qt4 REQUIRED)
153 set(QT_DONT_USE_QTGUI 1)
154 include(${QT_USE_FILE})
155 include_directories(${QT_INCLUDES})
159 find_package(OpenSSL)
161 message(STATUS "Not enabling OpenSSL support")
165 if(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
166 message(STATUS "Found OpenSSL support in Qt")
167 add_definitions(-DHAVE_SSL)
169 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_SSL)
170 else(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
171 message(STATUS "No OpenSSL support found in Qt, disabling")
172 endif(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
174 add_definitions(-DQT_NO_OPENSSL)
177 # Setup D-Bus support
180 message(STATUS "Found QtDBus, enabling D-Bus support")
181 add_definitions(-DHAVE_DBUS)
184 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_DBUS)
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(LINK_WEBKIT WEBKIT)
198 set(HAVE_WEBKIT true)
199 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_WEBKIT)
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(MOC_DEFINES ${MOC_DEFINES} -DHAVE_KDE)
216 set(QUASSEL_KDE_LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBRARY} ${KDE4_SOLID_LIBS} knotifyconfig)
217 # We always use external icons for KDE4 support, since we use its iconloader rather than our own
220 message(STATUS "KDE4 not found, disabling KDE integration")
223 message(STATUS "Not enabling KDE4 integration")
226 # Setup Phonon support - we only need this if we don't have or want KDE4
231 message(STATUS "Enabling Phonon support")
232 add_definitions(-DHAVE_PHONON)
233 set(HAVE_PHONON true)
234 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_PHONON)
236 message(STATUS "Phonon not found, disabling audio notifications")
239 message(STATUS "Not enabling Phonon support")
243 # Setup libindicate-qt support
245 find_package(PkgConfig QUIET)
247 pkg_check_modules(INDICATEQT indicate-qt>=0.2.1)
249 message(STATUS "Enabling Ayatana notification support")
250 add_definitions(-DHAVE_INDICATEQT)
251 else(INDICATEQT_FOUND)
252 message(STATUS "Disabling Ayatana notification support")
253 endif(INDICATEQT_FOUND)
254 endif(PKG_CONFIG_FOUND)
255 else(WITH_LIBINDICATE)
256 message(STATUS "Not enabling Ayatana notification support")
257 endif(WITH_LIBINDICATE)
259 # Now set up install locations; those are set by KDE if integration is enabled
262 set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path for binaries")
263 set(DATA_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/apps CACHE FILEPATH "Install path for data files")
264 set(ICON_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/icons CACHE FILEPATH "Global icon install path")
265 set(XDG_APPS_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/applications CACHE FILEPATH "Install path for .desktop files")
267 set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin CACHE FILEPATH "Install path for binaries")
268 set(DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/apps CACHE FILEPATH "Install path for data files")
269 set(ICON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/icons CACHE FILEPATH "Global icon install path")
270 set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications CACHE FILEPATH "Install path for .desktop files")
275 message(STATUS "Embedding data files into the binary")
277 message(STATUS "Installing data files separately")
280 # RPATH needs to be set correctly
281 # Do this down here, since otherwise KDE wants to handle it itself, and fails
282 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)
283 set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
285 # Set global buildflags
286 # This is very much non-portable, so don't use -DSTATIC until you know what
288 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
289 set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
290 link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
292 set(QUASSEL_SSL_LIBRARIES ssl crypto) # these miss in static builds
294 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
297 link_libraries(imm32 winmm dbghelp Secur32) # missing by default :/
300 link_libraries(${OPENSSL_LIBRARIES} libeay32MD)
305 add_definitions(-DXDG_APPS_INSTALL_DIR=${XDG_APPS_INSTALL_DIR})
306 endif(INDICATEQT_FOUND)
308 # We need to create a version.gen
309 # For this, we create our genversion binary and make sure it is run every time.
310 add_executable(genversion ${CMAKE_SOURCE_DIR}/src/common/genversion.cpp)
311 target_link_libraries(genversion ${QT_LIBRARIES} ${QT_CORE_LIB_DEPENDENCIES})
313 get_target_property(GENVERSION_EXECUTABLE genversion LOCATION)
314 add_custom_target(genversion_run ALL ${GENVERSION_EXECUTABLE}
315 ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/version.gen)
316 add_dependencies(genversion_run genversion)
318 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
319 set(COMMON_DEPS ${RC_WIN32})
323 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
324 add_subdirectory(data)
325 add_subdirectory(icons)
326 add_subdirectory(pics)
328 add_subdirectory(src)