Use inline assembly for fast float-to-int conversions
[openal-soft/android.git] / CMakeLists.txt
blob4f4902bbb61c45b7cd59725fca1aa41430d481ce
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(CheckSharedFunctionExists)
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 -D_WIN32_WINNT=0x0500")
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)
84 CHECK_C_SOURCE_COMPILES("int *restrict foo;
85                          int main() {return 0;}" HAVE_RESTRICT)
86 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
87                          int main() {return 0;}" HAVE___RESTRICT)
90 # Add definitions, compiler switches, etc.
91 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
93 IF(NOT CMAKE_BUILD_TYPE)
94     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
95         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
96         FORCE)
97 ENDIF()
98 IF(NOT CMAKE_DEBUG_POSTFIX)
99     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
100         "Library postfix for debug builds. Normally left blank."
101         FORCE)
102 ENDIF()
104 IF(MSVC)
105     # ???
106     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
107     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
108     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
109     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
110     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
111     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
113     IF(NOT DXSDK_DIR)
114         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
115     ELSE()
116         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
117     ENDIF()
118     IF(DXSDK_DIR)
119         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
120         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
121         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
122         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
123     ENDIF()
125     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
126     IF(FORCE_STATIC_VCRT)
127         FOREACH(flag_var
128                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
129                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
130             IF(${flag_var} MATCHES "/MD")
131                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
132             ENDIF()
133         ENDFOREACH(flag_var)
134     ENDIF()
135 ELSE()
136     ADD_DEFINITIONS(-Winline -Wall)
137     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
138     IF(HAVE_W_EXTRA)
139         ADD_DEFINITIONS(-Wextra)
140     ENDIF()
142     IF(WERROR)
143         ADD_DEFINITIONS(-Werror)
144     ENDIF()
146     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
147         "Flags used by the compiler during Release with Debug Info builds."
148         FORCE)
149     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
150         "Flags used by the compiler during release minsize builds."
151         FORCE)
152     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
153         "Flags used by the compiler during release builds"
154         FORCE)
155     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
156         "Flags used by the compiler during debug builds."
157         FORCE)
159     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
160                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
161 ENDIF()
163 # Set visibility/export options if available
164 IF(WIN32)
165     SET(EXPORT_DECL "__declspec(dllexport)")
167     OPTION(WINE "Enable use of Wine headers when compiling" OFF)
168     IF(WINE)
169         FIND_PATH(WINE_INCLUDE_DIR library.h
170                   PATHS
171                   /usr/include/wine
172                   /usr/local/include/wine
173                   CMAKE_FIND_ROOT_PATH_BOTH)
174         IF(WINE_INCLUDE_DIR)
175             MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
176             INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
177             SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
178         ELSE()
179             MESSAGE(STATUS "Could not find Wine header files" )
180         ENDIF()
181     ENDIF()
182 ELSE()
183     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
184     # Yes GCC, really don't accept visibility modes you don't support
185     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
187     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
188                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
189     IF(HAVE_GCC_PROTECTED_VISIBILITY)
190         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
191     ELSE()
192         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
193                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
194         IF(HAVE_GCC_DEFAULT_VISIBILITY)
195             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
196         ENDIF()
197     ENDIF()
199     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
200         CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
201         IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
202             ADD_DEFINITIONS(-fvisibility=internal)
203         ELSE()
204             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
205             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
206                 ADD_DEFINITIONS(-fvisibility=hidden)
207             ENDIF()
208         ENDIF()
209     ENDIF()
211     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
212 ENDIF()
214 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
215                          int main() {return 0;}" HAVE_GCC_FORMAT)
217 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
218 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
219 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
220 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
221 IF(NOT HAVE_GUIDDEF_H)
222     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
223 ENDIF()
224 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
226 # Some systems need libm for some of the following math functions to work
227 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
228 IF(HAVE_LIBM)
229     SET(EXTRA_LIBS m ${EXTRA_LIBS})
230     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
231 ENDIF()
234 CHECK_SYMBOL_EXISTS(powf   math.h HAVE_POWF)
235 CHECK_SYMBOL_EXISTS(sqrtf  math.h HAVE_SQRTF)
236 CHECK_SYMBOL_EXISTS(cosf   math.h HAVE_COSF)
237 CHECK_SYMBOL_EXISTS(sinf   math.h HAVE_SINF)
238 CHECK_SYMBOL_EXISTS(acosf  math.h HAVE_ACOSF)
239 CHECK_SYMBOL_EXISTS(asinf  math.h HAVE_ASINF)
240 CHECK_SYMBOL_EXISTS(atanf  math.h HAVE_ATANF)
241 CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
242 CHECK_SYMBOL_EXISTS(fabsf  math.h HAVE_FABSF)
243 CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
244 CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
246 IF(HAVE_FENV_H)
247     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
248 ENDIF()
250 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
251 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
253 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
254 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
255 IF(NOT HAVE_STRCASECMP)
256     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
257     IF(NOT HAVE__STRICMP)
258         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
259     ENDIF()
261     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
262 ENDIF()
264 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
265 IF(NOT HAVE_STRNCASECMP)
266     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
267     IF(NOT HAVE__STRNICMP)
268         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
269     ENDIF()
271     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
272 ENDIF()
274 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
275 IF(NOT HAVE_SNPRINTF)
276     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
277     IF(NOT HAVE__SNPRINTF)
278         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
279     ENDIF()
281     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
282 ENDIF()
284 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
285 IF(NOT HAVE_VSNPRINTF)
286     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
287     IF(NOT HAVE__VSNPRINTF)
288         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
289     ENDIF()
291     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
292 ENDIF()
294 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
295 IF(NOT HAVE_ISFINITE)
296     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
297     IF(NOT HAVE_FINITE)
298         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
299         IF(NOT HAVE__FINITE)
300             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
301         ENDIF()
302         ADD_DEFINITIONS(-Disfinite=_finite)
303     ELSE()
304         ADD_DEFINITIONS(-Disfinite=finite)
305     ENDIF()
306 ENDIF()
308 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
309 IF(NOT HAVE_ISNAN)
310     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
311     IF(NOT HAVE__ISNAN)
312         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
313     ENDIF()
315     ADD_DEFINITIONS(-Disnan=_isnan)
316 ENDIF()
319 # Check for the dlopen API (for dynamicly loading backend libs)
320 IF(DLOPEN)
321     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
322     IF(HAVE_DLFCN_H)
323         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
324         IF(HAVE_LIBDL)
325             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
326         ENDIF()
327     ENDIF()
328 ENDIF()
330 # Check if we have Windows headers
331 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
332 IF(NOT HAVE_WINDOWS_H)
333     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
334     IF(NOT HAVE_GETTIMEOFDAY)
335         MESSAGE(FATAL_ERROR "No timing function found!")
336     ENDIF()
338     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
339     IF(NOT HAVE_NANOSLEEP)
340         MESSAGE(FATAL_ERROR "No sleep function found!")
341     ENDIF()
343     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
344     IF(HAVE_PTHREAD)
345         ADD_DEFINITIONS(-pthread)
346         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
347     ENDIF()
349     # We need pthreads outside of Windows
350     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
351     IF(NOT HAVE_PTHREAD_H)
352         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
353     ENDIF()
354     # Some systems need pthread_np.h to get recursive mutexes
355     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
357     # _GNU_SOURCE is needed on some systems for extra attributes, and
358     # _REENTRANT is needed for libc thread-safety
359     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
360     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
361     IF(HAVE_LIBPTHREAD)
362         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
363     ENDIF()
365     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
367     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
368     IF(HAVE_LIBRT)
369         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
370     ENDIF()
371 ENDIF()
373 # Check for a 64-bit type
374 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
375 IF(NOT HAVE_STDINT_H)
376     IF(HAVE_WINDOWS_H)
377         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
378                                  \#include <windows.h>
379                                  __int64 foo;
380                                  int main() {return 0;}" HAVE___INT64)
381     ENDIF()
382     IF(NOT HAVE___INT64)
383         IF(NOT SIZEOF_LONG MATCHES "8")
384             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
385                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
386             ENDIF()
387         ENDIF()
388     ENDIF()
389 ENDIF()
391 # Windows needs winmm for timeGetTime, even if the backend is disabled
392 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
393 IF(HAVE_LIBWINMM)
394     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
395     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
396 ENDIF()
399 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
400                  OpenAL32/alBuffer.c
401                  OpenAL32/alEffect.c
402                  OpenAL32/alError.c
403                  OpenAL32/alExtension.c
404                  OpenAL32/alFilter.c
405                  OpenAL32/alListener.c
406                  OpenAL32/alSource.c
407                  OpenAL32/alState.c
408                  OpenAL32/alThunk.c
410 SET(ALC_OBJS  Alc/ALc.c
411               Alc/ALu.c
412               Alc/alcConfig.c
413               Alc/alcDedicated.c
414               Alc/alcEcho.c
415               Alc/alcModulator.c
416               Alc/alcReverb.c
417               Alc/alcRing.c
418               Alc/alcThread.c
419               Alc/bs2b.c
420               Alc/helpers.c
421               Alc/hrtf.c
422               Alc/mixer.c
423               Alc/panning.c
424               # Default backends, always available
425               Alc/backends/loopback.c
426               Alc/backends/null.c
429 SET(BACKENDS "")
430 SET(HAVE_ALSA       0)
431 SET(HAVE_OSS        0)
432 SET(HAVE_SOLARIS    0)
433 SET(HAVE_SNDIO      0)
434 SET(HAVE_DSOUND     0)
435 SET(HAVE_WINMM      0)
436 SET(HAVE_PORTAUDIO  0)
437 SET(HAVE_PULSEAUDIO 0)
438 SET(HAVE_COREAUDIO  0)
439 SET(HAVE_OPENSL     0)
440 SET(HAVE_WAVE       0)
442 # Check ALSA backend
443 IF(ALSA)
444     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
445     IF(HAVE_ALSA_ASOUNDLIB_H)
446         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
447         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
448             SET(HAVE_ALSA 1)
449             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
450             IF(HAVE_DLFCN_H OR WIN32)
451                 SET(BACKENDS  "${BACKENDS} ALSA,")
452             ELSE()
453                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
454                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
455             ENDIF()
456         ENDIF()
457     ENDIF()
458 ENDIF()
459 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
460     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
461 ENDIF()
463 # Check OSS backend
464 IF(OSS)
465     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
466     IF(HAVE_SYS_SOUNDCARD_H)
467         SET(HAVE_OSS 1)
468         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
469         SET(BACKENDS  "${BACKENDS} OSS,")
470     ENDIF()
471 ENDIF()
472 IF(REQUIRE_OSS AND NOT HAVE_OSS)
473     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
474 ENDIF()
476 # Check Solaris backend
477 IF(SOLARIS)
478     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
479     IF(HAVE_SYS_AUDIOIO_H)
480         SET(HAVE_SOLARIS 1)
481         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
482         SET(BACKENDS  "${BACKENDS} Solaris,")
483     ENDIF()
484 ENDIF()
485 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
486     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
487 ENDIF()
489 # Check SndIO backend
490 IF(SNDIO)
491     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
492     IF(HAVE_SNDIO_H)
493         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
494         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
495             SET(HAVE_SNDIO 1)
496             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
497             IF(HAVE_DLFCN_H OR WIN32)
498                 SET(BACKENDS  "${BACKENDS} SndIO,")
499             ELSE()
500                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
501                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
502             ENDIF()
503         ENDIF()
504     ENDIF()
505 ENDIF()
506 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
507     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
508 ENDIF()
510 # Check for MMDevApi backend
511 IF(HAVE_WINDOWS_H)
512     IF(MMDEVAPI)
513         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
514         IF(HAVE_MMDEVICEAPI_H)
515             SET(HAVE_MMDEVAPI 1)
516             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
518             SET(BACKENDS  "${BACKENDS} MMDevApi,")
519         ENDIF()
520     ENDIF()
521 ENDIF()
522 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
523     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
524 ENDIF()
526 # Check DSound/MMSystem backend
527 IF(DSOUND)
528     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
529     IF(HAVE_DSOUND_H)
530         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
531         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
532             SET(HAVE_DSOUND 1)
533             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
535             IF(HAVE_DLFCN_H OR WIN32)
536                 SET(BACKENDS  "${BACKENDS} DirectSound,")
537             ELSE()
538                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
539                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
540             ENDIF()
541         ENDIF()
542     ENDIF()
543 ENDIF()
544 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
545     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
546 ENDIF()
548 IF(HAVE_WINDOWS_H)
549     IF(WINMM)
550         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
551         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
552             SET(HAVE_WINMM 1)
553             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
554             SET(BACKENDS  "${BACKENDS} WinMM,")
555         ENDIF()
556     ENDIF()
557 ENDIF()
558 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
559     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
560 ENDIF()
562 # Check PortAudio backend
563 IF(PORTAUDIO)
564     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
565     IF(HAVE_PORTAUDIO_H)
566         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
567         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
568             SET(HAVE_PORTAUDIO 1)
569             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
570             IF(HAVE_DLFCN_H OR WIN32)
571                 SET(BACKENDS  "${BACKENDS} PortAudio,")
572             ELSE()
573                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
574                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
575             ENDIF()
576         ENDIF()
577     ENDIF()
578 ENDIF()
579 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
580     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
581 ENDIF()
583 # Check PulseAudio backend
584 IF(PULSEAUDIO)
585     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
586     IF(HAVE_PULSE_PULSEAUDIO_H)
587         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
588         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
589             SET(HAVE_PULSEAUDIO 1)
590             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
591             IF(HAVE_DLFCN_H OR WIN32)
592                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
593             ELSE()
594                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
595                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
596             ENDIF()
597         ENDIF()
598     ENDIF()
599 ENDIF()
600 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
601     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
602 ENDIF()
604 # Check CoreAudio backend
605 IF(COREAUDIO)
606     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
607     IF(HAVE_COREAUDIO_FRAMEWORK)
608         SET(HAVE_COREAUDIO 1)
609         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
610         SET(BACKENDS  "${BACKENDS} CoreAudio,")
611         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
612         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
613         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
614     ENDIF()
615 ENDIF()
616 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
617     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
618 ENDIF()
620 # Check for OpenSL (Android) backend
621 IF(OPENSL)
622     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
623     IF(HAVE_SLES_OPENSLES_ANDROID_H)
624         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
625         IF(HAVE_LIBOPENSLES)
626             SET(HAVE_OPENSL 1)
627             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
628             SET(BACKENDS  "${BACKENDS} OpenSL,")
629             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
630         ENDIF()
631     ENDIF()
632 ENDIF()
633 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
634     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
635 ENDIF()
637 # Optionally enable the Wave Writer backend
638 IF(WAVE)
639     SET(HAVE_WAVE 1)
640     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
641     SET(BACKENDS  "${BACKENDS} WaveFile,")
642 ENDIF()
644 # This is always available
645 SET(BACKENDS  "${BACKENDS} Null")
647 IF(LIBTYPE STREQUAL "STATIC")
648     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
649     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
650 ENDIF()
652 # Needed for openal.pc.in
653 SET(prefix ${CMAKE_INSTALL_PREFIX})
654 SET(exec_prefix "\${prefix}")
655 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
656 SET(bindir "\${exec_prefix}/bin")
657 SET(includedir "\${prefix}/include")
658 SET(PACKAGE_VERSION "${LIB_VERSION}")
660 # End configuration
661 CONFIGURE_FILE(
662     "${OpenAL_SOURCE_DIR}/config.h.in"
663     "${OpenAL_BINARY_DIR}/config.h")
664 CONFIGURE_FILE(
665     "${OpenAL_SOURCE_DIR}/openal.pc.in"
666     "${OpenAL_BINARY_DIR}/openal.pc"
667     @ONLY)
669 # Build a library
670 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
671 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
672                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
673                                             VERSION ${LIB_VERSION}.0
674                                             SOVERSION ${LIB_MAJOR_VERSION})
675 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
676     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
677 ENDIF()
679 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
681 # Add an install target here
682 INSTALL(TARGETS ${LIBNAME}
683         RUNTIME DESTINATION bin
684         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
685         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
687 INSTALL(FILES include/AL/al.h
688               include/AL/alc.h
689               include/AL/alext.h
690               include/AL/efx.h
691               include/AL/efx-creative.h
692         DESTINATION include/AL
694 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
695         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
698 MESSAGE(STATUS "")
699 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
700 MESSAGE(STATUS "    ${BACKENDS}")
701 MESSAGE(STATUS "")
703 IF(WIN32)
704     IF(NOT HAVE_DSOUND)
705         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
706         MESSAGE(STATUS "         This is probably NOT what you want!")
707         MESSAGE(STATUS "")
708     ENDIF()
709 ENDIF()
711 # Install alsoft.conf configuration file
712 IF(ALSOFT_CONFIG)
713     INSTALL(FILES alsoftrc.sample
714             DESTINATION /etc/openal
715             RENAME alsoft.conf
716     )
717     MESSAGE(STATUS "Installing sample alsoft.conf")
718     MESSAGE(STATUS "")
719 ENDIF()
721 IF(UTILS)
722     ADD_EXECUTABLE(openal-info utils/openal-info.c)
723     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
724     INSTALL(TARGETS openal-info
725             RUNTIME DESTINATION bin
726             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
727             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
728     )
729     MESSAGE(STATUS "Building utility programs")
730     MESSAGE(STATUS "")
731 ENDIF()