Ensure some HRTF-related parameters are aligned
[openal-soft/openal-hmr.git] / CMakeLists.txt
blobf2265b87ecf5d32c2c26e57eab79ce561e895363
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(powf   math.h HAVE_POWF)
260 CHECK_SYMBOL_EXISTS(sqrtf  math.h HAVE_SQRTF)
261 CHECK_SYMBOL_EXISTS(cosf   math.h HAVE_COSF)
262 CHECK_SYMBOL_EXISTS(sinf   math.h HAVE_SINF)
263 CHECK_SYMBOL_EXISTS(acosf  math.h HAVE_ACOSF)
264 CHECK_SYMBOL_EXISTS(asinf  math.h HAVE_ASINF)
265 CHECK_SYMBOL_EXISTS(atanf  math.h HAVE_ATANF)
266 CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
267 CHECK_SYMBOL_EXISTS(fabsf  math.h HAVE_FABSF)
268 CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
269 CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
271 IF(HAVE_FENV_H)
272     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
273 ENDIF()
275 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
276 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
278 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
279 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
280 IF(NOT HAVE_STRCASECMP)
281     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
282     IF(NOT HAVE__STRICMP)
283         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
284     ENDIF()
286     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
287 ENDIF()
289 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
290 IF(NOT HAVE_STRNCASECMP)
291     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
292     IF(NOT HAVE__STRNICMP)
293         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
294     ENDIF()
296     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
297 ENDIF()
299 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
300 IF(NOT HAVE_SNPRINTF)
301     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
302     IF(NOT HAVE__SNPRINTF)
303         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
304     ENDIF()
306     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
307 ENDIF()
309 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
310 IF(NOT HAVE_VSNPRINTF)
311     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
312     IF(NOT HAVE__VSNPRINTF)
313         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
314     ENDIF()
316     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
317 ENDIF()
319 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
320 IF(NOT HAVE_ISFINITE)
321     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
322     IF(NOT HAVE_FINITE)
323         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
324         IF(NOT HAVE__FINITE)
325             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
326         ENDIF()
327         ADD_DEFINITIONS(-Disfinite=_finite)
328     ELSE()
329         ADD_DEFINITIONS(-Disfinite=finite)
330     ENDIF()
331 ENDIF()
333 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
334 IF(NOT HAVE_ISNAN)
335     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
336     IF(NOT HAVE__ISNAN)
337         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
338     ENDIF()
340     ADD_DEFINITIONS(-Disnan=_isnan)
341 ENDIF()
344 # Check for the dlopen API (for dynamicly loading backend libs)
345 IF(DLOPEN)
346     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
347     IF(HAVE_DLFCN_H)
348         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
349         IF(HAVE_LIBDL)
350             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
351         ENDIF()
352     ENDIF()
353 ENDIF()
355 # Check if we have Windows headers
356 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
357 IF(NOT HAVE_WINDOWS_H)
358     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
359     IF(NOT HAVE_GETTIMEOFDAY)
360         MESSAGE(FATAL_ERROR "No timing function found!")
361     ENDIF()
363     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
364     IF(NOT HAVE_NANOSLEEP)
365         MESSAGE(FATAL_ERROR "No sleep function found!")
366     ENDIF()
368     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
369     IF(HAVE_PTHREAD)
370         ADD_DEFINITIONS(-pthread)
371         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
372     ENDIF()
374     # We need pthreads outside of Windows
375     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
376     IF(NOT HAVE_PTHREAD_H)
377         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
378     ENDIF()
379     # Some systems need pthread_np.h to get recursive mutexes
380     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
382     # _GNU_SOURCE is needed on some systems for extra attributes
383     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
384     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
385     IF(HAVE_LIBPTHREAD)
386         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
387     ENDIF()
389     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
391     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
392     IF(HAVE_LIBRT)
393         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
394     ENDIF()
395 ENDIF()
397 # Check for a 64-bit type
398 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
399 IF(NOT HAVE_STDINT_H)
400     IF(HAVE_WINDOWS_H)
401         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
402                                  \#include <windows.h>
403                                  __int64 foo;
404                                  int main() {return 0;}" HAVE___INT64)
405     ENDIF()
406     IF(NOT HAVE___INT64)
407         IF(NOT SIZEOF_LONG MATCHES "8")
408             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
409                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
410             ENDIF()
411         ENDIF()
412     ENDIF()
413 ENDIF()
415 # Windows needs winmm for timeGetTime, even if the backend is disabled
416 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
417 IF(HAVE_LIBWINMM)
418     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
419     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
420 ENDIF()
423 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
424                  OpenAL32/alBuffer.c
425                  OpenAL32/alEffect.c
426                  OpenAL32/alError.c
427                  OpenAL32/alExtension.c
428                  OpenAL32/alFilter.c
429                  OpenAL32/alListener.c
430                  OpenAL32/alSource.c
431                  OpenAL32/alState.c
432                  OpenAL32/alThunk.c
434 SET(ALC_OBJS  Alc/ALc.c
435               Alc/ALu.c
436               Alc/alcConfig.c
437               Alc/alcDedicated.c
438               Alc/alcEcho.c
439               Alc/alcModulator.c
440               Alc/alcReverb.c
441               Alc/alcRing.c
442               Alc/alcThread.c
443               Alc/bs2b.c
444               Alc/helpers.c
445               Alc/panning.c
446               Alc/hrtf.c
447               Alc/mixer.c
448               Alc/mixer_c.c
452 SET(CPU_EXTS "Default")
453 SET(HAVE_SSE  0)
454 SET(HAVE_NEON 0)
456 # Check for SSE support
457 IF(SSE)
458     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
459     IF(HAVE_XMMINTRIN_H)
460         SET(HAVE_SSE 1)
461         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
462         IF(SSE_SWITCH)
463             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
464                                         COMPILE_FLAGS "${SSE_SWITCH}")
465         ENDIF()
466         SET(CPU_EXTS "${CPU_EXTS}, SSE")
467     ENDIF()
468 ENDIF()
469 IF(REQUIRE_SSE AND NOT HAVE_SSE)
470     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
471 ENDIF()
473 # Check for ARM Neon support
474 IF(NEON)
475     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
476     IF(HAVE_ARM_NEON_H)
477         SET(HAVE_NEON 1)
478         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
479         SET(CPU_EXTS "${CPU_EXTS}, Neon")
480     ENDIF()
481 ENDIF()
482 IF(REQUIRE_NEON AND NOT HAVE_NEON)
483     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
484 ENDIF()
487 SET(ALC_OBJS  ${ALC_OBJS}
488               # Default backends, always available
489               Alc/backends/loopback.c
490               Alc/backends/null.c
493 SET(BACKENDS "")
494 SET(HAVE_ALSA       0)
495 SET(HAVE_OSS        0)
496 SET(HAVE_SOLARIS    0)
497 SET(HAVE_SNDIO      0)
498 SET(HAVE_DSOUND     0)
499 SET(HAVE_MMDEVAPI   0)
500 SET(HAVE_WINMM      0)
501 SET(HAVE_PORTAUDIO  0)
502 SET(HAVE_PULSEAUDIO 0)
503 SET(HAVE_COREAUDIO  0)
504 SET(HAVE_OPENSL     0)
505 SET(HAVE_WAVE       0)
507 # Check ALSA backend
508 IF(ALSA)
509     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
510     IF(HAVE_ALSA_ASOUNDLIB_H)
511         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
512         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
513             SET(HAVE_ALSA 1)
514             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
515             IF(HAVE_DLFCN_H OR WIN32)
516                 SET(BACKENDS  "${BACKENDS} ALSA,")
517             ELSE()
518                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
519                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
520             ENDIF()
521         ENDIF()
522     ENDIF()
523 ENDIF()
524 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
525     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
526 ENDIF()
528 # Check OSS backend
529 IF(OSS)
530     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
531     IF(HAVE_SYS_SOUNDCARD_H)
532         SET(HAVE_OSS 1)
533         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
534         SET(BACKENDS  "${BACKENDS} OSS,")
535     ENDIF()
536 ENDIF()
537 IF(REQUIRE_OSS AND NOT HAVE_OSS)
538     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
539 ENDIF()
541 # Check Solaris backend
542 IF(SOLARIS)
543     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
544     IF(HAVE_SYS_AUDIOIO_H)
545         SET(HAVE_SOLARIS 1)
546         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
547         SET(BACKENDS  "${BACKENDS} Solaris,")
548     ENDIF()
549 ENDIF()
550 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
551     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
552 ENDIF()
554 # Check SndIO backend
555 IF(SNDIO)
556     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
557     IF(HAVE_SNDIO_H)
558         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
559         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
560             SET(HAVE_SNDIO 1)
561             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
562             IF(HAVE_DLFCN_H OR WIN32)
563                 SET(BACKENDS  "${BACKENDS} SndIO,")
564             ELSE()
565                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
566                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
567             ENDIF()
568         ENDIF()
569     ENDIF()
570 ENDIF()
571 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
572     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
573 ENDIF()
575 # Check for MMDevApi backend
576 IF(HAVE_WINDOWS_H)
577     IF(MMDEVAPI)
578         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
579         IF(HAVE_MMDEVICEAPI_H)
580             SET(HAVE_MMDEVAPI 1)
581             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
583             SET(BACKENDS  "${BACKENDS} MMDevApi,")
584         ENDIF()
585     ENDIF()
586 ENDIF()
587 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
588     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
589 ENDIF()
591 # Check DSound/MMSystem backend
592 IF(DSOUND)
593     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
594     IF(HAVE_DSOUND_H)
595         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
596         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
597             SET(HAVE_DSOUND 1)
598             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
600             IF(HAVE_DLFCN_H OR WIN32)
601                 SET(BACKENDS  "${BACKENDS} DirectSound,")
602             ELSE()
603                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
604                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
605             ENDIF()
606         ENDIF()
607     ENDIF()
608 ENDIF()
609 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
610     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
611 ENDIF()
613 IF(HAVE_WINDOWS_H)
614     IF(WINMM)
615         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
616         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
617             SET(HAVE_WINMM 1)
618             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
619             SET(BACKENDS  "${BACKENDS} WinMM,")
620         ENDIF()
621     ENDIF()
622 ENDIF()
623 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
624     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
625 ENDIF()
627 # Check PortAudio backend
628 IF(PORTAUDIO)
629     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
630     IF(HAVE_PORTAUDIO_H)
631         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
632         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
633             SET(HAVE_PORTAUDIO 1)
634             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
635             IF(HAVE_DLFCN_H OR WIN32)
636                 SET(BACKENDS  "${BACKENDS} PortAudio,")
637             ELSE()
638                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
639                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
640             ENDIF()
641         ENDIF()
642     ENDIF()
643 ENDIF()
644 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
645     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
646 ENDIF()
648 # Check PulseAudio backend
649 IF(PULSEAUDIO)
650     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
651     IF(HAVE_PULSE_PULSEAUDIO_H)
652         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
653         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
654             SET(HAVE_PULSEAUDIO 1)
655             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
656             IF(HAVE_DLFCN_H OR WIN32)
657                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
658             ELSE()
659                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
660                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
661             ENDIF()
662         ENDIF()
663     ENDIF()
664 ENDIF()
665 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
666     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
667 ENDIF()
669 # Check CoreAudio backend
670 IF(COREAUDIO)
671     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
672     IF(HAVE_COREAUDIO_FRAMEWORK)
673         SET(HAVE_COREAUDIO 1)
674         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
675         SET(BACKENDS  "${BACKENDS} CoreAudio,")
676         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
677         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
678         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
680         # Some versions of OSX may need the AudioToolbox framework. Add it if
681         # it's found.
682         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
683                      NAMES AudioToolbox
684                      PATHS ~/Library/Frameworks
685                            /Library/Frameworks
686                            /System/Library/Frameworks
687                     )
688         IF(AUDIOTOOLBOX_LIBRARY)
689             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
690         ENDIF()
691     ENDIF()
692 ENDIF()
693 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
694     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
695 ENDIF()
697 # Check for OpenSL (Android) backend
698 IF(OPENSL)
699     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
700     IF(HAVE_SLES_OPENSLES_ANDROID_H)
701         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
702         IF(HAVE_LIBOPENSLES)
703             SET(HAVE_OPENSL 1)
704             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
705             SET(BACKENDS  "${BACKENDS} OpenSL,")
706             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
707         ENDIF()
708     ENDIF()
709 ENDIF()
710 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
711     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
712 ENDIF()
714 # Optionally enable the Wave Writer backend
715 IF(WAVE)
716     SET(HAVE_WAVE 1)
717     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
718     SET(BACKENDS  "${BACKENDS} WaveFile,")
719 ENDIF()
721 # This is always available
722 SET(BACKENDS  "${BACKENDS} Null")
724 IF(EXAMPLES)
725     # Might be able to use earlier versions, but these definitely work
726     PKG_CHECK_MODULES(FFMPEG libavcodec>=52.123.0 libavformat>=52.111.0 libavutil>=51.9.1)
727 ENDIF()
729 IF(LIBTYPE STREQUAL "STATIC")
730     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
731     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
732 ENDIF()
734 # Needed for openal.pc.in
735 SET(prefix ${CMAKE_INSTALL_PREFIX})
736 SET(exec_prefix "\${prefix}")
737 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
738 SET(bindir "\${exec_prefix}/bin")
739 SET(includedir "\${prefix}/include")
740 SET(PACKAGE_VERSION "${LIB_VERSION}")
742 # End configuration
743 CONFIGURE_FILE(
744     "${OpenAL_SOURCE_DIR}/config.h.in"
745     "${OpenAL_BINARY_DIR}/config.h")
746 CONFIGURE_FILE(
747     "${OpenAL_SOURCE_DIR}/openal.pc.in"
748     "${OpenAL_BINARY_DIR}/openal.pc"
749     @ONLY)
751 # Build a library
752 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
753 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
754                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
755                                             VERSION ${LIB_VERSION}.0
756                                             SOVERSION ${LIB_MAJOR_VERSION})
757 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
758     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
759 ENDIF()
761 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
763 # Add an install target here
764 INSTALL(TARGETS ${LIBNAME}
765         RUNTIME DESTINATION bin
766         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
767         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
769 INSTALL(FILES include/AL/al.h
770               include/AL/alc.h
771               include/AL/alext.h
772               include/AL/efx.h
773               include/AL/efx-creative.h
774               include/AL/efx-presets.h
775         DESTINATION include/AL
777 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
778         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
781 MESSAGE(STATUS "")
782 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
783 MESSAGE(STATUS "    ${BACKENDS}")
784 MESSAGE(STATUS "")
785 MESSAGE(STATUS "Building with support for CPU extensions:")
786 MESSAGE(STATUS "    ${CPU_EXTS}")
787 MESSAGE(STATUS "")
789 IF(WIN32)
790     IF(NOT HAVE_DSOUND)
791         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
792         MESSAGE(STATUS "         This is probably NOT what you want!")
793         MESSAGE(STATUS "")
794     ENDIF()
795 ENDIF()
797 # Install alsoft.conf configuration file
798 IF(ALSOFT_CONFIG)
799     INSTALL(FILES alsoftrc.sample
800             DESTINATION /etc/openal
801             RENAME alsoft.conf
802     )
803     MESSAGE(STATUS "Installing sample alsoft.conf")
804     MESSAGE(STATUS "")
805 ENDIF()
807 IF(UTILS)
808     ADD_EXECUTABLE(openal-info utils/openal-info.c)
809     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
811     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
812     IF(HAVE_LIBM)
813         TARGET_LINK_LIBRARIES(makehrtf m)
814     ENDIF()
816     INSTALL(TARGETS openal-info makehrtf
817             RUNTIME DESTINATION bin
818             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
819             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
820     )
821     MESSAGE(STATUS "Building utility programs")
822     MESSAGE(STATUS "")
823 ENDIF()
825 IF(EXAMPLES)
826     IF(FFMPEG_FOUND)
827         ADD_EXECUTABLE(alstream examples/alhelpers.c examples/alffmpeg.c examples/alstream.c)
828         TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
829         SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
830         INSTALL(TARGETS alstream
831                 RUNTIME DESTINATION bin
832                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
833                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
834         )
836         MESSAGE(STATUS "Building ffmpeg example programs")
837         MESSAGE(STATUS "")
838     ENDIF()
839 ENDIF()