8176e0aa7e3a726ce20f0912d638ad6fa4b6a00e
[quassel.git] / CMakeLists.txt
1 # This is the cmake-based build system for Quassel IRC.
2 #
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)
13 #
14 # -DEMBED_DATA=ON        : Embed all data files in icons the binary, rather than installing them separately
15 #
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!
19 #
20 # NOTE: You should remove CMakeCache.txt if you plan to change any of these values!
21
22 project(QuasselIRC)
23
24 cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
25
26 if(COMMAND cmake_policy)
27    cmake_policy(SET CMP0003 NEW)
28 endif(COMMAND cmake_policy)
29
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)
34
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)
39
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)
46
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")
51
52 option(STATIC        "Enable static building (might not be portable)" OFF)
53
54 if(APPLE)
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)
56 endif(APPLE)
57
58 # Default to embedding data in the static case
59 if(STATIC OR WIN32)
60   set(EMBED_DEFAULT ON)
61 else(STATIC OR WIN32)
62   set(EMBED_DEFAULT ON) # should be OFF as soon as everything works
63 endif(STATIC OR WIN32)
64
65 option(EMBED_DATA    "Embed all data files in the binary (rather than installing them separately)"   ${EMBED_DEFAULT})
66
67 set(QT "" CACHE STRING "Path to a Qt installation to use instead of the system Qt (e.g. for static builds)")
68 set(LINGUAS "" CACHE STRING "Comma-separated list of locales specifying languages that should be compiled")
69
70 # Some settings imply others
71 if(STATIC)
72   add_definitions(-DSTATIC)
73   set(WITH_KDE OFF CACHE BOOL "Static building with KDE is not supported")
74 endif(STATIC)
75
76 if(WIN32)
77   # We don't support separately installed resources yet on Win32
78   set(EMBED_DATA ON)
79 endif(WIN32)
80
81 # For static builds, arbitrary extra libs might need to be linked
82 # Define a comma-separated list here
83 # e.g. for pgsql, we need -DLINK_EXTRA=pq;crypt
84 set(LINK_EXTRA "" CACHE STRING "Semicolon-separated list of libraries to be linked")
85 if(LINK_EXTRA)
86   string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
87   link_libraries(${LINK_EXTRA})
88 endif(LINK_EXTRA)
89
90 # Build Type
91 # We need to make sure it's not empty
92 # Supported: Release, RelWithDebugInfo, Debug, Debugfull
93
94 # On WIN32, only Release seems to work correctly (?)
95 if(WIN32)
96   set(DEFAULT_BUILD_TYPE "Release")
97 else(WIN32)
98   set(DEFAULT_BUILD_TYPE "RelWithDebugInfo")
99 endif(WIN32)
100
101 set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type")
102 if(NOT CMAKE_BUILD_TYPE)
103   set(CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING "CMake Build Type" FORCE)
104 endif(NOT CMAKE_BUILD_TYPE)
105
106 # Enable various flags on gcc
107 if(CMAKE_COMPILER_IS_GNUCXX)
108   # Let's just hope that all gccs support these options and skip the tests...
109   # -fno-strict-aliasing is needed apparently for Qt < 4.6
110   set(CMAKE_CXX_FLAGS                  "${CMAKE_CXX_FLAGS} -ansi -Wall -Wextra -Wnon-virtual-dtor -fno-strict-aliasing")
111   set(CMAKE_CXX_FLAGS_RELEASE          "-O2 ${CMAKE_CXX_FLAGS}")
112   set(CMAKE_CXX_FLAGS_RELWITHDEBUGINFO "-g -O2 ${CMAKE_CXX_FLAGS}")
113   set(CMAKE_CXX_FLAGS_DEBUG            "-g -ggdb -fno-reorder-blocks -fno-schedule-insns -fno-inline ${CMAKE_CXX_FLAGS}")
114   set(CMAKE_CXX_FLAGS_DEBUGFULL        "-g3 ${CMAKE_CXX_FLAGS_DEBUG}")
115 endif(CMAKE_COMPILER_IS_GNUCXX)
116
117 string(TOUPPER ${CMAKE_BUILD_TYPE} upper_build_type)
118 if(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
119   add_definitions(-DNDEBUG -DQT_NO_DEBUG)
120 else(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
121   set(DEBUG 1)
122 endif(upper_build_type STREQUAL "RELEASE" OR upper_build_type STREQUAL "RELWITHDEBUGINFO")
123
124 if(WANT_MONO OR WANT_QTCLIENT)
125   set(QT_MIN_VERSION "4.4.1") # Client crashes often with 4.4.0
126 else(WANT_MONO OR WANT_QTCLIENT)
127   set(QT_MIN_VERSION "4.4.0")
128 endif(WANT_MONO OR WANT_QTCLIENT)
129
130 if(APPLE AND DEPLOY)
131   set(CMAKE_OSX_ARCHITECTURES "i386;ppc")
132   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4")
133   set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
134   add_definitions(-DMAC_10_4_SDK)
135 endif(APPLE AND DEPLOY)
136
137 # Execinfo is needed for generating backtraces
138 find_package(ExecInfo)
139 if(EXECINFO_FOUND)
140   add_definitions(-DHAVE_EXECINFO)
141   include_directories(${EXECINFO_INCLUDES})
142   link_libraries(${EXECINFO_LIBRARIES})
143 endif(EXECINFO_FOUND)
144
145 # Select a Qt installation here, if you don't want to use system Qt
146 if(QT)
147   # FindQt4 will look for the qmake binary in $PATH, so we just prepend the Qt dir
148   set(ENV{PATH} ${QT}/bin:$ENV{PATH})
149 endif(QT)
150
151 # Now that we have the correct $PATH, lets find Qt!
152 find_package(Qt4 REQUIRED)
153
154 set(QT_DONT_USE_QTGUI 1)
155 include(${QT_USE_FILE})
156 include_directories(${QT_INCLUDES})
157
158 # Setup OpenSSL
159 if(WITH_OPENSSL)
160   find_package(OpenSSL)
161 else(WITH_OPENSSL)
162   message(STATUS "Not enabling OpenSSL support")
163 endif(WITH_OPENSSL)
164
165 if(OPENSSL_FOUND)
166   if(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
167     message(STATUS "Found OpenSSL support in Qt")
168     add_definitions(-DHAVE_SSL)
169     set(HAVE_SSL true)
170     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_SSL)
171   else(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
172     message(STATUS "No OpenSSL support found in Qt, disabling")
173   endif(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
174 else(OPENSSL_FOUND)
175   add_definitions(-DQT_NO_OPENSSL)
176 endif(OPENSSL_FOUND)
177
178 # Setup D-Bus support
179 if(WITH_DBUS)
180   if(QT_QTDBUS_FOUND)
181     message(STATUS "Found QtDBus, enabling D-Bus support")
182     add_definitions(-DHAVE_DBUS)
183     set(LINK_DBUS DBUS)
184     set(HAVE_DBUS true)
185     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_DBUS)
186   else(QT_QTDBUS_FOUND)
187     message(STATUS "QtDBus not found, disabling D-Bus support")
188   endif(QT_QTDBUS_FOUND)
189 else(WITH_DBUS)
190   message(STATUS "Not enabling D-Bus support")
191 endif(WITH_DBUS)
192
193 # Setup QtWebKit support
194 if(WITH_WEBKIT)
195   if(QT_QTWEBKIT_FOUND)
196     message(STATUS "Found QtWebKit, enabling WebKit support")
197     add_definitions(-DHAVE_WEBKIT)
198     set(LINK_WEBKIT WEBKIT)
199     set(HAVE_WEBKIT true)
200     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_WEBKIT)
201   else(QT_QTWEBKIT_FOUND)
202     message(STATUS "QtWebKit not found, disabling WebKit support")
203   endif(QT_QTWEBKIT_FOUND)
204 else(WITH_WEBKIT)
205   message(STATUS "Not enabling WebKit support")
206 endif(WITH_WEBKIT)
207
208 # Setup KDE4 support
209 if(WITH_KDE)
210   find_package(KDE4)
211   if(KDE4_FOUND)
212     message(STATUS "Enabling KDE4 integration")
213     include_directories(${KDE4_INCLUDES})
214     add_definitions(-DHAVE_KDE ${KDE4_DEFINITIONS})
215     set(HAVE_KDE 1)
216     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_KDE)
217     set(QUASSEL_KDE_LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBRARY} knotifyconfig)
218     # We always use external icons for KDE4 support, since we use its iconloader rather than our own
219     set(EMBED_DATA OFF)
220   else(KDE4_FOUND)
221     message(STATUS "KDE4 not found, disabling KDE integration")
222   endif(KDE4_FOUND)
223 else(WITH_KDE)
224   message(STATUS "Not enabling KDE4 integration")
225 endif(WITH_KDE)
226
227 # Setup Phonon support - we only need this if we don't have or want KDE4
228 if(NOT HAVE_KDE)
229   if(WITH_PHONON)
230     find_package(Phonon)
231     if(PHONON_FOUND)
232       message(STATUS "Enabling Phonon support")
233       add_definitions(-DHAVE_PHONON)
234       set(HAVE_PHONON true)
235       set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_PHONON)
236     else(PHONON_FOUND)
237       message(STATUS "Phonon not found, disabling audio notifications")
238     endif(PHONON_FOUND)
239   else(WITH_PHONON)
240     message(STATUS "Not enabling Phonon support")
241   endif(WITH_PHONON)
242 endif(NOT HAVE_KDE)
243
244 # Setup libindicate-qt support
245 if(WITH_LIBINDICATE)
246   find_package(PkgConfig QUIET)
247   if(PKG_CONFIG_FOUND)
248     pkg_check_modules(INDICATEQT indicate-qt>=0.2.1)
249     if(INDICATEQT_FOUND)
250       message(STATUS "Enabling Ayatana notification support")
251       add_definitions(-DHAVE_INDICATEQT)
252     else(INDICATEQT_FOUND)
253       message(STATUS "Disabling Ayatana notification support")
254     endif(INDICATEQT_FOUND)
255   endif(PKG_CONFIG_FOUND)
256 else(WITH_LIBINDICATE)
257   message(STATUS "Not enabling Ayatana notification support")
258 endif(WITH_LIBINDICATE)
259
260 # Now set up install locations; those are set by KDE if integration is enabled
261 if(NOT HAVE_KDE)
262   if(WIN32)
263     set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path for binaries")
264     set(DATA_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/apps CACHE FILEPATH "Install path for data files")
265     set(ICON_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/icons CACHE FILEPATH "Global icon install path")
266     set(XDG_APPS_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/applications CACHE FILEPATH "Install path for .desktop files")
267   else(WIN32)
268     set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin CACHE FILEPATH "Install path for binaries")
269     set(DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/apps CACHE FILEPATH "Install path for data files")
270     set(ICON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/icons CACHE FILEPATH "Global icon install path")
271     set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications CACHE FILEPATH "Install path for .desktop files")
272   endif(WIN32)
273 endif(NOT HAVE_KDE)
274
275 if(EMBED_DATA)
276   message(STATUS "Embedding data files into the binary")
277 else(EMBED_DATA)
278   message(STATUS "Installing data files separately")
279 endif(EMBED_DATA)
280
281 # RPATH needs to be set correctly
282 # Do this down here, since otherwise KDE wants to handle it itself, and fails
283 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)
284 set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
285
286 # Set global buildflags
287 # This is very much non-portable, so don't use -DSTATIC until you know what
288 # you do.
289 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
290   set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
291   link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
292   if(HAVE_SSL)
293     set(QUASSEL_SSL_LIBRARIES ssl crypto)  # these miss in static builds
294   endif(HAVE_SSL)
295 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
296
297 if(WIN32)
298   link_libraries(imm32 winmm dbghelp Secur32)  # missing by default :/
299
300   if(HAVE_SSL)
301      link_libraries(${OPENSSL_LIBRARIES} libeay32MD)
302   endif(HAVE_SSL)
303 endif(WIN32)
304
305 if(INDICATEQT_FOUND)
306   add_definitions(-DXDG_APPS_INSTALL_DIR=${XDG_APPS_INSTALL_DIR})
307 endif(INDICATEQT_FOUND)
308
309 # We need to create a version.gen
310 # For this, we create our genversion binary and make sure it is run every time.
311 add_executable(genversion ${CMAKE_SOURCE_DIR}/src/common/genversion.cpp)
312 target_link_libraries(genversion ${QT_LIBRARIES} ${QT_CORE_LIB_DEPENDENCIES})
313
314 get_target_property(GENVERSION_EXECUTABLE genversion LOCATION)
315 add_custom_target(genversion_run ALL ${GENVERSION_EXECUTABLE}
316                   ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/version.gen)
317 add_dependencies(genversion_run genversion)
318
319 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
320 set(COMMON_DEPS ${RC_WIN32})
321 set(CORE_DEPS )
322 set(CLIENT_DEPS )
323
324 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
325 add_subdirectory(data)
326 add_subdirectory(icons)
327 add_subdirectory(pics)
328 add_subdirectory(i18n)
329 add_subdirectory(src)