Updated Finnish translation
[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
69 # Some settings imply others
70 if(STATIC)
71   add_definitions(-DSTATIC)
72   set(WITH_KDE OFF CACHE BOOL "Static building with KDE is not supported")
73 endif(STATIC)
74
75 if(WIN32)
76   # We don't support separately installed resources yet on Win32
77   set(EMBED_DATA ON)
78 endif(WIN32)
79
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")
84 if(LINK_EXTRA)
85   string(REPLACE "," ";" LINK_EXTRA ${LINK_EXTRA})
86   link_libraries(${LINK_EXTRA})
87 endif(LINK_EXTRA)
88
89 # Build Type
90 # We need to make sure it's not empty
91 # Supported: Release, RelWithDebugInfo, Debug, Debugfull
92
93 # On WIN32, only Release seems to work correctly (?)
94 if(WIN32)
95   set(DEFAULT_BUILD_TYPE "Release")
96 else(WIN32)
97   set(DEFAULT_BUILD_TYPE "RelWithDebugInfo")
98 endif(WIN32)
99
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)
104
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_RELWITHDEBUGINFO "-O2")
111   set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-reorder-blocks -fno-schedule-insns -fno-inline")
112   set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3")
113 endif(CMAKE_COMPILER_IS_GNUCXX)
114
115 if(WANT_MONO OR WANT_QTCLIENT)
116   set(QT_MIN_VERSION "4.5.0")
117 else(WANT_MONO OR WANT_QTCLIENT)
118   set(QT_MIN_VERSION "4.4.0")
119 endif(WANT_MONO OR WANT_QTCLIENT)
120
121 if(APPLE AND DEPLOY)
122   set(CMAKE_OSX_ARCHITECTURES "i386;ppc")
123   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4")
124   set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
125   add_definitions(-DMAC_10_4_SDK)
126 endif(APPLE AND DEPLOY)
127
128 # Execinfo is needed for generating backtraces
129 find_package(ExecInfo)
130 if(EXECINFO_FOUND)
131   add_definitions(-DHAVE_EXECINFO)
132   include_directories(${EXECINFO_INCLUDES})
133   link_libraries(${EXECINFO_LIBRARIES})
134 endif(EXECINFO_FOUND)
135
136 # Select a Qt installation here, if you don't want to use system Qt
137 if(QT)
138   # FindQt4 will look for the qmake binary in $PATH, so we just prepend the Qt dir
139   set(ENV{PATH} ${QT}/bin:$ENV{PATH})
140 endif(QT)
141
142 # Now that we have the correct $PATH, lets find Qt!
143 find_package(Qt4 REQUIRED)
144
145 set(QT_DONT_USE_QTGUI 1)
146 include(${QT_USE_FILE})
147 include_directories(${QT_INCLUDES})
148
149 # Setup OpenSSL
150 if(WITH_OPENSSL)
151   find_package(OpenSSL)
152 else(WITH_OPENSSL)
153   message(STATUS "Not enabling OpenSSL support")
154 endif(WITH_OPENSSL)
155
156 if(OPENSSL_FOUND)
157   if(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
158     message(STATUS "Found OpenSSL support in Qt")
159     add_definitions(-DHAVE_SSL)
160     set(HAVE_SSL true)
161     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_SSL)
162   else(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
163     message(STATUS "No OpenSSL support found in Qt, disabling")
164   endif(NOT QT_DEFINITIONS MATCHES "QT_NO_OPENSSL")
165 else(OPENSSL_FOUND)
166   add_definitions(-DQT_NO_OPENSSL)
167 endif(OPENSSL_FOUND)
168
169 # Setup D-Bus support
170 if(WITH_DBUS)
171   if(QT_QTDBUS_FOUND)
172     message(STATUS "Found QtDBus, enabling D-Bus support")
173     add_definitions(-DHAVE_DBUS)
174     set(LINK_DBUS DBUS)
175     set(HAVE_DBUS true)
176     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_DBUS)
177   else(QT_QTDBUS_FOUND)
178     message(STATUS "QtDBus not found, disabling D-Bus support")
179   endif(QT_QTDBUS_FOUND)
180 else(WITH_DBUS)
181   message(STATUS "Not enabling D-Bus support")
182 endif(WITH_DBUS)
183
184 # Setup QtWebKit support
185 if(WITH_WEBKIT)
186   if(QT_QTWEBKIT_FOUND)
187     message(STATUS "Found QtWebKit, enabling WebKit support")
188     add_definitions(-DHAVE_WEBKIT)
189     set(LINK_WEBKIT WEBKIT)
190     set(HAVE_WEBKIT true)
191     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_WEBKIT)
192   else(QT_QTWEBKIT_FOUND)
193     message(STATUS "QtWebKit not found, disabling WebKit support")
194   endif(QT_QTWEBKIT_FOUND)
195 else(WITH_WEBKIT)
196   message(STATUS "Not enabling WebKit support")
197 endif(WITH_WEBKIT)
198
199 # Setup KDE4 support
200 if(WITH_KDE)
201   find_package(KDE4)
202   if(KDE4_FOUND)
203     message(STATUS "Enabling KDE4 integration")
204     include_directories(${KDE4_INCLUDES})
205     add_definitions(-DHAVE_KDE ${KDE4_DEFINITIONS})
206     set(HAVE_KDE 1)
207     set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_KDE)
208     set(QUASSEL_KDE_LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBRARY} knotifyconfig)
209     # We always use external icons for KDE4 support, since we use its iconloader rather than our own
210     set(EMBED_DATA OFF)
211   else(KDE4_FOUND)
212     message(STATUS "KDE4 not found, disabling KDE integration")
213   endif(KDE4_FOUND)
214 else(WITH_KDE)
215   message(STATUS "Not enabling KDE4 integration")
216 endif(WITH_KDE)
217
218 # Setup Phonon support - we only need this if we don't have or want KDE4
219 if(NOT HAVE_KDE)
220   if(WITH_PHONON)
221     find_package(Phonon)
222     if(PHONON_FOUND)
223       message(STATUS "Enabling Phonon support")
224       add_definitions(-DHAVE_PHONON)
225       set(HAVE_PHONON true)
226       set(MOC_DEFINES ${MOC_DEFINES} -DHAVE_PHONON)
227     else(PHONON_FOUND)
228       message(STATUS "Phonon not found, disabling audio notifications")
229     endif(PHONON_FOUND)
230   else(WITH_PHONON)
231     message(STATUS "Not enabling Phonon support")
232   endif(WITH_PHONON)
233 endif(NOT HAVE_KDE)
234
235 # Setup libindicate-qt support
236 if(WITH_LIBINDICATE)
237   find_package(PkgConfig QUIET)
238   if(PKG_CONFIG_FOUND)
239     pkg_check_modules(INDICATEQT indicate-qt>=0.2.1)
240     if(INDICATEQT_FOUND)
241       message(STATUS "Enabling Ayatana notification support")
242       add_definitions(-DHAVE_INDICATEQT)
243     else(INDICATEQT_FOUND)
244       message(STATUS "Disabling Ayatana notification support")
245     endif(INDICATEQT_FOUND)
246   endif(PKG_CONFIG_FOUND)
247 else(WITH_LIBINDICATE)
248   message(STATUS "Not enabling Ayatana notification support")
249 endif(WITH_LIBINDICATE)
250
251 # Now set up install locations; those are set by KDE if integration is enabled
252 if(NOT HAVE_KDE)
253   if(WIN32)
254     set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path for binaries")
255     set(DATA_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/apps CACHE FILEPATH "Install path for data files")
256     set(ICON_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/icons CACHE FILEPATH "Global icon install path")
257     set(XDG_APPS_INSTALL_DIR $ENV{APPDATA}/quassel-irc.org/share/applications CACHE FILEPATH "Install path for .desktop files")
258   else(WIN32)
259     set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin CACHE FILEPATH "Install path for binaries")
260     set(DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/apps CACHE FILEPATH "Install path for data files")
261     set(ICON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/icons CACHE FILEPATH "Global icon install path")
262     set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications CACHE FILEPATH "Install path for .desktop files")
263   endif(WIN32)
264 endif(NOT HAVE_KDE)
265
266 if(EMBED_DATA)
267   message(STATUS "Embedding data files into the binary")
268 else(EMBED_DATA)
269   message(STATUS "Installing data files separately")
270 endif(EMBED_DATA)
271
272 # RPATH needs to be set correctly
273 # Do this down here, since otherwise KDE wants to handle it itself, and fails
274 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)
275 set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
276
277 # Set global buildflags
278 # This is very much non-portable, so don't use -DSTATIC until you know what
279 # you do.
280 if(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
281   set(CMAKE_CXX_FLAGS "-static-libgcc ${CMAKE_CXX_FLAGS}")
282   link_directories(${CMAKE_BINARY_DIR}/staticlibs) # override dynamic libs
283   if(HAVE_SSL)
284     set(QUASSEL_SSL_LIBRARIES ssl crypto)  # these miss in static builds
285   endif(HAVE_SSL)
286 endif(STATIC AND CMAKE_COMPILER_IS_GNUCXX)
287
288 if(WIN32)
289   link_libraries(imm32 winmm dbghelp Secur32)  # missing by default :/
290
291   if(HAVE_SSL)
292      link_libraries(${OPENSSL_LIBRARIES} libeay32MD)
293   endif(HAVE_SSL)
294 endif(WIN32)
295
296 if(INDICATEQT_FOUND)
297   if(WANT_QTCLIENT)
298     set(DESKTOP_FILE ${XDG_APPS_INSTALL_DIR}/quasselclient.desktop)
299   endif(WANT_QTCLIENT)
300   if(WANT_MONO)
301     set(DESKTOP_FILE ${XDG_APPS_INSTALL_DIR}/quassel.desktop)
302   endif(WANT_MONO)
303   add_definitions(-DDESKTOP_FILE=${DESKTOP_FILE})
304 endif(INDICATEQT_FOUND)
305
306 # We need to create a version.gen
307 # For this, we create our genversion binary and make sure it is run every time.
308 add_executable(genversion ${CMAKE_SOURCE_DIR}/src/common/genversion.cpp)
309 target_link_libraries(genversion ${QT_LIBRARIES} ${QT_CORE_LIB_DEPENDENCIES})
310
311 get_target_property(GENVERSION_EXECUTABLE genversion LOCATION)
312 add_custom_target(genversion_run ALL ${GENVERSION_EXECUTABLE}
313                   ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/version.gen)
314 add_dependencies(genversion_run genversion)
315
316 # These variables will be added to the main targets (CORE, QTCLIENT, MONO)
317 set(COMMON_DEPS ${RC_WIN32})
318 set(CORE_DEPS )
319 set(CLIENT_DEPS )
320
321 # Add needed subdirs - the order is important, since src needs some vars set by other dirs
322 add_subdirectory(data)
323 add_subdirectory(icons)
324 add_subdirectory(pics)
325 add_subdirectory(po)
326 add_subdirectory(src)