Remove unused filter functions
[openal-soft.git] / CMakeLists.txt
blobfdee264e74fb9b108d32fab5bb6bba66b095efd8
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)
20 INCLUDE(FindPkgConfig)
23 PROJECT(OpenAL C)
26 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
29 OPTION(SSE  "Check for SSE CPU extensions"      ON)
30 OPTION(NEON "Check for ARM Neon CPU extensions" ON)
32 OPTION(REQUIRE_SSE  "Require SSE CPU extensions"      OFF)
33 OPTION(REQUIRE_NEON "Require ARM Neon CPU extensions" OFF)
36 OPTION(ALSA    "Check for ALSA backend"                ON)
37 OPTION(OSS     "Check for OSS backend"                 ON)
38 OPTION(SOLARIS "Check for Solaris backend"             ON)
39 OPTION(SNDIO   "Check for SndIO backend"               ON)
40 OPTION(MMDEVAPI "Check for MMDevApi"                   ON)
41 OPTION(DSOUND  "Check for DirectSound backend"         ON)
42 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
43 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
44 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
45 OPTION(COREAUDIO  "Check for CoreAudio backend"        ON)
46 OPTION(OPENSL     "Check for OpenSL backend"           ON)
47 OPTION(WAVE    "Enable Wave Writer backend"            ON)
49 OPTION(REQUIRE_ALSA       "Require ALSA backend"               OFF)
50 OPTION(REQUIRE_OSS        "Require OSS backend"                OFF)
51 OPTION(REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
52 OPTION(REQUIRE_SNDIO      "Require SndIO backend"              OFF)
53 OPTION(REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
54 OPTION(REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
55 OPTION(REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
56 OPTION(REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
57 OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
58 OPTION(REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
59 OPTION(REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
61 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
63 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
65 OPTION(UTILS  "Build and install utility programs"  ON)
67 OPTION(EXAMPLES  "Build and install example programs"  ON)
69 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
72 IF(WIN32)
73     SET(LIBNAME OpenAL32)
74     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0501")
75 ELSE()
76     SET(LIBNAME openal)
77 ENDIF()
79 IF(NOT LIBTYPE)
80     SET(LIBTYPE SHARED)
81 ENDIF()
83 SET(LIB_MAJOR_VERSION "1")
84 SET(LIB_MINOR_VERSION "14")
85 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
87 SET(EXPORT_DECL "")
90 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
91 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
94 CHECK_C_SOURCE_COMPILES("int *restrict foo;
95                          int main() {return 0;}" HAVE_RESTRICT)
96 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
97                          int main() {return 0;}" HAVE___RESTRICT)
100 # Add definitions, compiler switches, etc.
101 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
103 IF(NOT CMAKE_BUILD_TYPE)
104     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
105         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
106         FORCE)
107 ENDIF()
108 IF(NOT CMAKE_DEBUG_POSTFIX)
109     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
110         "Library postfix for debug builds. Normally left blank."
111         FORCE)
112 ENDIF()
114 IF(MSVC)
115     # ???
116     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
117     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
118     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
119     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
120     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
121     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
123     IF(NOT DXSDK_DIR)
124         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
125     ELSE()
126         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
127     ENDIF()
128     IF(DXSDK_DIR)
129         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
130         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
131         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
132         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
133     ENDIF()
135     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
136     IF(FORCE_STATIC_VCRT)
137         FOREACH(flag_var
138                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
139                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
140             IF(${flag_var} MATCHES "/MD")
141                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
142             ENDIF()
143         ENDFOREACH(flag_var)
144     ENDIF()
145 ELSE()
146     ADD_DEFINITIONS(-Winline -Wall)
147     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
148     IF(HAVE_W_EXTRA)
149         ADD_DEFINITIONS(-Wextra)
150     ENDIF()
152     IF(WERROR)
153         ADD_DEFINITIONS(-Werror)
154     ENDIF()
156     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
157         "Flags used by the compiler during Release with Debug Info builds."
158         FORCE)
159     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
160         "Flags used by the compiler during release minsize builds."
161         FORCE)
162     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
163         "Flags used by the compiler during release builds"
164         FORCE)
165     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
166         "Flags used by the compiler during debug builds."
167         FORCE)
169     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
170                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
171 ENDIF()
173 # Set visibility/export options if available
174 IF(WIN32)
175     SET(EXPORT_DECL "__declspec(dllexport)")
177     OPTION(WINE "Enable use of Wine headers when compiling" OFF)
178     IF(WINE)
179         FIND_PATH(WINE_INCLUDE_DIR library.h
180                   PATHS
181                   /usr/include/wine
182                   /usr/local/include/wine
183                   CMAKE_FIND_ROOT_PATH_BOTH)
184         IF(WINE_INCLUDE_DIR)
185             MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
186             INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
187             SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
188         ELSE()
189             MESSAGE(STATUS "Could not find Wine header files" )
190         ENDIF()
191     ENDIF()
192 ELSE()
193     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
194     # Yes GCC, really don't accept visibility modes you don't support
195     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
197     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
198                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
199     IF(HAVE_GCC_PROTECTED_VISIBILITY)
200         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
201     ELSE()
202         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
203                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
204         IF(HAVE_GCC_DEFAULT_VISIBILITY)
205             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
206         ENDIF()
207     ENDIF()
209     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
210         CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
211         IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
212             ADD_DEFINITIONS(-fvisibility=internal)
213         ELSE()
214             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
215             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
216                 ADD_DEFINITIONS(-fvisibility=hidden)
217             ENDIF()
218         ENDIF()
219     ENDIF()
221     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
222 ENDIF()
224 SET(SSE_SWITCH "")
225 CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
226 IF(HAVE_MSSE_SWITCH)
227     SET(SSE_SWITCH "-msse")
228 ENDIF()
230 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
231                          int main() {return 0;}" HAVE_GCC_FORMAT)
233 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
234 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
235 CHECK_INCLUDE_FILE(fpu_control.h HAVE_FPU_CONTROL_H)
236 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
237 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
238 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
239 IF(NOT HAVE_GUIDDEF_H)
240     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
241 ENDIF()
243 # Some systems need libm for some of the following math functions to work
244 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
245 IF(HAVE_LIBM)
246     SET(EXTRA_LIBS m ${EXTRA_LIBS})
247     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
248 ENDIF()
251 CHECK_SYMBOL_EXISTS(powf   math.h HAVE_POWF)
252 CHECK_SYMBOL_EXISTS(sqrtf  math.h HAVE_SQRTF)
253 CHECK_SYMBOL_EXISTS(cosf   math.h HAVE_COSF)
254 CHECK_SYMBOL_EXISTS(sinf   math.h HAVE_SINF)
255 CHECK_SYMBOL_EXISTS(acosf  math.h HAVE_ACOSF)
256 CHECK_SYMBOL_EXISTS(asinf  math.h HAVE_ASINF)
257 CHECK_SYMBOL_EXISTS(atanf  math.h HAVE_ATANF)
258 CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
259 CHECK_SYMBOL_EXISTS(fabsf  math.h HAVE_FABSF)
260 CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
261 CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
263 IF(HAVE_FENV_H)
264     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
265 ENDIF()
267 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
268 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
270 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
271 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
272 IF(NOT HAVE_STRCASECMP)
273     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
274     IF(NOT HAVE__STRICMP)
275         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
276     ENDIF()
278     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
279 ENDIF()
281 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
282 IF(NOT HAVE_STRNCASECMP)
283     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
284     IF(NOT HAVE__STRNICMP)
285         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
286     ENDIF()
288     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
289 ENDIF()
291 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
292 IF(NOT HAVE_SNPRINTF)
293     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
294     IF(NOT HAVE__SNPRINTF)
295         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
296     ENDIF()
298     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
299 ENDIF()
301 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
302 IF(NOT HAVE_VSNPRINTF)
303     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
304     IF(NOT HAVE__VSNPRINTF)
305         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
306     ENDIF()
308     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
309 ENDIF()
311 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
312 IF(NOT HAVE_ISFINITE)
313     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
314     IF(NOT HAVE_FINITE)
315         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
316         IF(NOT HAVE__FINITE)
317             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
318         ENDIF()
319         ADD_DEFINITIONS(-Disfinite=_finite)
320     ELSE()
321         ADD_DEFINITIONS(-Disfinite=finite)
322     ENDIF()
323 ENDIF()
325 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
326 IF(NOT HAVE_ISNAN)
327     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
328     IF(NOT HAVE__ISNAN)
329         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
330     ENDIF()
332     ADD_DEFINITIONS(-Disnan=_isnan)
333 ENDIF()
336 # Check for the dlopen API (for dynamicly loading backend libs)
337 IF(DLOPEN)
338     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
339     IF(HAVE_DLFCN_H)
340         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
341         IF(HAVE_LIBDL)
342             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
343         ENDIF()
344     ENDIF()
345 ENDIF()
347 # Check if we have Windows headers
348 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
349 IF(NOT HAVE_WINDOWS_H)
350     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
351     IF(NOT HAVE_GETTIMEOFDAY)
352         MESSAGE(FATAL_ERROR "No timing function found!")
353     ENDIF()
355     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
356     IF(NOT HAVE_NANOSLEEP)
357         MESSAGE(FATAL_ERROR "No sleep function found!")
358     ENDIF()
360     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
361     IF(HAVE_PTHREAD)
362         ADD_DEFINITIONS(-pthread)
363         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
364     ENDIF()
366     # We need pthreads outside of Windows
367     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
368     IF(NOT HAVE_PTHREAD_H)
369         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
370     ENDIF()
371     # Some systems need pthread_np.h to get recursive mutexes
372     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
374     # _GNU_SOURCE is needed on some systems for extra attributes
375     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
376     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
377     IF(HAVE_LIBPTHREAD)
378         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
379     ENDIF()
381     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
383     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
384     IF(HAVE_LIBRT)
385         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
386     ENDIF()
387 ENDIF()
389 # Check for a 64-bit type
390 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
391 IF(NOT HAVE_STDINT_H)
392     IF(HAVE_WINDOWS_H)
393         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
394                                  \#include <windows.h>
395                                  __int64 foo;
396                                  int main() {return 0;}" HAVE___INT64)
397     ENDIF()
398     IF(NOT HAVE___INT64)
399         IF(NOT SIZEOF_LONG MATCHES "8")
400             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
401                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
402             ENDIF()
403         ENDIF()
404     ENDIF()
405 ENDIF()
407 # Windows needs winmm for timeGetTime, even if the backend is disabled
408 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
409 IF(HAVE_LIBWINMM)
410     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
411     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
412 ENDIF()
415 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
416                  OpenAL32/alBuffer.c
417                  OpenAL32/alEffect.c
418                  OpenAL32/alError.c
419                  OpenAL32/alExtension.c
420                  OpenAL32/alFilter.c
421                  OpenAL32/alListener.c
422                  OpenAL32/alSource.c
423                  OpenAL32/alState.c
424                  OpenAL32/alThunk.c
426 SET(ALC_OBJS  Alc/ALc.c
427               Alc/ALu.c
428               Alc/alcConfig.c
429               Alc/alcDedicated.c
430               Alc/alcEcho.c
431               Alc/alcModulator.c
432               Alc/alcReverb.c
433               Alc/alcRing.c
434               Alc/alcThread.c
435               Alc/bs2b.c
436               Alc/helpers.c
437               Alc/panning.c
438               Alc/hrtf.c
439               Alc/mixer.c
440               Alc/mixer_c.c
444 SET(CPU_EXTS "Default")
445 SET(HAVE_SSE  0)
446 SET(HAVE_NEON 0)
448 # Check for SSE support
449 IF(SSE)
450     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
451     IF(HAVE_XMMINTRIN_H)
452         SET(HAVE_SSE 1)
453         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
454         IF(SSE_SWITCH)
455             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
456                                         COMPILE_FLAGS "${SSE_SWITCH}")
457         ENDIF()
458         SET(CPU_EXTS "${CPU_EXTS}, SSE")
459     ENDIF()
460 ENDIF()
461 IF(REQUIRE_SSE AND NOT HAVE_SSE)
462     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
463 ENDIF()
465 # Check for ARM Neon support
466 IF(NEON)
467     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
468     IF(HAVE_ARM_NEON_H)
469         SET(HAVE_NEON 1)
470         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
471         SET(CPU_EXTS "${CPU_EXTS}, Neon")
472     ENDIF()
473 ENDIF()
474 IF(REQUIRE_NEON AND NOT HAVE_NEON)
475     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
476 ENDIF()
479 SET(ALC_OBJS  ${ALC_OBJS}
480               # Default backends, always available
481               Alc/backends/loopback.c
482               Alc/backends/null.c
485 SET(BACKENDS "")
486 SET(HAVE_ALSA       0)
487 SET(HAVE_OSS        0)
488 SET(HAVE_SOLARIS    0)
489 SET(HAVE_SNDIO      0)
490 SET(HAVE_DSOUND     0)
491 SET(HAVE_MMDEVAPI   0)
492 SET(HAVE_WINMM      0)
493 SET(HAVE_PORTAUDIO  0)
494 SET(HAVE_PULSEAUDIO 0)
495 SET(HAVE_COREAUDIO  0)
496 SET(HAVE_OPENSL     0)
497 SET(HAVE_WAVE       0)
499 # Check ALSA backend
500 IF(ALSA)
501     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
502     IF(HAVE_ALSA_ASOUNDLIB_H)
503         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
504         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
505             SET(HAVE_ALSA 1)
506             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
507             IF(HAVE_DLFCN_H OR WIN32)
508                 SET(BACKENDS  "${BACKENDS} ALSA,")
509             ELSE()
510                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
511                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
512             ENDIF()
513         ENDIF()
514     ENDIF()
515 ENDIF()
516 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
517     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
518 ENDIF()
520 # Check OSS backend
521 IF(OSS)
522     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
523     IF(HAVE_SYS_SOUNDCARD_H)
524         SET(HAVE_OSS 1)
525         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
526         SET(BACKENDS  "${BACKENDS} OSS,")
527     ENDIF()
528 ENDIF()
529 IF(REQUIRE_OSS AND NOT HAVE_OSS)
530     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
531 ENDIF()
533 # Check Solaris backend
534 IF(SOLARIS)
535     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
536     IF(HAVE_SYS_AUDIOIO_H)
537         SET(HAVE_SOLARIS 1)
538         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
539         SET(BACKENDS  "${BACKENDS} Solaris,")
540     ENDIF()
541 ENDIF()
542 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
543     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
544 ENDIF()
546 # Check SndIO backend
547 IF(SNDIO)
548     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
549     IF(HAVE_SNDIO_H)
550         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
551         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
552             SET(HAVE_SNDIO 1)
553             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
554             IF(HAVE_DLFCN_H OR WIN32)
555                 SET(BACKENDS  "${BACKENDS} SndIO,")
556             ELSE()
557                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
558                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
559             ENDIF()
560         ENDIF()
561     ENDIF()
562 ENDIF()
563 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
564     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
565 ENDIF()
567 # Check for MMDevApi backend
568 IF(HAVE_WINDOWS_H)
569     IF(MMDEVAPI)
570         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
571         IF(HAVE_MMDEVICEAPI_H)
572             SET(HAVE_MMDEVAPI 1)
573             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
575             SET(BACKENDS  "${BACKENDS} MMDevApi,")
576         ENDIF()
577     ENDIF()
578 ENDIF()
579 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
580     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
581 ENDIF()
583 # Check DSound/MMSystem backend
584 IF(DSOUND)
585     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
586     IF(HAVE_DSOUND_H)
587         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
588         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
589             SET(HAVE_DSOUND 1)
590             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
592             IF(HAVE_DLFCN_H OR WIN32)
593                 SET(BACKENDS  "${BACKENDS} DirectSound,")
594             ELSE()
595                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
596                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
597             ENDIF()
598         ENDIF()
599     ENDIF()
600 ENDIF()
601 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
602     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
603 ENDIF()
605 IF(HAVE_WINDOWS_H)
606     IF(WINMM)
607         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
608         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
609             SET(HAVE_WINMM 1)
610             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
611             SET(BACKENDS  "${BACKENDS} WinMM,")
612         ENDIF()
613     ENDIF()
614 ENDIF()
615 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
616     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
617 ENDIF()
619 # Check PortAudio backend
620 IF(PORTAUDIO)
621     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
622     IF(HAVE_PORTAUDIO_H)
623         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
624         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
625             SET(HAVE_PORTAUDIO 1)
626             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
627             IF(HAVE_DLFCN_H OR WIN32)
628                 SET(BACKENDS  "${BACKENDS} PortAudio,")
629             ELSE()
630                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
631                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
632             ENDIF()
633         ENDIF()
634     ENDIF()
635 ENDIF()
636 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
637     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
638 ENDIF()
640 # Check PulseAudio backend
641 IF(PULSEAUDIO)
642     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
643     IF(HAVE_PULSE_PULSEAUDIO_H)
644         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
645         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
646             SET(HAVE_PULSEAUDIO 1)
647             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
648             IF(HAVE_DLFCN_H OR WIN32)
649                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
650             ELSE()
651                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
652                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
653             ENDIF()
654         ENDIF()
655     ENDIF()
656 ENDIF()
657 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
658     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
659 ENDIF()
661 # Check CoreAudio backend
662 IF(COREAUDIO)
663     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
664     IF(HAVE_COREAUDIO_FRAMEWORK)
665         SET(HAVE_COREAUDIO 1)
666         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
667         SET(BACKENDS  "${BACKENDS} CoreAudio,")
668         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
669         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
670         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
672         # Some versions of OSX may need the AudioToolbox framework. Add it if
673         # it's found.
674         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
675                      NAMES AudioToolbox
676                      PATHS ~/Library/Frameworks
677                            /Library/Frameworks
678                            /System/Library/Frameworks
679                     )
680         IF(AUDIOTOOLBOX_LIBRARY)
681             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
682         ENDIF()
683     ENDIF()
684 ENDIF()
685 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
686     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
687 ENDIF()
689 # Check for OpenSL (Android) backend
690 IF(OPENSL)
691     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
692     IF(HAVE_SLES_OPENSLES_ANDROID_H)
693         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
694         IF(HAVE_LIBOPENSLES)
695             SET(HAVE_OPENSL 1)
696             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
697             SET(BACKENDS  "${BACKENDS} OpenSL,")
698             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
699         ENDIF()
700     ENDIF()
701 ENDIF()
702 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
703     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
704 ENDIF()
706 # Optionally enable the Wave Writer backend
707 IF(WAVE)
708     SET(HAVE_WAVE 1)
709     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
710     SET(BACKENDS  "${BACKENDS} WaveFile,")
711 ENDIF()
713 # This is always available
714 SET(BACKENDS  "${BACKENDS} Null")
716 IF(EXAMPLES)
717     # Might be able to use earlier versions, but these definitely work
718     PKG_CHECK_MODULES(FFMPEG libavcodec>=52.123.0 libavformat>=52.111.0 libavutil>=51.9.1)
719 ENDIF()
721 IF(LIBTYPE STREQUAL "STATIC")
722     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
723     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
724 ENDIF()
726 # Needed for openal.pc.in
727 SET(prefix ${CMAKE_INSTALL_PREFIX})
728 SET(exec_prefix "\${prefix}")
729 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
730 SET(bindir "\${exec_prefix}/bin")
731 SET(includedir "\${prefix}/include")
732 SET(PACKAGE_VERSION "${LIB_VERSION}")
734 # End configuration
735 CONFIGURE_FILE(
736     "${OpenAL_SOURCE_DIR}/config.h.in"
737     "${OpenAL_BINARY_DIR}/config.h")
738 CONFIGURE_FILE(
739     "${OpenAL_SOURCE_DIR}/openal.pc.in"
740     "${OpenAL_BINARY_DIR}/openal.pc"
741     @ONLY)
743 # Build a library
744 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
745 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
746                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
747                                             VERSION ${LIB_VERSION}.0
748                                             SOVERSION ${LIB_MAJOR_VERSION})
749 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
750     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
751 ENDIF()
753 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
755 # Add an install target here
756 INSTALL(TARGETS ${LIBNAME}
757         RUNTIME DESTINATION bin
758         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
759         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
761 INSTALL(FILES include/AL/al.h
762               include/AL/alc.h
763               include/AL/alext.h
764               include/AL/efx.h
765               include/AL/efx-creative.h
766               include/AL/efx-presets.h
767         DESTINATION include/AL
769 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
770         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
773 MESSAGE(STATUS "")
774 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
775 MESSAGE(STATUS "    ${BACKENDS}")
776 MESSAGE(STATUS "")
777 MESSAGE(STATUS "Building with support for CPU extensions:")
778 MESSAGE(STATUS "    ${CPU_EXTS}")
779 MESSAGE(STATUS "")
781 IF(WIN32)
782     IF(NOT HAVE_DSOUND)
783         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
784         MESSAGE(STATUS "         This is probably NOT what you want!")
785         MESSAGE(STATUS "")
786     ENDIF()
787 ENDIF()
789 # Install alsoft.conf configuration file
790 IF(ALSOFT_CONFIG)
791     INSTALL(FILES alsoftrc.sample
792             DESTINATION /etc/openal
793             RENAME alsoft.conf
794     )
795     MESSAGE(STATUS "Installing sample alsoft.conf")
796     MESSAGE(STATUS "")
797 ENDIF()
799 IF(UTILS)
800     ADD_EXECUTABLE(openal-info utils/openal-info.c)
801     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
803     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
804     IF(HAVE_LIBM)
805         TARGET_LINK_LIBRARIES(makehrtf m)
806     ENDIF()
808     INSTALL(TARGETS openal-info makehrtf
809             RUNTIME DESTINATION bin
810             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
811             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
812     )
813     MESSAGE(STATUS "Building utility programs")
814     MESSAGE(STATUS "")
815 ENDIF()
817 IF(EXAMPLES)
818     IF(FFMPEG_FOUND)
819         ADD_EXECUTABLE(alstream examples/alhelpers.c examples/alffmpeg.c examples/alstream.c)
820         TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
821         SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
822         INSTALL(TARGETS alstream
823                 RUNTIME DESTINATION bin
824                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
825                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
826         )
828         MESSAGE(STATUS "Building ffmpeg example programs")
829         MESSAGE(STATUS "")
830     ENDIF()
831 ENDIF()