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 set(CPP_DEFS ${CPP_DEFS} _CRT_SECURE_NO_WARNINGS)
231 check_cxx_compiler_flag(/permissive- HAVE_PERMISSIVE_SWITCH)
232 if(HAVE_PERMISSIVE_SWITCH)
233 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:/permissive->)
235 set(C_FLAGS ${C_FLAGS} /W4 /w14640 /wd4065 /wd4127 /wd4268 /wd4324 /wd5030 /wd5051)
238 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
240 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
243 message(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
246 option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
247 if(FORCE_STATIC_VCRT)
249 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
250 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
251 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
252 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
253 if(${flag_var} MATCHES "/MD")
254 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
259 set(C_FLAGS ${C_FLAGS} -Winline -Wunused -Wall -Wextra -Wshadow -Wconversion -Wcast-align
261 $<$<COMPILE_LANGUAGE:CXX>:-Wold-style-cast -Wnon-virtual-dtor -Woverloaded-virtual>)
263 check_cxx_compiler_flag(-Wno-c++20-attribute-extensions HAVE_WNO_CXX20_ATTR_EXT)
264 if(HAVE_WNO_CXX20_ATTR_EXT)
265 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-attribute-extensions>)
267 check_cxx_compiler_flag(-Wno-c++20-extensions HAVE_WNO_CXX20_EXT)
268 if(HAVE_WNO_CXX20_EXT)
269 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-extensions>)
273 check_cxx_compiler_flag(-Wno-interference-size HAVE_WNO_INTERFERENCE_SIZE)
274 if(HAVE_WNO_INTERFERENCE_SIZE)
275 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-interference-size>)
279 set(C_FLAGS ${C_FLAGS} -Werror)
282 # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
284 foreach(flag_var CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
285 if(${flag_var} MATCHES "-DNDEBUG")
286 string(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
290 check_c_compiler_flag(-fno-math-errno HAVE_FNO_MATH_ERRNO)
291 if(HAVE_FNO_MATH_ERRNO)
292 set(C_FLAGS ${C_FLAGS} -fno-math-errno)
295 option(ALSOFT_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
296 if(ALSOFT_STATIC_LIBGCC)
297 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
298 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
299 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBGCC_SWITCH)
300 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
301 unset(OLD_REQUIRED_LIBRARIES)
303 if(NOT HAVE_STATIC_LIBGCC_SWITCH)
304 message(FATAL_ERROR "Cannot static link libgcc")
306 set(LINKER_FLAGS ${LINKER_FLAGS} -static-libgcc)
309 option(ALSOFT_STATIC_STDCXX "Static link libstdc++" OFF)
310 if(ALSOFT_STATIC_STDCXX)
311 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
312 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-static-libstdc++")
313 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBSTDCXX_SWITCH)
314 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
315 unset(OLD_REQUIRED_LIBRARIES)
317 if(NOT HAVE_STATIC_LIBSTDCXX_SWITCH)
318 message(FATAL_ERROR "Cannot static link libstdc++")
320 set(LINKER_FLAGS ${LINKER_FLAGS} "-static-libstdc++")
324 option(ALSOFT_STATIC_WINPTHREAD "Static link libwinpthread" OFF)
325 if(ALSOFT_STATIC_WINPTHREAD)
326 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
327 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
328 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBWINPTHREAD_SWITCH)
329 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
330 unset(OLD_REQUIRED_LIBRARIES)
332 if(NOT HAVE_STATIC_LIBWINPTHREAD_SWITCH)
333 message(FATAL_ERROR "Cannot static link libwinpthread")
335 set(LINKER_FLAGS ${LINKER_FLAGS} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
340 # Set visibility/export options if available
341 if(NOT LIBTYPE STREQUAL "STATIC")
343 set(EXPORT_DECL "__declspec(dllexport)")
345 set(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
346 # Yes GCC, really don't accept visibility modes you don't support
347 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
349 check_c_source_compiles("int foo() __attribute__((visibility(\"protected\")));
350 int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
351 if(HAVE_GCC_PROTECTED_VISIBILITY)
352 set(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
354 check_c_source_compiles("int foo() __attribute__((visibility(\"default\")));
355 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
356 if(HAVE_GCC_DEFAULT_VISIBILITY)
357 set(EXPORT_DECL "__attribute__((visibility(\"default\")))")
360 if(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
361 set(CMAKE_C_VISIBILITY_PRESET hidden)
362 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
365 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
373 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
374 # Yes GCC, really don't accept command line options you don't support
375 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
376 check_c_compiler_flag(-msse2 HAVE_MSSE2_SWITCH)
377 if(HAVE_MSSE2_SWITCH)
378 set(SSE2_SWITCH "-msse2")
380 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
381 unset(OLD_REQUIRED_FLAGS)
384 check_include_file(xmmintrin.h HAVE_XMMINTRIN_H)
385 check_include_file(emmintrin.h HAVE_EMMINTRIN_H)
386 check_include_file(pmmintrin.h HAVE_PMMINTRIN_H)
387 check_include_file(smmintrin.h HAVE_SMMINTRIN_H)
388 check_include_file(arm_neon.h HAVE_ARM_NEON_H)
396 # Check for SSE support
397 option(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
398 option(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
399 if(ALSOFT_CPUEXT_SSE AND HAVE_XMMINTRIN_H)
402 if(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
403 message(FATAL_ERROR "Failed to enable required SSE CPU extensions")
406 option(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
407 option(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
408 if(ALSOFT_CPUEXT_SSE2 AND HAVE_SSE AND HAVE_EMMINTRIN_H)
411 if(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
412 message(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
415 option(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
416 option(ALSOFT_REQUIRE_SSE3 "Require SSE3 support" OFF)
417 if(ALSOFT_CPUEXT_SSE3 AND HAVE_SSE2 AND HAVE_PMMINTRIN_H)
420 if(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
421 message(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
424 option(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
425 option(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
426 if(ALSOFT_CPUEXT_SSE4_1 AND HAVE_SSE3 AND HAVE_SMMINTRIN_H)
429 if(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
430 message(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
433 # Check for ARM Neon support
434 option(ALSOFT_CPUEXT_NEON "Enable ARM NEON support" ON)
435 option(ALSOFT_REQUIRE_NEON "Require ARM NEON support" OFF)
436 if(ALSOFT_CPUEXT_NEON AND HAVE_ARM_NEON_H)
437 check_c_source_compiles("#include <arm_neon.h>
440 int32x4_t ret4 = vdupq_n_s32(0);
441 return vgetq_lane_s32(ret4, 0);
442 }" HAVE_NEON_INTRINSICS)
443 if(HAVE_NEON_INTRINSICS)
447 if(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
448 message(FATAL_ERROR "Failed to enable required ARM NEON CPU extensions")
452 set(ALSOFT_FORCE_ALIGN )
455 if(CMAKE_SIZEOF_VOID_P MATCHES "4" AND HAVE_SSE2)
456 option(ALSOFT_ENABLE_SSE2_CODEGEN "Enable SSE2 code generation instead of x87 for 32-bit targets." TRUE)
457 if(ALSOFT_ENABLE_SSE2_CODEGEN)
459 check_c_compiler_flag("/arch:SSE2" HAVE_ARCH_SSE2)
461 set(SSE_FLAGS ${SSE_FLAGS} "/arch:SSE2")
462 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
466 check_c_compiler_flag("${SSE2_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE_2)
467 if(HAVE_MFPMATH_SSE_2)
468 set(SSE_FLAGS ${SSE_FLAGS} ${SSE2_SWITCH} -mfpmath=sse)
469 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
472 # SSE depends on a 16-byte aligned stack, and by default, GCC
473 # assumes the stack is suitably aligned. Older Linux code or other
474 # OSs don't guarantee this on 32-bit, so externally-callable
475 # functions need to ensure an aligned stack.
476 set(EXPORT_DECL "${EXPORT_DECL}__attribute__((force_align_arg_pointer))")
477 set(ALSOFT_FORCE_ALIGN "__attribute__((force_align_arg_pointer))")
483 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
484 foreach(flag_var ${SSE_FLAGS})
485 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag_var}")
488 check_c_source_compiles("#include <emmintrin.h>
489 int main() {_mm_pause(); return 0;}" HAVE_SSE_INTRINSICS)
491 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
495 check_include_file(cpuid.h HAVE_CPUID_H)
496 check_include_file(intrin.h HAVE_INTRIN_H)
497 check_include_file(guiddef.h HAVE_GUIDDEF_H)
499 # Some systems need libm for some math functions to work
501 check_library_exists(m pow "" HAVE_LIBM)
503 set(MATH_LIB ${MATH_LIB} m)
504 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
507 # Some systems need to link with -lrt for clock_gettime as used by the common
510 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
515 # Check for the dlopen API (for dynamically loading backend libs)
517 check_include_file(dlfcn.h HAVE_DLFCN_H)
518 check_library_exists(dl dlopen "" HAVE_LIBDL)
520 set(EXTRA_LIBS dl ${EXTRA_LIBS})
521 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
525 # Check for a cpuid intrinsic
527 check_c_source_compiles("#include <cpuid.h>
530 unsigned int eax, ebx, ecx, edx;
531 return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
532 }" HAVE_GCC_GET_CPUID)
535 check_c_source_compiles("#include <intrin.h>
541 }" HAVE_CPUID_INTRINSIC)
544 check_symbol_exists(proc_pidpath libproc.h HAVE_PROC_PIDPATH)
547 # We need pthreads outside of Windows, for semaphores. It's also used to
548 # set the priority and name of threads, when possible.
549 check_include_file(pthread.h HAVE_PTHREAD_H)
550 if(NOT HAVE_PTHREAD_H)
551 message(FATAL_ERROR "PThreads is required for non-Windows builds!")
554 check_c_compiler_flag(-pthread HAVE_PTHREAD)
556 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
557 set(C_FLAGS ${C_FLAGS} -pthread)
558 set(LINKER_FLAGS ${LINKER_FLAGS} -pthread)
561 check_symbol_exists(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
563 # Some systems need pthread_np.h to get pthread_setname_np
564 check_include_files("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
565 if(HAVE_PTHREAD_NP_H)
566 check_symbol_exists(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
567 if(NOT HAVE_PTHREAD_SETNAME_NP)
568 check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
571 check_symbol_exists(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
572 if(NOT HAVE_PTHREAD_SETNAME_NP)
573 check_symbol_exists(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
579 # Common sources used by both the OpenAL implementation library, the OpenAL
580 # router, and certain tools and examples.
595 common/althrd_setname.cpp
596 common/althrd_setname.h
604 common/intrusive_ptr.h
608 common/phase_shifter.h
609 common/polyphase_resampler.cpp
610 common/polyphase_resampler.h
612 common/ringbuffer.cpp
619 # Core library routines
631 core/bsinc_tables.cpp
634 core/buffer_storage.cpp
635 core/buffer_storage.h
643 core/cubic_tables.cpp
654 core/filters/biquad.h
655 core/filters/biquad.cpp
658 core/filters/splitter.cpp
659 core/filters/splitter.h
664 core/front_stablizer.h
675 core/resampler_limits.h
676 core/storage_formats.cpp
677 core/storage_formats.h
687 option(ALSOFT_RTKIT "Enable RTKit support" ON)
688 option(ALSOFT_REQUIRE_RTKIT "Require RTKit/D-Bus support" FALSE)
690 find_package(DBus1 QUIET)
691 if(NOT DBus1_FOUND AND PkgConfig_FOUND)
692 pkg_check_modules(DBUS dbus-1)
694 if(DBus1_FOUND OR DBUS_FOUND)
696 set(CORE_OBJS ${CORE_OBJS} core/dbus_wrap.cpp core/dbus_wrap.h
697 core/rtkit.cpp core/rtkit.h)
699 set(INC_PATHS ${INC_PATHS} ${DBUS_INCLUDE_DIRS})
700 set(CPP_DEFS ${CPP_DEFS} ${DBUS_CFLAGS_OTHER})
702 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBUS_LINK_LIBRARIES})
705 set(INC_PATHS ${INC_PATHS} ${DBus1_INCLUDE_DIRS})
706 set(CPP_DEFS ${CPP_DEFS} ${DBus1_DEFINITIONS})
708 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBus1_LIBRARIES})
713 if(NOT DBus1_INCLUDE_DIRS)
714 set(MISSING_VARS "${MISSING_VARS} DBus1_INCLUDE_DIRS")
716 if(NOT DBus1_LIBRARIES)
717 set(MISSING_VARS "${MISSING_VARS} DBus1_LIBRARIES")
719 message(STATUS "Could NOT find DBus1 (missing:${MISSING_VARS})")
723 if(ALSOFT_REQUIRE_RTKIT AND NOT HAVE_RTKIT)
724 message(FATAL_ERROR "Failed to enable required RTKit support")
727 # Default mixers, always available
728 set(CORE_OBJS ${CORE_OBJS}
730 core/mixer/hrtfbase.h
731 core/mixer/hrtfdefs.h
732 core/mixer/mixer_c.cpp)
734 # AL and related routines
745 al/effects/autowah.cpp
746 al/effects/chorus.cpp
747 al/effects/compressor.cpp
748 al/effects/convolution.cpp
749 al/effects/dedicated.cpp
750 al/effects/distortion.cpp
752 al/effects/effects.cpp
754 al/effects/equalizer.cpp
755 al/effects/fshifter.cpp
756 al/effects/modulator.cpp
758 al/effects/pshifter.cpp
759 al/effects/reverb.cpp
760 al/effects/vmorpher.cpp
774 # ALC and related routines
786 alc/effects/autowah.cpp
787 alc/effects/chorus.cpp
788 alc/effects/compressor.cpp
789 alc/effects/convolution.cpp
790 alc/effects/dedicated.cpp
791 alc/effects/distortion.cpp
793 alc/effects/equalizer.cpp
794 alc/effects/fshifter.cpp
795 alc/effects/modulator.cpp
797 alc/effects/pshifter.cpp
798 alc/effects/reverb.cpp
799 alc/effects/vmorpher.cpp
816 al/eax/fx_slot_index.cpp
817 al/eax/fx_slot_index.h
827 # Include SIMD mixers
828 set(CPU_EXTS "Default")
830 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse.cpp)
831 set(CPU_EXTS "${CPU_EXTS}, SSE")
834 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse2.cpp)
835 set(CPU_EXTS "${CPU_EXTS}, SSE2")
838 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse3.cpp)
839 set(CPU_EXTS "${CPU_EXTS}, SSE3")
842 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse41.cpp)
843 set(CPU_EXTS "${CPU_EXTS}, SSE4.1")
846 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_neon.cpp)
847 set(CPU_EXTS "${CPU_EXTS}, Neon")
859 set(HAVE_PORTAUDIO 0)
860 set(HAVE_PULSEAUDIO 0)
861 set(HAVE_COREAUDIO 0)
868 if(WIN32 OR HAVE_DLFCN_H)
870 macro(ADD_BACKEND_LIBS _LIBS)
873 set(IS_LINKED " (linked)")
874 macro(ADD_BACKEND_LIBS _LIBS)
875 set(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
880 set(ALC_OBJS ${ALC_OBJS}
881 alc/backends/base.cpp
883 # Default backends, always available
884 alc/backends/loopback.cpp
885 alc/backends/loopback.h
886 alc/backends/null.cpp
890 # Check PipeWire backend
891 option(ALSOFT_BACKEND_PIPEWIRE "Enable PipeWire backend" ON)
892 option(ALSOFT_REQUIRE_PIPEWIRE "Require PipeWire backend" OFF)
893 if(ALSOFT_BACKEND_PIPEWIRE AND PkgConfig_FOUND)
894 pkg_check_modules(PIPEWIRE libpipewire-0.3>=0.3.23)
897 set(BACKENDS "${BACKENDS} PipeWire${IS_LINKED},")
898 set(ALC_OBJS ${ALC_OBJS} alc/backends/pipewire.cpp alc/backends/pipewire.h)
899 add_backend_libs(${PIPEWIRE_LIBRARIES})
900 set(INC_PATHS ${INC_PATHS} ${PIPEWIRE_INCLUDE_DIRS})
903 if(ALSOFT_REQUIRE_PIPEWIRE AND NOT HAVE_PIPEWIRE)
904 message(FATAL_ERROR "Failed to enable required PipeWire backend")
907 # Check PulseAudio backend
908 option(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
909 option(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
910 if(ALSOFT_BACKEND_PULSEAUDIO)
911 find_package(PulseAudio)
913 set(HAVE_PULSEAUDIO 1)
914 set(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},")
915 set(ALC_OBJS ${ALC_OBJS} alc/backends/pulseaudio.cpp alc/backends/pulseaudio.h)
916 add_backend_libs(${PULSEAUDIO_LIBRARY})
917 set(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIR})
920 if(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
921 message(FATAL_ERROR "Failed to enable required PulseAudio backend")
926 option(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
927 option(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
928 if(ALSOFT_BACKEND_ALSA)
932 set(BACKENDS "${BACKENDS} ALSA${IS_LINKED},")
933 set(ALC_OBJS ${ALC_OBJS} alc/backends/alsa.cpp alc/backends/alsa.h)
934 add_backend_libs(${ALSA_LIBRARIES})
935 set(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS})
940 option(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
941 option(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
942 if(ALSOFT_BACKEND_OSS)
946 set(BACKENDS "${BACKENDS} OSS,")
947 set(ALC_OBJS ${ALC_OBJS} alc/backends/oss.cpp alc/backends/oss.h)
949 set(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS})
951 set(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS})
955 # Check Solaris backend
956 option(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
957 option(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
958 if(ALSOFT_BACKEND_SOLARIS)
959 find_package(AudioIO)
962 set(BACKENDS "${BACKENDS} Solaris,")
963 set(ALC_OBJS ${ALC_OBJS} alc/backends/solaris.cpp alc/backends/solaris.h)
964 set(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS})
968 # Check SndIO backend (disabled by default on non-BSDs)
970 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
972 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" OFF)
974 option(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
975 if(ALSOFT_BACKEND_SNDIO)
979 set(BACKENDS "${BACKENDS} SndIO (linked),")
980 set(ALC_OBJS ${ALC_OBJS} alc/backends/sndio.cpp alc/backends/sndio.h)
981 set(EXTRA_LIBS ${SNDIO_LIBRARIES} ${EXTRA_LIBS})
982 set(INC_PATHS ${INC_PATHS} ${SNDIO_INCLUDE_DIRS})
986 if(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
987 message(FATAL_ERROR "Failed to enable required ALSA backend")
989 if(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
990 message(FATAL_ERROR "Failed to enable required OSS backend")
992 if(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
993 message(FATAL_ERROR "Failed to enable required Solaris backend")
995 if(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
996 message(FATAL_ERROR "Failed to enable required SndIO backend")
999 # Check Windows-only backends
1002 # Check MMSystem backend
1003 option(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
1004 option(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
1005 if(ALSOFT_BACKEND_WINMM)
1007 set(BACKENDS "${BACKENDS} WinMM,")
1008 set(ALC_OBJS ${ALC_OBJS} alc/backends/winmm.cpp alc/backends/winmm.h)
1009 # There doesn't seem to be good way to search for winmm.lib for MSVC.
1010 # find_library doesn't find it without being told to look in a specific
1011 # place in the WindowsSDK, but it links anyway. If there ends up being
1012 # Windows targets without this, another means to detect it is needed.
1013 set(EXTRA_LIBS winmm ${EXTRA_LIBS})
1016 # Check DSound backend
1017 option(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
1018 option(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
1019 if(ALSOFT_BACKEND_DSOUND)
1020 check_include_file(dsound.h HAVE_DSOUND_H)
1022 find_path(DSOUND_INCLUDE_DIR NAMES "dsound.h"
1023 PATHS "${DXSDK_DIR}" PATH_SUFFIXES include
1024 DOC "The DirectSound include directory")
1026 if(HAVE_DSOUND_H OR DSOUND_INCLUDE_DIR)
1028 set(BACKENDS "${BACKENDS} DirectSound,")
1029 set(ALC_OBJS ${ALC_OBJS} alc/backends/dsound.cpp alc/backends/dsound.h)
1031 if(NOT HAVE_DSOUND_H)
1032 set(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIR})
1038 # Check for WASAPI backend
1039 option(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON)
1040 option(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF)
1041 if(ALSOFT_BACKEND_WASAPI)
1042 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1043 if(HAVE_MMDEVICEAPI_H)
1045 set(BACKENDS "${BACKENDS} WASAPI,")
1046 set(ALC_OBJS ${ALC_OBJS} alc/backends/wasapi.cpp alc/backends/wasapi.h)
1050 option(ALSOFT_BACKEND_OTHERIO "Enable OtherIO backend" ON)
1051 option(ALSOFT_REQUIRE_OTHERIO "Require OtherIO backend" OFF)
1052 if(ALSOFT_BACKEND_OTHERIO)
1054 set(BACKENDS "${BACKENDS} OtherIO,")
1055 set(ALC_OBJS ${ALC_OBJS} alc/backends/otherio.cpp alc/backends/otherio.h)
1058 if(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
1059 message(FATAL_ERROR "Failed to enable required WinMM backend")
1061 if(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
1062 message(FATAL_ERROR "Failed to enable required DSound backend")
1064 if(ALSOFT_REQUIRE_WASAPI AND NOT HAVE_WASAPI)
1065 message(FATAL_ERROR "Failed to enable required WASAPI backend")
1067 if(ALSOFT_REQUIRE_OTHERIO AND NOT HAVE_OTHERIO)
1068 message(FATAL_ERROR "Failed to enable required OtherIO backend")
1071 # Check JACK backend
1072 option(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
1073 option(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
1074 if(ALSOFT_BACKEND_JACK)
1078 set(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
1079 set(ALC_OBJS ${ALC_OBJS} alc/backends/jack.cpp alc/backends/jack.h)
1080 add_backend_libs(${JACK_LIBRARIES})
1081 set(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
1084 if(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
1085 message(FATAL_ERROR "Failed to enable required JACK backend")
1088 # Check CoreAudio backend
1089 option(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
1090 option(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
1091 if(ALSOFT_BACKEND_COREAUDIO)
1092 find_library(COREAUDIO_FRAMEWORK NAMES CoreAudio)
1093 find_path(AUDIOUNIT_INCLUDE_DIR NAMES AudioUnit/AudioUnit.h)
1094 if(COREAUDIO_FRAMEWORK AND AUDIOUNIT_INCLUDE_DIR)
1095 set(HAVE_COREAUDIO 1)
1096 set(ALC_OBJS ${ALC_OBJS} alc/backends/coreaudio.cpp alc/backends/coreaudio.h)
1097 set(BACKENDS "${BACKENDS} CoreAudio,")
1099 set(EXTRA_LIBS -Wl,-framework,CoreAudio ${EXTRA_LIBS})
1100 if(CMAKE_SYSTEM_NAME MATCHES "^(iOS|tvOS)$")
1101 find_library(COREFOUNDATION_FRAMEWORK NAMES CoreFoundation)
1102 if(COREFOUNDATION_FRAMEWORK)
1103 set(EXTRA_LIBS -Wl,-framework,CoreFoundation ${EXTRA_LIBS})
1106 set(EXTRA_LIBS -Wl,-framework,AudioUnit,-framework,ApplicationServices ${EXTRA_LIBS})
1109 # Some versions of OSX may need the AudioToolbox framework. Add it if
1111 find_library(AUDIOTOOLBOX_LIBRARY NAMES AudioToolbox)
1112 if(AUDIOTOOLBOX_LIBRARY)
1113 set(EXTRA_LIBS -Wl,-framework,AudioToolbox ${EXTRA_LIBS})
1116 set(INC_PATHS ${INC_PATHS} ${AUDIOUNIT_INCLUDE_DIR})
1119 if(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
1120 message(FATAL_ERROR "Failed to enable required CoreAudio backend")
1123 # Check for Oboe (Android) backend
1124 option(ALSOFT_BACKEND_OBOE "Enable Oboe backend" ON)
1125 option(ALSOFT_REQUIRE_OBOE "Require Oboe backend" OFF)
1126 if(ALSOFT_BACKEND_OBOE)
1129 set(OBOE_SOURCE "" CACHE STRING "Source directory for Oboe.")
1131 add_subdirectory(${OBOE_SOURCE} ./oboe EXCLUDE_FROM_ALL)
1132 set(OBOE_TARGET oboe)
1134 find_package(oboe CONFIG)
1135 if(NOT TARGET oboe::oboe)
1138 if(TARGET oboe::oboe)
1139 set(OBOE_TARGET "oboe::oboe")
1146 set(ALC_OBJS ${ALC_OBJS} alc/backends/oboe.cpp alc/backends/oboe.h)
1147 set(BACKENDS "${BACKENDS} Oboe,")
1148 set(EXTRA_LIBS ${OBOE_TARGET} ${EXTRA_LIBS})
1151 if(ALSOFT_REQUIRE_OBOE AND NOT HAVE_OBOE)
1152 message(FATAL_ERROR "Failed to enable required Oboe backend")
1155 # Check for OpenSL (Android) backend
1156 option(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
1157 option(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
1158 if(ALSOFT_BACKEND_OPENSL)
1159 find_package(OpenSL)
1162 set(ALC_OBJS ${ALC_OBJS} alc/backends/opensl.cpp alc/backends/opensl.h)
1163 set(BACKENDS "${BACKENDS} OpenSL,")
1164 set(EXTRA_LIBS ${OPENSL_LIBRARIES} ${EXTRA_LIBS})
1165 set(INC_PATHS ${INC_PATHS} ${OPENSL_INCLUDE_DIRS})
1168 if(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
1169 message(FATAL_ERROR "Failed to enable required OpenSL backend")
1172 # Check PortAudio backend
1173 option(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
1174 option(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
1175 if(ALSOFT_BACKEND_PORTAUDIO)
1176 find_package(PortAudio)
1178 set(HAVE_PORTAUDIO 1)
1179 set(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},")
1180 set(ALC_OBJS ${ALC_OBJS} alc/backends/portaudio.cpp alc/backends/portaudio.h)
1181 add_backend_libs(${PORTAUDIO_LIBRARIES})
1182 set(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS})
1185 if(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
1186 message(FATAL_ERROR "Failed to enable required PortAudio backend")
1189 # Check for SDL2 backend
1190 # Off by default, since it adds a runtime dependency
1191 option(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF)
1192 option(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF)
1193 if(ALSOFT_BACKEND_SDL2)
1196 set(ALC_OBJS ${ALC_OBJS} alc/backends/sdl2.cpp alc/backends/sdl2.h)
1197 set(BACKENDS "${BACKENDS} SDL2,")
1198 set(EXTRA_LIBS ${EXTRA_LIBS} SDL2::SDL2)
1200 message(STATUS "Could NOT find SDL2")
1203 if(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND)
1204 message(FATAL_ERROR "Failed to enable required SDL2 backend")
1207 # Optionally enable the Wave Writer backend
1208 option(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
1209 if(ALSOFT_BACKEND_WAVE)
1211 set(ALC_OBJS ${ALC_OBJS} alc/backends/wave.cpp alc/backends/wave.h)
1212 set(BACKENDS "${BACKENDS} WaveFile,")
1215 # This is always available
1216 set(BACKENDS "${BACKENDS} Null")
1220 if(ALSOFT_UPDATE_BUILD_VERSION AND GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
1221 set(GIT_DIR "${OpenAL_SOURCE_DIR}/.git")
1223 # Check if this is a submodule, if it is then find the .git directory
1224 if(NOT IS_DIRECTORY "${OpenAL_SOURCE_DIR}/.git")
1225 file(READ ${GIT_DIR} submodule)
1226 string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE ${submodule})
1227 string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
1228 get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
1229 get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
1232 # Get the current working branch and its latest abbreviated commit hash
1233 add_custom_command(OUTPUT "${OpenAL_BINARY_DIR}/version_witness.txt"
1234 BYPRODUCTS "${OpenAL_BINARY_DIR}/version.h"
1235 COMMAND ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE} -D LIB_VERSION=${LIB_VERSION}
1236 -D LIB_VERSION_NUM=${LIB_VERSION_NUM} -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
1237 -D DST=${OpenAL_BINARY_DIR}/version.h -P ${OpenAL_SOURCE_DIR}/version.cmake
1238 COMMAND ${CMAKE_COMMAND} -E touch "${OpenAL_BINARY_DIR}/version_witness.txt"
1239 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1240 MAIN_DEPENDENCY "${OpenAL_SOURCE_DIR}/version.h.in"
1241 DEPENDS "${GIT_DIR}/index" "${OpenAL_SOURCE_DIR}/version.cmake"
1245 add_custom_target(build_version DEPENDS "${OpenAL_BINARY_DIR}/version_witness.txt")
1247 set(GIT_BRANCH "UNKNOWN")
1248 set(GIT_COMMIT_HASH "unknown")
1250 "${OpenAL_SOURCE_DIR}/version.h.in"
1251 "${OpenAL_BINARY_DIR}/version.h")
1255 option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" ON)
1256 if(ALSOFT_EMBED_HRTF_DATA)
1257 macro(make_hrtf_header FILENAME VARNAME)
1258 set(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}")
1259 set(outfile "${OpenAL_BINARY_DIR}/${VARNAME}.txt")
1261 add_custom_command(OUTPUT "${outfile}"
1262 COMMAND ${CMAKE_COMMAND} -D "INPUT_FILE=${infile}" -D "OUTPUT_FILE=${outfile}"
1263 -P "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1264 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1265 DEPENDS "${infile}" "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1268 set(ALC_OBJS ${ALC_OBJS} "${outfile}")
1271 make_hrtf_header("Default HRTF.mhr" "default_hrtf")
1276 find_package(MySOFA)
1277 if(NOT ALSOFT_NO_CONFIG_UTIL)
1278 find_package(Qt5Widgets QUIET)
1279 if(NOT Qt5Widgets_FOUND)
1280 message(STATUS "Could NOT find Qt5Widgets")
1284 if(ALSOFT_UTILS OR ALSOFT_EXAMPLES)
1285 find_package(SndFile)
1287 find_package(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
1292 set(LIBNAME "openal")
1294 set(LIBNAME "OpenAL32")
1297 # Needed for openal.pc.in
1298 set(prefix ${CMAKE_INSTALL_PREFIX})
1299 set(exec_prefix "\${prefix}")
1300 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
1301 set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
1302 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
1303 set(PACKAGE_VERSION "${LIB_VERSION}")
1304 set(PKG_CONFIG_CFLAGS )
1305 set(PKG_CONFIG_PRIVATE_LIBS )
1306 if(LIBTYPE STREQUAL "STATIC")
1307 set(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC)
1308 foreach(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1309 # If this is already a linker flag, or is a full path+file, add it
1310 # as-is. If it's an SDL2 target, add the link flag for it. Otherwise,
1311 # it's a name intended to be dressed as -lname.
1312 if(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}")
1313 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}")
1314 elseif(FLAG MATCHES "^SDL2::SDL2")
1315 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -lSDL2")
1317 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}")
1324 "${OpenAL_SOURCE_DIR}/config.h.in"
1325 "${OpenAL_BINARY_DIR}/config.h")
1327 "${OpenAL_SOURCE_DIR}/openal.pc.in"
1328 "${OpenAL_BINARY_DIR}/openal.pc"
1332 add_library(alcommon STATIC EXCLUDE_FROM_ALL ${COMMON_OBJS})
1333 target_include_directories(alcommon PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/include
1334 PUBLIC ${OpenAL_SOURCE_DIR}/common)
1335 target_compile_definitions(alcommon PRIVATE ${CPP_DEFS})
1336 target_compile_options(alcommon PRIVATE ${C_FLAGS})
1337 set_target_properties(alcommon PROPERTIES ${DEFAULT_TARGET_PROPS} POSITION_INDEPENDENT_CODE TRUE)
1341 set(IMPL_TARGET OpenAL) # Either OpenAL or soft_oal.
1343 # Build main library
1344 if(LIBTYPE STREQUAL "STATIC")
1345 add_library(${IMPL_TARGET} STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS})
1346 target_compile_definitions(${IMPL_TARGET} PUBLIC AL_LIBTYPE_STATIC)
1347 target_link_libraries(${IMPL_TARGET} PRIVATE ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1350 # This option is for static linking OpenAL Soft into another project
1351 # that already defines the IDs. It is up to that project to ensure all
1352 # required IDs are defined.
1353 option(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
1354 if(ALSOFT_NO_UID_DEFS)
1355 target_compile_definitions(${IMPL_TARGET} PRIVATE AL_NO_UID_DEFS)
1359 set(RC_CONFIG resources/openal32.rc)
1360 if(WIN32 AND ALSOFT_BUILD_ROUTER)
1361 add_library(OpenAL SHARED
1368 target_compile_definitions(OpenAL
1369 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES "ALC_API=${EXPORT_DECL}"
1370 "AL_API=${EXPORT_DECL}" ${CPP_DEFS})
1371 target_compile_options(OpenAL PRIVATE ${C_FLAGS})
1372 target_link_libraries(OpenAL PRIVATE alcommon ${LINKER_FLAGS})
1373 target_include_directories(OpenAL
1375 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1376 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1378 ${OpenAL_SOURCE_DIR}/common
1379 ${OpenAL_BINARY_DIR}
1381 set_target_properties(OpenAL PROPERTIES ${DEFAULT_TARGET_PROPS} PREFIX ""
1382 OUTPUT_NAME ${LIBNAME})
1383 if(TARGET build_version)
1384 add_dependencies(OpenAL build_version)
1388 set(LIBNAME "soft_oal")
1389 set(IMPL_TARGET soft_oal)
1390 set(RC_CONFIG resources/soft_oal.rc)
1393 # !important: for osx framework public header works, the headers must be in
1395 set(TARGET_PUBLIC_HEADERS include/AL/al.h include/AL/alc.h include/AL/alext.h include/AL/efx.h
1396 include/AL/efx-presets.h)
1398 add_library(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS} ${RC_CONFIG}
1399 ${TARGET_PUBLIC_HEADERS})
1401 set_target_properties(${IMPL_TARGET} PROPERTIES PREFIX "")
1403 target_link_libraries(${IMPL_TARGET} PRIVATE alcommon ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1406 set(ALSOFT_CPPWINRT_VERSION "2.0.230706.1" CACHE STRING "The soft-oal default cppwinrt version")
1408 find_program(NUGET_EXE NAMES nuget)
1410 message("NUGET.EXE not found.")
1411 message(FATAL_ERROR "Please install this executable, and run CMake again.")
1414 exec_program(${NUGET_EXE}
1415 ARGS install "Microsoft.Windows.CppWinRT" -Version ${ALSOFT_CPPWINRT_VERSION} -ExcludeVersion -OutputDirectory "\"${CMAKE_BINARY_DIR}/packages\"")
1417 set_target_properties(${IMPL_TARGET} PROPERTIES
1418 VS_PROJECT_IMPORT ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.props
1420 target_link_libraries(${IMPL_TARGET} PRIVATE ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.targets)
1423 if(NOT WIN32 AND NOT APPLE)
1424 # FIXME: This doesn't put a dependency on the version script. Changing
1425 # the version script will not cause a relink as it should.
1426 target_link_options(${IMPL_TARGET} PRIVATE
1427 "-Wl,--version-script=${OpenAL_SOURCE_DIR}/libopenal.version")
1430 if(APPLE AND ALSOFT_OSX_FRAMEWORK)
1431 # Sets framework name to soft_oal to avoid ambiguity with the system OpenAL.framework
1432 set(LIBNAME "soft_oal")
1434 execute_process(COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD
1436 OUTPUT_VARIABLE BUNDLE_VERSION
1437 OUTPUT_STRIP_TRAILING_WHITESPACE)
1439 set(BUNDLE_VERSION 1)
1442 # Build: Fix rpath in iOS shared libraries
1443 # If this flag is not set, the final dylib binary ld path will be
1444 # /User/xxx/*/soft_oal.framework/soft_oal, which can't be loaded by iOS devices.
1445 # See also: https://github.com/libjpeg-turbo/libjpeg-turbo/commit/c80ddef7a4ce21ace9e3ca0fd190d320cc8cdaeb
1446 if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
1447 set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
1450 set_target_properties(${IMPL_TARGET} PROPERTIES
1453 MACOSX_FRAMEWORK_NAME "${IMPL_TARGET}"
1454 MACOSX_FRAMEWORK_IDENTIFIER "org.openal-soft.openal"
1455 MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${LIB_VERSION}"
1456 MACOSX_FRAMEWORK_BUNDLE_VERSION "${BUNDLE_VERSION}"
1457 XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
1458 XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
1459 XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
1460 PUBLIC_HEADER "${TARGET_PUBLIC_HEADERS}"
1465 target_include_directories(${IMPL_TARGET}
1467 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1469 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include/AL>
1470 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1471 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/AL>
1474 ${OpenAL_BINARY_DIR}
1475 ${OpenAL_SOURCE_DIR}
1476 ${OpenAL_SOURCE_DIR}/common
1479 set_target_properties(${IMPL_TARGET} PROPERTIES ${DEFAULT_TARGET_PROPS}
1480 OUTPUT_NAME ${LIBNAME}
1481 VERSION ${LIB_VERSION}
1482 SOVERSION ${LIB_MAJOR_VERSION}
1484 target_compile_definitions(${IMPL_TARGET}
1485 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES $<$<BOOL:${ALSOFT_EAX}>:ALSOFT_EAX>
1486 "ALC_API=${EXPORT_DECL}" "AL_API=${EXPORT_DECL}" ${CPP_DEFS})
1487 target_compile_options(${IMPL_TARGET} PRIVATE ${C_FLAGS})
1489 if(TARGET build_version)
1490 add_dependencies(${IMPL_TARGET} build_version)
1493 if(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC")
1494 find_program(SED_EXECUTABLE NAMES sed DOC "sed executable")
1495 if(NOT SED_EXECUTABLE OR NOT CMAKE_DLLTOOL)
1497 if(NOT SED_EXECUTABLE)
1498 message(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
1500 if(NOT CMAKE_DLLTOOL)
1501 message(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
1504 target_link_options(OpenAL PRIVATE "-Wl,--output-def,${PROJECT_BINARY_DIR}/OpenAL32.def")
1505 add_custom_command(TARGET OpenAL POST_BUILD
1506 COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def
1507 COMMAND "${CMAKE_DLLTOOL}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll
1508 # Technically OpenAL32.def was created by the build, but cmake
1509 # doesn't recognize it due to -Wl,--output-def,OpenAL32.def being
1510 # manually specified. But declaring the file here allows it to be
1511 # properly cleaned, e.g. during make clean.
1512 BYPRODUCTS OpenAL32.def OpenAL32.lib
1513 COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..."
1521 message(STATUS "Building DLL router")
1525 message(STATUS "Building OpenAL with support for the following backends:")
1526 message(STATUS " ${BACKENDS}")
1528 message(STATUS "Building with support for CPU extensions:")
1529 message(STATUS " ${CPU_EXTS}")
1532 message(STATUS "Building with SSE${FPMATH_SET} codegen")
1536 message(STATUS "Building with UWP support")
1540 message(STATUS "Building with legacy EAX extension support")
1544 if(ALSOFT_EMBED_HRTF_DATA)
1545 message(STATUS "Embedding HRTF datasets")
1549 # An alias for sub-project builds
1550 add_library(OpenAL::OpenAL ALIAS OpenAL)
1552 # Install main library
1554 configure_package_config_file(OpenALConfig.cmake.in OpenALConfig.cmake
1555 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL)
1556 install(TARGETS OpenAL EXPORT OpenAL
1557 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1558 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1559 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1560 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
1561 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL)
1562 export(TARGETS OpenAL
1564 FILE OpenALTargets.cmake)
1565 install(EXPORT OpenAL
1566 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL
1568 FILE OpenALTargets.cmake)
1569 install(DIRECTORY include/AL
1570 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1571 install(FILES "${OpenAL_BINARY_DIR}/openal.pc"
1572 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
1573 install(FILES "${OpenAL_BINARY_DIR}/OpenALConfig.cmake"
1574 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL")
1576 install(TARGETS soft_oal
1577 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1579 message(STATUS "Installing library and headers")
1581 message(STATUS "NOT installing library and headers")
1584 if(ALSOFT_INSTALL_CONFIG)
1585 install(FILES alsoftrc.sample
1586 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1587 message(STATUS "Installing sample configuration")
1590 if(ALSOFT_INSTALL_HRTF_DATA)
1591 install(DIRECTORY hrtf
1592 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1593 message(STATUS "Installing HRTF data files")
1596 if(ALSOFT_INSTALL_AMBDEC_PRESETS)
1597 install(DIRECTORY presets
1598 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1599 message(STATUS "Installing AmbDec presets")
1605 set(UNICODE_FLAG ${UNICODE_FLAG} -municode)
1607 set(EXTRA_INSTALLS )
1609 add_executable(openal-info utils/openal-info.c)
1610 target_include_directories(openal-info PRIVATE ${OpenAL_SOURCE_DIR}/common)
1611 target_compile_options(openal-info PRIVATE ${C_FLAGS})
1612 target_link_libraries(openal-info PRIVATE ${LINKER_FLAGS} OpenAL ${UNICODE_FLAG})
1613 set_target_properties(openal-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1614 if(ALSOFT_INSTALL_EXAMPLES)
1615 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} openal-info)
1619 add_executable(uhjdecoder utils/uhjdecoder.cpp)
1620 target_compile_definitions(uhjdecoder PRIVATE ${CPP_DEFS})
1621 target_include_directories(uhjdecoder
1622 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1623 target_compile_options(uhjdecoder PRIVATE ${C_FLAGS})
1624 target_link_libraries(uhjdecoder PUBLIC alcommon
1625 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1626 set_target_properties(uhjdecoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1628 add_executable(uhjencoder utils/uhjencoder.cpp)
1629 target_compile_definitions(uhjencoder PRIVATE ${CPP_DEFS})
1630 target_include_directories(uhjencoder
1631 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1632 target_compile_options(uhjencoder PRIVATE ${C_FLAGS})
1633 target_link_libraries(uhjencoder PUBLIC alcommon
1634 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1635 set_target_properties(uhjencoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1639 set(SOFA_SUPPORT_SRCS
1640 utils/sofa-support.cpp
1641 utils/sofa-support.h)
1642 add_library(sofa-support STATIC EXCLUDE_FROM_ALL ${SOFA_SUPPORT_SRCS})
1643 target_compile_definitions(sofa-support PRIVATE ${CPP_DEFS})
1644 target_include_directories(sofa-support PUBLIC ${OpenAL_SOURCE_DIR}/common)
1645 target_compile_options(sofa-support PRIVATE ${C_FLAGS})
1646 target_link_libraries(sofa-support PUBLIC alcommon MySOFA::MySOFA PRIVATE ${LINKER_FLAGS})
1647 set_target_properties(sofa-support PROPERTIES ${DEFAULT_TARGET_PROPS})
1650 utils/makemhr/loaddef.cpp
1651 utils/makemhr/loaddef.h
1652 utils/makemhr/loadsofa.cpp
1653 utils/makemhr/loadsofa.h
1654 utils/makemhr/makemhr.cpp
1655 utils/makemhr/makemhr.h)
1656 add_executable(makemhr ${MAKEMHR_SRCS})
1657 target_compile_definitions(makemhr PRIVATE ${CPP_DEFS})
1658 target_include_directories(makemhr
1659 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/utils)
1660 target_compile_options(makemhr PRIVATE ${C_FLAGS})
1661 target_link_libraries(makemhr PRIVATE ${LINKER_FLAGS} sofa-support ${UNICODE_FLAG})
1662 set_target_properties(makemhr PROPERTIES ${DEFAULT_TARGET_PROPS})
1663 if(ALSOFT_INSTALL_EXAMPLES)
1664 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} makemhr)
1667 set(SOFAINFO_SRCS utils/sofa-info.cpp)
1668 add_executable(sofa-info ${SOFAINFO_SRCS})
1669 target_compile_definitions(sofa-info PRIVATE ${CPP_DEFS})
1670 target_include_directories(sofa-info PRIVATE ${OpenAL_SOURCE_DIR}/utils)
1671 target_compile_options(sofa-info PRIVATE ${C_FLAGS})
1672 target_link_libraries(sofa-info PRIVATE ${LINKER_FLAGS} sofa-support ${UNICODE_FLAG})
1673 set_target_properties(sofa-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1675 message(STATUS "Building utility programs")
1677 if(NOT ALSOFT_NO_CONFIG_UTIL)
1678 add_subdirectory(utils/alsoft-config)
1684 # Add a static library with common functions used by multiple example targets
1685 add_library(al-excommon STATIC EXCLUDE_FROM_ALL
1686 examples/common/alhelpers.c
1687 examples/common/alhelpers.h)
1688 target_compile_definitions(al-excommon PUBLIC ${CPP_DEFS})
1689 target_include_directories(al-excommon PUBLIC ${OpenAL_SOURCE_DIR}/common)
1690 target_compile_options(al-excommon PUBLIC ${C_FLAGS})
1691 target_link_libraries(al-excommon PUBLIC OpenAL PRIVATE ${RT_LIB})
1692 set_target_properties(al-excommon PROPERTIES ${DEFAULT_TARGET_PROPS})
1695 add_executable(altonegen examples/altonegen.c)
1696 target_link_libraries(altonegen PRIVATE ${LINKER_FLAGS} ${MATH_LIB} al-excommon ${UNICODE_FLAG})
1697 set_target_properties(altonegen PROPERTIES ${DEFAULT_TARGET_PROPS})
1699 add_executable(alrecord examples/alrecord.c)
1700 target_link_libraries(alrecord PRIVATE ${LINKER_FLAGS} al-excommon ${UNICODE_FLAG})
1701 set_target_properties(alrecord PROPERTIES ${DEFAULT_TARGET_PROPS})
1703 add_executable(allafplay examples/allafplay.cpp)
1704 target_link_libraries(allafplay PRIVATE ${LINKER_FLAGS} alcommon al-excommon ${UNICODE_FLAG})
1705 set_target_properties(allafplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1707 if(ALSOFT_INSTALL_EXAMPLES)
1708 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} altonegen alrecord allafplay)
1711 message(STATUS "Building example programs")
1714 add_executable(alplay examples/alplay.c)
1715 target_link_libraries(alplay PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1717 set_target_properties(alplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1719 add_executable(alstream examples/alstream.c)
1720 target_link_libraries(alstream PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1722 set_target_properties(alstream PROPERTIES ${DEFAULT_TARGET_PROPS})
1724 add_executable(alreverb examples/alreverb.c)
1725 target_link_libraries(alreverb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1727 set_target_properties(alreverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1729 add_executable(almultireverb examples/almultireverb.c)
1730 target_link_libraries(almultireverb
1731 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1732 set_target_properties(almultireverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1734 add_executable(allatency examples/allatency.c)
1735 target_link_libraries(allatency PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1737 set_target_properties(allatency PROPERTIES ${DEFAULT_TARGET_PROPS})
1739 add_executable(alhrtf examples/alhrtf.c)
1740 target_link_libraries(alhrtf
1741 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1742 set_target_properties(alhrtf PROPERTIES ${DEFAULT_TARGET_PROPS})
1744 add_executable(alstreamcb examples/alstreamcb.cpp)
1745 target_link_libraries(alstreamcb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1747 set_target_properties(alstreamcb PROPERTIES ${DEFAULT_TARGET_PROPS})
1749 add_executable(aldirect examples/aldirect.cpp)
1750 target_link_libraries(aldirect PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1752 set_target_properties(aldirect PROPERTIES ${DEFAULT_TARGET_PROPS})
1754 add_executable(alconvolve examples/alconvolve.c)
1755 target_link_libraries(alconvolve PRIVATE ${LINKER_FLAGS} alcommon SndFile::SndFile
1756 al-excommon ${UNICODE_FLAG})
1757 set_target_properties(alconvolve PROPERTIES ${DEFAULT_TARGET_PROPS})
1759 if(ALSOFT_INSTALL_EXAMPLES)
1760 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alplay alstream alreverb almultireverb allatency
1764 message(STATUS "Building SndFile example programs")
1768 add_executable(alloopback examples/alloopback.c)
1769 target_link_libraries(alloopback
1770 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 al-excommon ${MATH_LIB})
1771 set_target_properties(alloopback PROPERTIES ${DEFAULT_TARGET_PROPS})
1773 if(ALSOFT_INSTALL_EXAMPLES)
1774 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alloopback)
1777 message(STATUS "Building SDL example programs")
1782 if(AVFORMAT_VERSION VERSION_LESS "59.27.100")
1783 message(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 59.27.100)")
1786 if(AVCODEC_VERSION VERSION_LESS "59.37.100")
1787 message(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 59.37.100)")
1790 if(AVUTIL_VERSION VERSION_LESS "57.28.100")
1791 message(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 57.28.100)")
1794 if(SWSCALE_VERSION VERSION_LESS "6.7.100")
1795 message(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 6.7.100)")
1798 if(SWRESAMPLE_VERSION VERSION_LESS "4.7.100")
1799 message(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 4.7.100)")
1804 add_executable(alffplay examples/alffplay.cpp)
1805 target_include_directories(alffplay PRIVATE ${FFMPEG_INCLUDE_DIRS})
1806 target_link_libraries(alffplay
1807 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 ${FFMPEG_LIBRARIES} al-excommon)
1808 set_target_properties(alffplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1810 if(ALSOFT_INSTALL_EXAMPLES)
1811 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alffplay)
1813 message(STATUS "Building SDL+FFmpeg example programs")
1820 add_subdirectory(tests)
1824 install(TARGETS ${EXTRA_INSTALLS}
1825 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1826 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
1827 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1828 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})