Set a proper channel map for PulseAudio
[openal-soft.git] / CMakeLists.txt
blob533daa3024ddc404b9130a171ece31bec56a4638
1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
5 IF(COMMAND CMAKE_POLICY)
6   CMAKE_POLICY(SET CMP0003 NEW)
7 ENDIF(COMMAND CMAKE_POLICY)
9 INCLUDE(CheckFunctionExists)
10 INCLUDE(CheckLibraryExists)
11 INCLUDE(CheckIncludeFile)
12 INCLUDE(CheckIncludeFiles)
13 INCLUDE(CheckSymbolExists)
14 INCLUDE(CheckCCompilerFlag)
15 INCLUDE(CheckCSourceCompiles)
16 INCLUDE(CheckTypeSize)
19 PROJECT(OpenAL C)
22 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
25 OPTION(ALSA    "Check for ALSA backend"                ON)
26 OPTION(OSS     "Check for OSS backend"                 ON)
27 OPTION(SOLARIS "Check for Solaris backend"             ON)
28 OPTION(DSOUND  "Check for DirectSound backend"         ON)
29 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
30 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
31 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
33 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
35 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
37 OPTION(EXAMPLES  "Build example programs"              ON)
39 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
42 IF(WIN32)
43     SET(LIBNAME OpenAL32)
44     ADD_DEFINITIONS("-D_WIN32")
45 ELSE()
46     SET(LIBNAME openal)
47 ENDIF()
49 SET(LIB_MAJOR_VERSION "1")
50 SET(LIB_MINOR_VERSION "9")
51 SET(LIB_BUILD_VERSION "563")
52 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
53 IF(NOT DEFINED LIB_INSTALL_DIR)
54   SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
55 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
58 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
59 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
60 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
61 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
64 # Add definitions, compiler switches, etc.
65 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
67 IF(NOT CMAKE_BUILD_TYPE)
68     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
69         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
70         FORCE)
71 ENDIF()
72 IF(NOT CMAKE_DEBUG_POSTFIX)
73     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
74         "Library postfix for debug builds. Normally left blank."
75         FORCE)
76 ENDIF()
78 IF(MSVC)
79     # ???
80     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
81     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
82     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
83     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
84     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
85 ELSE()
86     ADD_DEFINITIONS(-Wall)
87     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
88     IF(HAVE_W_EXTRA)
89         ADD_DEFINITIONS(-Wextra)
90     ENDIF()
92     IF(WERROR)
93         ADD_DEFINITIONS(-Werror)
94     ENDIF()
96     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
97         "Flags used by the compiler during Release with Debug Info builds."
98         FORCE)
99     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
100         "Flags used by the compiler during release minsize builds."
101         FORCE)
102     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
103         "Flags used by the compiler during release builds"
104         FORCE)
105     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
106         "Flags used by the compiler during debug builds."
107         FORCE)
109     # Set visibility options if available
110     IF(NOT WIN32)
111         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
112                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
114         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
115         IF(HAVE_VISIBILITY_SWITCH)
116             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
117                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
118             IF(HAVE_GCC_VISIBILITY)
119                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
120             ENDIF()
121         ENDIF()
122     ENDIF()
123 ENDIF()
125 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
126 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
128 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
129 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
130 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
131 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
132 IF(HAVE_FENV_H)
133     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
134 ENDIF()
135 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
136     SET(EXTRA_LIBS m ${EXTRA_LIBS})
137 ENDIF()
138 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
139 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
141 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
142 IF(NOT HAVE_STRCASECMP)
143     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
144     IF(NOT HAVE__STRICMP)
145         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
146     ENDIF()
148     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
149 ENDIF()
151 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
152 IF(NOT HAVE_STRNCASECMP)
153     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
154     IF(NOT HAVE__STRNICMP)
155         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
156     ENDIF()
158     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
159 ENDIF()
161 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
162 IF(NOT HAVE_SNPRINTF)
163     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
164     IF(NOT HAVE__SNPRINTF)
165         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
166     ENDIF()
168     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
169 ENDIF()
171 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
172 IF(NOT HAVE_VSNPRINTF)
173     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
174     IF(NOT HAVE__VSNPRINTF)
175         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
176     ENDIF()
178     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
179 ENDIF()
181 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
182 IF(NOT HAVE_ISNAN)
183     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
184     IF(NOT HAVE__ISNAN)
185         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
186     ENDIF()
188     ADD_DEFINITIONS(-Disnan=_isnan)
189 ENDIF()
192 # Check for the dlopen API (for dynamicly loading backend libs)
193 IF(DLOPEN)
194     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
195     IF(HAVE_DLFCN_H)
196         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
197         IF(HAVE_LIBDL)
198             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
199         ENDIF()
200     ENDIF()
201 ENDIF()
203 # Check if we have Windows headers
204 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
205 IF(NOT HAVE_WINDOWS_H)
206     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
207     IF(NOT HAVE_GETTIMEOFDAY)
208         MESSAGE(FATAL_ERROR "No timing function found!")
209     ENDIF()
211     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
212     IF(NOT HAVE_NANOSLEEP)
213         MESSAGE(FATAL_ERROR "No sleep function found!")
214     ENDIF()
216     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
217     IF(HAVE_PTHREAD)
218         ADD_DEFINITIONS(-pthread)
219         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
220     ENDIF()
222     # We need pthreads outside of Windows
223     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
224     IF(NOT HAVE_PTHREAD_H)
225         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
226     ENDIF()
227     # Some systems need pthread_np.h to get recursive mutexes
228     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
230     # _GNU_SOURCE is needed on some systems for extra attributes, and
231     # _REENTRANT is needed for libc thread-safety
232     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
233     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
234     IF(HAVE_LIBPTHREAD)
235         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
236     ENDIF()
237 ENDIF()
239 # Check for a 64-bit type
240 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
241 IF(NOT HAVE_STDINT_H)
242     IF(HAVE_WINDOWS_H)
243         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
244                                  \#include <windows.h>
245                                  __int64 foo;
246                                  int main() {return 0;}" HAVE___INT64)
247     ENDIF()
248     IF(NOT HAVE___INT64)
249         IF(NOT SIZEOF_LONG MATCHES "8")
250             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
251                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
252             ENDIF()
253         ENDIF()
254     ENDIF()
255 ENDIF()
258 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
259                  OpenAL32/alBuffer.c
260                  OpenAL32/alDatabuffer.c
261                  OpenAL32/alEffect.c
262                  OpenAL32/alError.c
263                  OpenAL32/alExtension.c
264                  OpenAL32/alFilter.c
265                  OpenAL32/alListener.c
266                  OpenAL32/alSource.c
267                  OpenAL32/alState.c
268                  OpenAL32/alThunk.c
270 SET(ALC_OBJS  Alc/ALc.c
271               Alc/ALu.c
272               Alc/alcConfig.c
273               Alc/alcEcho.c
274               Alc/alcReverb.c
275               Alc/alcRing.c
276               Alc/alcThread.c
277               Alc/bs2b.c
278               Alc/wave.c
281 SET(BACKENDS "")
283 # Check ALSA backend
284 IF(ALSA)
285     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
286     IF(HAVE_ALSA_ASOUNDLIB_H)
287         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
288         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
289             SET(HAVE_ALSA 1)
290             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
291             IF(HAVE_DLFCN_H)
292                 SET(BACKENDS  "${BACKENDS} ALSA,")
293             ELSE()
294                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
295                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
296             ENDIF()
297         ENDIF()
298     ENDIF()
299 ENDIF()
301 # Check OSS backend
302 IF(OSS)
303     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
304     IF(HAVE_SYS_SOUNDCARD_H)
305         SET(HAVE_OSS 1)
306         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
307         SET(BACKENDS  "${BACKENDS} OSS,")
308     ENDIF()
309 ENDIF()
311 # Check Solaris backend
312 IF(SOLARIS)
313     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
314     IF(HAVE_SYS_AUDIOIO_H)
315         SET(HAVE_SOLARIS 1)
316         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
317         SET(BACKENDS  "${BACKENDS} Solaris,")
318     ENDIF()
319 ENDIF()
321 # Check DSound/MMSystem backend
322 IF(DSOUND)
323     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
324     IF(HAVE_DSOUND_H)
325         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
326         IF(HAVE_LIBDSOUND OR WIN32)
327             SET(HAVE_DSOUND 1)
328             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
330             IF(WIN32)
331                 SET(BACKENDS  "${BACKENDS} DirectSound,")
332             ELSE()
333                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
334                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
335             ENDIF()
336         ENDIF()
337     ENDIF()
338 ENDIF()
339 IF(HAVE_WINDOWS_H)
340     IF(WINMM)
341         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
342         IF(HAVE_MMSYSTEM_H)
343             SET(HAVE_WINMM 1)
344             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
345             SET(BACKENDS  "${BACKENDS} WinMM,")
347             SET(CMAKE_REQUIRED_LIBRARIES winmm)
348             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
349             SET(CMAKE_REQUIRED_LIBRARIES "")
350 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
351             IF(HAVE_LIBWINMM)
352                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
353             ENDIF()
354         ENDIF()
355     ENDIF()
356 ENDIF()
358 # Check PortAudio backend
359 IF(PORTAUDIO)
360     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
361     IF(HAVE_PORTAUDIO_H)
362         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
363         IF(HAVE_LIBPORTAUDIO)
364             SET(HAVE_PORTAUDIO 1)
365             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
366             IF(HAVE_DLFCN_H)
367                 SET(BACKENDS  "${BACKENDS} PortAudio,")
368             ELSE()
369                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
370                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
371             ENDIF()
372         ENDIF()
373     ENDIF()
374 ENDIF()
376 # Check PortAudio backend
377 IF(PULSEAUDIO)
378     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
379     IF(HAVE_PULSE_PULSEAUDIO_H)
380         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
381         IF(HAVE_LIBPULSE)
382             SET(HAVE_PULSEAUDIO 1)
383             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
384             IF(HAVE_DLFCN_H)
385                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
386             ELSE()
387                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
388                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
389             ENDIF()
390         ENDIF()
391     ENDIF()
392 ENDIF()
394 # This is always available
395 SET(BACKENDS  "${BACKENDS} WaveFile")
397 # Needed for openal.pc.in
398 SET(prefix ${CMAKE_INSTALL_PREFIX})
399 SET(exec_prefix "\${prefix}")
400 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
401 SET(bindir "\${exec_prefix}/bin")
402 SET(includedir "\${prefix}/include")
403 SET(PACKAGE_VERSION "${LIB_VERSION}")
405 # End configuration
406 CONFIGURE_FILE(
407     "${OpenAL_SOURCE_DIR}/config.h.in"
408     "${OpenAL_BINARY_DIR}/config.h")
409 CONFIGURE_FILE(
410     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
411     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
412     @ONLY)
414 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
416 # Build a library
417 IF(NOT LIBTYPE)
418     SET(LIBTYPE SHARED)
419 ENDIF()
420 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
421 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
422                                             SOVERSION ${LIB_MAJOR_VERSION})
423 IF(WIN32)
424     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
425 ENDIF()
427 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
429 # Add an install target here
430 INSTALL(TARGETS ${LIBNAME}
431         RUNTIME DESTINATION bin
432         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
433         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
435 INSTALL(FILES include/AL/al.h
436               include/AL/alc.h
437               include/AL/alext.h
438         DESTINATION include/AL
440 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
441         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
443 # Install alsoft.conf configuration file
444 IF(ALSOFT_CONFIG)
445     INSTALL(FILES alsoftrc.sample
446             DESTINATION /etc/openal
447             RENAME alsoft.conf
448     )
449 ENDIF()
451 IF(EXAMPLES)
452     ADD_EXECUTABLE(openal-info examples/openal-info.c)
453     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
454     INSTALL(TARGETS openal-info
455             RUNTIME DESTINATION bin
456             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
457             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
458     )
459 ENDIF()
461 MESSAGE(STATUS "")
462 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
463 MESSAGE(STATUS "    ${BACKENDS}")
464 MESSAGE(STATUS "")
466 IF(WIN32)
467     IF(NOT HAVE_DSOUND)
468         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
469         MESSAGE(STATUS "         This is probably NOT what you want!")
470         MESSAGE(STATUS "")
471     ENDIF()
472 ENDIF()