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