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)
206 # Some systems may need libatomic for atomic functions to work
207 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
208 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES} atomic)
209 check_cxx_source_compiles("#include <atomic>
210 std::atomic<int> foo{0};
211 int main() { return foo.fetch_add(2); }"
213 if(NOT HAVE_LIBATOMIC)
214 set(CMAKE_REQUIRED_LIBRARIES "${OLD_REQUIRED_LIBRARIES}")
216 set(EXTRA_LIBS atomic ${EXTRA_LIBS})
218 unset(OLD_REQUIRED_LIBRARIES)
221 # Include liblog for Android logging
222 check_library_exists(log __android_log_print "" HAVE_LIBLOG)
224 set(EXTRA_LIBS log ${EXTRA_LIBS})
225 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} log)
230 # NOTE: _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR is temporary. When building on
231 # VS 2022 17.10 or newer, but using an older runtime, mutexes can crash
232 # when locked. Ideally the runtime should be updated on the system, but
233 # until the update becomes more widespread, this helps avoid some pain
235 set(CPP_DEFS ${CPP_DEFS} _CRT_SECURE_NO_WARNINGS _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
236 check_cxx_compiler_flag(/permissive- HAVE_PERMISSIVE_SWITCH)
237 if(HAVE_PERMISSIVE_SWITCH)
238 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:/permissive->)
240 set(C_FLAGS ${C_FLAGS} /W4 /w14640 /wd4065 /wd4127 /wd4268 /wd4324 /wd5030 /wd5051
241 $<$<COMPILE_LANGUAGE:CXX>:/EHsc>)
244 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
246 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
249 message(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
252 option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
253 if(FORCE_STATIC_VCRT)
255 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
256 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
257 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
258 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
259 if(${flag_var} MATCHES "/MD")
260 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
265 set(C_FLAGS ${C_FLAGS} -Winline -Wunused -Wall -Wextra -Wshadow -Wconversion -Wcast-align
267 $<$<COMPILE_LANGUAGE:CXX>:-Wold-style-cast -Wnon-virtual-dtor -Woverloaded-virtual>)
269 check_cxx_compiler_flag(-Wno-c++20-attribute-extensions HAVE_WNO_CXX20_ATTR_EXT)
270 if(HAVE_WNO_CXX20_ATTR_EXT)
271 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-attribute-extensions>)
273 check_cxx_compiler_flag(-Wno-c++20-extensions HAVE_WNO_CXX20_EXT)
274 if(HAVE_WNO_CXX20_EXT)
275 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-extensions>)
279 check_cxx_compiler_flag(-Wno-interference-size HAVE_WNO_INTERFERENCE_SIZE)
280 if(HAVE_WNO_INTERFERENCE_SIZE)
281 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-interference-size>)
285 set(C_FLAGS ${C_FLAGS} -Werror)
288 # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
290 foreach(flag_var CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
291 if(${flag_var} MATCHES "-DNDEBUG")
292 string(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
296 check_c_compiler_flag(-fno-math-errno HAVE_FNO_MATH_ERRNO)
297 if(HAVE_FNO_MATH_ERRNO)
298 set(C_FLAGS ${C_FLAGS} -fno-math-errno)
301 option(ALSOFT_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
302 if(ALSOFT_STATIC_LIBGCC)
303 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
304 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
305 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBGCC_SWITCH)
306 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
307 unset(OLD_REQUIRED_LIBRARIES)
309 if(NOT HAVE_STATIC_LIBGCC_SWITCH)
310 message(FATAL_ERROR "Cannot static link libgcc")
312 set(LINKER_FLAGS ${LINKER_FLAGS} -static-libgcc)
315 option(ALSOFT_STATIC_STDCXX "Static link libstdc++" OFF)
316 if(ALSOFT_STATIC_STDCXX)
317 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
318 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-static-libstdc++")
319 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBSTDCXX_SWITCH)
320 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
321 unset(OLD_REQUIRED_LIBRARIES)
323 if(NOT HAVE_STATIC_LIBSTDCXX_SWITCH)
324 message(FATAL_ERROR "Cannot static link libstdc++")
326 set(LINKER_FLAGS ${LINKER_FLAGS} "-static-libstdc++")
330 option(ALSOFT_STATIC_WINPTHREAD "Static link libwinpthread" OFF)
331 if(ALSOFT_STATIC_WINPTHREAD)
332 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
333 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
334 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBWINPTHREAD_SWITCH)
335 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
336 unset(OLD_REQUIRED_LIBRARIES)
338 if(NOT HAVE_STATIC_LIBWINPTHREAD_SWITCH)
339 message(FATAL_ERROR "Cannot static link libwinpthread")
341 set(LINKER_FLAGS ${LINKER_FLAGS} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
346 # Set visibility/export options if available
347 if(NOT LIBTYPE STREQUAL "STATIC")
349 set(EXPORT_DECL "__declspec(dllexport)")
351 set(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
352 # Yes GCC, really don't accept visibility modes you don't support
353 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
355 check_c_source_compiles("int foo() __attribute__((visibility(\"protected\")));
356 int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
357 if(HAVE_GCC_PROTECTED_VISIBILITY)
358 set(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
360 check_c_source_compiles("int foo() __attribute__((visibility(\"default\")));
361 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
362 if(HAVE_GCC_DEFAULT_VISIBILITY)
363 set(EXPORT_DECL "__attribute__((visibility(\"default\")))")
366 if(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
367 set(CMAKE_C_VISIBILITY_PRESET hidden)
368 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
371 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
379 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
380 # Yes GCC, really don't accept command line options you don't support
381 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
382 check_c_compiler_flag(-msse2 HAVE_MSSE2_SWITCH)
383 if(HAVE_MSSE2_SWITCH)
384 set(SSE2_SWITCH "-msse2")
386 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
387 unset(OLD_REQUIRED_FLAGS)
390 check_include_file(xmmintrin.h HAVE_XMMINTRIN_H)
391 check_include_file(emmintrin.h HAVE_EMMINTRIN_H)
392 check_include_file(pmmintrin.h HAVE_PMMINTRIN_H)
393 check_include_file(smmintrin.h HAVE_SMMINTRIN_H)
394 check_include_file(arm_neon.h HAVE_ARM_NEON_H)
402 # Check for SSE support
403 option(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
404 option(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
405 if(ALSOFT_CPUEXT_SSE AND HAVE_XMMINTRIN_H)
408 if(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
409 message(FATAL_ERROR "Failed to enable required SSE CPU extensions")
412 option(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
413 option(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
414 if(ALSOFT_CPUEXT_SSE2 AND HAVE_SSE AND HAVE_EMMINTRIN_H)
417 if(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
418 message(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
421 option(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
422 option(ALSOFT_REQUIRE_SSE3 "Require SSE3 support" OFF)
423 if(ALSOFT_CPUEXT_SSE3 AND HAVE_SSE2 AND HAVE_PMMINTRIN_H)
426 if(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
427 message(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
430 option(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
431 option(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
432 if(ALSOFT_CPUEXT_SSE4_1 AND HAVE_SSE3 AND HAVE_SMMINTRIN_H)
435 if(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
436 message(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
439 # Check for ARM Neon support
440 option(ALSOFT_CPUEXT_NEON "Enable ARM NEON support" ON)
441 option(ALSOFT_REQUIRE_NEON "Require ARM NEON support" OFF)
442 if(ALSOFT_CPUEXT_NEON AND HAVE_ARM_NEON_H)
443 check_c_source_compiles("#include <arm_neon.h>
446 int32x4_t ret4 = vdupq_n_s32(0);
447 return vgetq_lane_s32(ret4, 0);
448 }" HAVE_NEON_INTRINSICS)
449 if(HAVE_NEON_INTRINSICS)
453 if(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
454 message(FATAL_ERROR "Failed to enable required ARM NEON CPU extensions")
458 set(ALSOFT_FORCE_ALIGN )
461 if(CMAKE_SIZEOF_VOID_P MATCHES "4" AND HAVE_SSE2)
462 option(ALSOFT_ENABLE_SSE2_CODEGEN "Enable SSE2 code generation instead of x87 for 32-bit targets." TRUE)
463 if(ALSOFT_ENABLE_SSE2_CODEGEN)
465 check_c_compiler_flag("/arch:SSE2" HAVE_ARCH_SSE2)
467 set(SSE_FLAGS ${SSE_FLAGS} "/arch:SSE2")
468 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
472 check_c_compiler_flag("${SSE2_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE_2)
473 if(HAVE_MFPMATH_SSE_2)
474 set(SSE_FLAGS ${SSE_FLAGS} ${SSE2_SWITCH} -mfpmath=sse)
475 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
478 # SSE depends on a 16-byte aligned stack, and by default, GCC
479 # assumes the stack is suitably aligned. Older Linux code or other
480 # OSs don't guarantee this on 32-bit, so externally-callable
481 # functions need to ensure an aligned stack.
482 set(EXPORT_DECL "${EXPORT_DECL}__attribute__((force_align_arg_pointer))")
483 set(ALSOFT_FORCE_ALIGN "__attribute__((force_align_arg_pointer))")
489 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
490 foreach(flag_var ${SSE_FLAGS})
491 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag_var}")
494 check_c_source_compiles("#include <emmintrin.h>
495 int main() {_mm_pause(); return 0;}" HAVE_SSE_INTRINSICS)
497 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
501 check_include_file(cpuid.h HAVE_CPUID_H)
502 check_include_file(intrin.h HAVE_INTRIN_H)
503 check_include_file(guiddef.h HAVE_GUIDDEF_H)
505 # Some systems need libm for some math functions to work
507 check_library_exists(m pow "" HAVE_LIBM)
509 set(MATH_LIB ${MATH_LIB} m)
510 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
513 # Some systems need to link with -lrt for clock_gettime as used by the common
516 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
521 # Check for the dlopen API (for dynamically loading backend libs)
523 check_include_file(dlfcn.h HAVE_DLFCN_H)
524 check_library_exists(dl dlopen "" HAVE_LIBDL)
526 set(EXTRA_LIBS dl ${EXTRA_LIBS})
527 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
531 # Check for a cpuid intrinsic
533 check_c_source_compiles("#include <cpuid.h>
536 unsigned int eax, ebx, ecx, edx;
537 return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
538 }" HAVE_GCC_GET_CPUID)
541 check_c_source_compiles("#include <intrin.h>
547 }" HAVE_CPUID_INTRINSIC)
550 check_symbol_exists(proc_pidpath libproc.h HAVE_PROC_PIDPATH)
553 # We need pthreads outside of Windows, for semaphores. It's also used to
554 # set the priority and name of threads, when possible.
555 check_include_file(pthread.h HAVE_PTHREAD_H)
556 if(NOT HAVE_PTHREAD_H)
557 message(FATAL_ERROR "PThreads is required for non-Windows builds!")
560 check_c_compiler_flag(-pthread HAVE_PTHREAD)
562 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
563 set(C_FLAGS ${C_FLAGS} -pthread)
564 set(LINKER_FLAGS ${LINKER_FLAGS} -pthread)
567 check_symbol_exists(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
569 # Some systems need pthread_np.h to get pthread_setname_np
570 check_include_files("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
571 if(HAVE_PTHREAD_NP_H)
572 check_symbol_exists(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
573 if(NOT HAVE_PTHREAD_SETNAME_NP)
574 check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
577 check_symbol_exists(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
578 if(NOT HAVE_PTHREAD_SETNAME_NP)
579 check_symbol_exists(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
585 # Common sources used by both the OpenAL implementation library, the OpenAL
586 # router, and certain tools and examples.
601 common/althrd_setname.cpp
602 common/althrd_setname.h
610 common/intrusive_ptr.h
614 common/phase_shifter.h
615 common/polyphase_resampler.cpp
616 common/polyphase_resampler.h
618 common/ringbuffer.cpp
625 # Core library routines
637 core/bsinc_tables.cpp
640 core/buffer_storage.cpp
641 core/buffer_storage.h
649 core/cubic_tables.cpp
660 core/filters/biquad.h
661 core/filters/biquad.cpp
664 core/filters/splitter.cpp
665 core/filters/splitter.h
670 core/front_stablizer.h
681 core/resampler_limits.h
682 core/storage_formats.cpp
683 core/storage_formats.h
693 option(ALSOFT_RTKIT "Enable RTKit support" ON)
694 option(ALSOFT_REQUIRE_RTKIT "Require RTKit/D-Bus support" FALSE)
696 find_package(DBus1 QUIET)
697 if(NOT DBus1_FOUND AND PkgConfig_FOUND)
698 pkg_check_modules(DBUS dbus-1)
700 if(DBus1_FOUND OR DBUS_FOUND)
702 set(CORE_OBJS ${CORE_OBJS} core/dbus_wrap.cpp core/dbus_wrap.h
703 core/rtkit.cpp core/rtkit.h)
705 set(INC_PATHS ${INC_PATHS} ${DBUS_INCLUDE_DIRS})
706 set(CPP_DEFS ${CPP_DEFS} ${DBUS_CFLAGS_OTHER})
708 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBUS_LINK_LIBRARIES})
711 set(INC_PATHS ${INC_PATHS} ${DBus1_INCLUDE_DIRS})
712 set(CPP_DEFS ${CPP_DEFS} ${DBus1_DEFINITIONS})
714 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBus1_LIBRARIES})
719 if(NOT DBus1_INCLUDE_DIRS)
720 set(MISSING_VARS "${MISSING_VARS} DBus1_INCLUDE_DIRS")
722 if(NOT DBus1_LIBRARIES)
723 set(MISSING_VARS "${MISSING_VARS} DBus1_LIBRARIES")
725 message(STATUS "Could NOT find DBus1 (missing:${MISSING_VARS})")
729 if(ALSOFT_REQUIRE_RTKIT AND NOT HAVE_RTKIT)
730 message(FATAL_ERROR "Failed to enable required RTKit support")
733 # Default mixers, always available
734 set(CORE_OBJS ${CORE_OBJS}
736 core/mixer/hrtfbase.h
737 core/mixer/hrtfdefs.h
738 core/mixer/mixer_c.cpp)
740 # AL and related routines
751 al/effects/autowah.cpp
752 al/effects/chorus.cpp
753 al/effects/compressor.cpp
754 al/effects/convolution.cpp
755 al/effects/dedicated.cpp
756 al/effects/distortion.cpp
758 al/effects/effects.cpp
760 al/effects/equalizer.cpp
761 al/effects/fshifter.cpp
762 al/effects/modulator.cpp
764 al/effects/pshifter.cpp
765 al/effects/reverb.cpp
766 al/effects/vmorpher.cpp
780 # ALC and related routines
792 alc/effects/autowah.cpp
793 alc/effects/chorus.cpp
794 alc/effects/compressor.cpp
795 alc/effects/convolution.cpp
796 alc/effects/dedicated.cpp
797 alc/effects/distortion.cpp
799 alc/effects/equalizer.cpp
800 alc/effects/fshifter.cpp
801 alc/effects/modulator.cpp
803 alc/effects/pshifter.cpp
804 alc/effects/reverb.cpp
805 alc/effects/vmorpher.cpp
822 al/eax/fx_slot_index.cpp
823 al/eax/fx_slot_index.h
833 # Include SIMD mixers
834 set(CPU_EXTS "Default")
836 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse.cpp)
837 set(CPU_EXTS "${CPU_EXTS}, SSE")
840 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse2.cpp)
841 set(CPU_EXTS "${CPU_EXTS}, SSE2")
844 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse3.cpp)
845 set(CPU_EXTS "${CPU_EXTS}, SSE3")
848 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse41.cpp)
849 set(CPU_EXTS "${CPU_EXTS}, SSE4.1")
852 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_neon.cpp)
853 set(CPU_EXTS "${CPU_EXTS}, Neon")
865 set(HAVE_PORTAUDIO 0)
866 set(HAVE_PULSEAUDIO 0)
867 set(HAVE_COREAUDIO 0)
874 if(WIN32 OR HAVE_DLFCN_H)
876 macro(ADD_BACKEND_LIBS _LIBS)
879 set(IS_LINKED " (linked)")
880 macro(ADD_BACKEND_LIBS _LIBS)
881 set(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
886 set(ALC_OBJS ${ALC_OBJS}
887 alc/backends/base.cpp
889 # Default backends, always available
890 alc/backends/loopback.cpp
891 alc/backends/loopback.h
892 alc/backends/null.cpp
896 # Check PipeWire backend
897 option(ALSOFT_BACKEND_PIPEWIRE "Enable PipeWire backend" ON)
898 option(ALSOFT_REQUIRE_PIPEWIRE "Require PipeWire backend" OFF)
899 if(ALSOFT_BACKEND_PIPEWIRE AND PkgConfig_FOUND)
900 pkg_check_modules(PIPEWIRE libpipewire-0.3>=0.3.23)
903 set(BACKENDS "${BACKENDS} PipeWire${IS_LINKED},")
904 set(ALC_OBJS ${ALC_OBJS} alc/backends/pipewire.cpp alc/backends/pipewire.h)
905 add_backend_libs(${PIPEWIRE_LIBRARIES})
906 set(INC_PATHS ${INC_PATHS} ${PIPEWIRE_INCLUDE_DIRS})
909 if(ALSOFT_REQUIRE_PIPEWIRE AND NOT HAVE_PIPEWIRE)
910 message(FATAL_ERROR "Failed to enable required PipeWire backend")
913 # Check PulseAudio backend
914 option(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
915 option(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
916 if(ALSOFT_BACKEND_PULSEAUDIO)
917 find_package(PulseAudio)
919 set(HAVE_PULSEAUDIO 1)
920 set(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},")
921 set(ALC_OBJS ${ALC_OBJS} alc/backends/pulseaudio.cpp alc/backends/pulseaudio.h)
922 add_backend_libs(${PULSEAUDIO_LIBRARY})
923 set(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIR})
926 if(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
927 message(FATAL_ERROR "Failed to enable required PulseAudio backend")
932 option(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
933 option(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
934 if(ALSOFT_BACKEND_ALSA)
938 set(BACKENDS "${BACKENDS} ALSA${IS_LINKED},")
939 set(ALC_OBJS ${ALC_OBJS} alc/backends/alsa.cpp alc/backends/alsa.h)
940 add_backend_libs(${ALSA_LIBRARIES})
941 set(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS})
946 option(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
947 option(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
948 if(ALSOFT_BACKEND_OSS)
952 set(BACKENDS "${BACKENDS} OSS,")
953 set(ALC_OBJS ${ALC_OBJS} alc/backends/oss.cpp alc/backends/oss.h)
955 set(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS})
957 set(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS})
961 # Check Solaris backend
962 option(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
963 option(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
964 if(ALSOFT_BACKEND_SOLARIS)
965 find_package(AudioIO)
968 set(BACKENDS "${BACKENDS} Solaris,")
969 set(ALC_OBJS ${ALC_OBJS} alc/backends/solaris.cpp alc/backends/solaris.h)
970 set(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS})
974 # Check SndIO backend (disabled by default on non-BSDs)
976 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
978 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" OFF)
980 option(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
981 if(ALSOFT_BACKEND_SNDIO)
985 set(BACKENDS "${BACKENDS} SndIO (linked),")
986 set(ALC_OBJS ${ALC_OBJS} alc/backends/sndio.cpp alc/backends/sndio.h)
987 set(EXTRA_LIBS ${SNDIO_LIBRARIES} ${EXTRA_LIBS})
988 set(INC_PATHS ${INC_PATHS} ${SNDIO_INCLUDE_DIRS})
992 if(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
993 message(FATAL_ERROR "Failed to enable required ALSA backend")
995 if(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
996 message(FATAL_ERROR "Failed to enable required OSS backend")
998 if(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
999 message(FATAL_ERROR "Failed to enable required Solaris backend")
1001 if(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
1002 message(FATAL_ERROR "Failed to enable required SndIO backend")
1005 # Check Windows-only backends
1008 # Check MMSystem backend
1009 option(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
1010 option(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
1011 if(ALSOFT_BACKEND_WINMM)
1013 set(BACKENDS "${BACKENDS} WinMM,")
1014 set(ALC_OBJS ${ALC_OBJS} alc/backends/winmm.cpp alc/backends/winmm.h)
1015 # There doesn't seem to be good way to search for winmm.lib for MSVC.
1016 # find_library doesn't find it without being told to look in a specific
1017 # place in the WindowsSDK, but it links anyway. If there ends up being
1018 # Windows targets without this, another means to detect it is needed.
1019 set(EXTRA_LIBS winmm ${EXTRA_LIBS})
1022 # Check DSound backend
1023 option(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
1024 option(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
1025 if(ALSOFT_BACKEND_DSOUND)
1026 check_include_file(dsound.h HAVE_DSOUND_H)
1028 find_path(DSOUND_INCLUDE_DIR NAMES "dsound.h"
1029 PATHS "${DXSDK_DIR}" PATH_SUFFIXES include
1030 DOC "The DirectSound include directory")
1032 if(HAVE_DSOUND_H OR DSOUND_INCLUDE_DIR)
1034 set(BACKENDS "${BACKENDS} DirectSound,")
1035 set(ALC_OBJS ${ALC_OBJS} alc/backends/dsound.cpp alc/backends/dsound.h)
1037 if(NOT HAVE_DSOUND_H)
1038 set(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIR})
1044 # Check for WASAPI backend
1045 option(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON)
1046 option(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF)
1047 if(ALSOFT_BACKEND_WASAPI)
1048 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1049 if(HAVE_MMDEVICEAPI_H)
1051 set(BACKENDS "${BACKENDS} WASAPI,")
1052 set(ALC_OBJS ${ALC_OBJS} alc/backends/wasapi.cpp alc/backends/wasapi.h)
1055 set(EXTRA_LIBS avrt ${EXTRA_LIBS})
1060 option(ALSOFT_BACKEND_OTHERIO "Enable OtherIO backend" OFF)
1061 option(ALSOFT_REQUIRE_OTHERIO "Require OtherIO backend" OFF)
1062 if(ALSOFT_BACKEND_OTHERIO)
1064 set(BACKENDS "${BACKENDS} OtherIO,")
1065 set(ALC_OBJS ${ALC_OBJS} alc/backends/otherio.cpp alc/backends/otherio.h)
1068 if(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
1069 message(FATAL_ERROR "Failed to enable required WinMM backend")
1071 if(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
1072 message(FATAL_ERROR "Failed to enable required DSound backend")
1074 if(ALSOFT_REQUIRE_WASAPI AND NOT HAVE_WASAPI)
1075 message(FATAL_ERROR "Failed to enable required WASAPI backend")
1077 if(ALSOFT_REQUIRE_OTHERIO AND NOT HAVE_OTHERIO)
1078 message(FATAL_ERROR "Failed to enable required OtherIO backend")
1081 # Check JACK backend
1082 option(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
1083 option(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
1084 if(ALSOFT_BACKEND_JACK)
1088 set(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
1089 set(ALC_OBJS ${ALC_OBJS} alc/backends/jack.cpp alc/backends/jack.h)
1090 add_backend_libs(${JACK_LIBRARIES})
1091 set(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
1094 if(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
1095 message(FATAL_ERROR "Failed to enable required JACK backend")
1098 # Check CoreAudio backend
1099 option(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
1100 option(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
1101 if(ALSOFT_BACKEND_COREAUDIO)
1102 find_library(COREAUDIO_FRAMEWORK NAMES CoreAudio)
1103 find_path(AUDIOUNIT_INCLUDE_DIR NAMES AudioUnit/AudioUnit.h)
1104 if(COREAUDIO_FRAMEWORK AND AUDIOUNIT_INCLUDE_DIR)
1105 set(HAVE_COREAUDIO 1)
1106 set(ALC_OBJS ${ALC_OBJS} alc/backends/coreaudio.cpp alc/backends/coreaudio.h)
1107 set(BACKENDS "${BACKENDS} CoreAudio,")
1109 set(EXTRA_LIBS -Wl,-framework,CoreAudio ${EXTRA_LIBS})
1110 if(CMAKE_SYSTEM_NAME MATCHES "^(iOS|tvOS)$")
1111 find_library(COREFOUNDATION_FRAMEWORK NAMES CoreFoundation)
1112 if(COREFOUNDATION_FRAMEWORK)
1113 set(EXTRA_LIBS -Wl,-framework,CoreFoundation ${EXTRA_LIBS})
1116 set(EXTRA_LIBS -Wl,-framework,AudioUnit,-framework,ApplicationServices ${EXTRA_LIBS})
1119 # Some versions of OSX may need the AudioToolbox framework. Add it if
1121 find_library(AUDIOTOOLBOX_LIBRARY NAMES AudioToolbox)
1122 if(AUDIOTOOLBOX_LIBRARY)
1123 set(EXTRA_LIBS -Wl,-framework,AudioToolbox ${EXTRA_LIBS})
1126 set(INC_PATHS ${INC_PATHS} ${AUDIOUNIT_INCLUDE_DIR})
1129 if(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
1130 message(FATAL_ERROR "Failed to enable required CoreAudio backend")
1133 # Check for Oboe (Android) backend
1134 option(ALSOFT_BACKEND_OBOE "Enable Oboe backend" ON)
1135 option(ALSOFT_REQUIRE_OBOE "Require Oboe backend" OFF)
1136 if(ALSOFT_BACKEND_OBOE)
1139 set(OBOE_SOURCE "" CACHE STRING "Source directory for Oboe.")
1141 add_subdirectory(${OBOE_SOURCE} ./oboe EXCLUDE_FROM_ALL)
1142 set(OBOE_TARGET oboe)
1144 find_package(oboe CONFIG)
1145 if(NOT TARGET oboe::oboe)
1148 if(TARGET oboe::oboe)
1149 set(OBOE_TARGET "oboe::oboe")
1156 set(ALC_OBJS ${ALC_OBJS} alc/backends/oboe.cpp alc/backends/oboe.h)
1157 set(BACKENDS "${BACKENDS} Oboe,")
1158 set(EXTRA_LIBS ${OBOE_TARGET} ${EXTRA_LIBS})
1161 if(ALSOFT_REQUIRE_OBOE AND NOT HAVE_OBOE)
1162 message(FATAL_ERROR "Failed to enable required Oboe backend")
1165 # Check for OpenSL (Android) backend
1166 option(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
1167 option(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
1168 if(ALSOFT_BACKEND_OPENSL)
1169 find_package(OpenSL)
1172 set(ALC_OBJS ${ALC_OBJS} alc/backends/opensl.cpp alc/backends/opensl.h)
1173 set(BACKENDS "${BACKENDS} OpenSL,")
1174 set(EXTRA_LIBS ${OPENSL_LIBRARIES} ${EXTRA_LIBS})
1175 set(INC_PATHS ${INC_PATHS} ${OPENSL_INCLUDE_DIRS})
1178 if(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
1179 message(FATAL_ERROR "Failed to enable required OpenSL backend")
1182 # Check PortAudio backend
1183 option(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
1184 option(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
1185 if(ALSOFT_BACKEND_PORTAUDIO)
1186 find_package(PortAudio)
1188 set(HAVE_PORTAUDIO 1)
1189 set(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},")
1190 set(ALC_OBJS ${ALC_OBJS} alc/backends/portaudio.cpp alc/backends/portaudio.h)
1191 add_backend_libs(${PORTAUDIO_LIBRARIES})
1192 set(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS})
1195 if(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
1196 message(FATAL_ERROR "Failed to enable required PortAudio backend")
1199 # Check for SDL2 backend
1200 # Off by default, since it adds a runtime dependency
1201 option(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF)
1202 option(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF)
1203 if(ALSOFT_BACKEND_SDL2)
1206 set(ALC_OBJS ${ALC_OBJS} alc/backends/sdl2.cpp alc/backends/sdl2.h)
1207 set(BACKENDS "${BACKENDS} SDL2,")
1208 set(EXTRA_LIBS ${EXTRA_LIBS} SDL2::SDL2)
1210 message(STATUS "Could NOT find SDL2")
1213 if(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND)
1214 message(FATAL_ERROR "Failed to enable required SDL2 backend")
1217 # Optionally enable the Wave Writer backend
1218 option(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
1219 if(ALSOFT_BACKEND_WAVE)
1221 set(ALC_OBJS ${ALC_OBJS} alc/backends/wave.cpp alc/backends/wave.h)
1222 set(BACKENDS "${BACKENDS} WaveFile,")
1225 # This is always available
1226 set(BACKENDS "${BACKENDS} Null")
1230 if(ALSOFT_UPDATE_BUILD_VERSION AND GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
1231 set(GIT_DIR "${OpenAL_SOURCE_DIR}/.git")
1233 # Check if this is a submodule, if it is then find the .git directory
1234 if(NOT IS_DIRECTORY "${OpenAL_SOURCE_DIR}/.git")
1235 file(READ ${GIT_DIR} submodule)
1236 string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE ${submodule})
1237 string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
1238 get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
1239 get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
1242 # Get the current working branch and its latest abbreviated commit hash
1243 add_custom_command(OUTPUT "${OpenAL_BINARY_DIR}/version_witness.txt"
1244 BYPRODUCTS "${OpenAL_BINARY_DIR}/version.h"
1245 COMMAND ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE} -D LIB_VERSION=${LIB_VERSION}
1246 -D LIB_VERSION_NUM=${LIB_VERSION_NUM} -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
1247 -D DST=${OpenAL_BINARY_DIR}/version.h -P ${OpenAL_SOURCE_DIR}/version.cmake
1248 COMMAND ${CMAKE_COMMAND} -E touch "${OpenAL_BINARY_DIR}/version_witness.txt"
1249 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1250 MAIN_DEPENDENCY "${OpenAL_SOURCE_DIR}/version.h.in"
1251 DEPENDS "${GIT_DIR}/index" "${OpenAL_SOURCE_DIR}/version.cmake"
1255 add_custom_target(build_version DEPENDS "${OpenAL_BINARY_DIR}/version_witness.txt")
1257 set(GIT_BRANCH "UNKNOWN")
1258 set(GIT_COMMIT_HASH "unknown")
1260 "${OpenAL_SOURCE_DIR}/version.h.in"
1261 "${OpenAL_BINARY_DIR}/version.h")
1265 option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" ON)
1266 if(ALSOFT_EMBED_HRTF_DATA)
1267 macro(make_hrtf_header FILENAME VARNAME)
1268 set(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}")
1269 set(outfile "${OpenAL_BINARY_DIR}/${VARNAME}.txt")
1271 add_custom_command(OUTPUT "${outfile}"
1272 COMMAND ${CMAKE_COMMAND} -D "INPUT_FILE=${infile}" -D "OUTPUT_FILE=${outfile}"
1273 -P "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1274 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1275 DEPENDS "${infile}" "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1278 set(ALC_OBJS ${ALC_OBJS} "${outfile}")
1281 make_hrtf_header("Default HRTF.mhr" "default_hrtf")
1286 find_package(MySOFA)
1287 if(NOT ALSOFT_NO_CONFIG_UTIL)
1288 find_package(Qt5Widgets QUIET)
1289 if(NOT Qt5Widgets_FOUND)
1290 message(STATUS "Could NOT find Qt5Widgets")
1294 if(ALSOFT_UTILS OR ALSOFT_EXAMPLES)
1295 find_package(SndFile)
1297 find_package(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
1302 set(LIBNAME "openal")
1304 set(LIBNAME "OpenAL32")
1307 # Needed for openal.pc.in
1308 set(prefix ${CMAKE_INSTALL_PREFIX})
1309 set(exec_prefix "\${prefix}")
1310 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
1311 set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
1312 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
1313 set(PACKAGE_VERSION "${LIB_VERSION}")
1314 set(PKG_CONFIG_CFLAGS )
1315 set(PKG_CONFIG_PRIVATE_LIBS )
1316 if(LIBTYPE STREQUAL "STATIC")
1317 set(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC)
1318 foreach(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1319 # If this is already a linker flag, or is a full path+file, add it
1320 # as-is. If it's an SDL2 target, add the link flag for it. Otherwise,
1321 # it's a name intended to be dressed as -lname.
1322 if(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}")
1323 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}")
1324 elseif(FLAG MATCHES "^SDL2::SDL2")
1325 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -lSDL2")
1327 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}")
1334 "${OpenAL_SOURCE_DIR}/config.h.in"
1335 "${OpenAL_BINARY_DIR}/config.h")
1337 "${OpenAL_SOURCE_DIR}/openal.pc.in"
1338 "${OpenAL_BINARY_DIR}/openal.pc"
1342 add_library(alcommon STATIC EXCLUDE_FROM_ALL ${COMMON_OBJS})
1343 target_include_directories(alcommon PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/include
1344 PUBLIC ${OpenAL_SOURCE_DIR}/common)
1345 target_compile_definitions(alcommon PRIVATE ${CPP_DEFS})
1346 target_compile_options(alcommon PRIVATE ${C_FLAGS})
1347 set_target_properties(alcommon PROPERTIES ${DEFAULT_TARGET_PROPS} POSITION_INDEPENDENT_CODE TRUE)
1351 set(IMPL_TARGET OpenAL) # Either OpenAL or soft_oal.
1353 # Build main library
1354 if(LIBTYPE STREQUAL "STATIC")
1355 add_library(${IMPL_TARGET} STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS})
1356 target_compile_definitions(${IMPL_TARGET} PUBLIC AL_LIBTYPE_STATIC)
1357 target_link_libraries(${IMPL_TARGET} PRIVATE ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1360 # This option is for static linking OpenAL Soft into another project
1361 # that already defines the IDs. It is up to that project to ensure all
1362 # required IDs are defined.
1363 option(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
1364 if(ALSOFT_NO_UID_DEFS)
1365 target_compile_definitions(${IMPL_TARGET} PRIVATE AL_NO_UID_DEFS)
1369 set(RC_CONFIG resources/openal32.rc)
1370 if(WIN32 AND ALSOFT_BUILD_ROUTER)
1371 add_library(OpenAL SHARED
1378 target_compile_definitions(OpenAL
1379 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES "ALC_API=${EXPORT_DECL}"
1380 "AL_API=${EXPORT_DECL}" ${CPP_DEFS})
1381 target_compile_options(OpenAL PRIVATE ${C_FLAGS})
1382 target_link_libraries(OpenAL PRIVATE alcommon ${LINKER_FLAGS})
1383 target_include_directories(OpenAL
1385 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1386 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1388 ${OpenAL_SOURCE_DIR}/common
1389 ${OpenAL_BINARY_DIR}
1391 set_target_properties(OpenAL PROPERTIES ${DEFAULT_TARGET_PROPS} PREFIX ""
1392 OUTPUT_NAME ${LIBNAME})
1393 if(TARGET build_version)
1394 add_dependencies(OpenAL build_version)
1398 set(LIBNAME "soft_oal")
1399 set(IMPL_TARGET soft_oal)
1400 set(RC_CONFIG resources/soft_oal.rc)
1403 # !important: for osx framework public header works, the headers must be in
1405 set(TARGET_PUBLIC_HEADERS include/AL/al.h include/AL/alc.h include/AL/alext.h include/AL/efx.h
1406 include/AL/efx-presets.h)
1408 add_library(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS} ${RC_CONFIG}
1409 ${TARGET_PUBLIC_HEADERS})
1411 set_target_properties(${IMPL_TARGET} PROPERTIES PREFIX "")
1413 target_link_libraries(${IMPL_TARGET} PRIVATE alcommon ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1416 set(ALSOFT_CPPWINRT_VERSION "2.0.230706.1" CACHE STRING "The soft-oal default cppwinrt version")
1418 find_program(NUGET_EXE NAMES nuget)
1420 message("NUGET.EXE not found.")
1421 message(FATAL_ERROR "Please install this executable, and run CMake again.")
1424 exec_program(${NUGET_EXE}
1425 ARGS install "Microsoft.Windows.CppWinRT" -Version ${ALSOFT_CPPWINRT_VERSION} -ExcludeVersion -OutputDirectory "\"${CMAKE_BINARY_DIR}/packages\"")
1427 set_target_properties(${IMPL_TARGET} PROPERTIES
1428 VS_PROJECT_IMPORT ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.props
1430 target_link_libraries(${IMPL_TARGET} PRIVATE ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.targets)
1433 if(NOT WIN32 AND NOT APPLE)
1434 # FIXME: This doesn't put a dependency on the version script. Changing
1435 # the version script will not cause a relink as it should.
1436 target_link_options(${IMPL_TARGET} PRIVATE
1437 "-Wl,--version-script=${OpenAL_SOURCE_DIR}/libopenal.version")
1440 if(APPLE AND ALSOFT_OSX_FRAMEWORK)
1441 # Sets framework name to soft_oal to avoid ambiguity with the system OpenAL.framework
1442 set(LIBNAME "soft_oal")
1444 execute_process(COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD
1446 OUTPUT_VARIABLE BUNDLE_VERSION
1447 OUTPUT_STRIP_TRAILING_WHITESPACE)
1449 set(BUNDLE_VERSION 1)
1452 # Build: Fix rpath in iOS shared libraries
1453 # If this flag is not set, the final dylib binary ld path will be
1454 # /User/xxx/*/soft_oal.framework/soft_oal, which can't be loaded by iOS devices.
1455 # See also: https://github.com/libjpeg-turbo/libjpeg-turbo/commit/c80ddef7a4ce21ace9e3ca0fd190d320cc8cdaeb
1456 if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
1457 set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
1460 set_target_properties(${IMPL_TARGET} PROPERTIES
1463 MACOSX_FRAMEWORK_NAME "${IMPL_TARGET}"
1464 MACOSX_FRAMEWORK_IDENTIFIER "org.openal-soft.openal"
1465 MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${LIB_VERSION}"
1466 MACOSX_FRAMEWORK_BUNDLE_VERSION "${BUNDLE_VERSION}"
1467 XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
1468 XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
1469 XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
1470 PUBLIC_HEADER "${TARGET_PUBLIC_HEADERS}"
1475 target_include_directories(${IMPL_TARGET}
1477 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1479 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include/AL>
1480 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1481 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/AL>
1484 ${OpenAL_BINARY_DIR}
1485 ${OpenAL_SOURCE_DIR}
1486 ${OpenAL_SOURCE_DIR}/common
1489 set_target_properties(${IMPL_TARGET} PROPERTIES ${DEFAULT_TARGET_PROPS}
1490 OUTPUT_NAME ${LIBNAME}
1491 VERSION ${LIB_VERSION}
1492 SOVERSION ${LIB_MAJOR_VERSION}
1494 target_compile_definitions(${IMPL_TARGET}
1495 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES $<$<BOOL:${ALSOFT_EAX}>:ALSOFT_EAX>
1496 "ALC_API=${EXPORT_DECL}" "AL_API=${EXPORT_DECL}" ${CPP_DEFS})
1497 target_compile_options(${IMPL_TARGET} PRIVATE ${C_FLAGS})
1499 if(TARGET build_version)
1500 add_dependencies(${IMPL_TARGET} build_version)
1503 if(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC")
1504 find_program(SED_EXECUTABLE NAMES sed DOC "sed executable")
1505 if(NOT SED_EXECUTABLE OR NOT CMAKE_DLLTOOL)
1507 if(NOT SED_EXECUTABLE)
1508 message(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
1510 if(NOT CMAKE_DLLTOOL)
1511 message(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
1514 target_link_options(OpenAL PRIVATE "-Wl,--output-def,${PROJECT_BINARY_DIR}/OpenAL32.def")
1515 add_custom_command(TARGET OpenAL POST_BUILD
1516 COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def
1517 COMMAND "${CMAKE_DLLTOOL}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll
1518 # Technically OpenAL32.def was created by the build, but cmake
1519 # doesn't recognize it due to -Wl,--output-def,OpenAL32.def being
1520 # manually specified. But declaring the file here allows it to be
1521 # properly cleaned, e.g. during make clean.
1522 BYPRODUCTS OpenAL32.def OpenAL32.lib
1523 COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..."
1531 message(STATUS "Building DLL router")
1535 message(STATUS "Building OpenAL with support for the following backends:")
1536 message(STATUS " ${BACKENDS}")
1538 message(STATUS "Building with support for CPU extensions:")
1539 message(STATUS " ${CPU_EXTS}")
1542 message(STATUS "Building with SSE${FPMATH_SET} codegen")
1546 message(STATUS "Building with UWP support")
1550 message(STATUS "Building with legacy EAX extension support")
1554 if(ALSOFT_EMBED_HRTF_DATA)
1555 message(STATUS "Embedding HRTF datasets")
1559 # An alias for sub-project builds
1560 add_library(OpenAL::OpenAL ALIAS OpenAL)
1562 # Install main library
1564 configure_package_config_file(OpenALConfig.cmake.in OpenALConfig.cmake
1565 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL)
1566 install(TARGETS OpenAL EXPORT OpenAL
1567 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1568 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1569 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1570 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
1571 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL)
1572 export(TARGETS OpenAL
1574 FILE OpenALTargets.cmake)
1575 install(EXPORT OpenAL
1576 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL
1578 FILE OpenALTargets.cmake)
1579 install(DIRECTORY include/AL
1580 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1581 install(FILES "${OpenAL_BINARY_DIR}/openal.pc"
1582 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
1583 install(FILES "${OpenAL_BINARY_DIR}/OpenALConfig.cmake"
1584 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL")
1586 install(TARGETS soft_oal
1587 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1589 message(STATUS "Installing library and headers")
1591 message(STATUS "NOT installing library and headers")
1594 if(ALSOFT_INSTALL_CONFIG)
1595 install(FILES alsoftrc.sample
1596 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1597 message(STATUS "Installing sample configuration")
1600 if(ALSOFT_INSTALL_HRTF_DATA)
1601 install(DIRECTORY hrtf
1602 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1603 message(STATUS "Installing HRTF data files")
1606 if(ALSOFT_INSTALL_AMBDEC_PRESETS)
1607 install(DIRECTORY presets
1608 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1609 message(STATUS "Installing AmbDec presets")
1615 set(UNICODE_FLAG ${UNICODE_FLAG} -municode)
1617 set(EXTRA_INSTALLS )
1619 add_executable(openal-info utils/openal-info.c)
1620 target_include_directories(openal-info PRIVATE ${OpenAL_SOURCE_DIR}/common)
1621 target_compile_options(openal-info PRIVATE ${C_FLAGS})
1622 target_link_libraries(openal-info PRIVATE ${LINKER_FLAGS} OpenAL ${UNICODE_FLAG})
1623 set_target_properties(openal-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1624 if(ALSOFT_INSTALL_EXAMPLES)
1625 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} openal-info)
1629 add_executable(uhjdecoder utils/uhjdecoder.cpp)
1630 target_compile_definitions(uhjdecoder PRIVATE ${CPP_DEFS})
1631 target_include_directories(uhjdecoder
1632 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1633 target_compile_options(uhjdecoder PRIVATE ${C_FLAGS})
1634 target_link_libraries(uhjdecoder PUBLIC alcommon
1635 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1636 set_target_properties(uhjdecoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1638 add_executable(uhjencoder utils/uhjencoder.cpp)
1639 target_compile_definitions(uhjencoder PRIVATE ${CPP_DEFS})
1640 target_include_directories(uhjencoder
1641 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1642 target_compile_options(uhjencoder PRIVATE ${C_FLAGS})
1643 target_link_libraries(uhjencoder PUBLIC alcommon
1644 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1645 set_target_properties(uhjencoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1649 set(SOFA_SUPPORT_SRCS
1650 utils/sofa-support.cpp
1651 utils/sofa-support.h)
1652 add_library(sofa-support STATIC EXCLUDE_FROM_ALL ${SOFA_SUPPORT_SRCS})
1653 target_compile_definitions(sofa-support PRIVATE ${CPP_DEFS})
1654 target_include_directories(sofa-support PUBLIC ${OpenAL_SOURCE_DIR}/common)
1655 target_compile_options(sofa-support PRIVATE ${C_FLAGS})
1656 target_link_libraries(sofa-support PUBLIC alcommon MySOFA::MySOFA PRIVATE ${LINKER_FLAGS})
1657 set_target_properties(sofa-support PROPERTIES ${DEFAULT_TARGET_PROPS})
1660 utils/makemhr/loaddef.cpp
1661 utils/makemhr/loaddef.h
1662 utils/makemhr/loadsofa.cpp
1663 utils/makemhr/loadsofa.h
1664 utils/makemhr/makemhr.cpp
1665 utils/makemhr/makemhr.h)
1666 add_executable(makemhr ${MAKEMHR_SRCS})
1667 target_compile_definitions(makemhr PRIVATE ${CPP_DEFS})
1668 target_include_directories(makemhr
1669 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/utils)
1670 target_compile_options(makemhr PRIVATE ${C_FLAGS})
1671 target_link_libraries(makemhr PRIVATE ${LINKER_FLAGS} sofa-support ${UNICODE_FLAG})
1672 set_target_properties(makemhr PROPERTIES ${DEFAULT_TARGET_PROPS})
1673 if(ALSOFT_INSTALL_EXAMPLES)
1674 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} makemhr)
1677 set(SOFAINFO_SRCS utils/sofa-info.cpp)
1678 add_executable(sofa-info ${SOFAINFO_SRCS})
1679 target_compile_definitions(sofa-info PRIVATE ${CPP_DEFS})
1680 target_include_directories(sofa-info PRIVATE ${OpenAL_SOURCE_DIR}/utils)
1681 target_compile_options(sofa-info PRIVATE ${C_FLAGS})
1682 target_link_libraries(sofa-info PRIVATE ${LINKER_FLAGS} sofa-support ${UNICODE_FLAG})
1683 set_target_properties(sofa-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1685 message(STATUS "Building utility programs")
1687 if(NOT ALSOFT_NO_CONFIG_UTIL)
1688 add_subdirectory(utils/alsoft-config)
1694 # Add a static library with common functions used by multiple example targets
1695 add_library(al-excommon STATIC EXCLUDE_FROM_ALL
1696 examples/common/alhelpers.c
1697 examples/common/alhelpers.h)
1698 target_compile_definitions(al-excommon PUBLIC ${CPP_DEFS})
1699 target_include_directories(al-excommon PUBLIC ${OpenAL_SOURCE_DIR}/common)
1700 target_compile_options(al-excommon PUBLIC ${C_FLAGS})
1701 target_link_libraries(al-excommon PUBLIC OpenAL PRIVATE ${RT_LIB})
1702 set_target_properties(al-excommon PROPERTIES ${DEFAULT_TARGET_PROPS})
1705 add_executable(altonegen examples/altonegen.c)
1706 target_link_libraries(altonegen PRIVATE ${LINKER_FLAGS} ${MATH_LIB} al-excommon ${UNICODE_FLAG})
1707 set_target_properties(altonegen PROPERTIES ${DEFAULT_TARGET_PROPS})
1709 add_executable(alrecord examples/alrecord.c)
1710 target_link_libraries(alrecord PRIVATE ${LINKER_FLAGS} al-excommon ${UNICODE_FLAG})
1711 set_target_properties(alrecord PROPERTIES ${DEFAULT_TARGET_PROPS})
1713 add_executable(allafplay examples/allafplay.cpp)
1714 target_link_libraries(allafplay PRIVATE ${LINKER_FLAGS} alcommon al-excommon ${UNICODE_FLAG})
1715 set_target_properties(allafplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1717 if(ALSOFT_INSTALL_EXAMPLES)
1718 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} altonegen alrecord allafplay)
1721 message(STATUS "Building example programs")
1724 add_executable(alplay examples/alplay.c)
1725 target_link_libraries(alplay PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1727 set_target_properties(alplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1729 add_executable(alstream examples/alstream.c)
1730 target_link_libraries(alstream PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1732 set_target_properties(alstream PROPERTIES ${DEFAULT_TARGET_PROPS})
1734 add_executable(alreverb examples/alreverb.c)
1735 target_link_libraries(alreverb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1737 set_target_properties(alreverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1739 add_executable(almultireverb examples/almultireverb.c)
1740 target_link_libraries(almultireverb
1741 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1742 set_target_properties(almultireverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1744 add_executable(allatency examples/allatency.c)
1745 target_link_libraries(allatency PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1747 set_target_properties(allatency PROPERTIES ${DEFAULT_TARGET_PROPS})
1749 add_executable(alhrtf examples/alhrtf.c)
1750 target_link_libraries(alhrtf
1751 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1752 set_target_properties(alhrtf PROPERTIES ${DEFAULT_TARGET_PROPS})
1754 add_executable(alstreamcb examples/alstreamcb.cpp)
1755 target_link_libraries(alstreamcb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1757 set_target_properties(alstreamcb PROPERTIES ${DEFAULT_TARGET_PROPS})
1759 add_executable(aldirect examples/aldirect.cpp)
1760 target_link_libraries(aldirect PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1762 set_target_properties(aldirect PROPERTIES ${DEFAULT_TARGET_PROPS})
1764 add_executable(alconvolve examples/alconvolve.c)
1765 target_link_libraries(alconvolve PRIVATE ${LINKER_FLAGS} alcommon SndFile::SndFile
1766 al-excommon ${UNICODE_FLAG})
1767 set_target_properties(alconvolve PROPERTIES ${DEFAULT_TARGET_PROPS})
1769 if(ALSOFT_INSTALL_EXAMPLES)
1770 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alplay alstream alreverb almultireverb allatency
1774 message(STATUS "Building SndFile example programs")
1778 add_executable(alloopback examples/alloopback.c)
1779 target_link_libraries(alloopback
1780 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 al-excommon ${MATH_LIB})
1781 set_target_properties(alloopback PROPERTIES ${DEFAULT_TARGET_PROPS})
1783 if(ALSOFT_INSTALL_EXAMPLES)
1784 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alloopback)
1787 message(STATUS "Building SDL example programs")
1792 if(AVFORMAT_VERSION VERSION_LESS "59.27.100")
1793 message(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 59.27.100)")
1796 if(AVCODEC_VERSION VERSION_LESS "59.37.100")
1797 message(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 59.37.100)")
1800 if(AVUTIL_VERSION VERSION_LESS "57.28.100")
1801 message(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 57.28.100)")
1804 if(SWSCALE_VERSION VERSION_LESS "6.7.100")
1805 message(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 6.7.100)")
1808 if(SWRESAMPLE_VERSION VERSION_LESS "4.7.100")
1809 message(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 4.7.100)")
1814 add_executable(alffplay examples/alffplay.cpp)
1815 target_include_directories(alffplay PRIVATE ${FFMPEG_INCLUDE_DIRS})
1816 target_link_libraries(alffplay
1817 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 ${FFMPEG_LIBRARIES} al-excommon)
1818 set_target_properties(alffplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1820 if(ALSOFT_INSTALL_EXAMPLES)
1821 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alffplay)
1823 message(STATUS "Building SDL+FFmpeg example programs")
1830 add_subdirectory(tests)
1834 install(TARGETS ${EXTRA_INSTALLS}
1835 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1836 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
1837 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1838 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})