Use an al_string in the PulseAudio backend instead of char*
[openal-soft.git] / CMakeLists.txt
blob68a58caed63634465b95a4a9b3ad91b87b52a8ce
1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
5 PROJECT(OpenAL)
7 IF(COMMAND CMAKE_POLICY)
8   CMAKE_POLICY(SET CMP0003 NEW)
9   CMAKE_POLICY(SET CMP0005 NEW)
10 ENDIF(COMMAND CMAKE_POLICY)
12 SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
14 INCLUDE(CheckFunctionExists)
15 INCLUDE(CheckLibraryExists)
16 INCLUDE(CheckSharedFunctionExists)
17 INCLUDE(CheckIncludeFile)
18 INCLUDE(CheckIncludeFiles)
19 INCLUDE(CheckSymbolExists)
20 INCLUDE(CheckCCompilerFlag)
21 INCLUDE(CheckCSourceCompiles)
22 INCLUDE(CheckTypeSize)
25 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
28 IF(WIN32)
29     # This option is mainly for static linking OpenAL Soft into another project
30     # that already defines the IDs. It is up to that project to ensure all
31     # required IDs are defined.
32     OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
33 ELSE()
34     # These are needed on non-Windows systems for extra features
35     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700)
36     SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700")
37 ENDIF()
40 OPTION(ALSOFT_BACKEND_MMDEVAPI "Check for MMDevApi backend"           ON)
41 OPTION(ALSOFT_BACKEND_WINMM    "Check for Windows Multimedia backend" ON)
42 OPTION(ALSOFT_BACKEND_OPENSL   "Check for OpenSL backend"             ON)
44 OPTION(ALSOFT_REQUIRE_MMDEVAPI "Require MMDevApi"                   OFF)
45 OPTION(ALSOFT_REQUIRE_WINMM    "Require Windows Multimedia backend" OFF)
46 OPTION(ALSOFT_REQUIRE_OPENSL   "Require OpenSL backend"             OFF)
48 OPTION(ALSOFT_DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
50 OPTION(ALSOFT_WERROR  "Treat compile warnings as errors"      OFF)
52 OPTION(ALSOFT_UTILS          "Build and install utility programs"         ON)
53 OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
55 OPTION(ALSOFT_EXAMPLES  "Build and install example programs"  ON)
57 OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
58 OPTION(ALSOFT_HRTF_DEFS "Install HRTF definition files" ON)
61 IF(WIN32)
62     SET(LIBNAME OpenAL32)
63     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502")
64 ELSE()
65     SET(LIBNAME openal)
66 ENDIF()
68 # QNX's gcc do not uses /usr/include and /usr/lib pathes by default
69 IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
70     ADD_DEFINITIONS("-I/usr/include")
71     SET(EXTRA_LIBS ${EXTRA_LIBS} -L/usr/lib)
72 ENDIF()
74 IF(NOT LIBTYPE)
75     SET(LIBTYPE SHARED)
76 ENDIF()
78 SET(LIB_MAJOR_VERSION "1")
79 SET(LIB_MINOR_VERSION "15")
80 SET(LIB_REVISION "1")
81 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
83 SET(EXPORT_DECL "")
84 SET(ALIGN_DECL "")
87 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
88 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
91 CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
92 IF(HAVE_STD_C99)
93     SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
94 ENDIF()
96 # MSVC may need workarounds for C99 restrict and inline
97 IF(MSVC)
98     # TODO: Once we truly require C99, these restrict and inline checks should go
99     # away.
100     CHECK_C_SOURCE_COMPILES("int *restrict foo;
101                              int main() {return 0;}" HAVE_RESTRICT)
102     IF(NOT HAVE_RESTRICT)
103         ADD_DEFINITIONS("-Drestrict=")
104         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
105     ENDIF()
107     CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
108                              int main() {return 0;}" HAVE_INLINE)
109     IF(NOT HAVE_INLINE)
110         CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
111                                  int main() {return 0;}" HAVE___INLINE)
112         IF(NOT HAVE___INLINE)
113             MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
114         ENDIF()
116         ADD_DEFINITIONS(-Dinline=__inline)
117         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
118     ENDIF()
119 ENDIF()
121 # Make sure we have C99-style inline semantics with GCC (4.3 or newer).
122 IF(CMAKE_COMPILER_IS_GNUCC)
123     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
124     # Force no inlining for the next test.
125     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
127     CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
128                              int main() {return foo();}" INLINE_IS_C99)
129     IF(NOT INLINE_IS_C99)
130         MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
131                              Please update your compiler for better C99 compliance.")
132     ENDIF()
134     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
135 ENDIF()
137 # Check if we have C99 variable length arrays
138 CHECK_C_SOURCE_COMPILES(
139 "int main(int argc, char *argv[])
141      volatile int tmp[argc];
142      tmp[0] = argv[0][0];
143      return tmp[0];
144  }"
145 HAVE_C99_VLA)
147 # Check if we have C11 static_assert
148 CHECK_C_SOURCE_COMPILES(
149 "int main()
151      _Static_assert(sizeof(int) == sizeof(int), \"What\");
152      return 0;
153  }"
154 HAVE_C11_STATIC_ASSERT)
156 # Check if we have C11 alignas
157 CHECK_C_SOURCE_COMPILES(
158 "_Alignas(4) int foo;
159  int main()
161      return 0;
162  }"
163 HAVE_C11_ALIGNAS)
165 # Add definitions, compiler switches, etc.
166 INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_BINARY_DIR}")
167 IF(CMAKE_VERSION VERSION_LESS "2.8.8")
168     INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
169     IF(WIN32 AND ALSOFT_NO_UID_DEFS)
170         ADD_DEFINITIONS("-DAL_NO_UID_DEFS")
171     ENDIF()
172 ENDIF()
174 IF(NOT CMAKE_BUILD_TYPE)
175     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
176         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
177         FORCE)
178 ENDIF()
179 IF(NOT CMAKE_DEBUG_POSTFIX)
180     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
181         "Library postfix for debug builds. Normally left blank."
182         FORCE)
183 ENDIF()
185 IF(MSVC)
186     # ???
187     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
188     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
189     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
190     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
191     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
192     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
193     ADD_DEFINITIONS("/wd4098")
195     IF(NOT DXSDK_DIR)
196         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
197     ELSE()
198         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
199     ENDIF()
200     IF(DXSDK_DIR)
201         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
202         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
203         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
204         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
205     ENDIF()
207     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
208     IF(FORCE_STATIC_VCRT)
209         FOREACH(flag_var
210                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
211                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
212             IF(${flag_var} MATCHES "/MD")
213                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
214             ENDIF()
215         ENDFOREACH(flag_var)
216     ENDIF()
217 ELSE()
218     ADD_DEFINITIONS(-Winline -Wall)
219     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
220     IF(HAVE_W_EXTRA)
221         ADD_DEFINITIONS(-Wextra)
222     ENDIF()
224     IF(ALSOFT_WERROR)
225         ADD_DEFINITIONS(-Werror)
226     ENDIF()
228     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
229         "Flags used by the compiler during Release with Debug Info builds."
230         FORCE)
231     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
232         "Flags used by the compiler during release minsize builds."
233         FORCE)
234     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
235         "Flags used by the compiler during release builds"
236         FORCE)
237     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
238         "Flags used by the compiler during debug builds."
239         FORCE)
241     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
242                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
243 ENDIF()
245 # Set visibility/export options if available
246 IF(WIN32)
247     SET(EXPORT_DECL "__declspec(dllexport)")
248     IF(NOT MINGW)
249         SET(ALIGN_DECL "__declspec(align(x))")
250     ELSE()
251         SET(ALIGN_DECL "__declspec(aligned(x))")
252     ENDIF()
253 ELSE()
254     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
255     # Yes GCC, really don't accept visibility modes you don't support
256     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
258     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
259                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
260     IF(HAVE_GCC_PROTECTED_VISIBILITY)
261         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
262     ELSE()
263         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
264                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
265         IF(HAVE_GCC_DEFAULT_VISIBILITY)
266             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
267         ENDIF()
268     ENDIF()
270     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
271         CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
272         IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
273             ADD_DEFINITIONS(-fvisibility=internal)
274         ELSE()
275             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
276             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
277                 ADD_DEFINITIONS(-fvisibility=hidden)
278             ENDIF()
279         ENDIF()
280     ENDIF()
282     CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
283                              int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
284     IF(HAVE_ATTRIBUTE_ALIGNED)
285         SET(ALIGN_DECL "__attribute__((aligned(x)))")
286     ENDIF()
288     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
289 ENDIF()
291 SET(SSE_SWITCH "")
292 IF(MSVC)
293     CHECK_C_COMPILER_FLAG(/arch:SSE HAVE_ARCHSSE_SWITCH)
294     IF(HAVE_ARCHSSE_SWITCH)
295         SET(SSE_SWITCH "/arch:SSE")
296     ENDIF()
297 ENDIF()
298 IF(NOT SSE_SWITCH)
299     CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
300     IF(HAVE_MSSE_SWITCH)
301         SET(SSE_SWITCH "-msse")
302     ENDIF()
303 ENDIF()
305 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
306                          int main() {return 0;}" HAVE_GCC_FORMAT)
308 CHECK_INCLUDE_FILE(stdalign.h HAVE_STDALIGN_H)
309 IF(NOT HAVE_C99_VLA)
310     CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
311 ENDIF()
312 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
313 CHECK_INCLUDE_FILE(ftw.h HAVE_FTW_H)
314 CHECK_INCLUDE_FILE(io.h HAVE_IO_H)
315 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
316 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
317 CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
318 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
319 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
320 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
321 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
322 IF(NOT HAVE_GUIDDEF_H)
323     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
324 ENDIF()
326 # Some systems need libm for some of the following math functions to work
327 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
328 IF(HAVE_LIBM)
329     SET(EXTRA_LIBS m ${EXTRA_LIBS})
330     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
331 ENDIF()
334 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
335 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
336 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
337 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
338 IF(NOT HAVE_C99_VLA)
339     IF(HAVE_ALLOCA_H)
340         CHECK_SYMBOL_EXISTS(alloca alloca.h HAVE_ALLOCA)
341     ELSEIF(HAVE_MALLOC_H)
342         CHECK_SYMBOL_EXISTS(alloca malloc.h HAVE_ALLOCA)
343     ENDIF()
344     IF(NOT HAVE_ALLOCA)
345         MESSAGE(FATAL_ERROR "No alloca function found, please report!")
346     ENDIF()
347 ENDIF()
349 IF(HAVE_FLOAT_H)
350     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
351     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
352 ENDIF()
353 IF(HAVE_FTW_H)
354     CHECK_SYMBOL_EXISTS(ftw ftw.h HAVE_FTW)
355 ENDIF()
356 IF(HAVE_IO_H)
357     CHECK_SYMBOL_EXISTS(_wfindfirst io.h HAVE__WFINDFIRST)
358 ENDIF()
360 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
361 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
362 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
363 IF(NOT HAVE_STRCASECMP)
364     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
365     IF(NOT HAVE__STRICMP)
366         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
367     ENDIF()
369     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
370 ENDIF()
372 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
373 IF(NOT HAVE_STRNCASECMP)
374     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
375     IF(NOT HAVE__STRNICMP)
376         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
377     ENDIF()
379     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
380 ENDIF()
382 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
383 IF(NOT HAVE_SNPRINTF)
384     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
385     IF(NOT HAVE__SNPRINTF)
386         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
387     ENDIF()
389     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
390 ENDIF()
392 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
393 IF(NOT HAVE_ISFINITE)
394     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
395     IF(NOT HAVE_FINITE)
396         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
397         IF(NOT HAVE__FINITE)
398             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
399         ENDIF()
400         ADD_DEFINITIONS(-Disfinite=_finite)
401     ELSE()
402         ADD_DEFINITIONS(-Disfinite=finite)
403     ENDIF()
404 ENDIF()
406 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
407 IF(NOT HAVE_ISNAN)
408     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
409     IF(NOT HAVE__ISNAN)
410         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
411     ENDIF()
413     ADD_DEFINITIONS(-Disnan=_isnan)
414 ENDIF()
417 # Check for the dlopen API (for dynamicly loading backend libs)
418 IF(ALSOFT_DLOPEN)
419     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
420     IF(HAVE_DLFCN_H)
421         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
422         IF(HAVE_LIBDL)
423             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
424         ENDIF()
425     ENDIF()
426 ENDIF()
428 # Check if we have Windows headers
429 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0502)
430 IF(NOT HAVE_WINDOWS_H)
431     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
432     IF(NOT HAVE_GETTIMEOFDAY)
433         MESSAGE(FATAL_ERROR "No timing function found!")
434     ENDIF()
436     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
437     IF(NOT HAVE_NANOSLEEP)
438         MESSAGE(FATAL_ERROR "No sleep function found!")
439     ENDIF()
441     # We need pthreads outside of Windows
442     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
443     IF(NOT HAVE_PTHREAD_H)
444         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
445     ENDIF()
446     # Some systems need pthread_np.h to get recursive mutexes
447     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
449     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
450     IF(HAVE_PTHREAD)
451         ADD_DEFINITIONS(-pthread)
452         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
453         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
454     ENDIF()
456     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
457     IF(HAVE_LIBPTHREAD)
458         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
459     ENDIF()
461     CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
463     CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
464     IF(NOT HAVE_PTHREAD_SETNAME_NP)
465         CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
466     ENDIF()
467     IF(HAVE_PTHREAD_NP_H)
468         CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np "pthread.h;pthread_np.h" HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
469     ENDIF()
471     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
472     IF(HAVE_LIBRT)
473         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
474     ENDIF()
475 ENDIF()
477 # Check for a 64-bit type
478 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
479 IF(NOT HAVE_STDINT_H)
480     IF(HAVE_WINDOWS_H)
481         CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
482                                  #include <windows.h>
483                                  __int64 foo;
484                                  int main() {return 0;}" HAVE___INT64)
485     ENDIF()
486     IF(NOT HAVE___INT64)
487         IF(NOT SIZEOF_LONG MATCHES "8")
488             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
489                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
490             ENDIF()
491         ENDIF()
492     ENDIF()
493 ENDIF()
496 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
497                  OpenAL32/alBuffer.c
498                  OpenAL32/alEffect.c
499                  OpenAL32/alError.c
500                  OpenAL32/alExtension.c
501                  OpenAL32/alFilter.c
502                  OpenAL32/alFontsound.c
503                  OpenAL32/alListener.c
504                  OpenAL32/alMidi.c
505                  OpenAL32/alPreset.c
506                  OpenAL32/alSoundfont.c
507                  OpenAL32/alSource.c
508                  OpenAL32/alState.c
509                  OpenAL32/alThunk.c
510                  OpenAL32/sample_cvt.c
512 SET(ALC_OBJS  Alc/ALc.c
513               Alc/ALu.c
514               Alc/alcConfig.c
515               Alc/alcRing.c
516               Alc/bs2b.c
517               Alc/effects/autowah.c
518               Alc/effects/chorus.c
519               Alc/effects/compressor.c
520               Alc/effects/dedicated.c
521               Alc/effects/distortion.c
522               Alc/effects/echo.c
523               Alc/effects/equalizer.c
524               Alc/effects/flanger.c
525               Alc/effects/modulator.c
526               Alc/effects/null.c
527               Alc/effects/reverb.c
528               Alc/helpers.c
529               Alc/hrtf.c
530               Alc/panning.c
531               Alc/threads.c
532               Alc/mixer.c
533               Alc/mixer_c.c
537 SET(CPU_EXTS "Default")
538 SET(HAVE_SSE  0)
539 SET(HAVE_NEON 0)
541 # Check for SSE support
542 OPTION(ALSOFT_REQUIRE_SSE "Require SSE/SSE2 support" OFF)
543 CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
544 IF(HAVE_XMMINTRIN_H)
545     OPTION(ALSOFT_CPUEXT_SSE "Enable SSE/SSE2 support" ON)
546     IF(ALSOFT_CPUEXT_SSE AND ALIGN_DECL)
547         SET(HAVE_SSE 1)
548         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
549         IF(SSE_SWITCH)
550             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
551                                         COMPILE_FLAGS "${SSE_SWITCH}")
552         ENDIF()
553         SET(CPU_EXTS "${CPU_EXTS}, SSE")
554     ENDIF()
555 ENDIF()
556 IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
557     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
558 ENDIF()
560 # Check for ARM Neon support
561 OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
562 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
563 IF(HAVE_ARM_NEON_H)
564     OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON)
565     IF(ALSOFT_CPUEXT_NEON)
566         SET(HAVE_NEON 1)
567         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
568         SET(CPU_EXTS "${CPU_EXTS}, Neon")
569     ENDIF()
570 ENDIF()
571 IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
572     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
573 ENDIF()
576 SET(ALC_OBJS  ${ALC_OBJS}
577               Alc/midi/base.c
578               Alc/midi/sf2load.c
579               Alc/midi/dummy.c
580               Alc/midi/fluidsynth.c
581               Alc/midi/soft.c
584 SET(HAVE_FLUIDSYNTH  0)
586 # Check for FluidSynth support
587 OPTION(ALSOFT_REQUIRE_FLUIDSYNTH "Require FluidSynth MIDI" OFF)
588 FIND_PACKAGE(FluidSynth)
589 IF(FLUIDSYNTH_FOUND)
590     OPTION(ALSOFT_MIDI_FLUIDSYNTH "Enable FluidSynth MIDI" ON)
591     IF(ALSOFT_MIDI_FLUIDSYNTH)
592         SET(HAVE_FLUIDSYNTH 1)
593         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
594             INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIR})
595         ENDIF()
596         SET(EXTRA_LIBS ${FLUIDSYNTH_LIBRARIES} ${EXTRA_LIBS})
597     ENDIF()
598 ENDIF()
599 IF(ALSOFT_REQUIRE_FLUIDSYNTH AND NOT HAVE_FLUIDSYNTH)
600     MESSAGE(FATAL_ERROR "Failed to enabled required FluidSynth support")
601 ENDIF()
604 SET(ALC_OBJS  ${ALC_OBJS}
605               Alc/backends/base.c
606               # Default backends, always available
607               Alc/backends/loopback.c
608               Alc/backends/null.c
611 SET(BACKENDS "")
612 SET(HAVE_ALSA       0)
613 SET(HAVE_OSS        0)
614 SET(HAVE_SOLARIS    0)
615 SET(HAVE_SNDIO      0)
616 SET(HAVE_QSA        0)
617 SET(HAVE_DSOUND     0)
618 SET(HAVE_MMDEVAPI   0)
619 SET(HAVE_WINMM      0)
620 SET(HAVE_PORTAUDIO  0)
621 SET(HAVE_PULSEAUDIO 0)
622 SET(HAVE_COREAUDIO  0)
623 SET(HAVE_OPENSL     0)
624 SET(HAVE_WAVE       0)
626 # Check ALSA backend
627 OPTION(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
628 FIND_PACKAGE(ALSA)
629 IF(ALSA_FOUND)
630     OPTION(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
631     IF(ALSOFT_BACKEND_ALSA)
632         SET(HAVE_ALSA 1)
633         SET_SOURCE_FILES_PROPERTIES(Alc/backends/alsa.c PROPERTIES
634                                     INCLUDE_DIRECTORIES "${ALSA_INCLUDE_DIRS}")
635         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
636         IF(HAVE_DLFCN_H OR WIN32)
637             SET(BACKENDS  "${BACKENDS} ALSA,")
638         ELSE()
639             SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
640             SET(EXTRA_LIBS ${ALSA_LIBRARIES} ${EXTRA_LIBS})
641         ENDIF()
642     ENDIF()
643 ENDIF()
644 IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
645     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
646 ENDIF()
648 # Check OSS backend
649 OPTION(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
650 FIND_PACKAGE(OSS)
651 IF(OSS_FOUND)
652     OPTION(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
653     IF(ALSOFT_BACKEND_OSS)
654         SET(HAVE_OSS 1)
655         SET_SOURCE_FILES_PROPERTIES(Alc/backends/oss.c PROPERTIES
656                                     INCLUDE_DIRECTORIES "${OSS_INCLUDE_DIRS}")
657         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
658         SET(BACKENDS  "${BACKENDS} OSS,")
659     ENDIF()
660 ENDIF()
661 IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
662     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
663 ENDIF()
665 # Check Solaris backend
666 OPTION(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
667 FIND_PACKAGE(AudioIO)
668 IF(AUDIOIO_FOUND)
669     OPTION(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
670     IF(ALSOFT_BACKEND_SOLARIS)
671         SET(HAVE_SOLARIS 1)
672         SET_SOURCE_FILES_PROPERTIES(Alc/backends/solaris.c PROPERTIES
673                                     INCLUDE_DIRECTORIES "${AUDIOIO_INCLUDE_DIRS}")
674         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
675         SET(BACKENDS  "${BACKENDS} Solaris,")
676     ENDIF()
677 ENDIF()
678 IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
679     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
680 ENDIF()
682 # Check SndIO backend
683 OPTION(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
684 FIND_PACKAGE(SoundIO)
685 IF(SOUNDIO_FOUND)
686     OPTION(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
687     IF(ALSOFT_BACKEND_SNDIO)
688         SET(HAVE_SNDIO 1)
689         SET_SOURCE_FILES_PROPERTIES(Alc/backends/sndio.c PROPERTIES
690                                     INCLUDE_DIRECTORIES "${SOUNDIO_INCLUDE_DIRS}")
691         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
692         SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
693         SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
694     ENDIF()
695 ENDIF()
696 IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
697     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
698 ENDIF()
700 # Check QSA backend
701 OPTION(ALSOFT_REQUIRE_QSA "Require QSA backend" OFF)
702 FIND_PACKAGE(QSA)
703 IF(QSA_FOUND)
704     OPTION(ALSOFT_BACKEND_QSA "Enable QSA backend" ON)
705     IF(ALSOFT_BACKEND_QSA)
706         SET(HAVE_QSA 1)
707         SET_SOURCE_FILES_PROPERTIES(Alc/backends/qsa.c PROPERTIES
708                                     INCLUDE_DIRECTORIES "${QSA_INCLUDE_DIRS}")
709         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/qsa.c)
710         SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS})
711         SET(BACKENDS  "${BACKENDS} QSA \(linked\),")
712     ENDIF()
713 ENDIF()
714 IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
715     MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
716 ENDIF()
718 # Check DSound backend
719 OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
720 FIND_PACKAGE(DSound)
721 IF(DSOUND_FOUND)
722     OPTION(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
723     IF(ALSOFT_BACKEND_DSOUND)
724         SET(HAVE_DSOUND 1)
725         SET_SOURCE_FILES_PROPERTIES(Alc/backends/dsound.c PROPERTIES
726                                     INCLUDE_DIRECTORIES "${DSOUND_INCLUDE_DIRS}")
727         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
728         IF(HAVE_DLFCN_H OR WIN32)
729             SET(BACKENDS  "${BACKENDS} DirectSound,")
730         ELSE()
731             SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
732             SET(EXTRA_LIBS ${DSOUND_LIBRARIES} ${EXTRA_LIBS})
733         ENDIF()
734     ENDIF()
735 ENDIF()
736 IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
737     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
738 ENDIF()
740 # Check for MMDevApi backend
741 IF(HAVE_WINDOWS_H)
742     IF(ALSOFT_BACKEND_MMDEVAPI)
743         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
744         IF(HAVE_MMDEVICEAPI_H)
745             SET(HAVE_MMDEVAPI 1)
746             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
748             SET(BACKENDS  "${BACKENDS} MMDevApi,")
749         ENDIF()
750     ENDIF()
751 ENDIF()
752 IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
753     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
754 ENDIF()
756 # Check MMSystem backend
757 IF(HAVE_WINDOWS_H)
758     IF(ALSOFT_BACKEND_WINMM)
759         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0502)
760         IF(HAVE_MMSYSTEM_H)
761             CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
762             IF(HAVE_LIBWINMM)
763                 SET(HAVE_WINMM 1)
764                 SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
765                 SET(BACKENDS  "${BACKENDS} WinMM,")
766                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
767             ENDIF()
768         ENDIF()
769     ENDIF()
770 ENDIF()
771 IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
772     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
773 ENDIF()
775 # Check PortAudio backend
776 OPTION(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
777 FIND_PACKAGE(PortAudio)
778 IF(PORTAUDIO_FOUND)
779     OPTION(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
780     IF(ALSOFT_BACKEND_PORTAUDIO)
781         SET(HAVE_PORTAUDIO 1)
782         SET_SOURCE_FILES_PROPERTIES(Alc/backends/portaudio.c PROPERTIES
783                                     INCLUDE_DIRECTORIES "${PORTAUDIO_INCLUDE_DIRS}")
784         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
785         IF(HAVE_DLFCN_H OR WIN32)
786             SET(BACKENDS  "${BACKENDS} PortAudio,")
787         ELSE()
788             SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
789             SET(EXTRA_LIBS ${PORTAUDIO_LIBRARIES} ${EXTRA_LIBS})
790         ENDIF()
791     ENDIF()
792 ENDIF()
793 IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
794     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
795 ENDIF()
797 # Check PulseAudio backend
798 OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
799 FIND_PACKAGE(PulseAudio)
800 IF(PULSEAUDIO_FOUND)
801     OPTION(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
802     IF(ALSOFT_BACKEND_PULSEAUDIO)
803         SET(HAVE_PULSEAUDIO 1)
804         SET_SOURCE_FILES_PROPERTIES(Alc/backends/pulseaudio.c PROPERTIES
805                                     INCLUDE_DIRECTORIES "${PULSEAUDIO_INCLUDE_DIRS}")
806         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
807         IF(HAVE_DLFCN_H OR WIN32)
808             SET(BACKENDS  "${BACKENDS} PulseAudio,")
809         ELSE()
810             SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
811             SET(EXTRA_LIBS ${PULSEAUDIO_LIBRARIES} ${EXTRA_LIBS})
812         ENDIF()
813     ENDIF()
814 ENDIF()
815 IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
816     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
817 ENDIF()
819 # Check CoreAudio backend
820 OPTION(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
821 FIND_LIBRARY(COREAUDIO_FRAMEWORK
822              NAMES CoreAudio
823              PATHS /System/Library/Frameworks
825 IF(COREAUDIO_FRAMEWORK)
826     OPTION(ALSOFT_BACKEND_COREAUDIO "Check for CoreAudio backend" ON)
827     IF(ALSOFT_BACKEND_COREAUDIO)
828         SET(HAVE_COREAUDIO 1)
829         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
830         SET(BACKENDS  "${BACKENDS} CoreAudio,")
831         SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
832         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
833         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
835         # Some versions of OSX may need the AudioToolbox framework. Add it if
836         # it's found.
837         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
838                      NAMES AudioToolbox
839                      PATHS ~/Library/Frameworks
840                            /Library/Frameworks
841                            /System/Library/Frameworks
842                     )
843         IF(AUDIOTOOLBOX_LIBRARY)
844             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
845         ENDIF()
846     ENDIF()
847 ENDIF()
848 IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
849     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
850 ENDIF()
852 # Check for OpenSL (Android) backend
853 IF(ALSOFT_BACKEND_OPENSL)
854     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
855     IF(HAVE_SLES_OPENSLES_ANDROID_H)
856         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
857         IF(HAVE_LIBOPENSLES)
858             SET(HAVE_OPENSL 1)
859             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
860             SET(BACKENDS  "${BACKENDS} OpenSL,")
861             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
862         ENDIF()
863     ENDIF()
864 ENDIF()
865 IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
866     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
867 ENDIF()
869 # Optionally enable the Wave Writer backend
870 OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
871 IF(ALSOFT_BACKEND_WAVE)
872     SET(HAVE_WAVE 1)
873     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
874     SET(BACKENDS  "${BACKENDS} WaveFile,")
875 ENDIF()
877 # This is always available
878 SET(BACKENDS  "${BACKENDS} Null")
880 IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
881     add_subdirectory(utils/alsoft-config)
882 ENDIF()
883 IF(ALSOFT_EXAMPLES)
884     FIND_PACKAGE(SDL)
885     IF(SDL_FOUND)
886         FIND_PACKAGE(SDL_sound)
887         IF(SDL_SOUND_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
888             INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
889         ENDIF()
890     ENDIF()
891 ENDIF()
893 IF(LIBTYPE STREQUAL "STATIC")
894     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
895     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
896 ENDIF()
898 # Needed for openal.pc.in
899 SET(prefix ${CMAKE_INSTALL_PREFIX})
900 SET(exec_prefix "\${prefix}")
901 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
902 SET(bindir "\${exec_prefix}/bin")
903 SET(includedir "\${prefix}/include")
904 SET(PACKAGE_VERSION "${LIB_VERSION}")
906 # End configuration
907 CONFIGURE_FILE(
908     "${OpenAL_SOURCE_DIR}/config.h.in"
909     "${OpenAL_BINARY_DIR}/config.h")
910 CONFIGURE_FILE(
911     "${OpenAL_SOURCE_DIR}/openal.pc.in"
912     "${OpenAL_BINARY_DIR}/openal.pc"
913     @ONLY)
915 # Build a library
916 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
917 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES)
918 IF(WIN32 AND ALSOFT_NO_UID_DEFS)
919     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
920 ENDIF()
921 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
922 IF(FLUIDSYNTH_FOUND)
923     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${FLUIDSYNTH_INCLUDE_DIR})
924 ENDIF()
925 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
926                                             SOVERSION ${LIB_MAJOR_VERSION})
927 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
928     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
929 ENDIF()
931 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
933 # Add an install target here
934 INSTALL(TARGETS ${LIBNAME}
935         RUNTIME DESTINATION bin
936         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
937         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
939 INSTALL(FILES include/AL/al.h
940               include/AL/alc.h
941               include/AL/alext.h
942               include/AL/efx.h
943               include/AL/efx-creative.h
944               include/AL/efx-presets.h
945         DESTINATION include/AL
947 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
948         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
951 MESSAGE(STATUS "")
952 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
953 MESSAGE(STATUS "    ${BACKENDS}")
954 MESSAGE(STATUS "")
955 MESSAGE(STATUS "Building with support for CPU extensions:")
956 MESSAGE(STATUS "    ${CPU_EXTS}")
957 MESSAGE(STATUS "")
958 IF(HAVE_FLUIDSYNTH)
959     MESSAGE(STATUS "FluidSynth support for ALC_SOFT_midi_interface enabled")
960     MESSAGE(STATUS "")
961 ENDIF()
963 IF(WIN32)
964     IF(NOT HAVE_DSOUND)
965         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
966         MESSAGE(STATUS "         This is probably NOT what you want!")
967         MESSAGE(STATUS "")
968     ENDIF()
969 ENDIF()
971 # Install alsoft.conf configuration file
972 IF(ALSOFT_CONFIG)
973     INSTALL(FILES alsoftrc.sample
974             DESTINATION share/openal
975     )
976     MESSAGE(STATUS "Installing sample configuration")
977     MESSAGE(STATUS "")
978 ENDIF()
980 # Install HRTF definitions
981 IF(ALSOFT_HRTF_DEFS)
982     INSTALL(FILES hrtf/default-44100.mhr
983             DESTINATION share/openal/hrtf
984     )
985     MESSAGE(STATUS "Installing HRTF definitions")
986     MESSAGE(STATUS "")
987 ENDIF()
989 IF(ALSOFT_UTILS)
990     ADD_EXECUTABLE(openal-info utils/openal-info.c)
991     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
993     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
994     IF(HAVE_LIBM)
995         TARGET_LINK_LIBRARIES(makehrtf m)
996     ENDIF()
998     INSTALL(TARGETS openal-info makehrtf
999             RUNTIME DESTINATION bin
1000             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1001             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1002     )
1004     MESSAGE(STATUS "Building utility programs")
1005     IF(TARGET alsoft-config)
1006         MESSAGE(STATUS "Building configuration program")
1007     ENDIF()
1008     MESSAGE(STATUS "")
1009 ENDIF()
1011 IF(ALSOFT_EXAMPLES)
1012     IF(SDL_FOUND AND SDL_SOUND_FOUND)
1013         ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c
1014                                      examples/common/sdl_sound.c)
1015         SET_PROPERTY(TARGET ex-common APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1017         ADD_EXECUTABLE(alstream examples/alstream.c)
1018         TARGET_LINK_LIBRARIES(alstream ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1019         SET_PROPERTY(TARGET alstream APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1021         ADD_EXECUTABLE(alreverb examples/alreverb.c)
1022         TARGET_LINK_LIBRARIES(alreverb ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1023         SET_PROPERTY(TARGET alreverb APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1025         ADD_EXECUTABLE(allatency examples/allatency.c)
1026         TARGET_LINK_LIBRARIES(allatency ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1027         SET_PROPERTY(TARGET allatency APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1029         ADD_EXECUTABLE(alloopback examples/alloopback.c)
1030         TARGET_LINK_LIBRARIES(alloopback ex-common ${SDL_SOUND_LIBRARIES} ${SDL_LIBRARY} ${LIBNAME})
1031         SET_PROPERTY(TARGET alloopback APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_INCLUDE_DIR}
1032                                                                            ${SDL_SOUND_INCLUDE_DIR})
1034         INSTALL(TARGETS alstream alreverb allatency alloopback
1035                 RUNTIME DESTINATION bin
1036                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1037                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1038         )
1040         MESSAGE(STATUS "Building example programs")
1041         MESSAGE(STATUS "")
1042     ENDIF()
1043 ENDIF()