1 # CMake build file list for OpenAL
3 cmake_minimum_required(VERSION 3.13)
7 # The workaround for try_compile failing with code signing
8 # since cmake-3.18.2, not required
9 set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
10 ${CMAKE_TRY_COMPILE_PLATFORM_VARIABLES}
11 "CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED"
12 "CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED")
13 set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO)
14 set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED NO)
17 if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
18 # Fix compile failure with armv7 deployment target >= 11.0, xcode clang
20 # error: invalid iOS deployment version '--target=armv7-apple-ios13.6',
21 # iOS 10 is the maximum deployment target for 32-bit targets
22 # If CMAKE_OSX_DEPLOYMENT_TARGET is not defined, cmake will choose latest
24 if("${CMAKE_OSX_ARCHITECTURES}" MATCHES ".*armv7.*")
25 if(NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET
26 OR NOT CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "11.0")
27 message(STATUS "Forcing iOS deployment target to 10.0 for armv7")
28 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0" CACHE STRING "Minimum OS X deployment version"
32 elseif(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
36 if(COMMAND CMAKE_POLICY)
37 cmake_policy(SET CMP0003 NEW)
38 cmake_policy(SET CMP0005 NEW)
40 cmake_policy(SET CMP0020 NEW)
43 cmake_policy(SET CMP0042 NEW)
46 cmake_policy(SET CMP0054 NEW)
49 cmake_policy(SET CMP0058 NEW)
52 cmake_policy(SET CMP0063 NEW)
55 cmake_policy(SET CMP0075 NEW)
58 cmake_policy(SET CMP0092 NEW)
61 cmake_policy(SET CMP0117 NEW)
63 endif(COMMAND CMAKE_POLICY)
67 if(NOT CMAKE_BUILD_TYPE)
68 set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
69 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
72 if(NOT CMAKE_DEBUG_POSTFIX)
73 set(CMAKE_DEBUG_POSTFIX "" CACHE STRING
74 "Library postfix for debug builds. Normally left blank."
78 set(DEFAULT_TARGET_PROPS
81 CXX_STANDARD_REQUIRED TRUE
82 # Prefer C11, but support C99 and earlier when possible.
85 set(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
87 include(CheckFunctionExists)
88 include(CheckLibraryExists)
89 include(CheckIncludeFile)
90 include(CheckIncludeFiles)
91 include(CheckSymbolExists)
92 include(CheckCCompilerFlag)
93 include(CheckCXXCompilerFlag)
94 include(CheckCSourceCompiles)
95 include(CheckCXXSourceCompiles)
96 include(CheckStructHasMember)
97 include(CMakePackageConfigHelpers)
98 include(GNUInstallDirs)
100 find_package(PkgConfig)
101 find_package(SDL2 QUIET)
104 option(ALSOFT_DLOPEN "Check for the dlopen API for loading optional libs" ON)
106 option(ALSOFT_WERROR "Treat compile warnings as errors" OFF)
108 option(ALSOFT_UTILS "Build utility programs" ON)
109 option(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
111 option(ALSOFT_EXAMPLES "Build example programs" ON)
112 option(ALSOFT_TESTS "Build test programs" OFF)
114 option(ALSOFT_INSTALL "Install main library" ON)
115 option(ALSOFT_INSTALL_CONFIG "Install alsoft.conf sample configuration file" ON)
116 option(ALSOFT_INSTALL_HRTF_DATA "Install HRTF data files" ON)
117 option(ALSOFT_INSTALL_AMBDEC_PRESETS "Install AmbDec preset files" ON)
118 option(ALSOFT_INSTALL_EXAMPLES "Install example programs (alplay, alstream, ...)" ON)
119 option(ALSOFT_INSTALL_UTILS "Install utility programs (openal-info, alsoft-config, ...)" ON)
120 option(ALSOFT_UPDATE_BUILD_VERSION "Update git build version info" ON)
122 option(ALSOFT_EAX "Enable legacy EAX extensions" ${WIN32})
124 option(ALSOFT_SEARCH_INSTALL_DATADIR "Search the installation data directory" OFF)
125 if(ALSOFT_SEARCH_INSTALL_DATADIR)
126 set(ALSOFT_INSTALL_DATADIR ${CMAKE_INSTALL_FULL_DATADIR})
129 if(DEFINED SHARE_INSTALL_DIR)
130 message(WARNING "SHARE_INSTALL_DIR is deprecated. Use the variables provided by the GNUInstallDirs module instead")
131 set(CMAKE_INSTALL_DATADIR "${SHARE_INSTALL_DIR}")
134 if(DEFINED LIB_SUFFIX)
135 message(WARNING "LIB_SUFFIX is deprecated. Use the variables provided by the GNUInstallDirs module instead")
137 if(DEFINED ALSOFT_CONFIG)
138 message(WARNING "ALSOFT_CONFIG is deprecated. Use ALSOFT_INSTALL_CONFIG instead")
140 if(DEFINED ALSOFT_HRTF_DEFS)
141 message(WARNING "ALSOFT_HRTF_DEFS is deprecated. Use ALSOFT_INSTALL_HRTF_DATA instead")
143 if(DEFINED ALSOFT_AMBDEC_PRESETS)
144 message(WARNING "ALSOFT_AMBDEC_PRESETS is deprecated. Use ALSOFT_INSTALL_AMBDEC_PRESETS instead")
148 set(CPP_DEFS ) # C pre-processor, not C++
152 set(LINKER_FLAGS_DEBUG )
153 set(LINKER_FLAGS_RELEASE )
157 set(CPP_DEFS ${CPP_DEFS} _WIN32 NOMINMAX)
159 set(CPP_DEFS ${CPP_DEFS} __USE_MINGW_ANSI_STDIO)
162 option(ALSOFT_BUILD_ROUTER "Build the router (EXPERIMENTAL; creates OpenAL32.dll and soft_oal.dll)" OFF)
164 option(ALSOFT_BUILD_IMPORT_LIB "Build an import .lib using dlltool (requires sed)" ON)
167 option(ALSOFT_OSX_FRAMEWORK "Build as macOS framework" OFF)
171 # QNX's gcc do not uses /usr/include and /usr/lib paths by default
172 if("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
173 set(INC_PATHS ${INC_PATHS} /usr/include)
174 set(LINKER_FLAGS ${LINKER_FLAGS} -L/usr/lib)
177 # When the library is built for static linking, apps should define
178 # AL_LIBTYPE_STATIC when including the AL headers.
183 set(LIB_MAJOR_VERSION "1")
184 set(LIB_MINOR_VERSION "23")
185 set(LIB_REVISION "1")
186 set(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
187 set(LIB_VERSION_NUM ${LIB_MAJOR_VERSION},${LIB_MINOR_VERSION},${LIB_REVISION},0)
192 # Some systems erroneously require the __STDC_FORMAT_MACROS macro to be defined
193 # to get the fixed-width integer type formatter macros.
194 check_cxx_source_compiles("#include <cinttypes>
199 std::printf(\"%\" PRId64, i64);
201 HAVE_STDC_FORMAT_MACROS)
202 if(NOT HAVE_STDC_FORMAT_MACROS)
203 set(CPP_DEFS ${CPP_DEFS} __STDC_FORMAT_MACROS)
207 # Check if _POSIX_C_SOURCE and _XOPEN_SOURCE needs to be set for POSIX functions
208 check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_DEFAULT)
209 if(NOT HAVE_POSIX_MEMALIGN_DEFAULT)
210 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
211 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600")
212 check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_POSIX)
213 if(NOT HAVE_POSIX_MEMALIGN_POSIX)
214 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
216 set(CPP_DEFS ${CPP_DEFS} _POSIX_C_SOURCE=200112L _XOPEN_SOURCE=600)
219 unset(OLD_REQUIRED_FLAGS)
222 # C99 has restrict, but C++ does not, so we can only utilize __restrict.
223 check_cxx_source_compiles("int *__restrict foo;
224 int main() { return 0; }" HAVE___RESTRICT)
226 set(CPP_DEFS ${CPP_DEFS} RESTRICT=__restrict)
228 set(CPP_DEFS ${CPP_DEFS} "RESTRICT=")
231 # Some systems may need libatomic for atomic functions to work
232 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
233 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES} atomic)
234 check_cxx_source_compiles("#include <atomic>
235 std::atomic<int> foo{0};
236 int main() { return foo.fetch_add(2); }"
238 if(NOT HAVE_LIBATOMIC)
239 set(CMAKE_REQUIRED_LIBRARIES "${OLD_REQUIRED_LIBRARIES}")
241 set(EXTRA_LIBS atomic ${EXTRA_LIBS})
243 unset(OLD_REQUIRED_LIBRARIES)
246 # Include liblog for Android logging
247 check_library_exists(log __android_log_print "" HAVE_LIBLOG)
249 set(EXTRA_LIBS log ${EXTRA_LIBS})
250 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} log)
255 set(CPP_DEFS ${CPP_DEFS} _CRT_SECURE_NO_WARNINGS)
256 check_cxx_compiler_flag(/permissive- HAVE_PERMISSIVE_SWITCH)
257 if(HAVE_PERMISSIVE_SWITCH)
258 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:/permissive->)
260 set(C_FLAGS ${C_FLAGS} /W4 /w14640 /wd4065 /wd4127 /wd4268 /wd4324 /wd5030 /wd5051)
263 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
265 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
268 message(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
271 option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
272 if(FORCE_STATIC_VCRT)
274 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
275 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
276 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
277 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
278 if(${flag_var} MATCHES "/MD")
279 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
284 set(C_FLAGS ${C_FLAGS} -Winline -Wunused -Wall -Wextra -Wshadow -Wconversion -Wcast-align
286 $<$<COMPILE_LANGUAGE:CXX>:-Wold-style-cast -Wnon-virtual-dtor -Woverloaded-virtual>)
288 check_cxx_compiler_flag(-Wno-c++20-attribute-extensions HAVE_WNO_CXX20_ATTR_EXT)
289 if(HAVE_WNO_CXX20_ATTR_EXT)
290 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-attribute-extensions>)
292 check_cxx_compiler_flag(-Wno-c++20-extensions HAVE_WNO_CXX20_EXT)
293 if(HAVE_WNO_CXX20_EXT)
294 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-extensions>)
298 check_cxx_compiler_flag(-Wno-interference-size HAVE_WNO_INTERFERENCE_SIZE)
299 if(HAVE_WNO_INTERFERENCE_SIZE)
300 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-interference-size>)
304 set(C_FLAGS ${C_FLAGS} -Werror)
307 # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
309 foreach(flag_var CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
310 if(${flag_var} MATCHES "-DNDEBUG")
311 string(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
315 check_c_compiler_flag(-fno-math-errno HAVE_FNO_MATH_ERRNO)
316 if(HAVE_FNO_MATH_ERRNO)
317 set(C_FLAGS ${C_FLAGS} -fno-math-errno)
320 option(ALSOFT_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
321 if(ALSOFT_STATIC_LIBGCC)
322 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
323 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
324 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBGCC_SWITCH)
325 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
326 unset(OLD_REQUIRED_LIBRARIES)
328 if(NOT HAVE_STATIC_LIBGCC_SWITCH)
329 message(FATAL_ERROR "Cannot static link libgcc")
331 set(LINKER_FLAGS ${LINKER_FLAGS} -static-libgcc)
334 option(ALSOFT_STATIC_STDCXX "Static link libstdc++" OFF)
335 if(ALSOFT_STATIC_STDCXX)
336 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
337 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-static-libstdc++")
338 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBSTDCXX_SWITCH)
339 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
340 unset(OLD_REQUIRED_LIBRARIES)
342 if(NOT HAVE_STATIC_LIBSTDCXX_SWITCH)
343 message(FATAL_ERROR "Cannot static link libstdc++")
345 set(LINKER_FLAGS ${LINKER_FLAGS} "-static-libstdc++")
349 option(ALSOFT_STATIC_WINPTHREAD "Static link libwinpthread" OFF)
350 if(ALSOFT_STATIC_WINPTHREAD)
351 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
352 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
353 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBWINPTHREAD_SWITCH)
354 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
355 unset(OLD_REQUIRED_LIBRARIES)
357 if(NOT HAVE_STATIC_LIBWINPTHREAD_SWITCH)
358 message(FATAL_ERROR "Cannot static link libwinpthread")
360 set(LINKER_FLAGS ${LINKER_FLAGS} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
365 # Set visibility/export options if available
366 if(NOT LIBTYPE STREQUAL "STATIC")
368 set(EXPORT_DECL "__declspec(dllexport)")
370 set(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
371 # Yes GCC, really don't accept visibility modes you don't support
372 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
374 check_c_source_compiles("int foo() __attribute__((visibility(\"protected\")));
375 int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
376 if(HAVE_GCC_PROTECTED_VISIBILITY)
377 set(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
379 check_c_source_compiles("int foo() __attribute__((visibility(\"default\")));
380 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
381 if(HAVE_GCC_DEFAULT_VISIBILITY)
382 set(EXPORT_DECL "__attribute__((visibility(\"default\")))")
385 if(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
386 set(CMAKE_C_VISIBILITY_PRESET hidden)
387 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
390 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
398 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
399 # Yes GCC, really don't accept command line options you don't support
400 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
401 check_c_compiler_flag(-msse2 HAVE_MSSE2_SWITCH)
402 if(HAVE_MSSE2_SWITCH)
403 set(SSE2_SWITCH "-msse2")
405 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
406 unset(OLD_REQUIRED_FLAGS)
409 check_include_file(xmmintrin.h HAVE_XMMINTRIN_H)
410 check_include_file(emmintrin.h HAVE_EMMINTRIN_H)
411 check_include_file(pmmintrin.h HAVE_PMMINTRIN_H)
412 check_include_file(smmintrin.h HAVE_SMMINTRIN_H)
413 check_include_file(arm_neon.h HAVE_ARM_NEON_H)
421 # Check for SSE support
422 option(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
423 option(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
424 if(ALSOFT_CPUEXT_SSE AND HAVE_XMMINTRIN_H)
427 if(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
428 message(FATAL_ERROR "Failed to enable required SSE CPU extensions")
431 option(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
432 option(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
433 if(ALSOFT_CPUEXT_SSE2 AND HAVE_SSE AND HAVE_EMMINTRIN_H)
436 if(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
437 message(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
440 option(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
441 option(ALSOFT_REQUIRE_SSE3 "Require SSE3 support" OFF)
442 if(ALSOFT_CPUEXT_SSE3 AND HAVE_SSE2 AND HAVE_PMMINTRIN_H)
445 if(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
446 message(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
449 option(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
450 option(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
451 if(ALSOFT_CPUEXT_SSE4_1 AND HAVE_SSE3 AND HAVE_SMMINTRIN_H)
454 if(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
455 message(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
458 # Check for ARM Neon support
459 option(ALSOFT_CPUEXT_NEON "Enable ARM NEON support" ON)
460 option(ALSOFT_REQUIRE_NEON "Require ARM NEON support" OFF)
461 if(ALSOFT_CPUEXT_NEON AND HAVE_ARM_NEON_H)
462 check_c_source_compiles("#include <arm_neon.h>
465 int32x4_t ret4 = vdupq_n_s32(0);
466 return vgetq_lane_s32(ret4, 0);
467 }" HAVE_NEON_INTRINSICS)
468 if(HAVE_NEON_INTRINSICS)
472 if(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
473 message(FATAL_ERROR "Failed to enable required ARM NEON CPU extensions")
477 set(ALSOFT_FORCE_ALIGN )
480 if(CMAKE_SIZEOF_VOID_P MATCHES "4" AND HAVE_SSE2)
481 option(ALSOFT_ENABLE_SSE2_CODEGEN "Enable SSE2 code generation instead of x87 for 32-bit targets." TRUE)
482 if(ALSOFT_ENABLE_SSE2_CODEGEN)
484 check_c_compiler_flag("/arch:SSE2" HAVE_ARCH_SSE2)
486 set(SSE_FLAGS ${SSE_FLAGS} "/arch:SSE2")
487 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
491 check_c_compiler_flag("${SSE2_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE_2)
492 if(HAVE_MFPMATH_SSE_2)
493 set(SSE_FLAGS ${SSE_FLAGS} ${SSE2_SWITCH} -mfpmath=sse)
494 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
497 # SSE depends on a 16-byte aligned stack, and by default, GCC
498 # assumes the stack is suitably aligned. Older Linux code or other
499 # OSs don't guarantee this on 32-bit, so externally-callable
500 # functions need to ensure an aligned stack.
501 set(EXPORT_DECL "${EXPORT_DECL}__attribute__((force_align_arg_pointer))")
502 set(ALSOFT_FORCE_ALIGN "__attribute__((force_align_arg_pointer))")
508 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
509 foreach(flag_var ${SSE_FLAGS})
510 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag_var}")
513 check_c_source_compiles("#include <emmintrin.h>
514 int main() {_mm_pause(); return 0;}" HAVE_SSE_INTRINSICS)
516 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
520 check_include_file(malloc.h HAVE_MALLOC_H)
521 check_include_file(cpuid.h HAVE_CPUID_H)
522 check_include_file(intrin.h HAVE_INTRIN_H)
523 check_include_file(guiddef.h HAVE_GUIDDEF_H)
524 if(NOT HAVE_GUIDDEF_H)
525 check_include_file(initguid.h HAVE_INITGUID_H)
528 # Some systems need libm for some math functions to work
530 check_library_exists(m pow "" HAVE_LIBM)
532 set(MATH_LIB ${MATH_LIB} m)
533 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
536 # Some systems need to link with -lrt for clock_gettime as used by the common
539 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
544 # Check for the dlopen API (for dynamically loading backend libs)
546 check_include_file(dlfcn.h HAVE_DLFCN_H)
547 check_library_exists(dl dlopen "" HAVE_LIBDL)
549 set(EXTRA_LIBS dl ${EXTRA_LIBS})
550 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
554 # Check for a cpuid intrinsic
556 check_c_source_compiles("#include <cpuid.h>
559 unsigned int eax, ebx, ecx, edx;
560 return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
561 }" HAVE_GCC_GET_CPUID)
564 check_c_source_compiles("#include <intrin.h>
570 }" HAVE_CPUID_INTRINSIC)
573 check_symbol_exists(proc_pidpath libproc.h HAVE_PROC_PIDPATH)
576 # We need pthreads outside of Windows, for semaphores. It's also used to
577 # set the priority and name of threads, when possible.
578 check_include_file(pthread.h HAVE_PTHREAD_H)
579 if(NOT HAVE_PTHREAD_H)
580 message(FATAL_ERROR "PThreads is required for non-Windows builds!")
583 check_c_compiler_flag(-pthread HAVE_PTHREAD)
585 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
586 set(C_FLAGS ${C_FLAGS} -pthread)
587 set(LINKER_FLAGS ${LINKER_FLAGS} -pthread)
590 check_symbol_exists(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
592 # Some systems need pthread_np.h to get pthread_setname_np
593 check_include_files("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
594 if(HAVE_PTHREAD_NP_H)
595 check_symbol_exists(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
596 if(NOT HAVE_PTHREAD_SETNAME_NP)
597 check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
600 check_symbol_exists(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
601 if(NOT HAVE_PTHREAD_SETNAME_NP)
602 check_symbol_exists(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
608 # Common sources used by both the OpenAL implementation library, the OpenAL
609 # router, and certain tools and examples.
624 common/althrd_setname.cpp
625 common/althrd_setname.h
633 common/intrusive_ptr.h
637 common/phase_shifter.h
638 common/polyphase_resampler.cpp
639 common/polyphase_resampler.h
641 common/ringbuffer.cpp
648 # Core library routines
660 core/bsinc_tables.cpp
663 core/buffer_storage.cpp
664 core/buffer_storage.h
672 core/cubic_tables.cpp
683 core/filters/biquad.h
684 core/filters/biquad.cpp
687 core/filters/splitter.cpp
688 core/filters/splitter.h
693 core/front_stablizer.h
704 core/resampler_limits.h
705 core/storage_formats.cpp
706 core/storage_formats.h
716 option(ALSOFT_RTKIT "Enable RTKit support" ON)
717 option(ALSOFT_REQUIRE_RTKIT "Require RTKit/D-Bus support" FALSE)
719 find_package(DBus1 QUIET)
720 if(NOT DBus1_FOUND AND PkgConfig_FOUND)
721 pkg_check_modules(DBUS dbus-1)
723 if(DBus1_FOUND OR DBUS_FOUND)
725 set(CORE_OBJS ${CORE_OBJS} core/dbus_wrap.cpp core/dbus_wrap.h
726 core/rtkit.cpp core/rtkit.h)
728 set(INC_PATHS ${INC_PATHS} ${DBUS_INCLUDE_DIRS})
729 set(CPP_DEFS ${CPP_DEFS} ${DBUS_CFLAGS_OTHER})
731 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBUS_LINK_LIBRARIES})
734 set(INC_PATHS ${INC_PATHS} ${DBus1_INCLUDE_DIRS})
735 set(CPP_DEFS ${CPP_DEFS} ${DBus1_DEFINITIONS})
737 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBus1_LIBRARIES})
742 if(NOT DBus1_INCLUDE_DIRS)
743 set(MISSING_VARS "${MISSING_VARS} DBus1_INCLUDE_DIRS")
745 if(NOT DBus1_LIBRARIES)
746 set(MISSING_VARS "${MISSING_VARS} DBus1_LIBRARIES")
748 message(STATUS "Could NOT find DBus1 (missing:${MISSING_VARS})")
752 if(ALSOFT_REQUIRE_RTKIT AND NOT HAVE_RTKIT)
753 message(FATAL_ERROR "Failed to enable required RTKit support")
756 # Default mixers, always available
757 set(CORE_OBJS ${CORE_OBJS}
759 core/mixer/hrtfbase.h
760 core/mixer/hrtfdefs.h
761 core/mixer/mixer_c.cpp)
763 # AL and related routines
774 al/effects/autowah.cpp
775 al/effects/chorus.cpp
776 al/effects/compressor.cpp
777 al/effects/convolution.cpp
778 al/effects/dedicated.cpp
779 al/effects/distortion.cpp
781 al/effects/effects.cpp
783 al/effects/equalizer.cpp
784 al/effects/fshifter.cpp
785 al/effects/modulator.cpp
787 al/effects/pshifter.cpp
788 al/effects/reverb.cpp
789 al/effects/vmorpher.cpp
803 # ALC and related routines
815 alc/effects/autowah.cpp
816 alc/effects/chorus.cpp
817 alc/effects/compressor.cpp
818 alc/effects/convolution.cpp
819 alc/effects/dedicated.cpp
820 alc/effects/distortion.cpp
822 alc/effects/equalizer.cpp
823 alc/effects/fshifter.cpp
824 alc/effects/modulator.cpp
826 alc/effects/pshifter.cpp
827 alc/effects/reverb.cpp
828 alc/effects/vmorpher.cpp
845 al/eax/fx_slot_index.cpp
846 al/eax/fx_slot_index.h
856 # Include SIMD mixers
857 set(CPU_EXTS "Default")
859 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse.cpp)
860 set(CPU_EXTS "${CPU_EXTS}, SSE")
863 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse2.cpp)
864 set(CPU_EXTS "${CPU_EXTS}, SSE2")
867 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse3.cpp)
868 set(CPU_EXTS "${CPU_EXTS}, SSE3")
871 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse41.cpp)
872 set(CPU_EXTS "${CPU_EXTS}, SSE4.1")
875 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_neon.cpp)
876 set(CPU_EXTS "${CPU_EXTS}, Neon")
888 set(HAVE_PORTAUDIO 0)
889 set(HAVE_PULSEAUDIO 0)
890 set(HAVE_COREAUDIO 0)
896 if(WIN32 OR HAVE_DLFCN_H)
898 macro(ADD_BACKEND_LIBS _LIBS)
901 set(IS_LINKED " (linked)")
902 macro(ADD_BACKEND_LIBS _LIBS)
903 set(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
908 set(ALC_OBJS ${ALC_OBJS}
909 alc/backends/base.cpp
911 # Default backends, always available
912 alc/backends/loopback.cpp
913 alc/backends/loopback.h
914 alc/backends/null.cpp
918 # Check PipeWire backend
919 option(ALSOFT_BACKEND_PIPEWIRE "Enable PipeWire backend" ON)
920 option(ALSOFT_REQUIRE_PIPEWIRE "Require PipeWire backend" OFF)
921 if(ALSOFT_BACKEND_PIPEWIRE AND PkgConfig_FOUND)
922 pkg_check_modules(PIPEWIRE libpipewire-0.3>=0.3.23)
925 set(BACKENDS "${BACKENDS} PipeWire${IS_LINKED},")
926 set(ALC_OBJS ${ALC_OBJS} alc/backends/pipewire.cpp alc/backends/pipewire.h)
927 add_backend_libs(${PIPEWIRE_LIBRARIES})
928 set(INC_PATHS ${INC_PATHS} ${PIPEWIRE_INCLUDE_DIRS})
931 if(ALSOFT_REQUIRE_PIPEWIRE AND NOT HAVE_PIPEWIRE)
932 message(FATAL_ERROR "Failed to enable required PipeWire backend")
935 # Check PulseAudio backend
936 option(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
937 option(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
938 if(ALSOFT_BACKEND_PULSEAUDIO)
939 find_package(PulseAudio)
941 set(HAVE_PULSEAUDIO 1)
942 set(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},")
943 set(ALC_OBJS ${ALC_OBJS} alc/backends/pulseaudio.cpp alc/backends/pulseaudio.h)
944 add_backend_libs(${PULSEAUDIO_LIBRARY})
945 set(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIR})
948 if(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
949 message(FATAL_ERROR "Failed to enable required PulseAudio backend")
954 option(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
955 option(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
956 if(ALSOFT_BACKEND_ALSA)
960 set(BACKENDS "${BACKENDS} ALSA${IS_LINKED},")
961 set(ALC_OBJS ${ALC_OBJS} alc/backends/alsa.cpp alc/backends/alsa.h)
962 add_backend_libs(${ALSA_LIBRARIES})
963 set(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS})
968 option(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
969 option(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
970 if(ALSOFT_BACKEND_OSS)
974 set(BACKENDS "${BACKENDS} OSS,")
975 set(ALC_OBJS ${ALC_OBJS} alc/backends/oss.cpp alc/backends/oss.h)
977 set(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS})
979 set(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS})
983 # Check Solaris backend
984 option(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
985 option(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
986 if(ALSOFT_BACKEND_SOLARIS)
987 find_package(AudioIO)
990 set(BACKENDS "${BACKENDS} Solaris,")
991 set(ALC_OBJS ${ALC_OBJS} alc/backends/solaris.cpp alc/backends/solaris.h)
992 set(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS})
996 # Check SndIO backend (disabled by default on non-BSDs)
998 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
1000 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" OFF)
1002 option(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
1003 if(ALSOFT_BACKEND_SNDIO)
1007 set(BACKENDS "${BACKENDS} SndIO (linked),")
1008 set(ALC_OBJS ${ALC_OBJS} alc/backends/sndio.cpp alc/backends/sndio.h)
1009 set(EXTRA_LIBS ${SNDIO_LIBRARIES} ${EXTRA_LIBS})
1010 set(INC_PATHS ${INC_PATHS} ${SNDIO_INCLUDE_DIRS})
1014 if(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
1015 message(FATAL_ERROR "Failed to enable required ALSA backend")
1017 if(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
1018 message(FATAL_ERROR "Failed to enable required OSS backend")
1020 if(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
1021 message(FATAL_ERROR "Failed to enable required Solaris backend")
1023 if(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
1024 message(FATAL_ERROR "Failed to enable required SndIO backend")
1027 # Check Windows-only backends
1030 # Check MMSystem backend
1031 option(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
1032 option(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
1033 if(ALSOFT_BACKEND_WINMM)
1035 set(BACKENDS "${BACKENDS} WinMM,")
1036 set(ALC_OBJS ${ALC_OBJS} alc/backends/winmm.cpp alc/backends/winmm.h)
1037 # There doesn't seem to be good way to search for winmm.lib for MSVC.
1038 # find_library doesn't find it without being told to look in a specific
1039 # place in the WindowsSDK, but it links anyway. If there ends up being
1040 # Windows targets without this, another means to detect it is needed.
1041 set(EXTRA_LIBS winmm ${EXTRA_LIBS})
1044 # Check DSound backend
1045 option(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
1046 option(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
1047 if(ALSOFT_BACKEND_DSOUND)
1048 check_include_file(dsound.h HAVE_DSOUND_H)
1050 find_path(DSOUND_INCLUDE_DIR NAMES "dsound.h"
1051 PATHS "${DXSDK_DIR}" PATH_SUFFIXES include
1052 DOC "The DirectSound include directory")
1054 if(HAVE_DSOUND_H OR DSOUND_INCLUDE_DIR)
1056 set(BACKENDS "${BACKENDS} DirectSound,")
1057 set(ALC_OBJS ${ALC_OBJS} alc/backends/dsound.cpp alc/backends/dsound.h)
1059 if(NOT HAVE_DSOUND_H)
1060 set(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIR})
1066 # Check for WASAPI backend
1067 option(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON)
1068 option(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF)
1069 if(ALSOFT_BACKEND_WASAPI)
1070 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1071 if(HAVE_MMDEVICEAPI_H)
1073 set(BACKENDS "${BACKENDS} WASAPI,")
1074 set(ALC_OBJS ${ALC_OBJS} alc/backends/wasapi.cpp alc/backends/wasapi.h)
1078 if(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
1079 message(FATAL_ERROR "Failed to enable required WinMM backend")
1081 if(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
1082 message(FATAL_ERROR "Failed to enable required DSound backend")
1084 if(ALSOFT_REQUIRE_WASAPI AND NOT HAVE_WASAPI)
1085 message(FATAL_ERROR "Failed to enable required WASAPI backend")
1088 # Check JACK backend
1089 option(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
1090 option(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
1091 if(ALSOFT_BACKEND_JACK)
1095 set(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
1096 set(ALC_OBJS ${ALC_OBJS} alc/backends/jack.cpp alc/backends/jack.h)
1097 add_backend_libs(${JACK_LIBRARIES})
1098 set(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
1101 if(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
1102 message(FATAL_ERROR "Failed to enable required JACK backend")
1105 # Check CoreAudio backend
1106 option(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
1107 option(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
1108 if(ALSOFT_BACKEND_COREAUDIO)
1109 find_library(COREAUDIO_FRAMEWORK NAMES CoreAudio)
1110 find_path(AUDIOUNIT_INCLUDE_DIR NAMES AudioUnit/AudioUnit.h)
1111 if(COREAUDIO_FRAMEWORK AND AUDIOUNIT_INCLUDE_DIR)
1112 set(HAVE_COREAUDIO 1)
1113 set(ALC_OBJS ${ALC_OBJS} alc/backends/coreaudio.cpp alc/backends/coreaudio.h)
1114 set(BACKENDS "${BACKENDS} CoreAudio,")
1116 set(EXTRA_LIBS -Wl,-framework,CoreAudio ${EXTRA_LIBS})
1117 if(CMAKE_SYSTEM_NAME MATCHES "^(iOS|tvOS)$")
1118 find_library(COREFOUNDATION_FRAMEWORK NAMES CoreFoundation)
1119 if(COREFOUNDATION_FRAMEWORK)
1120 set(EXTRA_LIBS -Wl,-framework,CoreFoundation ${EXTRA_LIBS})
1123 set(EXTRA_LIBS -Wl,-framework,AudioUnit,-framework,ApplicationServices ${EXTRA_LIBS})
1126 # Some versions of OSX may need the AudioToolbox framework. Add it if
1128 find_library(AUDIOTOOLBOX_LIBRARY NAMES AudioToolbox)
1129 if(AUDIOTOOLBOX_LIBRARY)
1130 set(EXTRA_LIBS -Wl,-framework,AudioToolbox ${EXTRA_LIBS})
1133 set(INC_PATHS ${INC_PATHS} ${AUDIOUNIT_INCLUDE_DIR})
1136 if(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
1137 message(FATAL_ERROR "Failed to enable required CoreAudio backend")
1140 # Check for Oboe (Android) backend
1141 option(ALSOFT_BACKEND_OBOE "Enable Oboe backend" ON)
1142 option(ALSOFT_REQUIRE_OBOE "Require Oboe backend" OFF)
1143 if(ALSOFT_BACKEND_OBOE)
1146 set(OBOE_SOURCE "" CACHE STRING "Source directory for Oboe.")
1148 add_subdirectory(${OBOE_SOURCE} ./oboe)
1149 set(OBOE_TARGET oboe)
1151 find_package(oboe CONFIG)
1152 if(NOT TARGET oboe::oboe)
1155 if(TARGET oboe::oboe)
1156 set(OBOE_TARGET "oboe::oboe")
1163 set(ALC_OBJS ${ALC_OBJS} alc/backends/oboe.cpp alc/backends/oboe.h)
1164 set(BACKENDS "${BACKENDS} Oboe,")
1165 set(EXTRA_LIBS ${OBOE_TARGET} ${EXTRA_LIBS})
1168 if(ALSOFT_REQUIRE_OBOE AND NOT HAVE_OBOE)
1169 message(FATAL_ERROR "Failed to enable required Oboe backend")
1172 # Check for OpenSL (Android) backend
1173 option(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
1174 option(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
1175 if(ALSOFT_BACKEND_OPENSL)
1176 find_package(OpenSL)
1179 set(ALC_OBJS ${ALC_OBJS} alc/backends/opensl.cpp alc/backends/opensl.h)
1180 set(BACKENDS "${BACKENDS} OpenSL,")
1181 set(EXTRA_LIBS ${OPENSL_LIBRARIES} ${EXTRA_LIBS})
1182 set(INC_PATHS ${INC_PATHS} ${OPENSL_INCLUDE_DIRS})
1185 if(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
1186 message(FATAL_ERROR "Failed to enable required OpenSL backend")
1189 # Check PortAudio backend
1190 option(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
1191 option(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
1192 if(ALSOFT_BACKEND_PORTAUDIO)
1193 find_package(PortAudio)
1195 set(HAVE_PORTAUDIO 1)
1196 set(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},")
1197 set(ALC_OBJS ${ALC_OBJS} alc/backends/portaudio.cpp alc/backends/portaudio.h)
1198 add_backend_libs(${PORTAUDIO_LIBRARIES})
1199 set(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS})
1202 if(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
1203 message(FATAL_ERROR "Failed to enable required PortAudio backend")
1206 # Check for SDL2 backend
1207 # Off by default, since it adds a runtime dependency
1208 option(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF)
1209 option(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF)
1210 if(ALSOFT_BACKEND_SDL2)
1213 set(ALC_OBJS ${ALC_OBJS} alc/backends/sdl2.cpp alc/backends/sdl2.h)
1214 set(BACKENDS "${BACKENDS} SDL2,")
1215 set(EXTRA_LIBS ${EXTRA_LIBS} SDL2::SDL2)
1217 message(STATUS "Could NOT find SDL2")
1220 if(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND)
1221 message(FATAL_ERROR "Failed to enable required SDL2 backend")
1224 # Optionally enable the Wave Writer backend
1225 option(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
1226 if(ALSOFT_BACKEND_WAVE)
1228 set(ALC_OBJS ${ALC_OBJS} alc/backends/wave.cpp alc/backends/wave.h)
1229 set(BACKENDS "${BACKENDS} WaveFile,")
1232 # This is always available
1233 set(BACKENDS "${BACKENDS} Null")
1237 if(ALSOFT_UPDATE_BUILD_VERSION AND GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
1238 set(GIT_DIR "${OpenAL_SOURCE_DIR}/.git")
1240 # Check if this is a submodule, if it is then find the .git directory
1241 if(NOT IS_DIRECTORY "${OpenAL_SOURCE_DIR}/.git")
1242 file(READ ${GIT_DIR} submodule)
1243 string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE ${submodule})
1244 string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
1245 get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
1246 get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
1249 # Get the current working branch and its latest abbreviated commit hash
1250 add_custom_command(OUTPUT "${OpenAL_BINARY_DIR}/version_witness.txt"
1251 BYPRODUCTS "${OpenAL_BINARY_DIR}/version.h"
1252 COMMAND ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE} -D LIB_VERSION=${LIB_VERSION}
1253 -D LIB_VERSION_NUM=${LIB_VERSION_NUM} -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
1254 -D DST=${OpenAL_BINARY_DIR}/version.h -P ${OpenAL_SOURCE_DIR}/version.cmake
1255 COMMAND ${CMAKE_COMMAND} -E touch "${OpenAL_BINARY_DIR}/version_witness.txt"
1256 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1257 MAIN_DEPENDENCY "${OpenAL_SOURCE_DIR}/version.h.in"
1258 DEPENDS "${GIT_DIR}/index" "${OpenAL_SOURCE_DIR}/version.cmake"
1262 add_custom_target(build_version DEPENDS "${OpenAL_BINARY_DIR}/version_witness.txt")
1264 set(GIT_BRANCH "UNKNOWN")
1265 set(GIT_COMMIT_HASH "unknown")
1267 "${OpenAL_SOURCE_DIR}/version.h.in"
1268 "${OpenAL_BINARY_DIR}/version.h")
1272 option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" ON)
1273 if(ALSOFT_EMBED_HRTF_DATA)
1274 macro(make_hrtf_header FILENAME VARNAME)
1275 set(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}")
1276 set(outfile "${OpenAL_BINARY_DIR}/${VARNAME}.txt")
1278 add_custom_command(OUTPUT "${outfile}"
1279 COMMAND ${CMAKE_COMMAND} -D "INPUT_FILE=${infile}" -D "OUTPUT_FILE=${outfile}"
1280 -P "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1281 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1282 DEPENDS "${infile}" "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1285 set(ALC_OBJS ${ALC_OBJS} "${outfile}")
1288 make_hrtf_header("Default HRTF.mhr" "default_hrtf")
1293 find_package(MySOFA)
1294 if(NOT ALSOFT_NO_CONFIG_UTIL)
1295 find_package(Qt5Widgets QUIET)
1296 if(NOT Qt5Widgets_FOUND)
1297 message(STATUS "Could NOT find Qt5Widgets")
1301 if(ALSOFT_UTILS OR ALSOFT_EXAMPLES)
1302 find_package(SndFile)
1304 find_package(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
1309 set(LIBNAME "openal")
1311 set(LIBNAME "OpenAL32")
1314 # Needed for openal.pc.in
1315 set(prefix ${CMAKE_INSTALL_PREFIX})
1316 set(exec_prefix "\${prefix}")
1317 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
1318 set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
1319 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
1320 set(PACKAGE_VERSION "${LIB_VERSION}")
1321 set(PKG_CONFIG_CFLAGS )
1322 set(PKG_CONFIG_PRIVATE_LIBS )
1323 if(LIBTYPE STREQUAL "STATIC")
1324 set(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC)
1325 foreach(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1326 # If this is already a linker flag, or is a full path+file, add it
1327 # as-is. If it's an SDL2 target, add the link flag for it. Otherwise,
1328 # it's a name intended to be dressed as -lname.
1329 if(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}")
1330 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}")
1331 elseif(FLAG MATCHES "^SDL2::SDL2")
1332 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -lSDL2")
1334 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}")
1341 "${OpenAL_SOURCE_DIR}/config.h.in"
1342 "${OpenAL_BINARY_DIR}/config.h")
1344 "${OpenAL_SOURCE_DIR}/openal.pc.in"
1345 "${OpenAL_BINARY_DIR}/openal.pc"
1349 add_library(alcommon STATIC EXCLUDE_FROM_ALL ${COMMON_OBJS})
1350 target_include_directories(alcommon PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/include
1351 PUBLIC ${OpenAL_SOURCE_DIR}/common)
1352 target_compile_definitions(alcommon PRIVATE ${CPP_DEFS})
1353 target_compile_options(alcommon PRIVATE ${C_FLAGS})
1354 set_target_properties(alcommon PROPERTIES ${DEFAULT_TARGET_PROPS} POSITION_INDEPENDENT_CODE TRUE)
1358 set(IMPL_TARGET OpenAL) # Either OpenAL or soft_oal.
1360 # Build main library
1361 if(LIBTYPE STREQUAL "STATIC")
1362 add_library(${IMPL_TARGET} STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS})
1363 target_compile_definitions(${IMPL_TARGET} PUBLIC AL_LIBTYPE_STATIC)
1364 target_link_libraries(${IMPL_TARGET} PRIVATE ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1367 # This option is for static linking OpenAL Soft into another project
1368 # that already defines the IDs. It is up to that project to ensure all
1369 # required IDs are defined.
1370 option(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
1371 if(ALSOFT_NO_UID_DEFS)
1372 target_compile_definitions(${IMPL_TARGET} PRIVATE AL_NO_UID_DEFS)
1376 set(RC_CONFIG resources/openal32.rc)
1377 if(WIN32 AND ALSOFT_BUILD_ROUTER)
1378 add_library(OpenAL SHARED
1385 target_compile_definitions(OpenAL
1386 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES "ALC_API=${EXPORT_DECL}"
1387 "AL_API=${EXPORT_DECL}" ${CPP_DEFS})
1388 target_compile_options(OpenAL PRIVATE ${C_FLAGS})
1389 target_link_libraries(OpenAL PRIVATE alcommon ${LINKER_FLAGS})
1390 target_include_directories(OpenAL
1392 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1393 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1395 ${OpenAL_SOURCE_DIR}/common
1396 ${OpenAL_BINARY_DIR}
1398 set_target_properties(OpenAL PROPERTIES ${DEFAULT_TARGET_PROPS} PREFIX ""
1399 OUTPUT_NAME ${LIBNAME})
1400 if(TARGET build_version)
1401 add_dependencies(OpenAL build_version)
1405 set(LIBNAME "soft_oal")
1406 set(IMPL_TARGET soft_oal)
1407 set(RC_CONFIG resources/soft_oal.rc)
1410 # !important: for osx framework public header works, the headers must be in
1412 set(TARGET_PUBLIC_HEADERS include/AL/al.h include/AL/alc.h include/AL/alext.h include/AL/efx.h
1413 include/AL/efx-presets.h)
1415 add_library(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS} ${RC_CONFIG}
1416 ${TARGET_PUBLIC_HEADERS})
1418 set_target_properties(${IMPL_TARGET} PROPERTIES PREFIX "")
1420 target_link_libraries(${IMPL_TARGET} PRIVATE alcommon ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1423 set(ALSOFT_CPPWINRT_VERSION "2.0.230706.1" CACHE STRING "The soft-oal default cppwinrt version")
1425 find_program(NUGET_EXE NAMES nuget)
1427 message("NUGET.EXE not found.")
1428 message(FATAL_ERROR "Please install this executable, and run CMake again.")
1431 exec_program(${NUGET_EXE}
1432 ARGS install "Microsoft.Windows.CppWinRT" -Version ${ALSOFT_CPPWINRT_VERSION} -ExcludeVersion -OutputDirectory "\"${CMAKE_BINARY_DIR}/packages\"")
1434 set_target_properties(${IMPL_TARGET} PROPERTIES
1435 VS_PROJECT_IMPORT ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.props
1437 target_link_libraries(${IMPL_TARGET} PRIVATE ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.targets)
1440 if(NOT WIN32 AND NOT APPLE)
1441 # FIXME: This doesn't put a dependency on the version script. Changing
1442 # the version script will not cause a relink as it should.
1443 target_link_options(${IMPL_TARGET} PRIVATE
1444 "-Wl,--version-script=${OpenAL_SOURCE_DIR}/libopenal.version")
1447 if(APPLE AND ALSOFT_OSX_FRAMEWORK)
1448 # Sets framework name to soft_oal to avoid ambiguity with the system OpenAL.framework
1449 set(LIBNAME "soft_oal")
1451 execute_process(COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD
1453 OUTPUT_VARIABLE BUNDLE_VERSION
1454 OUTPUT_STRIP_TRAILING_WHITESPACE)
1456 set(BUNDLE_VERSION 1)
1459 # Build: Fix rpath in iOS shared libraries
1460 # If this flag is not set, the final dylib binary ld path will be
1461 # /User/xxx/*/soft_oal.framework/soft_oal, which can't be loaded by iOS devices.
1462 # See also: https://github.com/libjpeg-turbo/libjpeg-turbo/commit/c80ddef7a4ce21ace9e3ca0fd190d320cc8cdaeb
1463 if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
1464 set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
1467 set_target_properties(${IMPL_TARGET} PROPERTIES
1470 MACOSX_FRAMEWORK_NAME "${IMPL_TARGET}"
1471 MACOSX_FRAMEWORK_IDENTIFIER "org.openal-soft.openal"
1472 MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${LIB_VERSION}"
1473 MACOSX_FRAMEWORK_BUNDLE_VERSION "${BUNDLE_VERSION}"
1474 XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
1475 XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
1476 XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
1477 PUBLIC_HEADER "${TARGET_PUBLIC_HEADERS}"
1482 target_include_directories(${IMPL_TARGET}
1484 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1486 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include/AL>
1487 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1488 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/AL>
1491 ${OpenAL_BINARY_DIR}
1492 ${OpenAL_SOURCE_DIR}
1493 ${OpenAL_SOURCE_DIR}/common
1496 set_target_properties(${IMPL_TARGET} PROPERTIES ${DEFAULT_TARGET_PROPS}
1497 OUTPUT_NAME ${LIBNAME}
1498 VERSION ${LIB_VERSION}
1499 SOVERSION ${LIB_MAJOR_VERSION}
1501 target_compile_definitions(${IMPL_TARGET}
1502 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES "ALC_API=${EXPORT_DECL}" "AL_API=${EXPORT_DECL}"
1504 target_compile_options(${IMPL_TARGET} PRIVATE ${C_FLAGS})
1506 if(TARGET build_version)
1507 add_dependencies(${IMPL_TARGET} build_version)
1510 if(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC")
1511 find_program(SED_EXECUTABLE NAMES sed DOC "sed executable")
1512 if(NOT SED_EXECUTABLE OR NOT CMAKE_DLLTOOL)
1514 if(NOT SED_EXECUTABLE)
1515 message(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
1517 if(NOT CMAKE_DLLTOOL)
1518 message(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
1521 target_link_options(OpenAL PRIVATE "-Wl,--output-def,${PROJECT_BINARY_DIR}/OpenAL32.def")
1522 add_custom_command(TARGET OpenAL POST_BUILD
1523 COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def
1524 COMMAND "${CMAKE_DLLTOOL}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll
1525 # Technically OpenAL32.def was created by the build, but cmake
1526 # doesn't recognize it due to -Wl,--output-def,OpenAL32.def being
1527 # manually specified. But declaring the file here allows it to be
1528 # properly cleaned, e.g. during make clean.
1529 BYPRODUCTS OpenAL32.def OpenAL32.lib
1530 COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..."
1538 message(STATUS "Building DLL router")
1542 message(STATUS "Building OpenAL with support for the following backends:")
1543 message(STATUS " ${BACKENDS}")
1545 message(STATUS "Building with support for CPU extensions:")
1546 message(STATUS " ${CPU_EXTS}")
1549 message(STATUS "Building with SSE${FPMATH_SET} codegen")
1553 message(STATUS "Building with UWP support")
1557 message(STATUS "Building with legacy EAX extension support")
1561 if(ALSOFT_EMBED_HRTF_DATA)
1562 message(STATUS "Embedding HRTF datasets")
1566 # An alias for sub-project builds
1567 add_library(OpenAL::OpenAL ALIAS OpenAL)
1569 # Install main library
1571 configure_package_config_file(OpenALConfig.cmake.in OpenALConfig.cmake
1572 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL)
1573 install(TARGETS OpenAL EXPORT OpenAL
1574 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1575 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1576 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1577 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
1578 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL)
1579 export(TARGETS OpenAL
1581 FILE OpenALTargets.cmake)
1582 install(EXPORT OpenAL
1583 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL
1585 FILE OpenALTargets.cmake)
1586 install(DIRECTORY include/AL
1587 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1588 install(FILES "${OpenAL_BINARY_DIR}/openal.pc"
1589 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
1590 install(FILES "${OpenAL_BINARY_DIR}/OpenALConfig.cmake"
1591 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL")
1593 install(TARGETS soft_oal
1594 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1596 message(STATUS "Installing library and headers")
1598 message(STATUS "NOT installing library and headers")
1601 if(ALSOFT_INSTALL_CONFIG)
1602 install(FILES alsoftrc.sample
1603 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1604 message(STATUS "Installing sample configuration")
1607 if(ALSOFT_INSTALL_HRTF_DATA)
1608 install(DIRECTORY hrtf
1609 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1610 message(STATUS "Installing HRTF data files")
1613 if(ALSOFT_INSTALL_AMBDEC_PRESETS)
1614 install(DIRECTORY presets
1615 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1616 message(STATUS "Installing AmbDec presets")
1622 set(UNICODE_FLAG ${UNICODE_FLAG} -municode)
1624 set(EXTRA_INSTALLS )
1626 add_executable(openal-info utils/openal-info.c)
1627 target_include_directories(openal-info PRIVATE ${OpenAL_SOURCE_DIR}/common)
1628 target_compile_options(openal-info PRIVATE ${C_FLAGS})
1629 target_link_libraries(openal-info PRIVATE ${LINKER_FLAGS} OpenAL ${UNICODE_FLAG})
1630 set_target_properties(openal-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1631 if(ALSOFT_INSTALL_EXAMPLES)
1632 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} openal-info)
1636 add_executable(uhjdecoder utils/uhjdecoder.cpp)
1637 target_compile_definitions(uhjdecoder PRIVATE ${CPP_DEFS})
1638 target_include_directories(uhjdecoder
1639 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1640 target_compile_options(uhjdecoder PRIVATE ${C_FLAGS})
1641 target_link_libraries(uhjdecoder PUBLIC alcommon
1642 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1643 set_target_properties(uhjdecoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1645 add_executable(uhjencoder utils/uhjencoder.cpp)
1646 target_compile_definitions(uhjencoder PRIVATE ${CPP_DEFS})
1647 target_include_directories(uhjencoder
1648 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1649 target_compile_options(uhjencoder PRIVATE ${C_FLAGS})
1650 target_link_libraries(uhjencoder PUBLIC alcommon
1651 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1652 set_target_properties(uhjencoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1656 set(SOFA_SUPPORT_SRCS
1657 utils/sofa-support.cpp
1658 utils/sofa-support.h)
1659 add_library(sofa-support STATIC EXCLUDE_FROM_ALL ${SOFA_SUPPORT_SRCS})
1660 target_compile_definitions(sofa-support PRIVATE ${CPP_DEFS})
1661 target_include_directories(sofa-support PUBLIC ${OpenAL_SOURCE_DIR}/common)
1662 target_compile_options(sofa-support PRIVATE ${C_FLAGS})
1663 target_link_libraries(sofa-support PUBLIC alcommon MySOFA::MySOFA PRIVATE ${LINKER_FLAGS})
1664 set_target_properties(sofa-support PROPERTIES ${DEFAULT_TARGET_PROPS})
1667 utils/makemhr/loaddef.cpp
1668 utils/makemhr/loaddef.h
1669 utils/makemhr/loadsofa.cpp
1670 utils/makemhr/loadsofa.h
1671 utils/makemhr/makemhr.cpp
1672 utils/makemhr/makemhr.h)
1673 add_executable(makemhr ${MAKEMHR_SRCS})
1674 target_compile_definitions(makemhr PRIVATE ${CPP_DEFS})
1675 target_include_directories(makemhr
1676 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/utils)
1677 target_compile_options(makemhr PRIVATE ${C_FLAGS})
1678 target_link_libraries(makemhr PRIVATE ${LINKER_FLAGS} sofa-support ${UNICODE_FLAG})
1679 set_target_properties(makemhr PROPERTIES ${DEFAULT_TARGET_PROPS})
1680 if(ALSOFT_INSTALL_EXAMPLES)
1681 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} makemhr)
1684 set(SOFAINFO_SRCS utils/sofa-info.cpp)
1685 add_executable(sofa-info ${SOFAINFO_SRCS})
1686 target_compile_definitions(sofa-info PRIVATE ${CPP_DEFS})
1687 target_include_directories(sofa-info PRIVATE ${OpenAL_SOURCE_DIR}/utils)
1688 target_compile_options(sofa-info PRIVATE ${C_FLAGS})
1689 target_link_libraries(sofa-info PRIVATE ${LINKER_FLAGS} sofa-support ${UNICODE_FLAG})
1690 set_target_properties(sofa-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1692 message(STATUS "Building utility programs")
1694 if(NOT ALSOFT_NO_CONFIG_UTIL)
1695 add_subdirectory(utils/alsoft-config)
1701 # Add a static library with common functions used by multiple example targets
1702 add_library(al-excommon STATIC EXCLUDE_FROM_ALL
1703 examples/common/alhelpers.c
1704 examples/common/alhelpers.h)
1705 target_compile_definitions(al-excommon PUBLIC ${CPP_DEFS})
1706 target_include_directories(al-excommon PUBLIC ${OpenAL_SOURCE_DIR}/common)
1707 target_compile_options(al-excommon PUBLIC ${C_FLAGS})
1708 target_link_libraries(al-excommon PUBLIC OpenAL PRIVATE ${RT_LIB})
1709 set_target_properties(al-excommon PROPERTIES ${DEFAULT_TARGET_PROPS})
1712 add_executable(altonegen examples/altonegen.c)
1713 target_link_libraries(altonegen PRIVATE ${LINKER_FLAGS} ${MATH_LIB} al-excommon ${UNICODE_FLAG})
1714 set_target_properties(altonegen PROPERTIES ${DEFAULT_TARGET_PROPS})
1716 add_executable(alrecord examples/alrecord.c)
1717 target_link_libraries(alrecord PRIVATE ${LINKER_FLAGS} al-excommon ${UNICODE_FLAG})
1718 set_target_properties(alrecord PROPERTIES ${DEFAULT_TARGET_PROPS})
1720 if(ALSOFT_INSTALL_EXAMPLES)
1721 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} altonegen alrecord)
1724 message(STATUS "Building example programs")
1727 add_executable(alplay examples/alplay.c)
1728 target_link_libraries(alplay PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1730 set_target_properties(alplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1732 add_executable(alstream examples/alstream.c)
1733 target_link_libraries(alstream PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1735 set_target_properties(alstream PROPERTIES ${DEFAULT_TARGET_PROPS})
1737 add_executable(alreverb examples/alreverb.c)
1738 target_link_libraries(alreverb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1740 set_target_properties(alreverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1742 add_executable(almultireverb examples/almultireverb.c)
1743 target_link_libraries(almultireverb
1744 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1745 set_target_properties(almultireverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1747 add_executable(allatency examples/allatency.c)
1748 target_link_libraries(allatency PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1750 set_target_properties(allatency PROPERTIES ${DEFAULT_TARGET_PROPS})
1752 add_executable(alhrtf examples/alhrtf.c)
1753 target_link_libraries(alhrtf
1754 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1755 set_target_properties(alhrtf PROPERTIES ${DEFAULT_TARGET_PROPS})
1757 add_executable(alstreamcb examples/alstreamcb.cpp)
1758 target_link_libraries(alstreamcb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1760 set_target_properties(alstreamcb PROPERTIES ${DEFAULT_TARGET_PROPS})
1762 add_executable(aldirect examples/aldirect.cpp)
1763 target_link_libraries(aldirect PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1765 set_target_properties(aldirect PROPERTIES ${DEFAULT_TARGET_PROPS})
1767 add_executable(alconvolve examples/alconvolve.c)
1768 target_link_libraries(alconvolve PRIVATE ${LINKER_FLAGS} alcommon SndFile::SndFile
1769 al-excommon ${UNICODE_FLAG})
1770 set_target_properties(alconvolve PROPERTIES ${DEFAULT_TARGET_PROPS})
1772 if(ALSOFT_INSTALL_EXAMPLES)
1773 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alplay alstream alreverb almultireverb allatency
1777 message(STATUS "Building SndFile example programs")
1781 add_executable(alloopback examples/alloopback.c)
1782 target_link_libraries(alloopback
1783 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 al-excommon ${MATH_LIB})
1784 set_target_properties(alloopback PROPERTIES ${DEFAULT_TARGET_PROPS})
1786 if(ALSOFT_INSTALL_EXAMPLES)
1787 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alloopback)
1790 message(STATUS "Building SDL example programs")
1795 if(AVFORMAT_VERSION VERSION_LESS "59.27.100")
1796 message(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 59.27.100)")
1799 if(AVCODEC_VERSION VERSION_LESS "59.37.100")
1800 message(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 59.37.100)")
1803 if(AVUTIL_VERSION VERSION_LESS "57.28.100")
1804 message(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 57.28.100)")
1807 if(SWSCALE_VERSION VERSION_LESS "6.7.100")
1808 message(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 6.7.100)")
1811 if(SWRESAMPLE_VERSION VERSION_LESS "4.7.100")
1812 message(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 4.7.100)")
1817 add_executable(alffplay examples/alffplay.cpp)
1818 target_include_directories(alffplay PRIVATE ${FFMPEG_INCLUDE_DIRS})
1819 target_link_libraries(alffplay
1820 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 ${FFMPEG_LIBRARIES} al-excommon)
1821 set_target_properties(alffplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1823 if(ALSOFT_INSTALL_EXAMPLES)
1824 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alffplay)
1826 message(STATUS "Building SDL+FFmpeg example programs")
1833 add_subdirectory(tests)
1837 install(TARGETS ${EXTRA_INSTALLS}
1838 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1839 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
1840 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1841 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})