Trace when the format is being requested
[openal-soft/android.git] / CMakeLists.txt
blobf105237fb4dd3bf667221cd353218d2c57c71b30
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 SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
11 INCLUDE(CheckFunctionExists)
12 INCLUDE(CheckLibraryExists)
13 INCLUDE(CheckSharedLibraryExists)
14 INCLUDE(CheckIncludeFile)
15 INCLUDE(CheckIncludeFiles)
16 INCLUDE(CheckSymbolExists)
17 INCLUDE(CheckCCompilerFlag)
18 INCLUDE(CheckCSourceCompiles)
19 INCLUDE(CheckTypeSize)
22 PROJECT(OpenAL C)
25 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
28 OPTION(ALSA    "Check for ALSA backend"                ON)
29 OPTION(OSS     "Check for OSS backend"                 ON)
30 OPTION(SOLARIS "Check for Solaris backend"             ON)
31 OPTION(SNDIO   "Check for SndIO backend"               ON)
32 OPTION(MMDEVAPI "Check for MMDevApi"                   ON)
33 OPTION(DSOUND  "Check for DirectSound backend"         ON)
34 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
35 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
36 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
37 OPTION(COREAUDIO  "Check for CoreAudio backend"        ON)
38 OPTION(OPENSL     "Check for OpenSL backend"           ON)
39 OPTION(WAVE    "Enable Wave Writer backend"            ON)
41 OPTION(REQUIRE_ALSA       "Require ALSA backend"               OFF)
42 OPTION(REQUIRE_OSS        "Require OSS backend"                OFF)
43 OPTION(REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
44 OPTION(REQUIRE_SNDIO      "Require SndIO backend"              OFF)
45 OPTION(REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
46 OPTION(REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
47 OPTION(REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
48 OPTION(REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
49 OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
50 OPTION(REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
51 OPTION(REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
53 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
55 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
57 OPTION(UTILS  "Build and install utility programs"  ON)
59 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
62 IF(WIN32)
63     SET(LIBNAME OpenAL32)
64     ADD_DEFINITIONS("-D_WIN32")
65 ELSE()
66     SET(LIBNAME openal)
67 ENDIF()
69 IF(NOT LIBTYPE)
70     SET(LIBTYPE SHARED)
71 ENDIF()
73 SET(LIB_MAJOR_VERSION "1")
74 SET(LIB_MINOR_VERSION "13")
75 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
77 SET(EXPORT_DECL "")
80 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
81 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
82 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
83 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
86 CHECK_C_SOURCE_COMPILES("int *restrict foo;
87                          int main() {return 0;}" HAVE_RESTRICT)
88 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
89                          int main() {return 0;}" HAVE___RESTRICT)
92 # Add definitions, compiler switches, etc.
93 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
95 IF(NOT CMAKE_BUILD_TYPE)
96     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
97         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
98         FORCE)
99 ENDIF()
100 IF(NOT CMAKE_DEBUG_POSTFIX)
101     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
102         "Library postfix for debug builds. Normally left blank."
103         FORCE)
104 ENDIF()
106 IF(MSVC)
107     # ???
108     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
109     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
110     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
111     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
112     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
113     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
115     IF(NOT DXSDK_DIR)
116         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
117     ELSE()
118         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
119     ENDIF()
120     IF(DXSDK_DIR)
121         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
122         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
123         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
124         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
125     ENDIF()
127     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
128     IF(FORCE_STATIC_VCRT)
129         FOREACH(flag_var
130                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
131                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
132             IF(${flag_var} MATCHES "/MD")
133                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
134             ENDIF()
135         ENDFOREACH(flag_var)
136     ENDIF()
137 ELSE()
138     ADD_DEFINITIONS(-Winline -Wall)
139     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
140     IF(HAVE_W_EXTRA)
141         ADD_DEFINITIONS(-Wextra)
142     ENDIF()
144     IF(WERROR)
145         ADD_DEFINITIONS(-Werror)
146     ENDIF()
148     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
149         "Flags used by the compiler during Release with Debug Info builds."
150         FORCE)
151     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
152         "Flags used by the compiler during release minsize builds."
153         FORCE)
154     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
155         "Flags used by the compiler during release builds"
156         FORCE)
157     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
158         "Flags used by the compiler during debug builds."
159         FORCE)
161     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
162                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
163 ENDIF()
165 # Set visibility/export options if available
166 IF(WIN32)
167     SET(EXPORT_DECL "__declspec(dllexport)")
169     OPTION(WINE "Enable use of Wine headers when compiling" ON)
170     IF(WINE)
171         FIND_PATH(WINE_INCLUDE_DIR library.h
172                   PATHS
173                   /usr/include/wine
174                   /usr/local/include/wine)
175         IF(WINE_INCLUDE_DIR)
176             MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
177             INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
178             SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
179         ELSE()
180             MESSAGE(STATUS "Could not find Wine header files" )
181         ENDIF()
182     ENDIF()
183 ELSE()
184     CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_SWITCH)
185     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
186                              int main() {return 0;}" HAVE_GCC_VISIBILITY)
187     IF(HAVE_VISIBILITY_SWITCH AND HAVE_GCC_VISIBILITY)
188         ADD_DEFINITIONS(-fvisibility=internal)
189         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
190     ENDIF()
191 ENDIF()
193 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
194                          int main() {return 0;}" HAVE_GCC_FORMAT)
196 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
197 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
198 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
199 IF(NOT HAVE_GUIDDEF_H)
200     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
201 ENDIF()
203 CHECK_LIBRARY_EXISTS(m  powf   "" HAVE_POWF)
204 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
205 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
206 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
207 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
208 IF(HAVE_FENV_H)
209     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
210 ENDIF()
211 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
212     SET(EXTRA_LIBS m ${EXTRA_LIBS})
213 ENDIF()
214 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
215 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
217 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
218 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
219 IF(NOT HAVE_STRCASECMP)
220     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
221     IF(NOT HAVE__STRICMP)
222         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
223     ENDIF()
225     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
226 ENDIF()
228 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
229 IF(NOT HAVE_STRNCASECMP)
230     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
231     IF(NOT HAVE__STRNICMP)
232         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
233     ENDIF()
235     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
236 ENDIF()
238 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
239 IF(NOT HAVE_SNPRINTF)
240     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
241     IF(NOT HAVE__SNPRINTF)
242         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
243     ENDIF()
245     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
246 ENDIF()
248 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
249 IF(NOT HAVE_VSNPRINTF)
250     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
251     IF(NOT HAVE__VSNPRINTF)
252         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
253     ENDIF()
255     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
256 ENDIF()
258 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
259 IF(NOT HAVE_ISNAN)
260     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
261     IF(NOT HAVE__ISNAN)
262         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
263     ENDIF()
265     ADD_DEFINITIONS(-Disnan=_isnan)
266 ENDIF()
269 # Check for the dlopen API (for dynamicly loading backend libs)
270 IF(DLOPEN)
271     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
272     IF(HAVE_DLFCN_H)
273         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
274         IF(HAVE_LIBDL)
275             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
276         ENDIF()
277     ENDIF()
278 ENDIF()
280 # Check if we have Windows headers
281 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
282 IF(NOT HAVE_WINDOWS_H)
283     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
284     IF(NOT HAVE_GETTIMEOFDAY)
285         MESSAGE(FATAL_ERROR "No timing function found!")
286     ENDIF()
288     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
289     IF(NOT HAVE_NANOSLEEP)
290         MESSAGE(FATAL_ERROR "No sleep function found!")
291     ENDIF()
293     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
294     IF(HAVE_PTHREAD)
295         ADD_DEFINITIONS(-pthread)
296         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
297     ENDIF()
299     # We need pthreads outside of Windows
300     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
301     IF(NOT HAVE_PTHREAD_H)
302         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
303     ENDIF()
304     # Some systems need pthread_np.h to get recursive mutexes
305     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
307     # _GNU_SOURCE is needed on some systems for extra attributes, and
308     # _REENTRANT is needed for libc thread-safety
309     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
310     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
311     IF(HAVE_LIBPTHREAD)
312         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
313     ENDIF()
315     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
317     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
318     IF(HAVE_LIBRT)
319         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
320     ENDIF()
321 ENDIF()
323 # Check for a 64-bit type
324 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
325 IF(NOT HAVE_STDINT_H)
326     IF(HAVE_WINDOWS_H)
327         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
328                                  \#include <windows.h>
329                                  __int64 foo;
330                                  int main() {return 0;}" HAVE___INT64)
331     ENDIF()
332     IF(NOT HAVE___INT64)
333         IF(NOT SIZEOF_LONG MATCHES "8")
334             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
335                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
336             ENDIF()
337         ENDIF()
338     ENDIF()
339 ENDIF()
341 # Windows needs winmm for timeGetTime, even if the backend is disabled
342 CHECK_SHARED_LIBRARY_EXISTS(winmm timeGetTime 0 "" HAVE_LIBWINMM)
343 IF(HAVE_LIBWINMM)
344     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
345     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
346 ENDIF()
349 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
350                  OpenAL32/alBuffer.c
351                  OpenAL32/alEffect.c
352                  OpenAL32/alError.c
353                  OpenAL32/alExtension.c
354                  OpenAL32/alFilter.c
355                  OpenAL32/alListener.c
356                  OpenAL32/alSource.c
357                  OpenAL32/alState.c
358                  OpenAL32/alThunk.c
360 SET(ALC_OBJS  Alc/ALc.c
361               Alc/ALu.c
362               Alc/alcConfig.c
363               Alc/alcDedicated.c
364               Alc/alcEcho.c
365               Alc/alcModulator.c
366               Alc/alcReverb.c
367               Alc/alcRing.c
368               Alc/alcThread.c
369               Alc/bs2b.c
370               Alc/hrtf.c
371               Alc/mixer.c
372               Alc/panning.c
373               Alc/loopback.c
374               Alc/null.c
377 SET(BACKENDS "")
378 SET(HAVE_ALSA       0)
379 SET(HAVE_OSS        0)
380 SET(HAVE_SOLARIS    0)
381 SET(HAVE_SNDIO      0)
382 SET(HAVE_DSOUND     0)
383 SET(HAVE_WINMM      0)
384 SET(HAVE_PORTAUDIO  0)
385 SET(HAVE_PULSEAUDIO 0)
386 SET(HAVE_COREAUDIO  0)
387 SET(HAVE_OPENSL     0)
388 SET(HAVE_WAVE       0)
390 # Check ALSA backend
391 IF(ALSA)
392     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
393     IF(HAVE_ALSA_ASOUNDLIB_H)
394         CHECK_SHARED_LIBRARY_EXISTS(asound snd_pcm_open 4 "" HAVE_LIBASOUND)
395         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
396             SET(HAVE_ALSA 1)
397             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
398             IF(HAVE_DLFCN_H OR WIN32)
399                 SET(BACKENDS  "${BACKENDS} ALSA,")
400             ELSE()
401                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
402                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
403             ENDIF()
404         ENDIF()
405     ENDIF()
406 ENDIF()
407 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
408     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
409 ENDIF()
411 # Check OSS backend
412 IF(OSS)
413     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
414     IF(HAVE_SYS_SOUNDCARD_H)
415         SET(HAVE_OSS 1)
416         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
417         SET(BACKENDS  "${BACKENDS} OSS,")
418     ENDIF()
419 ENDIF()
420 IF(REQUIRE_OSS AND NOT HAVE_OSS)
421     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
422 ENDIF()
424 # Check Solaris backend
425 IF(SOLARIS)
426     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
427     IF(HAVE_SYS_AUDIOIO_H)
428         SET(HAVE_SOLARIS 1)
429         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
430         SET(BACKENDS  "${BACKENDS} Solaris,")
431     ENDIF()
432 ENDIF()
433 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
434     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
435 ENDIF()
437 # Check SndIO backend
438 IF(SNDIO)
439     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
440     IF(HAVE_SNDIO_H)
441         CHECK_SHARED_LIBRARY_EXISTS(sndio sio_open 3 "" HAVE_LIBSNDIO)
442         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
443             SET(HAVE_SNDIO 1)
444             SET(ALC_OBJS  ${ALC_OBJS} Alc/sndio.c)
445             IF(HAVE_DLFCN_H OR WIN32)
446                 SET(BACKENDS  "${BACKENDS} SndIO,")
447             ELSE()
448                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
449                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
450             ENDIF()
451         ENDIF()
452     ENDIF()
453 ENDIF()
454 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
455     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
456 ENDIF()
458 # Check for MMDevApi backend
459 IF(HAVE_WINDOWS_H)
460     IF(MMDEVAPI)
461         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
462         IF(HAVE_MMDEVICEAPI_H)
463             SET(HAVE_MMDEVAPI 1)
464             SET(ALC_OBJS  ${ALC_OBJS} Alc/mmdevapi.c)
466             SET(BACKENDS  "${BACKENDS} MMDevApi,")
467         ENDIF()
468     ENDIF()
469 ENDIF()
470 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
471     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
472 ENDIF()
474 # Check DSound/MMSystem backend
475 IF(DSOUND)
476     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
477     IF(HAVE_DSOUND_H)
478         CHECK_SHARED_LIBRARY_EXISTS(dsound DirectSoundCreate 3 "" HAVE_LIBDSOUND)
479         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
480             SET(HAVE_DSOUND 1)
481             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
483             IF(HAVE_DLFCN_H OR WIN32)
484                 SET(BACKENDS  "${BACKENDS} DirectSound,")
485             ELSE()
486                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
487                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
488             ENDIF()
489         ENDIF()
490     ENDIF()
491 ENDIF()
492 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
493     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
494 ENDIF()
496 IF(HAVE_WINDOWS_H)
497     IF(WINMM)
498         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
499         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
500             SET(HAVE_WINMM 1)
501             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
502             SET(BACKENDS  "${BACKENDS} WinMM,")
503         ENDIF()
504     ENDIF()
505 ENDIF()
506 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
507     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
508 ENDIF()
510 # Check PortAudio backend
511 IF(PORTAUDIO)
512     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
513     IF(HAVE_PORTAUDIO_H)
514         CHECK_SHARED_LIBRARY_EXISTS(portaudio Pa_Initialize 0 "" HAVE_LIBPORTAUDIO)
515         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
516             SET(HAVE_PORTAUDIO 1)
517             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
518             IF(HAVE_DLFCN_H OR WIN32)
519                 SET(BACKENDS  "${BACKENDS} PortAudio,")
520             ELSE()
521                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
522                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
523             ENDIF()
524         ENDIF()
525     ENDIF()
526 ENDIF()
527 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
528     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
529 ENDIF()
531 # Check PulseAudio backend
532 IF(PULSEAUDIO)
533     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
534     IF(HAVE_PULSE_PULSEAUDIO_H)
535         CHECK_SHARED_LIBRARY_EXISTS(pulse pa_context_new 2 "" HAVE_LIBPULSE)
536         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
537             SET(HAVE_PULSEAUDIO 1)
538             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
539             IF(HAVE_DLFCN_H OR WIN32)
540                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
541             ELSE()
542                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
543                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
544             ENDIF()
545         ENDIF()
546     ENDIF()
547 ENDIF()
548 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
549     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
550 ENDIF()
552 # Check CoreAudio backend
553 IF(COREAUDIO)
554     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
555     IF(HAVE_COREAUDIO_FRAMEWORK)
556         SET(HAVE_COREAUDIO 1)
557         SET(ALC_OBJS  ${ALC_OBJS} Alc/coreaudio.c)
558         SET(BACKENDS  "${BACKENDS} CoreAudio,")
559         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
560         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
561         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
562     ENDIF()
563 ENDIF()
564 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
565     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
566 ENDIF()
568 # Check for OpenSL (Android) backend
569 IF(OPENSL)
570     CHECK_INCLUDE_FILE(SLES/OpenSLES_Android.h HAVE_SLES_OPENSLES_ANDROID_H)
571     IF(HAVE_SLES_OPENSLES_ANDROID_H)
572         CHECK_SHARED_LIBRARY_EXISTS(OpenSLES slCreateEngine 6 "" HAVE_LIBOPENSLES)
573         IF(HAVE_LIBOPENSLES)
574             SET(HAVE_OPENSL 1)
575             SET(ALC_OBJS  ${ALC_OBJS} Alc/opensl.c)
576             SET(BACKENDS  "${BACKENDS} OpenSL,")
577             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
578         ENDIF()
579     ENDIF()
580 ENDIF()
581 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
582     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
583 ENDIF()
585 # Optionally enable the Wave Writer backend
586 IF(WAVE)
587     SET(HAVE_WAVE 1)
588     SET(ALC_OBJS  ${ALC_OBJS} Alc/wave.c)
589     SET(BACKENDS  "${BACKENDS} WaveFile,")
590 ENDIF()
592 # This is always available
593 SET(BACKENDS  "${BACKENDS} Null")
595 IF(LIBTYPE STREQUAL "STATIC")
596     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
597     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
598 ENDIF()
600 # Needed for openal.pc.in
601 SET(prefix ${CMAKE_INSTALL_PREFIX})
602 SET(exec_prefix "\${prefix}")
603 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
604 SET(bindir "\${exec_prefix}/bin")
605 SET(includedir "\${prefix}/include")
606 SET(PACKAGE_VERSION "${LIB_VERSION}")
608 # End configuration
609 CONFIGURE_FILE(
610     "${OpenAL_SOURCE_DIR}/config.h.in"
611     "${OpenAL_BINARY_DIR}/config.h")
612 CONFIGURE_FILE(
613     "${OpenAL_SOURCE_DIR}/openal.pc.in"
614     "${OpenAL_BINARY_DIR}/openal.pc"
615     @ONLY)
617 # Build a library
618 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
619 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
620                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
621                                             VERSION ${LIB_VERSION}.0
622                                             SOVERSION ${LIB_MAJOR_VERSION})
623 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
624     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
625 ENDIF()
627 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
629 # Add an install target here
630 INSTALL(TARGETS ${LIBNAME}
631         RUNTIME DESTINATION bin
632         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
633         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
635 INSTALL(FILES include/AL/al.h
636               include/AL/alc.h
637               include/AL/alext.h
638               include/AL/efx.h
639               include/AL/efx-creative.h
640         DESTINATION include/AL
642 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
643         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
646 MESSAGE(STATUS "")
647 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
648 MESSAGE(STATUS "    ${BACKENDS}")
649 MESSAGE(STATUS "")
651 IF(WIN32)
652     IF(NOT HAVE_DSOUND)
653         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
654         MESSAGE(STATUS "         This is probably NOT what you want!")
655         MESSAGE(STATUS "")
656     ENDIF()
657 ENDIF()
659 # Install alsoft.conf configuration file
660 IF(ALSOFT_CONFIG)
661     INSTALL(FILES alsoftrc.sample
662             DESTINATION /etc/openal
663             RENAME alsoft.conf
664     )
665     MESSAGE(STATUS "Installing sample alsoft.conf")
666     MESSAGE(STATUS "")
667 ENDIF()
669 IF(UTILS)
670     ADD_EXECUTABLE(openal-info utils/openal-info.c)
671     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
672     INSTALL(TARGETS openal-info
673             RUNTIME DESTINATION bin
674             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
675             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
676     )
677     MESSAGE(STATUS "Building utility programs")
678     MESSAGE(STATUS "")
679 ENDIF()