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