Update binary search algorithm for uintmaps
[openal-soft.git] / CMakeLists.txt
blob839bf183ed18989158d19589f90d7dec6b8e57ee
1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5)
5 PROJECT(OpenAL)
7 IF(COMMAND CMAKE_POLICY)
8     CMAKE_POLICY(SET CMP0003 NEW)
9     CMAKE_POLICY(SET CMP0005 NEW)
10     IF(POLICY CMP0042)
11         CMAKE_POLICY(SET CMP0042 NEW)
12     ENDIF(POLICY CMP0042)
13     IF(POLICY CMP0054)
14         CMAKE_POLICY(SET CMP0054 NEW)
15     ENDIF(POLICY CMP0054)
16 ENDIF(COMMAND CMAKE_POLICY)
18 SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
20 INCLUDE(CheckFunctionExists)
21 INCLUDE(CheckLibraryExists)
22 INCLUDE(CheckSharedFunctionExists)
23 INCLUDE(CheckIncludeFile)
24 INCLUDE(CheckIncludeFiles)
25 INCLUDE(CheckSymbolExists)
26 INCLUDE(CheckCCompilerFlag)
27 INCLUDE(CheckCSourceCompiles)
28 INCLUDE(CheckTypeSize)
29 include(CheckStructHasMember)
30 include(CheckFileOffsetBits)
31 include(GNUInstallDirs)
33 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
36 OPTION(ALSOFT_DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
38 OPTION(ALSOFT_WERROR  "Treat compile warnings as errors"      OFF)
40 OPTION(ALSOFT_UTILS          "Build and install utility programs"         ON)
41 OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
43 OPTION(ALSOFT_EXAMPLES  "Build and install example programs"  ON)
44 OPTION(ALSOFT_TESTS     "Build and install test programs"     ON)
46 OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
47 OPTION(ALSOFT_HRTF_DEFS "Install HRTF definition files" ON)
48 OPTION(ALSOFT_AMBDEC_PRESETS "Install AmbDec preset files" ON)
49 OPTION(ALSOFT_INSTALL "Install headers and libraries" ON)
51 if(DEFINED SHARE_INSTALL_DIR)
52     message(WARNING "SHARE_INSTALL_DIR is deprecated.  Use the variables provided by the GNUInstallDirs module instead")
53     set(CMAKE_INSTALL_DATADIR "${SHARE_INSTALL_DIR}")
54 endif()
56 if(DEFINED LIB_SUFFIX)
57     message(WARNING "LIB_SUFFIX is deprecated.  Use the variables provided by the GNUInstallDirs module instead")
58 endif()
61 IF(NOT WIN32)
62     SET(LIBNAME openal)
63 ELSE()
64     SET(LIBNAME OpenAL32)
65     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502")
67     # This option is mainly for static linking OpenAL Soft into another project
68     # that already defines the IDs. It is up to that project to ensure all
69     # required IDs are defined.
70     OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
72     IF(MINGW)
73         OPTION(ALSOFT_BUILD_IMPORT_LIB "Build an import .lib using dlltool (requires sed)" ON)
74         IF(NOT DLLTOOL)
75             IF(HOST)
76                 SET(DLLTOOL "${HOST}-dlltool")
77             ELSE()
78                 SET(DLLTOOL "dlltool")
79             ENDIF()
80         ENDIF()
81     ENDIF()
82 ENDIF()
85 # QNX's gcc do not uses /usr/include and /usr/lib pathes by default
86 IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
87     ADD_DEFINITIONS("-I/usr/include")
88     SET(EXTRA_LIBS ${EXTRA_LIBS} -L/usr/lib)
89 ENDIF()
91 IF(NOT LIBTYPE)
92     SET(LIBTYPE SHARED)
93 ENDIF()
95 SET(LIB_MAJOR_VERSION "1")
96 SET(LIB_MINOR_VERSION "17")
97 SET(LIB_REVISION "2")
98 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
100 SET(EXPORT_DECL "")
101 SET(ALIGN_DECL "")
104 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
105 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
108 CHECK_C_COMPILER_FLAG(-std=c11 HAVE_STD_C11)
109 IF(HAVE_STD_C11)
110     SET(CMAKE_C_FLAGS "-std=c11 ${CMAKE_C_FLAGS}")
111 ELSE()
112     CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
113     IF(HAVE_STD_C99)
114         SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
115     ENDIF()
116 ENDIF()
118 if(NOT WIN32)
119     # Check if _POSIX_C_SOURCE and _XOPEN_SOURCE needs to be set for POSIX functions
120     CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_DEFAULT)
121     IF(NOT HAVE_POSIX_MEMALIGN_DEFAULT)
122         SET(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
123         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=500")
124         CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_POSIX)
125         IF(NOT HAVE_POSIX_MEMALIGN_POSIX)
126             SET(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
127         ELSE()
128             ADD_DEFINITIONS(-D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=500)
129         ENDIF()
130     ENDIF()
131     UNSET(OLD_REQUIRED_FLAGS)
132 ENDIF()
134 # Set defines for large file support
135 CHECK_FILE_OFFSET_BITS()
136 IF(_FILE_OFFSET_BITS)
137     ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
138     SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}")
139 ENDIF()
140 ADD_DEFINITIONS(-D_LARGEFILE_SOURCE -D_LARGE_FILES)
141 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_LARGEFILE_SOURCE -D_LARGE_FILES")
143 # MSVC may need workarounds for C99 restrict and inline
144 IF(MSVC)
145     # TODO: Once we truly require C99, these restrict and inline checks should go
146     # away.
147     CHECK_C_SOURCE_COMPILES("int *restrict foo;
148                              int main() {return 0;}" HAVE_RESTRICT)
149     IF(NOT HAVE_RESTRICT)
150         ADD_DEFINITIONS("-Drestrict=")
151         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
152     ENDIF()
154     CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
155                              int main() {return 0;}" HAVE_INLINE)
156     IF(NOT HAVE_INLINE)
157         CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
158                                  int main() {return 0;}" HAVE___INLINE)
159         IF(NOT HAVE___INLINE)
160             MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
161         ENDIF()
163         ADD_DEFINITIONS(-Dinline=__inline)
164         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
165     ENDIF()
166 ENDIF()
168 # Make sure we have C99-style inline semantics with GCC (4.3 or newer).
169 IF(CMAKE_COMPILER_IS_GNUCC)
170     SET(CMAKE_C_FLAGS "-fno-gnu89-inline ${CMAKE_C_FLAGS}")
172     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
173     # Force no inlining for the next test.
174     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
176     CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
177                              int main() {return foo();}" INLINE_IS_C99)
178     IF(NOT INLINE_IS_C99)
179         MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
180                              Please update your compiler for better C99 compliance.")
181     ENDIF()
183     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
184 ENDIF()
186 # Check if we have a proper timespec declaration
187 CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC)
188 IF(HAVE_STRUCT_TIMESPEC)
189     # Define it here so we don't have to include config.h for it
190     ADD_DEFINITIONS("-DHAVE_STRUCT_TIMESPEC")
191 ENDIF()
193 # Some systems may need libatomic for C11 atomic functions to work
194 SET(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
195 SET(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES} atomic)
196 CHECK_C_SOURCE_COMPILES("#include <stdatomic.h>
197 int _Atomic foo = ATOMIC_VAR_INIT(0);
198 int main()
200     return atomic_fetch_add(&foo, 2);
202 HAVE_LIBATOMIC)
203 IF(NOT HAVE_LIBATOMIC)
204     SET(CMAKE_REQUIRED_LIBRARIES "${OLD_REQUIRED_LIBRARIES}")
205 ELSE()
206     SET(EXTRA_LIBS atomic ${EXTRA_LIBS})
207 ENDIF()
208 UNSET(OLD_REQUIRED_LIBRARIES)
210 # Check if we have C99 variable length arrays
211 CHECK_C_SOURCE_COMPILES(
212 "int main(int argc, char *argv[])
214      volatile int tmp[argc];
215      tmp[0] = argv[0][0];
216      return tmp[0];
217  }"
218 HAVE_C99_VLA)
220 # Check if we have C99 bool
221 CHECK_C_SOURCE_COMPILES(
222 "int main(int argc, char *argv[])
224      volatile _Bool ret;
225      ret = (argc > 1) ? 1 : 0;
226      return ret ? -1 : 0;
227  }"
228 HAVE_C99_BOOL)
230 # Check if we have C11 static_assert
231 CHECK_C_SOURCE_COMPILES(
232 "int main()
234      _Static_assert(sizeof(int) == sizeof(int), \"What\");
235      return 0;
236  }"
237 HAVE_C11_STATIC_ASSERT)
239 # Check if we have C11 alignas
240 CHECK_C_SOURCE_COMPILES(
241 "_Alignas(16) int foo;
242  int main()
244      return 0;
245  }"
246 HAVE_C11_ALIGNAS)
248 # Check if we have C11 _Atomic
249 CHECK_C_SOURCE_COMPILES(
250 "#include <stdatomic.h>
251  const int _Atomic foo = ATOMIC_VAR_INIT(~0);
252  int _Atomic bar = ATOMIC_VAR_INIT(0);
253  int main()
255      atomic_fetch_add(&bar, 2);
256      return atomic_load(&foo);
257  }"
258 HAVE_C11_ATOMIC)
260 # Add definitions, compiler switches, etc.
261 INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_BINARY_DIR}")
262 IF(CMAKE_VERSION VERSION_LESS "2.8.8")
263     INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
264     IF(WIN32 AND ALSOFT_NO_UID_DEFS)
265         ADD_DEFINITIONS("-DAL_NO_UID_DEFS")
266     ENDIF()
267 ENDIF()
269 IF(NOT CMAKE_BUILD_TYPE)
270     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
271         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
272         FORCE)
273 ENDIF()
274 IF(NOT CMAKE_DEBUG_POSTFIX)
275     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
276         "Library postfix for debug builds. Normally left blank."
277         FORCE)
278 ENDIF()
280 SET(EXTRA_CFLAGS "")
281 IF(MSVC)
282     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
283     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
284     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} /wd4098")
286     IF(NOT DXSDK_DIR)
287         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
288     ELSE()
289         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
290     ENDIF()
291     IF(DXSDK_DIR)
292         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
293     ENDIF()
295     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
296     IF(FORCE_STATIC_VCRT)
297         FOREACH(flag_var
298                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
299                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
300             IF(${flag_var} MATCHES "/MD")
301                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
302             ENDIF()
303         ENDFOREACH(flag_var)
304     ENDIF()
305 ELSE()
306     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Winline -Wall")
307     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
308     IF(HAVE_W_EXTRA)
309         SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wextra")
310     ENDIF()
312     IF(ALSOFT_WERROR)
313         SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror")
314     ENDIF()
316     # Force enable -fPIC for CMake versions before 2.8.9 (later versions have
317     # the POSITION_INDEPENDENT_CODE target property). The static common library
318     # will be linked into the dynamic openal library, which requires all its
319     # code to be position-independent.
320     IF(CMAKE_VERSION VERSION_LESS "2.8.9" AND NOT WIN32)
321         CHECK_C_COMPILER_FLAG(-fPIC HAVE_FPIC_SWITCH)
322         IF(HAVE_FPIC_SWITCH)
323             SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIC")
324         ENDIF()
325     ENDIF()
327     # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
328     # instead of NDEBUG)
329     FOREACH(flag_var  CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
330         IF(${flag_var} MATCHES "-DNDEBUG")
331             STRING(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
332         ENDIF()
333     ENDFOREACH()
335     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
336                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
338     option(ALSOFT_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
339     if(ALSOFT_STATIC_LIBGCC)
340         set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
341         set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
342         check_c_source_compiles(
343 "#include <stdlib.h>
344 int main()
346     return 0;
348             HAVE_STATIC_LIBGCC_SWITCH
349         )
350         if(HAVE_STATIC_LIBGCC_SWITCH)
351             set(EXTRA_LIBS ${EXTRA_LIBS} -static-libgcc)
352         endif()
353         set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
354         unset(OLD_REQUIRED_LIBRARIES)
355     endif()
356 ENDIF()
358 # Set visibility/export options if available
359 SET(HIDDEN_DECL "")
360 IF(WIN32)
361     SET(EXPORT_DECL "__declspec(dllexport)")
362     IF(NOT MINGW)
363         SET(ALIGN_DECL "__declspec(align(x))")
364     ELSE()
365         SET(ALIGN_DECL "__declspec(aligned(x))")
366     ENDIF()
367 ELSE()
368     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
369     # Yes GCC, really don't accept visibility modes you don't support
370     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
372     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
373                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
374     IF(HAVE_GCC_PROTECTED_VISIBILITY)
375         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
376     ELSE()
377         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
378                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
379         IF(HAVE_GCC_DEFAULT_VISIBILITY)
380             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
381         ENDIF()
382     ENDIF()
384     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
385         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
386         IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
387             SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden")
388             SET(HIDDEN_DECL "__attribute__((visibility(\"hidden\")))")
389         ENDIF()
390     ENDIF()
392     CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
393                              int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
394     IF(HAVE_ATTRIBUTE_ALIGNED)
395         SET(ALIGN_DECL "__attribute__((aligned(x)))")
396     ENDIF()
398     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
399 ENDIF()
401 SET(SSE_SWITCH "")
402 SET(SSE2_SWITCH "")
403 SET(SSE3_SWITCH "")
404 SET(SSE4_1_SWITCH "")
405 SET(FPU_NEON_SWITCH "")
406 IF(NOT MSVC)
407     CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
408     IF(HAVE_MSSE_SWITCH)
409         SET(SSE_SWITCH "-msse")
410     ENDIF()
411     CHECK_C_COMPILER_FLAG(-msse2 HAVE_MSSE2_SWITCH)
412     IF(HAVE_MSSE2_SWITCH)
413         SET(SSE2_SWITCH "-msse2")
414     ENDIF()
415     CHECK_C_COMPILER_FLAG(-msse3 HAVE_MSSE3_SWITCH)
416     IF(HAVE_MSSE3_SWITCH)
417         SET(SSE3_SWITCH "-msse3")
418     ENDIF()
419     CHECK_C_COMPILER_FLAG(-msse4.1 HAVE_MSSE4_1_SWITCH)
420     IF(HAVE_MSSE4_1_SWITCH)
421         SET(SSE4_1_SWITCH "-msse4.1")
422     ENDIF()
423     CHECK_C_COMPILER_FLAG(-mfpu=neon HAVE_MFPU_NEON_SWITCH)
424     IF(HAVE_MFPU_NEON_SWITCH)
425         SET(FPU_NEON_SWITCH "-mfpu=neon")
426     ENDIF()
427 ENDIF()
429 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
430                          int main() {return 0;}" HAVE_GCC_FORMAT)
432 CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
433 CHECK_INCLUDE_FILE(stdalign.h HAVE_STDALIGN_H)
434 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
435 CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
436 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
437 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
438 CHECK_INCLUDE_FILE(intrin.h HAVE_INTRIN_H)
439 CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
440 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
441 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
442 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
443 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
444 IF(NOT HAVE_GUIDDEF_H)
445     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
446 ENDIF()
448 # Some systems need libm for some of the following math functions to work
449 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
450 IF(HAVE_LIBM)
451     SET(EXTRA_LIBS m ${EXTRA_LIBS})
452     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
453 ENDIF()
455 # Check for the dlopen API (for dynamicly loading backend libs)
456 IF(ALSOFT_DLOPEN)
457     CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
458     IF(HAVE_LIBDL)
459         SET(EXTRA_LIBS dl ${EXTRA_LIBS})
460         SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
461     ENDIF()
463     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
464 ENDIF()
466 # Check for a cpuid intrinsic
467 IF(HAVE_CPUID_H)
468     CHECK_C_SOURCE_COMPILES("#include <cpuid.h>
469         int main()
470         {
471             unsigned int eax, ebx, ecx, edx;
472             return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
473         }" HAVE_GCC_GET_CPUID)
474 ENDIF()
475 IF(HAVE_INTRIN_H)
476     CHECK_C_SOURCE_COMPILES("#include <intrin.h>
477         int main()
478         {
479             int regs[4];
480             __cpuid(regs, 0);
481             return regs[0];
482         }" HAVE_CPUID_INTRINSIC)
483 ENDIF()
485 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
486 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
487 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
488 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
489 CHECK_SYMBOL_EXISTS(modff  math.h HAVE_MODFF)
490 IF(NOT HAVE_C99_VLA)
491     CHECK_SYMBOL_EXISTS(alloca malloc.h HAVE_ALLOCA)
492     IF(NOT HAVE_ALLOCA)
493         MESSAGE(FATAL_ERROR "No alloca function found, please report!")
494     ENDIF()
495 ENDIF()
497 IF(HAVE_FLOAT_H)
498     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
499     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
500 ENDIF()
502 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
503 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
504 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
505 IF(NOT HAVE_STRCASECMP)
506     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
507     IF(NOT HAVE__STRICMP)
508         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
509     ENDIF()
511     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
512 ENDIF()
514 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
515 IF(NOT HAVE_STRNCASECMP)
516     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
517     IF(NOT HAVE__STRNICMP)
518         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
519     ENDIF()
521     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
522 ENDIF()
524 CHECK_SYMBOL_EXISTS(strnlen string.h HAVE_STRNLEN)
525 CHECK_SYMBOL_EXISTS(snprintf stdio.h HAVE_SNPRINTF)
526 IF(NOT HAVE_SNPRINTF)
527     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
528     IF(NOT HAVE__SNPRINTF)
529         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
530     ENDIF()
532     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
533 ENDIF()
535 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
536 IF(NOT HAVE_ISFINITE)
537     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
538     IF(NOT HAVE_FINITE)
539         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
540         IF(NOT HAVE__FINITE)
541             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
542         ENDIF()
543         ADD_DEFINITIONS(-Disfinite=_finite)
544     ELSE()
545         ADD_DEFINITIONS(-Disfinite=finite)
546     ENDIF()
547 ENDIF()
549 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
550 IF(NOT HAVE_ISNAN)
551     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
552     IF(NOT HAVE__ISNAN)
553         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
554     ENDIF()
556     ADD_DEFINITIONS(-Disnan=_isnan)
557 ENDIF()
560 # Check if we have Windows headers
561 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0502)
562 IF(NOT HAVE_WINDOWS_H)
563     CHECK_SYMBOL_EXISTS(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)
564     IF(NOT HAVE_GETTIMEOFDAY)
565         MESSAGE(FATAL_ERROR "No timing function found!")
566     ENDIF()
568     CHECK_SYMBOL_EXISTS(nanosleep time.h HAVE_NANOSLEEP)
569     IF(NOT HAVE_NANOSLEEP)
570         MESSAGE(FATAL_ERROR "No sleep function found!")
571     ENDIF()
573     # We need pthreads outside of Windows
574     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
575     IF(NOT HAVE_PTHREAD_H)
576         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
577     ENDIF()
578     # Some systems need pthread_np.h to get recursive mutexes
579     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
581     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
582     IF(HAVE_PTHREAD)
583         SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -pthread")
584         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
585         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
586     ENDIF()
588     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
589     IF(HAVE_LIBPTHREAD)
590         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
591     ENDIF()
593     CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
595     IF(HAVE_PTHREAD_NP_H)
596         CHECK_SYMBOL_EXISTS(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
597         IF(NOT HAVE_PTHREAD_SETNAME_NP)
598             CHECK_SYMBOL_EXISTS(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
599         ELSE()
600             CHECK_C_SOURCE_COMPILES("
601 #include <pthread.h>
602 #include <pthread_np.h>
603 int main()
605     pthread_setname_np(\"testname\");
606     return 0;
608                 PTHREAD_SETNAME_NP_ONE_PARAM
609             )
610         ENDIF()
611         CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np "pthread.h;pthread_np.h" HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
612     ELSE()
613         CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
614         IF(NOT HAVE_PTHREAD_SETNAME_NP)
615             CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
616         ELSE()
617             CHECK_C_SOURCE_COMPILES("
618 #include <pthread.h>
619 int main()
621     pthread_setname_np(\"testname\");
622     return 0;
624                 PTHREAD_SETNAME_NP_ONE_PARAM
625             )
626         ENDIF()
627         CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np pthread.h HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
628     ENDIF()
630     CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK)
632     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
633     IF(HAVE_LIBRT)
634         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
635     ENDIF()
636 ENDIF()
638 # Check for a 64-bit type
639 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
640 IF(NOT HAVE_STDINT_H)
641     IF(HAVE_WINDOWS_H)
642         CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
643                                  #include <windows.h>
644                                  __int64 foo;
645                                  int main() {return 0;}" HAVE___INT64)
646     ENDIF()
647     IF(NOT HAVE___INT64)
648         IF(NOT SIZEOF_LONG MATCHES "8")
649             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
650                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
651             ENDIF()
652         ENDIF()
653     ENDIF()
654 ENDIF()
657 SET(COMMON_OBJS  common/almalloc.c
658                  common/atomic.c
659                  common/rwlock.c
660                  common/threads.c
661                  common/uintmap.c
663 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
664                  OpenAL32/alBuffer.c
665                  OpenAL32/alEffect.c
666                  OpenAL32/alError.c
667                  OpenAL32/alExtension.c
668                  OpenAL32/alFilter.c
669                  OpenAL32/alListener.c
670                  OpenAL32/alSource.c
671                  OpenAL32/alState.c
672                  OpenAL32/alThunk.c
673                  OpenAL32/sample_cvt.c
675 SET(ALC_OBJS  Alc/ALc.c
676               Alc/ALu.c
677               Alc/alcConfig.c
678               Alc/alcRing.c
679               Alc/bs2b.c
680               Alc/effects/chorus.c
681               Alc/effects/compressor.c
682               Alc/effects/dedicated.c
683               Alc/effects/distortion.c
684               Alc/effects/echo.c
685               Alc/effects/equalizer.c
686               Alc/effects/flanger.c
687               Alc/effects/modulator.c
688               Alc/effects/null.c
689               Alc/effects/reverb.c
690               Alc/helpers.c
691               Alc/bsinc.c
692               Alc/hrtf.c
693               Alc/uhjfilter.c
694               Alc/ambdec.c
695               Alc/bformatdec.c
696               Alc/panning.c
697               Alc/mixer.c
698               Alc/mixer_c.c
702 SET(CPU_EXTS "Default")
703 SET(HAVE_SSE        0)
704 SET(HAVE_SSE2       0)
705 SET(HAVE_SSE3       0)
706 SET(HAVE_SSE4_1     0)
707 SET(HAVE_NEON       0)
709 SET(HAVE_ALSA       0)
710 SET(HAVE_OSS        0)
711 SET(HAVE_SOLARIS    0)
712 SET(HAVE_SNDIO      0)
713 SET(HAVE_QSA        0)
714 SET(HAVE_DSOUND     0)
715 SET(HAVE_MMDEVAPI   0)
716 SET(HAVE_WINMM      0)
717 SET(HAVE_PORTAUDIO  0)
718 SET(HAVE_PULSEAUDIO 0)
719 SET(HAVE_COREAUDIO  0)
720 SET(HAVE_OPENSL     0)
721 SET(HAVE_WAVE       0)
723 # Check for SSE support
724 OPTION(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
725 CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
726 IF(HAVE_XMMINTRIN_H)
727     OPTION(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
728     IF(ALSOFT_CPUEXT_SSE)
729         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
730             SET(HAVE_SSE 1)
731             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
732             IF(SSE_SWITCH)
733                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
734                                             COMPILE_FLAGS "${SSE_SWITCH}")
735             ENDIF()
736             SET(CPU_EXTS "${CPU_EXTS}, SSE")
737         ENDIF()
738     ENDIF()
739 ENDIF()
740 IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
741     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
742 ENDIF()
744 OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
745 CHECK_INCLUDE_FILE(emmintrin.h HAVE_EMMINTRIN_H "${SSE2_SWITCH}")
746 IF(HAVE_EMMINTRIN_H)
747     OPTION(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
748     IF(HAVE_SSE AND ALSOFT_CPUEXT_SSE2)
749         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
750             SET(HAVE_SSE2 1)
751             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse2.c)
752             IF(SSE2_SWITCH)
753                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse2.c PROPERTIES
754                                             COMPILE_FLAGS "${SSE2_SWITCH}")
755             ENDIF()
756             SET(CPU_EXTS "${CPU_EXTS}, SSE2")
757         ENDIF()
758     ENDIF()
759 ENDIF()
760 IF(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
761     MESSAGE(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
762 ENDIF()
764 OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE3 support" OFF)
765 CHECK_INCLUDE_FILE(pmmintrin.h HAVE_PMMINTRIN_H "${SSE3_SWITCH}")
766 IF(HAVE_EMMINTRIN_H)
767     OPTION(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
768     IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE3)
769         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
770             SET(HAVE_SSE3 1)
771             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse3.c)
772             IF(SSE2_SWITCH)
773                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse3.c PROPERTIES
774                                             COMPILE_FLAGS "${SSE3_SWITCH}")
775             ENDIF()
776             SET(CPU_EXTS "${CPU_EXTS}, SSE3")
777         ENDIF()
778     ENDIF()
779 ENDIF()
780 IF(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
781     MESSAGE(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
782 ENDIF()
784 OPTION(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
785 CHECK_INCLUDE_FILE(smmintrin.h HAVE_SMMINTRIN_H "${SSE4_1_SWITCH}")
786 IF(HAVE_SMMINTRIN_H)
787     OPTION(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
788     IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE4_1)
789         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
790             SET(HAVE_SSE4_1 1)
791             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse41.c)
792             IF(SSE4_1_SWITCH)
793                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse41.c PROPERTIES
794                                             COMPILE_FLAGS "${SSE4_1_SWITCH}")
795             ENDIF()
796             SET(CPU_EXTS "${CPU_EXTS}, SSE4.1")
797         ENDIF()
798     ENDIF()
799 ENDIF()
800 IF(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
801     MESSAGE(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
802 ENDIF()
804 # Check for ARM Neon support
805 OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
806 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
807 IF(HAVE_ARM_NEON_H)
808     OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON)
809     IF(ALSOFT_CPUEXT_NEON)
810         SET(HAVE_NEON 1)
811         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
812         IF(FPU_NEON_SWITCH)
813             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_neon.c PROPERTIES
814                                         COMPILE_FLAGS "${FPU_NEON_SWITCH}")
815         ENDIF()
816         SET(CPU_EXTS "${CPU_EXTS}, Neon")
817     ENDIF()
818 ENDIF()
819 IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
820     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
821 ENDIF()
824 IF(WIN32 OR HAVE_DLFCN_H)
825     SET(IS_LINKED "")
826     MACRO(ADD_BACKEND_LIBS _LIBS)
827     ENDMACRO()
828 ELSE()
829     SET(IS_LINKED " (linked)")
830     MACRO(ADD_BACKEND_LIBS _LIBS)
831         SET(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
832     ENDMACRO()
833 ENDIF()
835 SET(BACKENDS "")
836 SET(ALC_OBJS  ${ALC_OBJS}
837               Alc/backends/base.c
838               # Default backends, always available
839               Alc/backends/loopback.c
840               Alc/backends/null.c
843 # Check ALSA backend
844 OPTION(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
845 FIND_PACKAGE(ALSA)
846 IF(ALSA_FOUND)
847     OPTION(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
848     IF(ALSOFT_BACKEND_ALSA)
849         SET(HAVE_ALSA 1)
850         SET(BACKENDS  "${BACKENDS} ALSA${IS_LINKED},")
851         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
852         ADD_BACKEND_LIBS(${ALSA_LIBRARIES})
853         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
854             INCLUDE_DIRECTORIES(${ALSA_INCLUDE_DIRS})
855         ENDIF()
856     ENDIF()
857 ENDIF()
858 IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
859     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
860 ENDIF()
862 # Check OSS backend
863 OPTION(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
864 FIND_PACKAGE(OSS)
865 IF(OSS_FOUND)
866     OPTION(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
867     IF(ALSOFT_BACKEND_OSS)
868         SET(HAVE_OSS 1)
869         SET(BACKENDS  "${BACKENDS} OSS,")
870         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
871         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
872             INCLUDE_DIRECTORIES(${OSS_INCLUDE_DIRS})
873         ENDIF()
874     ENDIF()
875 ENDIF()
876 IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
877     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
878 ENDIF()
880 # Check Solaris backend
881 OPTION(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
882 FIND_PACKAGE(AudioIO)
883 IF(AUDIOIO_FOUND)
884     OPTION(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
885     IF(ALSOFT_BACKEND_SOLARIS)
886         SET(HAVE_SOLARIS 1)
887         SET(BACKENDS  "${BACKENDS} Solaris,")
888         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
889         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
890             INCLUDE_DIRECTORIES(${AUDIOIO_INCLUDE_DIRS})
891         ENDIF()
892     ENDIF()
893 ENDIF()
894 IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
895     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
896 ENDIF()
898 # Check SndIO backend
899 OPTION(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
900 FIND_PACKAGE(SoundIO)
901 IF(SOUNDIO_FOUND)
902     OPTION(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
903     IF(ALSOFT_BACKEND_SNDIO)
904         SET(HAVE_SNDIO 1)
905         SET(BACKENDS  "${BACKENDS} SndIO (linked),")
906         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
907         SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
908         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
909             INCLUDE_DIRECTORIES(${SOUNDIO_INCLUDE_DIRS})
910         ENDIF()
911     ENDIF()
912 ENDIF()
913 IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
914     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
915 ENDIF()
917 # Check QSA backend
918 OPTION(ALSOFT_REQUIRE_QSA "Require QSA backend" OFF)
919 FIND_PACKAGE(QSA)
920 IF(QSA_FOUND)
921     OPTION(ALSOFT_BACKEND_QSA "Enable QSA backend" ON)
922     IF(ALSOFT_BACKEND_QSA)
923         SET(HAVE_QSA 1)
924         SET(BACKENDS  "${BACKENDS} QSA (linked),")
925         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/qsa.c)
926         SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS})
927         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
928             INCLUDE_DIRECTORIES(${QSA_INCLUDE_DIRS})
929         ENDIF()
930     ENDIF()
931 ENDIF()
932 IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
933     MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
934 ENDIF()
936 # Check Windows-only backends
937 OPTION(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
938 OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
939 OPTION(ALSOFT_REQUIRE_MMDEVAPI "Require MMDevApi backend" OFF)
940 IF(HAVE_WINDOWS_H)
941     # Check MMSystem backend
942     CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0502)
943     IF(HAVE_MMSYSTEM_H)
944         CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
945         IF(HAVE_LIBWINMM)
946             OPTION(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
947             IF(ALSOFT_BACKEND_WINMM)
948                 SET(HAVE_WINMM 1)
949                 SET(BACKENDS  "${BACKENDS} WinMM,")
950                 SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
951                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
952             ENDIF()
953         ENDIF()
954     ENDIF()
956     # Check DSound backend
957     FIND_PACKAGE(DSound)
958     IF(DSOUND_FOUND)
959         OPTION(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
960         IF(ALSOFT_BACKEND_DSOUND)
961             SET(HAVE_DSOUND 1)
962             SET(BACKENDS  "${BACKENDS} DirectSound${IS_LINKED},")
963             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
964             ADD_BACKEND_LIBS(${DSOUND_LIBRARIES})
965             IF(CMAKE_VERSION VERSION_LESS "2.8.8")
966                 INCLUDE_DIRECTORIES(${DSOUND_INCLUDE_DIRS})
967             ENDIF()
968         ENDIF()
969     ENDIF()
971     # Check for MMDevApi backend
972     CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
973     IF(HAVE_MMDEVICEAPI_H)
974         OPTION(ALSOFT_BACKEND_MMDEVAPI "Enable MMDevApi backend" ON)
975         IF(ALSOFT_BACKEND_MMDEVAPI)
976             SET(HAVE_MMDEVAPI 1)
977             SET(BACKENDS  "${BACKENDS} MMDevApi,")
978             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
979         ENDIF()
980     ENDIF()
981 ENDIF()
982 IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
983     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
984 ENDIF()
985 IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
986     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
987 ENDIF()
988 IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
989     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
990 ENDIF()
992 # Check PortAudio backend
993 OPTION(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
994 FIND_PACKAGE(PortAudio)
995 IF(PORTAUDIO_FOUND)
996     OPTION(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
997     IF(ALSOFT_BACKEND_PORTAUDIO)
998         SET(HAVE_PORTAUDIO 1)
999         SET(BACKENDS  "${BACKENDS} PortAudio${IS_LINKED},")
1000         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
1001         ADD_BACKEND_LIBS(${PORTAUDIO_LIBRARIES})
1002         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
1003             INCLUDE_DIRECTORIES(${PORTAUDIO_INCLUDE_DIRS})
1004         ENDIF()
1005     ENDIF()
1006 ENDIF()
1007 IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
1008     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
1009 ENDIF()
1011 # Check PulseAudio backend
1012 OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
1013 FIND_PACKAGE(PulseAudio)
1014 IF(PULSEAUDIO_FOUND)
1015     OPTION(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
1016     IF(ALSOFT_BACKEND_PULSEAUDIO)
1017         SET(HAVE_PULSEAUDIO 1)
1018         SET(BACKENDS  "${BACKENDS} PulseAudio${IS_LINKED},")
1019         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
1020         ADD_BACKEND_LIBS(${PULSEAUDIO_LIBRARIES})
1021         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
1022             INCLUDE_DIRECTORIES(${PULSEAUDIO_INCLUDE_DIRS})
1023         ENDIF()
1024     ENDIF()
1025 ENDIF()
1026 IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
1027     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
1028 ENDIF()
1030 # Check JACK backend
1031 OPTION(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
1032 FIND_PACKAGE(JACK)
1033 IF(JACK_FOUND)
1034     OPTION(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
1035     IF(ALSOFT_BACKEND_JACK)
1036         SET(HAVE_JACK 1)
1037         SET(BACKENDS  "${BACKENDS} JACK${IS_LINKED},")
1038         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/jack.c)
1039         ADD_BACKEND_LIBS(${JACK_LIBRARIES})
1040         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
1041             INCLUDE_DIRECTORIES(${JACK_INCLUDE_DIRS})
1042         ENDIF()
1043     ENDIF()
1044 ENDIF()
1045 IF(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
1046     MESSAGE(FATAL_ERROR "Failed to enabled required JACK backend")
1047 ENDIF()
1049 # Check CoreAudio backend
1050 OPTION(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
1051 FIND_LIBRARY(COREAUDIO_FRAMEWORK
1052              NAMES CoreAudio
1053              PATHS /System/Library/Frameworks
1055 IF(COREAUDIO_FRAMEWORK)
1056     OPTION(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
1057     IF(ALSOFT_BACKEND_COREAUDIO)
1058         SET(HAVE_COREAUDIO 1)
1059         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
1060         SET(BACKENDS  "${BACKENDS} CoreAudio,")
1061         SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
1062         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
1063         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
1065         # Some versions of OSX may need the AudioToolbox framework. Add it if
1066         # it's found.
1067         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
1068                      NAMES AudioToolbox
1069                      PATHS ~/Library/Frameworks
1070                            /Library/Frameworks
1071                            /System/Library/Frameworks
1072                     )
1073         IF(AUDIOTOOLBOX_LIBRARY)
1074             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
1075         ENDIF()
1076     ENDIF()
1077 ENDIF()
1078 IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
1079     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
1080 ENDIF()
1082 # Check for OpenSL (Android) backend
1083 OPTION(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
1084 CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
1085 IF(HAVE_SLES_OPENSLES_ANDROID_H)
1086     CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
1087     IF(HAVE_LIBOPENSLES)
1088         OPTION(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
1089         IF(ALSOFT_BACKEND_OPENSL)
1090             SET(HAVE_OPENSL 1)
1091             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
1092             SET(BACKENDS  "${BACKENDS} OpenSL,")
1093             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
1094         ENDIF()
1095     ENDIF()
1096 ENDIF()
1097 IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
1098     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
1099 ENDIF()
1101 # Optionally enable the Wave Writer backend
1102 OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
1103 IF(ALSOFT_BACKEND_WAVE)
1104     SET(HAVE_WAVE 1)
1105     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
1106     SET(BACKENDS  "${BACKENDS} WaveFile,")
1107 ENDIF()
1109 # This is always available
1110 SET(BACKENDS  "${BACKENDS} Null")
1112 option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" OFF)
1113 if(ALSOFT_EMBED_HRTF_DATA)
1114     if(WIN32)
1115         set(ALC_OBJS  ${ALC_OBJS} Alc/hrtf_res.rc)
1116     elseif(APPLE)
1117         macro(add_custom_binary FILENAME BIN_NAME)
1118             set(outfile ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${FILENAME}${CMAKE_C_OUTPUT_EXTENSION})
1119             set(stubsrcfile ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${FILENAME}.stub.c)
1120             set(stubfile ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${FILENAME}.stub${CMAKE_C_OUTPUT_EXTENSION})
1121             add_custom_command(OUTPUT ${outfile}
1122                 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/hrtf/${FILENAME}"
1123                 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/hrtf"
1124                 COMMAND touch "${stubsrcfile}"
1125                 COMMAND "${CMAKE_C_COMPILER}" -o "${stubfile}" -c "${stubsrcfile}"
1126                 COMMAND "${CMAKE_LINKER}" -r -o "${outfile}" -sectcreate binary ${BIN_NAME} ${FILENAME} "${stubfile}"
1127                 COMMAND rm "${stubsrcfile}" "${stubfile}"
1128                 COMMENT "Generating ${FILENAME}${CMAKE_C_OUTPUT_EXTENSION}"
1129                 VERBATIM
1130             )
1131             set(ALC_OBJS  ${ALC_OBJS} ${outfile})
1132         endmacro()
1133         add_custom_binary(default-44100.mhr "default_44100")
1134         add_custom_binary(default-48000.mhr "default_48000")
1135     else()
1136         set(FILENAMES default-44100.mhr default-48000.mhr)
1137         foreach(FILENAME ${FILENAMES})
1138             set(outfile ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${FILENAME}${CMAKE_C_OUTPUT_EXTENSION})
1139             add_custom_command(OUTPUT ${outfile}
1140                 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/hrtf/${FILENAME}"
1141                 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/hrtf"
1142                 COMMAND "${CMAKE_LINKER}" -r -b binary -o "${outfile}" ${FILENAME}
1143                 COMMAND "${CMAKE_OBJCOPY}" --rename-section .data=.rodata,alloc,load,readonly,data,contents "${outfile}" "${outfile}"
1144                 COMMENT "Generating ${FILENAME}${CMAKE_C_OUTPUT_EXTENSION}"
1145                 VERBATIM
1146             )
1147             set(ALC_OBJS  ${ALC_OBJS} ${outfile})
1148         endforeach()
1149         unset(outfile)
1150         unset(FILENAMES)
1151     endif()
1152 endif()
1155 IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
1156     add_subdirectory(utils/alsoft-config)
1157 ENDIF()
1158 IF(ALSOFT_EXAMPLES)
1159     FIND_PACKAGE(SDL2)
1160     IF(SDL2_FOUND)
1161         FIND_PACKAGE(SDL_sound)
1162         IF(SDL_SOUND_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
1163             INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
1164         ENDIF()
1165         FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
1166         IF(FFMPEG_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
1167             INCLUDE_DIRECTORIES(${FFMPEG_INCLUDE_DIRS})
1168         ENDIF()
1169     ENDIF()
1170 ENDIF()
1172 IF(LIBTYPE STREQUAL "STATIC")
1173     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
1174     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
1175 ENDIF()
1177 FIND_PACKAGE(Git)
1178 IF(GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
1179     # Get the current working branch and its latest abbreviated commit hash
1180     ADD_CUSTOM_TARGET(build_version
1181         ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE}
1182                          -D LIB_VERSION=${LIB_VERSION}
1183                          -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
1184                          -D DST=${OpenAL_BINARY_DIR}/version.h
1185                          -P ${OpenAL_SOURCE_DIR}/version.cmake
1186         WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1187         VERBATIM
1188     )
1189 ELSE()
1190     SET(GIT_BRANCH "UNKNOWN")
1191     SET(GIT_COMMIT_HASH "unknown")
1192     CONFIGURE_FILE(
1193         "${OpenAL_SOURCE_DIR}/version.h.in"
1194         "${OpenAL_BINARY_DIR}/version.h")
1195 ENDIF()
1197 # Needed for openal.pc.in
1198 SET(prefix ${CMAKE_INSTALL_PREFIX})
1199 SET(exec_prefix "\${prefix}")
1200 SET(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
1201 SET(bindir "\${exec_prefix}/${CMAKE_INSTALL_BINDIR}")
1202 SET(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
1203 SET(PACKAGE_VERSION "${LIB_VERSION}")
1205 # End configuration
1206 CONFIGURE_FILE(
1207     "${OpenAL_SOURCE_DIR}/config.h.in"
1208     "${OpenAL_BINARY_DIR}/config.h")
1209 CONFIGURE_FILE(
1210     "${OpenAL_SOURCE_DIR}/openal.pc.in"
1211     "${OpenAL_BINARY_DIR}/openal.pc"
1212     @ONLY)
1214 # Build a common library with reusable helpers
1215 ADD_LIBRARY(common STATIC ${COMMON_OBJS})
1216 SET_PROPERTY(TARGET common APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1217 IF(NOT LIBTYPE STREQUAL "STATIC")
1218     SET_PROPERTY(TARGET common PROPERTY POSITION_INDEPENDENT_CODE TRUE)
1219 ENDIF()
1221 # Build main library
1222 IF(LIBTYPE STREQUAL "STATIC")
1223     ADD_LIBRARY(${LIBNAME} STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS})
1224 ELSE()
1225     ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
1226 ENDIF()
1227 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1228 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES)
1229 IF(WIN32 AND ALSOFT_NO_UID_DEFS)
1230     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
1231 ENDIF()
1232 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
1233 IF(HAVE_ALSA)
1234     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${ALSA_INCLUDE_DIRS})
1235 ENDIF()
1236 IF(HAVE_OSS)
1237     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${OSS_INCLUDE_DIRS})
1238 ENDIF()
1239 IF(HAVE_SOLARIS)
1240     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${AUDIOIO_INCLUDE_DIRS})
1241 ENDIF()
1242 IF(HAVE_SNDIO)
1243     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${SOUNDIO_INCLUDE_DIRS})
1244 ENDIF()
1245 IF(HAVE_QSA)
1246     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${QSA_INCLUDE_DIRS})
1247 ENDIF()
1248 IF(HAVE_DSOUND)
1249     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${DSOUND_INCLUDE_DIRS})
1250 ENDIF()
1251 IF(HAVE_PORTAUDIO)
1252     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${PORTAUDIO_INCLUDE_DIRS})
1253 ENDIF()
1254 IF(HAVE_PULSEAUDIO)
1255     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${PULSEAUDIO_INCLUDE_DIRS})
1256 ENDIF()
1257 IF(HAVE_JACK)
1258     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${JACK_INCLUDE_DIRS})
1259 ENDIF()
1260 IF(WIN32)
1261     IF(MSVC)
1262         SET_PROPERTY(TARGET ${LIBNAME} APPEND_STRING PROPERTY LINK_FLAGS " /SUBSYSTEM:WINDOWS")
1263     ELSEIF(CMAKE_COMPILER_IS_GNUCC)
1264         SET_PROPERTY(TARGET ${LIBNAME} APPEND_STRING PROPERTY LINK_FLAGS " -mwindows")
1265     ENDIF()
1266 ENDIF()
1268 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
1269                                             SOVERSION ${LIB_MAJOR_VERSION})
1270 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
1271     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
1273     IF(MINGW AND ALSOFT_BUILD_IMPORT_LIB)
1274         FIND_PROGRAM(SED_EXECUTABLE NAMES sed DOC "sed executable")
1275         FIND_PROGRAM(DLLTOOL_EXECUTABLE NAMES "${DLLTOOL}" DOC "dlltool executable")
1276         IF(NOT SED_EXECUTABLE OR NOT DLLTOOL_EXECUTABLE)
1277             MESSAGE(STATUS "")
1278             IF(NOT SED_EXECUTABLE)
1279                 MESSAGE(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
1280             ENDIF()
1281             IF(NOT DLLTOOL_EXECUTABLE)
1282                 MESSAGE(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
1283             ENDIF()
1284         ELSE()
1285             SET_PROPERTY(TARGET ${LIBNAME} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--output-def,${LIBNAME}.def")
1286             ADD_CUSTOM_COMMAND(TARGET ${LIBNAME} POST_BUILD
1287                 COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" ${LIBNAME}.def
1288                 COMMAND "${DLLTOOL_EXECUTABLE}" -d ${LIBNAME}.def -l ${LIBNAME}.lib -D ${LIBNAME}.dll
1289                 COMMENT "Stripping ordinals from ${LIBNAME}.def and generating ${LIBNAME}.lib..."
1290                 VERBATIM
1291             )
1292         ENDIF()
1293     ENDIF()
1294 ENDIF()
1296 TARGET_LINK_LIBRARIES(${LIBNAME} common ${EXTRA_LIBS})
1297 IF(TARGET build_version)
1298     ADD_DEPENDENCIES(${LIBNAME} build_version)
1299 ENDIF()
1301 IF(ALSOFT_INSTALL)
1302     # Add an install target here
1303     INSTALL(TARGETS ${LIBNAME}
1304             RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1305             LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1306             ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1307     )
1308     INSTALL(FILES include/AL/al.h
1309                   include/AL/alc.h
1310                   include/AL/alext.h
1311                   include/AL/efx.h
1312                   include/AL/efx-creative.h
1313                   include/AL/efx-presets.h
1314             DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/AL
1315     )
1316     INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
1317             DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
1318 ENDIF()
1321 MESSAGE(STATUS "")
1322 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
1323 MESSAGE(STATUS "    ${BACKENDS}")
1324 MESSAGE(STATUS "")
1325 MESSAGE(STATUS "Building with support for CPU extensions:")
1326 MESSAGE(STATUS "    ${CPU_EXTS}")
1327 MESSAGE(STATUS "")
1329 IF(WIN32)
1330     IF(NOT HAVE_DSOUND)
1331         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
1332         MESSAGE(STATUS "         This is probably NOT what you want!")
1333         MESSAGE(STATUS "")
1334     ENDIF()
1335 ENDIF()
1337 if(ALSOFT_EMBED_HRTF_DATA)
1338     message(STATUS "Embedding HRTF datasets")
1339     message(STATUS "")
1340 endif()
1342 # Install alsoft.conf configuration file
1343 IF(ALSOFT_CONFIG)
1344     INSTALL(FILES alsoftrc.sample
1345             DESTINATION ${CMAKE_INSTALL_DATADIR}/openal
1346     )
1347     MESSAGE(STATUS "Installing sample configuration")
1348     MESSAGE(STATUS "")
1349 ENDIF()
1351 # Install HRTF definitions
1352 IF(ALSOFT_HRTF_DEFS)
1353     INSTALL(FILES hrtf/default-44100.mhr
1354                   hrtf/default-48000.mhr
1355             DESTINATION ${CMAKE_INSTALL_DATADIR}/openal/hrtf
1356     )
1357     MESSAGE(STATUS "Installing HRTF definitions")
1358     MESSAGE(STATUS "")
1359 ENDIF()
1361 # Install AmbDec presets
1362 IF(ALSOFT_AMBDEC_PRESETS)
1363     INSTALL(FILES presets/3D7.1.ambdec
1364                   presets/hexagon.ambdec
1365                   presets/itu5.1.ambdec
1366                   presets/rectangle.ambdec
1367                   presets/square.ambdec
1368                   presets/presets.txt
1369             DESTINATION ${CMAKE_INSTALL_DATADIR}/openal/presets
1370     )
1371     MESSAGE(STATUS "Installing AmbDec presets")
1372     MESSAGE(STATUS "")
1373 ENDIF()
1375 IF(ALSOFT_UTILS)
1376     ADD_EXECUTABLE(openal-info utils/openal-info.c)
1377     SET_PROPERTY(TARGET openal-info APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1378     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
1380     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
1381     SET_PROPERTY(TARGET makehrtf APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1382     IF(HAVE_LIBM)
1383         TARGET_LINK_LIBRARIES(makehrtf m)
1384     ENDIF()
1386     ADD_EXECUTABLE(bsincgen utils/bsincgen.c)
1387     SET_PROPERTY(TARGET bsincgen APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1388     IF(HAVE_LIBM)
1389         TARGET_LINK_LIBRARIES(bsincgen m)
1390     ENDIF()
1392     IF(ALSOFT_INSTALL)
1393         INSTALL(TARGETS openal-info makehrtf bsincgen
1394                 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1395                 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1396                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1397         )
1398     ENDIF()
1400     MESSAGE(STATUS "Building utility programs")
1401     IF(TARGET alsoft-config)
1402         MESSAGE(STATUS "Building configuration program")
1403     ENDIF()
1404     MESSAGE(STATUS "")
1405 ENDIF()
1407 IF(ALSOFT_TESTS)
1408     ADD_LIBRARY(test-common STATIC examples/common/alhelpers.c)
1409     SET_PROPERTY(TARGET test-common APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1411     ADD_EXECUTABLE(altonegen examples/altonegen.c)
1412     TARGET_LINK_LIBRARIES(altonegen test-common ${LIBNAME})
1413     SET_PROPERTY(TARGET altonegen APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1415     IF(ALSOFT_INSTALL)
1416         INSTALL(TARGETS altonegen
1417                 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1418                 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1419                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1420         )
1421     ENDIF()
1423     MESSAGE(STATUS "Building test programs")
1424     MESSAGE(STATUS "")
1425 ENDIF()
1427 IF(ALSOFT_EXAMPLES)
1428     IF(SDL2_FOUND AND SDL_SOUND_FOUND)
1429         ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c
1430                                      examples/common/sdl_sound.c)
1431         SET_PROPERTY(TARGET ex-common APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1432         SET_PROPERTY(TARGET ex-common APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1433                                                                           ${SDL_SOUND_INCLUDE_DIR})
1435         ADD_EXECUTABLE(alstream examples/alstream.c)
1436         TARGET_LINK_LIBRARIES(alstream ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY}
1437                                        common ${LIBNAME})
1438         SET_PROPERTY(TARGET alstream APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1439         SET_PROPERTY(TARGET alstream APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1440                                                                          ${SDL_SOUND_INCLUDE_DIR})
1442         ADD_EXECUTABLE(alreverb examples/alreverb.c)
1443         TARGET_LINK_LIBRARIES(alreverb ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY}
1444                                        common ${LIBNAME})
1445         SET_PROPERTY(TARGET alreverb APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1446         SET_PROPERTY(TARGET alreverb APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1447                                                                          ${SDL_SOUND_INCLUDE_DIR})
1449         ADD_EXECUTABLE(allatency examples/allatency.c)
1450         TARGET_LINK_LIBRARIES(allatency ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY}
1451                                         common ${LIBNAME})
1452         SET_PROPERTY(TARGET allatency APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1453         SET_PROPERTY(TARGET allatency APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1454                                                                           ${SDL_SOUND_INCLUDE_DIR})
1456         ADD_EXECUTABLE(alloopback examples/alloopback.c)
1457         TARGET_LINK_LIBRARIES(alloopback ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY}
1458                                          common ${LIBNAME})
1459         SET_PROPERTY(TARGET alloopback APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1460         SET_PROPERTY(TARGET alloopback APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1461                                                                            ${SDL_SOUND_INCLUDE_DIR})
1463         ADD_EXECUTABLE(alhrtf examples/alhrtf.c)
1464         TARGET_LINK_LIBRARIES(alhrtf ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY}
1465                                      common ${LIBNAME})
1466         SET_PROPERTY(TARGET alhrtf APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1467         SET_PROPERTY(TARGET alhrtf APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1468                                                                        ${SDL_SOUND_INCLUDE_DIR})
1470         IF(ALSOFT_INSTALL)
1471             INSTALL(TARGETS alstream alreverb allatency alloopback alhrtf
1472                     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1473                     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1474                     ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1475             )
1476         ENDIF()
1478         SET(FFVER_OK FALSE)
1479         IF(FFMPEG_FOUND)
1480             SET(FFVER_OK TRUE)
1481             IF(AVFORMAT_VERSION VERSION_LESS "55.33.100")
1482                 MESSAGE(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 55.33.100)")
1483                 SET(FFVER_OK FALSE)
1484             ENDIF()
1485             IF(AVCODEC_VERSION VERSION_LESS "55.52.102")
1486                 MESSAGE(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 55.52.102)")
1487                 SET(FFVER_OK FALSE)
1488             ENDIF()
1489             IF(AVUTIL_VERSION VERSION_LESS "52.66.100")
1490                 MESSAGE(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 52.66.100)")
1491                 SET(FFVER_OK FALSE)
1492             ENDIF()
1493             IF(SWSCALE_VERSION VERSION_LESS "2.5.102")
1494                 MESSAGE(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 2.5.102)")
1495                 SET(FFVER_OK FALSE)
1496             ENDIF()
1497             IF(SWRESAMPLE_VERSION VERSION_LESS "0.18.100")
1498                 MESSAGE(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 0.18.100)")
1499                 SET(FFVER_OK FALSE)
1500             ENDIF()
1501         ENDIF()
1502         IF(FFVER_OK AND NOT MSVC)
1503             ADD_EXECUTABLE(alffplay examples/alffplay.c)
1504             TARGET_LINK_LIBRARIES(alffplay common ex-common ${SDL2_LIBRARY} ${LIBNAME} ${FFMPEG_LIBRARIES})
1505             SET_PROPERTY(TARGET alffplay APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
1506             SET_PROPERTY(TARGET alffplay APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1507                                                                              ${FFMPEG_INCLUDE_DIRS})
1509             IF(ALSOFT_INSTALL)
1510                 INSTALL(TARGETS alffplay
1511                         RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1512                         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1513                         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1514                 )
1515             ENDIF()
1516             MESSAGE(STATUS "Building SDL and FFmpeg example programs")
1517         ELSE()
1518             MESSAGE(STATUS "Building SDL example programs")
1519         ENDIF()
1520         MESSAGE(STATUS "")
1521     ENDIF()
1522 ENDIF()