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