|
1 project(Phonon) |
|
2 |
|
3 cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR) |
|
4 |
|
5 # CMP0002: we have multiple targets with the same name for the unit tests |
|
6 cmake_policy(SET CMP0002 OLD) |
|
7 |
|
8 # enable unit tests |
|
9 option(PHONON_BUILD_TESTS "Build the tests") |
|
10 option(PHONON_BUILD_EXAMPLES "Build the examples") |
|
11 |
|
12 if (PHONON_BUILD_TESTS) |
|
13 enable_testing() |
|
14 endif (PHONON_BUILD_TESTS) |
|
15 |
|
16 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") |
|
17 |
|
18 include(PhononMacros) |
|
19 |
|
20 include(MacroLogFeature) |
|
21 include(MacroOptionalFindPackage) |
|
22 |
|
23 set(QT_MIN_VERSION 4.4.0) |
|
24 find_package(Qt4 REQUIRED) |
|
25 if (NOT QT_QTDBUS_FOUND) |
|
26 message(STATUS "Warning: Phonon won't be compiled with DBus support.") |
|
27 endif(NOT QT_QTDBUS_FOUND) |
|
28 |
|
29 find_package(Automoc4 REQUIRED) |
|
30 include (CheckCXXCompilerFlag) |
|
31 include (MacroEnsureVersion) |
|
32 |
|
33 if (NOT AUTOMOC4_VERSION) |
|
34 set(AUTOMOC4_VERSION "0.9.83") |
|
35 endif (NOT AUTOMOC4_VERSION) |
|
36 macro_ensure_version("0.9.86" "${AUTOMOC4_VERSION}" _automoc4_version_ok) |
|
37 if (NOT _automoc4_version_ok) |
|
38 message(FATAL_ERROR "Your version of automoc4 is too old. You have ${AUTOMOC4_VERSION}, you need at least 0.9.86") |
|
39 endif (NOT _automoc4_version_ok) |
|
40 |
|
41 if (CMAKE_COMPILER_IS_GNUCXX) |
|
42 set (KDE4_ENABLE_EXCEPTIONS -fexceptions) |
|
43 # Select flags. |
|
44 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") |
|
45 set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG -DQT_NO_DEBUG") |
|
46 set(CMAKE_CXX_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") |
|
47 set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 -fno-inline") |
|
48 set(CMAKE_CXX_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") |
|
49 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") |
|
50 set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG -DQT_NO_DEBUG") |
|
51 set(CMAKE_C_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") |
|
52 set(CMAKE_C_FLAGS_DEBUGFULL "-g3 -fno-inline") |
|
53 set(CMAKE_C_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") |
|
54 |
|
55 if (CMAKE_SYSTEM_NAME MATCHES Linux) |
|
56 set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -std=iso9899:1990 -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common") |
|
57 set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -fno-check-new -fno-common") |
|
58 add_definitions (-D_BSD_SOURCE) |
|
59 endif (CMAKE_SYSTEM_NAME MATCHES Linux) |
|
60 |
|
61 # gcc under Windows |
|
62 if (MINGW) |
|
63 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols -Wl,--disable-auto-import") |
|
64 set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--export-all-symbols -Wl,--disable-auto-import") |
|
65 |
|
66 # we always link against the release version of QT with mingw |
|
67 # (even for debug builds). So we need to define QT_NO_DEBUG |
|
68 # or else QPluginLoader rejects plugins because it thinks |
|
69 # they're built against the wrong QT. |
|
70 add_definitions(-DQT_NO_DEBUG) |
|
71 endif (MINGW) |
|
72 |
|
73 check_cxx_compiler_flag(-fPIE HAVE_FPIE_SUPPORT) |
|
74 if(KDE4_ENABLE_FPIE) |
|
75 if(HAVE_FPIE_SUPPORT) |
|
76 set (KDE4_CXX_FPIE_FLAGS "-fPIE") |
|
77 set (KDE4_PIE_LDFLAGS "-pie") |
|
78 else(HAVE_FPIE_SUPPORT) |
|
79 message(STATUS "Your compiler doesn't support PIE flag") |
|
80 endif(HAVE_FPIE_SUPPORT) |
|
81 endif(KDE4_ENABLE_FPIE) |
|
82 |
|
83 check_cxx_compiler_flag(-Woverloaded-virtual __KDE_HAVE_W_OVERLOADED_VIRTUAL) |
|
84 if(__KDE_HAVE_W_OVERLOADED_VIRTUAL) |
|
85 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual") |
|
86 endif(__KDE_HAVE_W_OVERLOADED_VIRTUAL) |
|
87 |
|
88 # visibility support |
|
89 check_cxx_compiler_flag(-fvisibility=hidden __KDE_HAVE_GCC_VISIBILITY) |
|
90 set( __KDE_HAVE_GCC_VISIBILITY ${__KDE_HAVE_GCC_VISIBILITY} CACHE BOOL "GCC support for hidden visibility") |
|
91 |
|
92 # get the gcc version |
|
93 exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) |
|
94 |
|
95 string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") |
|
96 # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the patch level, handle this here: |
|
97 if (NOT _gcc_version) |
|
98 string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") |
|
99 endif (NOT _gcc_version) |
|
100 |
|
101 macro_ensure_version("4.1.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_1) |
|
102 macro_ensure_version("4.2.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_2) |
|
103 macro_ensure_version("4.3.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_3) |
|
104 |
|
105 # save a little by making local statics not threadsafe |
|
106 # ### do not enable it for older compilers, see |
|
107 # ### http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31806 |
|
108 if (GCC_IS_NEWER_THAN_4_3) |
|
109 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") |
|
110 endif (GCC_IS_NEWER_THAN_4_3) |
|
111 |
|
112 set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE) |
|
113 if (GCC_IS_NEWER_THAN_4_1) |
|
114 exec_program(${CMAKE_C_COMPILER} ARGS -v OUTPUT_VARIABLE _gcc_alloc_info) |
|
115 string(REGEX MATCH "(--enable-libstdcxx-allocator=mt)" _GCC_COMPILED_WITH_BAD_ALLOCATOR "${_gcc_alloc_info}") |
|
116 endif (GCC_IS_NEWER_THAN_4_1) |
|
117 |
|
118 if (__KDE_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) |
|
119 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") |
|
120 set (KDE4_C_FLAGS "-fvisibility=hidden") |
|
121 # check that Qt defines Q_DECL_EXPORT as __attribute__ ((visibility("default"))) |
|
122 # if it doesn't and KDE compiles with hidden default visibiltiy plugins will break |
|
123 set(_source "#include <QtCore/QtGlobal>\n int main()\n {\n #ifdef QT_VISIBILITY_AVAILABLE \n return 0;\n #else \n return 1; \n #endif \n }\n") |
|
124 set(_source_file ${CMAKE_BINARY_DIR}/CMakeTmp/check_qt_visibility.cpp) |
|
125 file(WRITE "${_source_file}" "${_source}") |
|
126 set(_include_dirs "-DINCLUDE_DIRECTORIES:STRING=${QT_INCLUDES}") |
|
127 |
|
128 try_run(_run_result _compile_result ${CMAKE_BINARY_DIR} ${_source_file} CMAKE_FLAGS "${_include_dirs}") |
|
129 |
|
130 if(NOT _compile_result) |
|
131 message(FATAL_ERROR "Could not compile simple test program:\n ${_source}") |
|
132 endif(NOT _compile_result) |
|
133 if(_run_result) |
|
134 message(FATAL_ERROR "Qt compiled without support for -fvisibility=hidden. This will break plugins and linking of some applications. Please fix your Qt installation.") |
|
135 endif(_run_result) |
|
136 |
|
137 if (GCC_IS_NEWER_THAN_4_2) |
|
138 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden") |
|
139 endif (GCC_IS_NEWER_THAN_4_2) |
|
140 else (__KDE_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) |
|
141 set (__KDE_HAVE_GCC_VISIBILITY 0) |
|
142 endif (__KDE_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) |
|
143 |
|
144 endif (CMAKE_COMPILER_IS_GNUCXX) |
|
145 |
|
146 set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|
147 set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON) |
|
148 set(CMAKE_COLOR_MAKEFILE ON) |
|
149 |
|
150 set(PHONON_LIB_MAJOR_VERSION "4") |
|
151 set(PHONON_LIB_MINOR_VERSION "3") |
|
152 set(PHONON_LIB_PATCH_VERSION "1") |
|
153 set(PHONON_LIB_VERSION "${PHONON_LIB_MAJOR_VERSION}.3.1") |
|
154 set(PHONON_LIB_SOVERSION ${PHONON_LIB_MAJOR_VERSION}) |
|
155 |
|
156 add_definitions(${QT_DEFINITIONS}) |
|
157 remove_definitions(-DQT3_SUPPORT_WARNINGS -DQT3_SUPPORT) |
|
158 if(MSVC) |
|
159 add_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS ) |
|
160 endif(MSVC) |
|
161 |
|
162 # for including config.h and for includes like <kparts/foo.h> |
|
163 include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/includes ${CMAKE_CURRENT_SOURCE_DIR}/phonon ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/phonon) |
|
164 |
|
165 macro(_SET_FANCY _var _value _comment) |
|
166 if (KDESupport_SOURCE_DIR) |
|
167 # when building inside kdesupport other subprojects write crap into our variables |
|
168 set(${_var} "${_value}") |
|
169 else (KDESupport_SOURCE_DIR) |
|
170 if (NOT DEFINED ${_var}) |
|
171 set(${_var} "${_value}") |
|
172 else (NOT DEFINED ${_var}) |
|
173 set(${_var} "${${_var}}" CACHE PATH "${_comment}") |
|
174 endif (NOT DEFINED ${_var}) |
|
175 endif (KDESupport_SOURCE_DIR) |
|
176 endmacro(_SET_FANCY) |
|
177 |
|
178 set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" ) |
|
179 |
|
180 _set_fancy(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Base directory for executables and libraries") |
|
181 _set_fancy(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share" "Base directory for files which go to share/") |
|
182 _set_fancy(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" "The install dir for executables (default ${EXEC_INSTALL_PREFIX}/bin)") |
|
183 _set_fancy(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" "The subdirectory relative to the install prefix where libraries will be installed (default is ${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX})") |
|
184 _set_fancy(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" "The subdirectory to the header prefix") |
|
185 _set_fancy(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4" "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde4)") |
|
186 _set_fancy(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" "The icon install dir (default ${SHARE_INSTALL_PREFIX}/share/icons/)") |
|
187 _set_fancy(SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/kde4/services" "The install dir for service (desktop, protocol, ...) files") |
|
188 _set_fancy(DBUS_INTERFACES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/interfaces" "The dbus interfaces install dir (default: ${SHARE_INSTALL_PREFIX}/dbus-1/interfaces)") |
|
189 _set_fancy(DBUS_SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/services" "The dbus services install dir (default: ${SHARE_INSTALL_PREFIX}/dbus-1/services)") |
|
190 |
|
191 set(INSTALL_TARGETS_DEFAULT_ARGS RUNTIME DESTINATION "${BIN_INSTALL_DIR}" |
|
192 LIBRARY DESTINATION "${LIB_INSTALL_DIR}" |
|
193 ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" COMPONENT Devel ) |
|
194 |
|
195 # on the Mac support an extra install directory for application bundles |
|
196 if(APPLE) |
|
197 set(INSTALL_TARGETS_DEFAULT_ARGS ${INSTALL_TARGETS_DEFAULT_ARGS} |
|
198 BUNDLE DESTINATION "${BUNDLE_INSTALL_DIR}" ) |
|
199 endif(APPLE) |
|
200 |
|
201 if (CMAKE_SYSTEM_NAME MATCHES Linux) |
|
202 if (CMAKE_COMPILER_IS_GNUCXX) |
|
203 set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_SHARED_LINKER_FLAGS}") |
|
204 set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_MODULE_LINKER_FLAGS}") |
|
205 |
|
206 set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_SHARED_LINKER_FLAGS}") |
|
207 set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_MODULE_LINKER_FLAGS}") |
|
208 set ( CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-new-dtags ${CMAKE_EXE_LINKER_FLAGS}") |
|
209 |
|
210 # we profile... |
|
211 if(CMAKE_BUILD_TYPE_TOLOWER MATCHES profile) |
|
212 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") |
|
213 set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") |
|
214 endif(CMAKE_BUILD_TYPE_TOLOWER MATCHES profile) |
|
215 endif (CMAKE_COMPILER_IS_GNUCXX) |
|
216 if (CMAKE_C_COMPILER MATCHES "icc") |
|
217 set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_SHARED_LINKER_FLAGS}") |
|
218 set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_MODULE_LINKER_FLAGS}") |
|
219 endif (CMAKE_C_COMPILER MATCHES "icc") |
|
220 endif (CMAKE_SYSTEM_NAME MATCHES Linux) |
|
221 |
|
222 set(PHONON_LIBS phonon ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) |
|
223 if(QT_QTDBUS_FOUND) |
|
224 list(APPEND PHONON_LIBS phonon ${QT_QTDBUS_LIBRARY}) |
|
225 endif(QT_QTDBUS_FOUND) |
|
226 |
|
227 set(EXECUTABLE_OUTPUT_PATH ${Phonon_BINARY_DIR}/bin) |
|
228 if (WIN32) |
|
229 set(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH}) |
|
230 else (WIN32) |
|
231 set(LIBRARY_OUTPUT_PATH ${Phonon_BINARY_DIR}/lib) |
|
232 endif (WIN32) |
|
233 |
|
234 if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_C_COMPILER MATCHES "icc") |
|
235 set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common") |
|
236 endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_C_COMPILER MATCHES "icc") |
|
237 |
|
238 # Set up RPATH handling, so the libs are found if they are installed to a non-standard location. |
|
239 # By default cmake builds the targets with full RPATH to everything in the build directory, |
|
240 # but then removes the RPATH when installing. |
|
241 # These two options below make it set the RPATH of the installed targets to all |
|
242 # RPATH directories outside the current CMAKE_BINARY_DIR and also the library |
|
243 # install directory. Alex |
|
244 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
|
245 set(CMAKE_INSTALL_RPATH "${LIB_INSTALL_DIR}" ) |
|
246 |
|
247 if(APPLE) |
|
248 set(CMAKE_INSTALL_NAME_DIR ${LIB_INSTALL_DIR}) |
|
249 endif(APPLE) |
|
250 |
|
251 |
|
252 add_subdirectory(cmake) |
|
253 add_subdirectory(phonon) |
|
254 add_subdirectory(includes) |
|
255 if (Q_WS_MAC AND BUILD_PHONON_QT7) |
|
256 add_subdirectory(qt7) |
|
257 endif (Q_WS_MAC AND BUILD_PHONON_QT7) |
|
258 if (Q_WS_WIN) |
|
259 add_subdirectory(ds9) |
|
260 endif (Q_WS_WIN) |
|
261 |
|
262 if (Q_WS_X11) |
|
263 add_subdirectory(gstreamer) |
|
264 add_subdirectory(xine) |
|
265 endif (Q_WS_X11) |
|
266 |
|
267 if(NOT WIN32) # pkgconfig file |
|
268 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/phonon.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/phonon.pc @ONLY) |
|
269 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/phonon.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) |
|
270 endif(NOT WIN32) |
|
271 |
|
272 macro_display_feature_log() |