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_KDE=ON : Enable KDE4 support
11 # -DWITH_OXYGEN=(ON|OFF) : Whether to install Oxygen icons (default: yes, unless KDE > 4.3.0 is present and enabled)
13 # -DEMBED_DATA=ON : Embed all data files in icons the binary, rather than installing them separately
15 # -DQT=/path/to/qt : Choose a Qt4 installation to use instead of the system Qt4
16 # -DSTATIC=ON : Enable static building of Quassel. Use with care.
17 # -DDEPLOY=ON : Mac OS X only. Use only for creating Quassel Packages!
19 # NOTE: You should remove CMakeCache.txt if you plan to change any of these values!
23 cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
25 if(COMMAND cmake_policy)
26 cmake_policy(SET CMP0003 NEW)
27 endif(COMMAND cmake_policy)
29 # Use our own (well, and KDE's) version of some modules
30 # In particular cmake's own FindQt4 and FindOpenSSL are quite buggy
31 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
32 include(QuasselMacros)
34 # Various options and variables that can be set on the command line
35 option(WANT_CORE "Build the core (server) binary" ON)
36 option(WANT_QTCLIENT "Build the Qt4 GUI client binary" ON)
37 option(WANT_MONO "Build the monolithic (all-in-one) binary" ON)
39 option(WITH_OPENSSL "Enable OpenSSL support if present on the system" ON)
40 option(WITH_DBUS "Enable D-Bus support if present on the system" ON)
41 option(WITH_WEBKIT "Enable WebKit support (for link previews)" ON)
42 option(WITH_PHONON "Enable Phonon support (for audio notifications)" ON)
43 option(WITH_KDE "Enable KDE4 integration" OFF)
45 # We use icon paths from KDE 4.3.x, which are partially invalid on older and possibly
46 # even on newer KDE versions. Do not disable this unless you are sure that your Quassel will
47 # run on a matching KDE version only.
48 set(WITH_OXYGEN AUTO CACHE STRING "Install Oxygen icons (default is \"AUTO\" to install when KDE 4.3 or later is present")
50 option(STATIC "Enable static building (might not be portable)" OFF)
53 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)
56 # Default to embedding data in the static case
60 set(EMBED_DEFAULT ON) # should be OFF as soon as everything works
61 endif(STATIC OR WIN32)
63 option(EMBED_DATA "Embed all data files in the binary (rather than installing them separately)" ${EMBED_DEFAULT})
65 set(QT "" CACHE STRING "Path to a Qt installation to use instead of the system Qt (e.g. for static builds)")
66 set(LINGUAS "" CACHE STRING "Comma-separated list of locales specifying languages that should be compiled")
68 # Some settings imply others
70 add_definitions(-DSTATIC)
71 set(WITH_KDE OFF CACHE BOOL "Static building with KDE is not supported")
75 # We don't support separately installed resources yet on Win32
79 # For static builds, arbitrary extra libs might need to be linked
80 # Define a comma-separated list here
81 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
82 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
84 string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
85 link_libraries(${LINK_EXTRA})
89 # We need to make sure it's not empty
90 # Supported: Release, RelWithDebugInfo, Debug, Debugfull
92 # On WIN32, only Release seems to work correctly (?)
94 set(DEFAULT_BUILD_TYPE "Release")
96 set(DEFAULT_BUILD_TYPE "RelWithDebugInfo")
99 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type")
100 if(NOT CMAKE_BUILD_TYPE)
101 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type" FORCE)
102 endif(NOT CMAKE_BUILD_TYPE)
104 # Enable various flags on gcc
105 if(CMAKE_COMPILER_IS_GNUCXX)
106 # Let's just hope that all gccs support these options and skip the tests...
107 # -fno-strict-aliasing is needed apparently for Qt < 4.6
108 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi -Wall -Wextra -Wnon-virtual-dtor -fno-strict-aliasing")
109 set(CMAKE_CXX_FLAGS_RELWITHDEBUGINFO "-O2")
110 set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-reorder-blocks -fno-schedule-insns -fno-inline")
111 set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3")
112 endif(CMAKE_COMPILER_IS_GNUCXX)
114 if(WANT_MONO OR WANT_QTCLIENT)
115 set(QT_MIN_VERSION "4.4.1") # Client crashes often with 4.4.0
116 else(WANT_MONO OR WANT_QTCLIENT)
117 set(QT_MIN_VERSION "4.4.0")
118 endif(WANT_MONO OR WANT_QTCLIENT)
121 set(CMAKE_OSX_ARCHITECTURES "i386;ppc")
122 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4")
123 set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
124 add_definitions(-DMAC_10_4_SDK)
125 endif(APPLE AND DEPLOY)
127 # Execinfo is needed for generating backtraces
128 find_package(ExecInfo)
130 add_definitions(-DHAVE_EXECINFO)
131 include_directories(${EXECINFO_INCLUDES})
132 link_libraries(${EXECINFO_LIBRARIES})
133 endif(EXECINFO_FOUND)
135 # Select a Qt installation here, if you don't want to use system Qt
137 # FindQt4 will look for the qmake binary in $PATH, so we just prepend the Qt dir
138 set(ENV{PATH} ${QT}/bin:$ENV{PATH})
141 # Now that we have the correct $PATH, lets find Qt!
142 find_package(Qt4 REQUIRED)
144 set(QT_DONT_USE_QTGUI 1)
145 include(${QT_USE_FILE})
146 include_directories(${QT_INCLUDES})
150 find_package(OpenSSL)
152 message(STATUS "Disabling OpenSSL support")
156 if(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
157 message(STATUS "Found OpenSSL support in Qt")
158 add_definitions(-DHAVE_SSL)
160 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_SSL)
161 else(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
162 message(STATUS "No OpenSSL support found in Qt, disabling")
163 endif(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
165 add_definitions(-DQT_NO_OPENSSL)
168 # Setup D-Bus support
171 message(STATUS "Found QtDBus, enabling D-Bus support")
172 add_definitions(-DHAVE_DBUS)
175 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_DBUS)
176 else(QT_QTDBUS_FOUND)
177 message(STATUS "QtDBus not found, disabling D-Bus support")
178 endif(QT_QTDBUS_FOUND)
180 message(STATUS "Disabling D-Bus support")
183 # Setup QtWebKit support
185 if(QT_QTWEBKIT_FOUND)
186 message(STATUS "Found QtWebKit, enabling WebKit support")
187 add_definitions(-DHAVE_WEBKIT)
188 set(LINK_WEBKIT WEBKIT)
189 set(HAVE_WEBKIT true)
190 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_WEBKIT)
191 else(QT_QTWEBKIT_FOUND)
192 message(STATUS "QtWebKit not found, disabling WebKit support")
193 endif(QT_QTWEBKIT_FOUND)
195 message(STATUS "Disabling WebKit support")
202 message(STATUS "Enabling KDE4 integration")
203 include_directories(${KDE4_INCLUDES})
204 add_definitions(-DHAVE_KDE ${KDE4_DEFINITIONS})
206 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_KDE)
207 set(QUASSEL_KDE_LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBRARY} knotifyconfig)
208 # We always use external icons for KDE4 support, since we use its iconloader rather than our own
211 message(STATUS "KDE4 not found, disabling KDE integration")
214 message(STATUS "Disabling KDE4 integration")
217 # Setup Phonon support - we only need this if we don't have or want KDE4
222 message(STATUS "Enabling Phonon support")
223 add_definitions(-DHAVE_PHONON)
224 set(HAVE_PHONON true)
225 set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_PHONON)
227 message(STATUS "Phonon not found, disabling audio notifications")
230 message(STATUS "Disabling Phonon support")
234 # Now set up install locations; those are set by KDE if integration is enabled
237 set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path for binaries")
238 set(DATA_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/apps CACHE FILEPATH "Install path for data files")
239 set(ICON_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/icons CACHE FILEPATH "Global icon install path")
240 set(XDG_APPS_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/applications CACHE FILEPATH "Install path for .desktop files")
242 set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin CACHE FILEPATH "Install path for binaries")
243 set(DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/apps CACHE FILEPATH "Install path for data files")
244 set(ICON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/icons CACHE FILEPATH "Global icon install path")
245 set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications CACHE FILEPATH "Install path for .desktop files")
250 message(STATUS "Embedding data files into the binary")
252 message(STATUS "Installing data files separately")
255 # RPATH needs to be set correctly
256 # Do this down here, since otherwise KDE wants to handle it itself, and fails
257 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)
258 set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
260 # Set global buildflags
261 # This is very much non-portable, so don't use -DSTATIC until you know what
263 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
264 set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
265 link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
267 set(QUASSEL_SSL_LIBRARIES ssl crypto) # these miss in static builds
269 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
272 link_libraries(imm32 winmm dbghelp Secur32) # missing by default :/
275 link_libraries(${OPENSSL_LIBRARIES} libeay32MD)
279 # We need to create a version.gen
280 # For this, we create our genversion binary and make sure it is run every time.
281 add_executable(genversion ${CMAKE_SOURCE_DIR}/src/common/genversion.cpp)
282 target_link_libraries(genversion ${QT_LIBRARIES} ${QT_CORE_LIB_DEPENDENCIES})
284 get_target_property(GENVERSION_EXECUTABLE genversion LOCATION)
285 add_custom_target(genversion_run ALL ${GENVERSION_EXECUTABLE}
286 ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/version.gen)
287 add_dependencies(genversion_run genversion)
289 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
290 set(COMMON_DEPS ${RC_WIN32})
294 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
295 add_subdirectory(data)
296 add_subdirectory(icons)
297 add_subdirectory(pics)
298 add_subdirectory(i18n)
299 add_subdirectory(src)