Check for asinf and use it
[openal-soft/openal-hmr.git] / CMakeLists.txt
blob4909a985bcf1c329ccbbb7586d4759583c4d83a4
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 CHECK_LIBRARY_EXISTS(m  powf   "" HAVE_POWF)
227 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
228 CHECK_LIBRARY_EXISTS(m  cosf   "" HAVE_COSF)
229 CHECK_LIBRARY_EXISTS(m  sinf   "" HAVE_SINF)
230 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
231 CHECK_LIBRARY_EXISTS(m  asinf  "" HAVE_ASINF)
232 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
233 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
234 IF(HAVE_FENV_H)
235     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
236 ENDIF()
237 IF(HAVE_SQRTF OR HAVE_COSF OR HAVE_SINF OR HAVE_ACOSF OR HAVE_ASINF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
238     SET(EXTRA_LIBS m ${EXTRA_LIBS})
239 ENDIF()
240 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
241 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
243 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
244 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
245 IF(NOT HAVE_STRCASECMP)
246     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
247     IF(NOT HAVE__STRICMP)
248         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
249     ENDIF()
251     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
252 ENDIF()
254 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
255 IF(NOT HAVE_STRNCASECMP)
256     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
257     IF(NOT HAVE__STRNICMP)
258         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
259     ENDIF()
261     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
262 ENDIF()
264 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
265 IF(NOT HAVE_SNPRINTF)
266     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
267     IF(NOT HAVE__SNPRINTF)
268         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
269     ENDIF()
271     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
272 ENDIF()
274 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
275 IF(NOT HAVE_VSNPRINTF)
276     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
277     IF(NOT HAVE__VSNPRINTF)
278         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
279     ENDIF()
281     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
282 ENDIF()
284 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
285 IF(NOT HAVE_ISFINITE)
286     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
287     IF(NOT HAVE_FINITE)
288         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
289         IF(NOT HAVE__FINITE)
290             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
291         ENDIF()
292         ADD_DEFINITIONS(-Disfinite=_finite)
293     ELSE()
294         ADD_DEFINITIONS(-Disfinite=finite)
295     ENDIF()
296 ENDIF()
298 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
299 IF(NOT HAVE_ISNAN)
300     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
301     IF(NOT HAVE__ISNAN)
302         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
303     ENDIF()
305     ADD_DEFINITIONS(-Disnan=_isnan)
306 ENDIF()
309 # Check for the dlopen API (for dynamicly loading backend libs)
310 IF(DLOPEN)
311     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
312     IF(HAVE_DLFCN_H)
313         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
314         IF(HAVE_LIBDL)
315             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
316         ENDIF()
317     ENDIF()
318 ENDIF()
320 # Check if we have Windows headers
321 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
322 IF(NOT HAVE_WINDOWS_H)
323     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
324     IF(NOT HAVE_GETTIMEOFDAY)
325         MESSAGE(FATAL_ERROR "No timing function found!")
326     ENDIF()
328     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
329     IF(NOT HAVE_NANOSLEEP)
330         MESSAGE(FATAL_ERROR "No sleep function found!")
331     ENDIF()
333     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
334     IF(HAVE_PTHREAD)
335         ADD_DEFINITIONS(-pthread)
336         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
337     ENDIF()
339     # We need pthreads outside of Windows
340     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
341     IF(NOT HAVE_PTHREAD_H)
342         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
343     ENDIF()
344     # Some systems need pthread_np.h to get recursive mutexes
345     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
347     # _GNU_SOURCE is needed on some systems for extra attributes, and
348     # _REENTRANT is needed for libc thread-safety
349     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
350     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
351     IF(HAVE_LIBPTHREAD)
352         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
353     ENDIF()
355     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
357     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
358     IF(HAVE_LIBRT)
359         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
360     ENDIF()
361 ENDIF()
363 # Check for a 64-bit type
364 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
365 IF(NOT HAVE_STDINT_H)
366     IF(HAVE_WINDOWS_H)
367         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
368                                  \#include <windows.h>
369                                  __int64 foo;
370                                  int main() {return 0;}" HAVE___INT64)
371     ENDIF()
372     IF(NOT HAVE___INT64)
373         IF(NOT SIZEOF_LONG MATCHES "8")
374             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
375                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
376             ENDIF()
377         ENDIF()
378     ENDIF()
379 ENDIF()
381 # Windows needs winmm for timeGetTime, even if the backend is disabled
382 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
383 IF(HAVE_LIBWINMM)
384     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
385     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
386 ENDIF()
389 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
390                  OpenAL32/alBuffer.c
391                  OpenAL32/alEffect.c
392                  OpenAL32/alError.c
393                  OpenAL32/alExtension.c
394                  OpenAL32/alFilter.c
395                  OpenAL32/alListener.c
396                  OpenAL32/alSource.c
397                  OpenAL32/alState.c
398                  OpenAL32/alThunk.c
400 SET(ALC_OBJS  Alc/ALc.c
401               Alc/ALu.c
402               Alc/alcConfig.c
403               Alc/alcDedicated.c
404               Alc/alcEcho.c
405               Alc/alcModulator.c
406               Alc/alcReverb.c
407               Alc/alcRing.c
408               Alc/alcThread.c
409               Alc/bs2b.c
410               Alc/helpers.c
411               Alc/hrtf.c
412               Alc/mixer.c
413               Alc/panning.c
414               # Default backends, always available
415               Alc/backends/loopback.c
416               Alc/backends/null.c
419 SET(BACKENDS "")
420 SET(HAVE_ALSA       0)
421 SET(HAVE_OSS        0)
422 SET(HAVE_SOLARIS    0)
423 SET(HAVE_SNDIO      0)
424 SET(HAVE_DSOUND     0)
425 SET(HAVE_WINMM      0)
426 SET(HAVE_PORTAUDIO  0)
427 SET(HAVE_PULSEAUDIO 0)
428 SET(HAVE_COREAUDIO  0)
429 SET(HAVE_OPENSL     0)
430 SET(HAVE_WAVE       0)
432 # Check ALSA backend
433 IF(ALSA)
434     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
435     IF(HAVE_ALSA_ASOUNDLIB_H)
436         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
437         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
438             SET(HAVE_ALSA 1)
439             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
440             IF(HAVE_DLFCN_H OR WIN32)
441                 SET(BACKENDS  "${BACKENDS} ALSA,")
442             ELSE()
443                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
444                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
445             ENDIF()
446         ENDIF()
447     ENDIF()
448 ENDIF()
449 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
450     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
451 ENDIF()
453 # Check OSS backend
454 IF(OSS)
455     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
456     IF(HAVE_SYS_SOUNDCARD_H)
457         SET(HAVE_OSS 1)
458         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
459         SET(BACKENDS  "${BACKENDS} OSS,")
460     ENDIF()
461 ENDIF()
462 IF(REQUIRE_OSS AND NOT HAVE_OSS)
463     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
464 ENDIF()
466 # Check Solaris backend
467 IF(SOLARIS)
468     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
469     IF(HAVE_SYS_AUDIOIO_H)
470         SET(HAVE_SOLARIS 1)
471         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
472         SET(BACKENDS  "${BACKENDS} Solaris,")
473     ENDIF()
474 ENDIF()
475 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
476     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
477 ENDIF()
479 # Check SndIO backend
480 IF(SNDIO)
481     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
482     IF(HAVE_SNDIO_H)
483         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
484         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
485             SET(HAVE_SNDIO 1)
486             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
487             IF(HAVE_DLFCN_H OR WIN32)
488                 SET(BACKENDS  "${BACKENDS} SndIO,")
489             ELSE()
490                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
491                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
492             ENDIF()
493         ENDIF()
494     ENDIF()
495 ENDIF()
496 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
497     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
498 ENDIF()
500 # Check for MMDevApi backend
501 IF(HAVE_WINDOWS_H)
502     IF(MMDEVAPI)
503         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
504         IF(HAVE_MMDEVICEAPI_H)
505             SET(HAVE_MMDEVAPI 1)
506             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
508             SET(BACKENDS  "${BACKENDS} MMDevApi,")
509         ENDIF()
510     ENDIF()
511 ENDIF()
512 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
513     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
514 ENDIF()
516 # Check DSound/MMSystem backend
517 IF(DSOUND)
518     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
519     IF(HAVE_DSOUND_H)
520         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
521         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
522             SET(HAVE_DSOUND 1)
523             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
525             IF(HAVE_DLFCN_H OR WIN32)
526                 SET(BACKENDS  "${BACKENDS} DirectSound,")
527             ELSE()
528                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
529                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
530             ENDIF()
531         ENDIF()
532     ENDIF()
533 ENDIF()
534 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
535     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
536 ENDIF()
538 IF(HAVE_WINDOWS_H)
539     IF(WINMM)
540         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
541         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
542             SET(HAVE_WINMM 1)
543             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
544             SET(BACKENDS  "${BACKENDS} WinMM,")
545         ENDIF()
546     ENDIF()
547 ENDIF()
548 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
549     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
550 ENDIF()
552 # Check PortAudio backend
553 IF(PORTAUDIO)
554     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
555     IF(HAVE_PORTAUDIO_H)
556         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
557         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
558             SET(HAVE_PORTAUDIO 1)
559             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
560             IF(HAVE_DLFCN_H OR WIN32)
561                 SET(BACKENDS  "${BACKENDS} PortAudio,")
562             ELSE()
563                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
564                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
565             ENDIF()
566         ENDIF()
567     ENDIF()
568 ENDIF()
569 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
570     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
571 ENDIF()
573 # Check PulseAudio backend
574 IF(PULSEAUDIO)
575     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
576     IF(HAVE_PULSE_PULSEAUDIO_H)
577         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
578         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
579             SET(HAVE_PULSEAUDIO 1)
580             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
581             IF(HAVE_DLFCN_H OR WIN32)
582                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
583             ELSE()
584                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
585                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
586             ENDIF()
587         ENDIF()
588     ENDIF()
589 ENDIF()
590 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
591     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
592 ENDIF()
594 # Check CoreAudio backend
595 IF(COREAUDIO)
596     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
597     IF(HAVE_COREAUDIO_FRAMEWORK)
598         SET(HAVE_COREAUDIO 1)
599         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
600         SET(BACKENDS  "${BACKENDS} CoreAudio,")
601         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
602         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
603         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
604     ENDIF()
605 ENDIF()
606 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
607     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
608 ENDIF()
610 # Check for OpenSL (Android) backend
611 IF(OPENSL)
612     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
613     IF(HAVE_SLES_OPENSLES_ANDROID_H)
614         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
615         IF(HAVE_LIBOPENSLES)
616             SET(HAVE_OPENSL 1)
617             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
618             SET(BACKENDS  "${BACKENDS} OpenSL,")
619             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
620         ENDIF()
621     ENDIF()
622 ENDIF()
623 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
624     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
625 ENDIF()
627 # Optionally enable the Wave Writer backend
628 IF(WAVE)
629     SET(HAVE_WAVE 1)
630     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
631     SET(BACKENDS  "${BACKENDS} WaveFile,")
632 ENDIF()
634 # This is always available
635 SET(BACKENDS  "${BACKENDS} Null")
637 IF(LIBTYPE STREQUAL "STATIC")
638     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
639     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
640 ENDIF()
642 # Needed for openal.pc.in
643 SET(prefix ${CMAKE_INSTALL_PREFIX})
644 SET(exec_prefix "\${prefix}")
645 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
646 SET(bindir "\${exec_prefix}/bin")
647 SET(includedir "\${prefix}/include")
648 SET(PACKAGE_VERSION "${LIB_VERSION}")
650 # End configuration
651 CONFIGURE_FILE(
652     "${OpenAL_SOURCE_DIR}/config.h.in"
653     "${OpenAL_BINARY_DIR}/config.h")
654 CONFIGURE_FILE(
655     "${OpenAL_SOURCE_DIR}/openal.pc.in"
656     "${OpenAL_BINARY_DIR}/openal.pc"
657     @ONLY)
659 # Build a library
660 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
661 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
662                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
663                                             VERSION ${LIB_VERSION}.0
664                                             SOVERSION ${LIB_MAJOR_VERSION})
665 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
666     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
667 ENDIF()
669 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
671 # Add an install target here
672 INSTALL(TARGETS ${LIBNAME}
673         RUNTIME DESTINATION bin
674         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
675         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
677 INSTALL(FILES include/AL/al.h
678               include/AL/alc.h
679               include/AL/alext.h
680               include/AL/efx.h
681               include/AL/efx-creative.h
682         DESTINATION include/AL
684 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
685         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
688 MESSAGE(STATUS "")
689 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
690 MESSAGE(STATUS "    ${BACKENDS}")
691 MESSAGE(STATUS "")
693 IF(WIN32)
694     IF(NOT HAVE_DSOUND)
695         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
696         MESSAGE(STATUS "         This is probably NOT what you want!")
697         MESSAGE(STATUS "")
698     ENDIF()
699 ENDIF()
701 # Install alsoft.conf configuration file
702 IF(ALSOFT_CONFIG)
703     INSTALL(FILES alsoftrc.sample
704             DESTINATION /etc/openal
705             RENAME alsoft.conf
706     )
707     MESSAGE(STATUS "Installing sample alsoft.conf")
708     MESSAGE(STATUS "")
709 ENDIF()
711 IF(UTILS)
712     ADD_EXECUTABLE(openal-info utils/openal-info.c)
713     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
714     INSTALL(TARGETS openal-info
715             RUNTIME DESTINATION bin
716             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
717             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
718     )
719     MESSAGE(STATUS "Building utility programs")
720     MESSAGE(STATUS "")
721 ENDIF()