1 # CMake build file list for OpenAL
3 cmake_minimum_required(VERSION 3.13)
7 # The workaround for try_compile failing with code signing
8 # since cmake-3.18.2, not required
9 set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
10 ${CMAKE_TRY_COMPILE_PLATFORM_VARIABLES}
11 "CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED"
12 "CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED")
13 set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO)
14 set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED NO)
17 if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
18 # Fix compile failure with armv7 deployment target >= 11.0, xcode clang
20 # error: invalid iOS deployment version '--target=armv7-apple-ios13.6',
21 # iOS 10 is the maximum deployment target for 32-bit targets
22 # If CMAKE_OSX_DEPLOYMENT_TARGET is not defined, cmake will choose latest
24 if("${CMAKE_OSX_ARCHITECTURES}" MATCHES ".*armv7.*")
25 if(NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET
26 OR NOT CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "11.0")
27 message(STATUS "Forcing iOS deployment target to 10.0 for armv7")
28 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0" CACHE STRING "Minimum OS X deployment version"
32 elseif(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
36 if(COMMAND CMAKE_POLICY)
37 cmake_policy(SET CMP0003 NEW)
38 cmake_policy(SET CMP0005 NEW)
40 cmake_policy(SET CMP0020 NEW)
43 cmake_policy(SET CMP0042 NEW)
46 cmake_policy(SET CMP0054 NEW)
49 cmake_policy(SET CMP0058 NEW)
52 cmake_policy(SET CMP0063 NEW)
55 cmake_policy(SET CMP0075 NEW)
58 cmake_policy(SET CMP0092 NEW)
61 cmake_policy(SET CMP0117 NEW)
63 endif(COMMAND CMAKE_POLICY)
67 if(NOT CMAKE_BUILD_TYPE)
68 set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
69 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
72 if(NOT CMAKE_DEBUG_POSTFIX)
73 set(CMAKE_DEBUG_POSTFIX "" CACHE STRING
74 "Library postfix for debug builds. Normally left blank."
78 set(DEFAULT_TARGET_PROPS
81 CXX_STANDARD_REQUIRED TRUE
82 # Prefer C11, but support C99 and earlier when possible.
85 set(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
87 include(CheckFunctionExists)
88 include(CheckLibraryExists)
89 include(CheckIncludeFile)
90 include(CheckIncludeFiles)
91 include(CheckSymbolExists)
92 include(CheckCCompilerFlag)
93 include(CheckCXXCompilerFlag)
94 include(CheckCSourceCompiles)
95 include(CheckCXXSourceCompiles)
96 include(CheckStructHasMember)
97 include(CMakePackageConfigHelpers)
98 include(GNUInstallDirs)
100 find_package(PkgConfig)
101 find_package(SDL2 QUIET)
104 option(ALSOFT_DLOPEN "Check for the dlopen API for loading optional libs" ON)
106 option(ALSOFT_WERROR "Treat compile warnings as errors" OFF)
108 option(ALSOFT_UTILS "Build utility programs" ON)
109 option(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
111 option(ALSOFT_EXAMPLES "Build example programs" ON)
112 option(ALSOFT_TESTS "Build test programs" OFF)
114 option(ALSOFT_INSTALL "Install main library" ON)
115 option(ALSOFT_INSTALL_CONFIG "Install alsoft.conf sample configuration file" ON)
116 option(ALSOFT_INSTALL_HRTF_DATA "Install HRTF data files" ON)
117 option(ALSOFT_INSTALL_AMBDEC_PRESETS "Install AmbDec preset files" ON)
118 option(ALSOFT_INSTALL_EXAMPLES "Install example programs (alplay, alstream, ...)" ON)
119 option(ALSOFT_INSTALL_UTILS "Install utility programs (openal-info, alsoft-config, ...)" ON)
120 option(ALSOFT_UPDATE_BUILD_VERSION "Update git build version info" ON)
122 option(ALSOFT_EAX "Enable legacy EAX extensions" ${WIN32})
124 option(ALSOFT_SEARCH_INSTALL_DATADIR "Search the installation data directory" OFF)
125 if(ALSOFT_SEARCH_INSTALL_DATADIR)
126 set(ALSOFT_INSTALL_DATADIR ${CMAKE_INSTALL_FULL_DATADIR})
129 if(DEFINED SHARE_INSTALL_DIR)
130 message(WARNING "SHARE_INSTALL_DIR is deprecated. Use the variables provided by the GNUInstallDirs module instead")
131 set(CMAKE_INSTALL_DATADIR "${SHARE_INSTALL_DIR}")
134 if(DEFINED LIB_SUFFIX)
135 message(WARNING "LIB_SUFFIX is deprecated. Use the variables provided by the GNUInstallDirs module instead")
137 if(DEFINED ALSOFT_CONFIG)
138 message(WARNING "ALSOFT_CONFIG is deprecated. Use ALSOFT_INSTALL_CONFIG instead")
140 if(DEFINED ALSOFT_HRTF_DEFS)
141 message(WARNING "ALSOFT_HRTF_DEFS is deprecated. Use ALSOFT_INSTALL_HRTF_DATA instead")
143 if(DEFINED ALSOFT_AMBDEC_PRESETS)
144 message(WARNING "ALSOFT_AMBDEC_PRESETS is deprecated. Use ALSOFT_INSTALL_AMBDEC_PRESETS instead")
148 set(CPP_DEFS ) # C pre-processor, not C++
152 set(LINKER_FLAGS_DEBUG )
153 set(LINKER_FLAGS_RELEASE )
157 set(CPP_DEFS ${CPP_DEFS} _WIN32 NOMINMAX)
159 set(CPP_DEFS ${CPP_DEFS} __USE_MINGW_ANSI_STDIO)
162 option(ALSOFT_BUILD_ROUTER "Build the router (EXPERIMENTAL; creates OpenAL32.dll and soft_oal.dll)" OFF)
164 option(ALSOFT_BUILD_IMPORT_LIB "Build an import .lib using dlltool (requires sed)" ON)
167 option(ALSOFT_OSX_FRAMEWORK "Build as macOS framework" OFF)
171 # QNX's gcc do not uses /usr/include and /usr/lib paths by default
172 if("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
173 set(INC_PATHS ${INC_PATHS} /usr/include)
174 set(LINKER_FLAGS ${LINKER_FLAGS} -L/usr/lib)
177 # When the library is built for static linking, apps should define
178 # AL_LIBTYPE_STATIC when including the AL headers.
183 set(LIB_MAJOR_VERSION "1")
184 set(LIB_MINOR_VERSION "23")
185 set(LIB_REVISION "1")
186 set(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
187 set(LIB_VERSION_NUM ${LIB_MAJOR_VERSION},${LIB_MINOR_VERSION},${LIB_REVISION},0)
192 # Some systems erroneously require the __STDC_FORMAT_MACROS macro to be defined
193 # to get the fixed-width integer type formatter macros.
194 check_cxx_source_compiles("#include <cinttypes>
199 std::printf(\"%\" PRId64, i64);
201 HAVE_STDC_FORMAT_MACROS)
202 if(NOT HAVE_STDC_FORMAT_MACROS)
203 set(CPP_DEFS ${CPP_DEFS} __STDC_FORMAT_MACROS)
207 # Check if _POSIX_C_SOURCE and _XOPEN_SOURCE needs to be set for POSIX functions
208 check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_DEFAULT)
209 if(NOT HAVE_POSIX_MEMALIGN_DEFAULT)
210 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
211 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600")
212 check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_POSIX)
213 if(NOT HAVE_POSIX_MEMALIGN_POSIX)
214 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
216 set(CPP_DEFS ${CPP_DEFS} _POSIX_C_SOURCE=200112L _XOPEN_SOURCE=600)
219 unset(OLD_REQUIRED_FLAGS)
222 # C99 has restrict, but C++ does not, so we can only utilize __restrict.
223 check_cxx_source_compiles("int *__restrict foo;
224 int main() { return 0; }" HAVE___RESTRICT)
226 set(CPP_DEFS ${CPP_DEFS} RESTRICT=__restrict)
228 set(CPP_DEFS ${CPP_DEFS} "RESTRICT=")
231 # Some systems may need libatomic for atomic functions to work
232 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
233 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES} atomic)
234 check_cxx_source_compiles("#include <atomic>
235 std::atomic<int> foo{0};
236 int main() { return foo.fetch_add(2); }"
238 if(NOT HAVE_LIBATOMIC)
239 set(CMAKE_REQUIRED_LIBRARIES "${OLD_REQUIRED_LIBRARIES}")
241 set(EXTRA_LIBS atomic ${EXTRA_LIBS})
243 unset(OLD_REQUIRED_LIBRARIES)
246 # Include liblog for Android logging
247 check_library_exists(log __android_log_print "" HAVE_LIBLOG)
249 set(EXTRA_LIBS log ${EXTRA_LIBS})
250 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} log)
255 set(CPP_DEFS ${CPP_DEFS} _CRT_SECURE_NO_WARNINGS)
256 check_cxx_compiler_flag(/permissive- HAVE_PERMISSIVE_SWITCH)
257 if(HAVE_PERMISSIVE_SWITCH)
258 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:/permissive->)
260 set(C_FLAGS ${C_FLAGS} /W4 /w14640 /wd4065 /wd4127 /wd4268 /wd4324 /wd5030 /wd5051)
263 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
265 string(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
268 message(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
271 option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
272 if(FORCE_STATIC_VCRT)
274 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
275 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
276 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
277 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
278 if(${flag_var} MATCHES "/MD")
279 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
284 set(C_FLAGS ${C_FLAGS} -Winline -Wunused -Wall -Wextra -Wshadow -Wconversion -Wcast-align
286 $<$<COMPILE_LANGUAGE:CXX>:-Wold-style-cast -Wnon-virtual-dtor -Woverloaded-virtual>)
288 check_cxx_compiler_flag(-Wno-c++20-attribute-extensions HAVE_WNO_CXX20_ATTR_EXT)
289 if(HAVE_WNO_CXX20_ATTR_EXT)
290 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-attribute-extensions>)
292 check_cxx_compiler_flag(-Wno-c++20-extensions HAVE_WNO_CXX20_EXT)
293 if(HAVE_WNO_CXX20_EXT)
294 set(C_FLAGS ${C_FLAGS} $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-extensions>)
299 set(C_FLAGS ${C_FLAGS} -Werror)
302 # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
304 foreach(flag_var CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
305 if(${flag_var} MATCHES "-DNDEBUG")
306 string(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
310 check_c_compiler_flag(-fno-math-errno HAVE_FNO_MATH_ERRNO)
311 if(HAVE_FNO_MATH_ERRNO)
312 set(C_FLAGS ${C_FLAGS} -fno-math-errno)
315 option(ALSOFT_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
316 if(ALSOFT_STATIC_LIBGCC)
317 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
318 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
319 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBGCC_SWITCH)
320 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
321 unset(OLD_REQUIRED_LIBRARIES)
323 if(NOT HAVE_STATIC_LIBGCC_SWITCH)
324 message(FATAL_ERROR "Cannot static link libgcc")
326 set(LINKER_FLAGS ${LINKER_FLAGS} -static-libgcc)
329 option(ALSOFT_STATIC_STDCXX "Static link libstdc++" OFF)
330 if(ALSOFT_STATIC_STDCXX)
331 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
332 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-static-libstdc++")
333 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBSTDCXX_SWITCH)
334 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
335 unset(OLD_REQUIRED_LIBRARIES)
337 if(NOT HAVE_STATIC_LIBSTDCXX_SWITCH)
338 message(FATAL_ERROR "Cannot static link libstdc++")
340 set(LINKER_FLAGS ${LINKER_FLAGS} "-static-libstdc++")
344 option(ALSOFT_STATIC_WINPTHREAD "Static link libwinpthread" OFF)
345 if(ALSOFT_STATIC_WINPTHREAD)
346 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
347 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
348 check_cxx_source_compiles("int main() { }" HAVE_STATIC_LIBWINPTHREAD_SWITCH)
349 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
350 unset(OLD_REQUIRED_LIBRARIES)
352 if(NOT HAVE_STATIC_LIBWINPTHREAD_SWITCH)
353 message(FATAL_ERROR "Cannot static link libwinpthread")
355 set(LINKER_FLAGS ${LINKER_FLAGS} "-Wl,--push-state,-Bstatic,-lstdc++,-lwinpthread,--pop-state")
360 # Set visibility/export options if available
361 if(NOT LIBTYPE STREQUAL "STATIC")
363 set(EXPORT_DECL "__declspec(dllexport)")
365 set(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
366 # Yes GCC, really don't accept visibility modes you don't support
367 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
369 check_c_source_compiles("int foo() __attribute__((visibility(\"protected\")));
370 int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
371 if(HAVE_GCC_PROTECTED_VISIBILITY)
372 set(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
374 check_c_source_compiles("int foo() __attribute__((visibility(\"default\")));
375 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
376 if(HAVE_GCC_DEFAULT_VISIBILITY)
377 set(EXPORT_DECL "__attribute__((visibility(\"default\")))")
380 if(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
381 set(CMAKE_C_VISIBILITY_PRESET hidden)
382 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
385 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
393 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
394 # Yes GCC, really don't accept command line options you don't support
395 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
396 check_c_compiler_flag(-msse2 HAVE_MSSE2_SWITCH)
397 if(HAVE_MSSE2_SWITCH)
398 set(SSE2_SWITCH "-msse2")
400 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
401 unset(OLD_REQUIRED_FLAGS)
404 check_include_file(xmmintrin.h HAVE_XMMINTRIN_H)
405 check_include_file(emmintrin.h HAVE_EMMINTRIN_H)
406 check_include_file(pmmintrin.h HAVE_PMMINTRIN_H)
407 check_include_file(smmintrin.h HAVE_SMMINTRIN_H)
408 check_include_file(arm_neon.h HAVE_ARM_NEON_H)
416 # Check for SSE support
417 option(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
418 option(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
419 if(ALSOFT_CPUEXT_SSE AND HAVE_XMMINTRIN_H)
422 if(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
423 message(FATAL_ERROR "Failed to enable required SSE CPU extensions")
426 option(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
427 option(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
428 if(ALSOFT_CPUEXT_SSE2 AND HAVE_SSE AND HAVE_EMMINTRIN_H)
431 if(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
432 message(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
435 option(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
436 option(ALSOFT_REQUIRE_SSE3 "Require SSE3 support" OFF)
437 if(ALSOFT_CPUEXT_SSE3 AND HAVE_SSE2 AND HAVE_PMMINTRIN_H)
440 if(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
441 message(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
444 option(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
445 option(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
446 if(ALSOFT_CPUEXT_SSE4_1 AND HAVE_SSE3 AND HAVE_SMMINTRIN_H)
449 if(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
450 message(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
453 # Check for ARM Neon support
454 option(ALSOFT_CPUEXT_NEON "Enable ARM NEON support" ON)
455 option(ALSOFT_REQUIRE_NEON "Require ARM NEON support" OFF)
456 if(ALSOFT_CPUEXT_NEON AND HAVE_ARM_NEON_H)
457 check_c_source_compiles("#include <arm_neon.h>
460 int32x4_t ret4 = vdupq_n_s32(0);
461 return vgetq_lane_s32(ret4, 0);
462 }" HAVE_NEON_INTRINSICS)
463 if(HAVE_NEON_INTRINSICS)
467 if(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
468 message(FATAL_ERROR "Failed to enable required ARM NEON CPU extensions")
472 set(ALSOFT_FORCE_ALIGN )
475 if(CMAKE_SIZEOF_VOID_P MATCHES "4" AND HAVE_SSE2)
476 option(ALSOFT_ENABLE_SSE2_CODEGEN "Enable SSE2 code generation instead of x87 for 32-bit targets." TRUE)
477 if(ALSOFT_ENABLE_SSE2_CODEGEN)
479 check_c_compiler_flag("/arch:SSE2" HAVE_ARCH_SSE2)
481 set(SSE_FLAGS ${SSE_FLAGS} "/arch:SSE2")
482 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
486 check_c_compiler_flag("${SSE2_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE_2)
487 if(HAVE_MFPMATH_SSE_2)
488 set(SSE_FLAGS ${SSE_FLAGS} ${SSE2_SWITCH} -mfpmath=sse)
489 set(C_FLAGS ${C_FLAGS} ${SSE_FLAGS})
492 # SSE depends on a 16-byte aligned stack, and by default, GCC
493 # assumes the stack is suitably aligned. Older Linux code or other
494 # OSs don't guarantee this on 32-bit, so externally-callable
495 # functions need to ensure an aligned stack.
496 set(EXPORT_DECL "${EXPORT_DECL}__attribute__((force_align_arg_pointer))")
497 set(ALSOFT_FORCE_ALIGN "__attribute__((force_align_arg_pointer))")
503 set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
504 foreach(flag_var ${SSE_FLAGS})
505 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag_var}")
508 check_c_source_compiles("#include <emmintrin.h>
509 int main() {_mm_pause(); return 0;}" HAVE_SSE_INTRINSICS)
511 set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
515 check_include_file(malloc.h HAVE_MALLOC_H)
516 check_include_file(cpuid.h HAVE_CPUID_H)
517 check_include_file(intrin.h HAVE_INTRIN_H)
518 check_include_file(guiddef.h HAVE_GUIDDEF_H)
519 if(NOT HAVE_GUIDDEF_H)
520 check_include_file(initguid.h HAVE_INITGUID_H)
523 # Some systems need libm for some math functions to work
525 check_library_exists(m pow "" HAVE_LIBM)
527 set(MATH_LIB ${MATH_LIB} m)
528 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
531 # Some systems need to link with -lrt for clock_gettime as used by the common
534 check_library_exists(rt clock_gettime "" HAVE_LIBRT)
539 # Check for the dlopen API (for dynamically loading backend libs)
541 check_include_file(dlfcn.h HAVE_DLFCN_H)
542 check_library_exists(dl dlopen "" HAVE_LIBDL)
544 set(EXTRA_LIBS dl ${EXTRA_LIBS})
545 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
549 # Check for a cpuid intrinsic
551 check_c_source_compiles("#include <cpuid.h>
554 unsigned int eax, ebx, ecx, edx;
555 return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
556 }" HAVE_GCC_GET_CPUID)
559 check_c_source_compiles("#include <intrin.h>
565 }" HAVE_CPUID_INTRINSIC)
568 check_symbol_exists(proc_pidpath libproc.h HAVE_PROC_PIDPATH)
571 # We need pthreads outside of Windows, for semaphores. It's also used to
572 # set the priority and name of threads, when possible.
573 check_include_file(pthread.h HAVE_PTHREAD_H)
574 if(NOT HAVE_PTHREAD_H)
575 message(FATAL_ERROR "PThreads is required for non-Windows builds!")
578 check_c_compiler_flag(-pthread HAVE_PTHREAD)
580 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
581 set(C_FLAGS ${C_FLAGS} -pthread)
582 set(LINKER_FLAGS ${LINKER_FLAGS} -pthread)
585 check_symbol_exists(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
587 # Some systems need pthread_np.h to get pthread_setname_np
588 check_include_files("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
589 if(HAVE_PTHREAD_NP_H)
590 check_symbol_exists(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
591 if(NOT HAVE_PTHREAD_SETNAME_NP)
592 check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
595 check_symbol_exists(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
596 if(NOT HAVE_PTHREAD_SETNAME_NP)
597 check_symbol_exists(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
602 check_symbol_exists(getopt unistd.h HAVE_GETOPT)
605 # Common sources used by both the OpenAL implementation library, the OpenAL
606 # router, and certain tools and examples.
619 common/althrd_setname.cpp
620 common/althrd_setname.h
628 common/intrusive_ptr.h
632 common/phase_shifter.h
633 common/polyphase_resampler.cpp
634 common/polyphase_resampler.h
636 common/ringbuffer.cpp
643 # Core library routines
655 core/bsinc_tables.cpp
658 core/buffer_storage.cpp
659 core/buffer_storage.h
667 core/cubic_tables.cpp
678 core/filters/biquad.h
679 core/filters/biquad.cpp
682 core/filters/splitter.cpp
683 core/filters/splitter.h
688 core/front_stablizer.h
699 core/resampler_limits.h
700 core/storage_formats.cpp
701 core/storage_formats.h
711 option(ALSOFT_RTKIT "Enable RTKit support" ON)
712 option(ALSOFT_REQUIRE_RTKIT "Require RTKit/D-Bus support" FALSE)
714 find_package(DBus1 QUIET)
715 if(NOT DBus1_FOUND AND PkgConfig_FOUND)
716 pkg_check_modules(DBUS dbus-1)
718 if(DBus1_FOUND OR DBUS_FOUND)
720 set(CORE_OBJS ${CORE_OBJS} core/dbus_wrap.cpp core/dbus_wrap.h
721 core/rtkit.cpp core/rtkit.h)
723 set(INC_PATHS ${INC_PATHS} ${DBUS_INCLUDE_DIRS})
724 set(CPP_DEFS ${CPP_DEFS} ${DBUS_CFLAGS_OTHER})
726 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBUS_LINK_LIBRARIES})
729 set(INC_PATHS ${INC_PATHS} ${DBus1_INCLUDE_DIRS})
730 set(CPP_DEFS ${CPP_DEFS} ${DBus1_DEFINITIONS})
732 set(EXTRA_LIBS ${EXTRA_LIBS} ${DBus1_LIBRARIES})
737 if(NOT DBus1_INCLUDE_DIRS)
738 set(MISSING_VARS "${MISSING_VARS} DBus1_INCLUDE_DIRS")
740 if(NOT DBus1_LIBRARIES)
741 set(MISSING_VARS "${MISSING_VARS} DBus1_LIBRARIES")
743 message(STATUS "Could NOT find DBus1 (missing:${MISSING_VARS})")
747 if(ALSOFT_REQUIRE_RTKIT AND NOT HAVE_RTKIT)
748 message(FATAL_ERROR "Failed to enable required RTKit support")
751 # Default mixers, always available
752 set(CORE_OBJS ${CORE_OBJS}
754 core/mixer/hrtfbase.h
755 core/mixer/hrtfdefs.h
756 core/mixer/mixer_c.cpp)
758 # AL and related routines
769 al/effects/autowah.cpp
770 al/effects/chorus.cpp
771 al/effects/compressor.cpp
772 al/effects/convolution.cpp
773 al/effects/dedicated.cpp
774 al/effects/distortion.cpp
776 al/effects/effects.cpp
778 al/effects/equalizer.cpp
779 al/effects/fshifter.cpp
780 al/effects/modulator.cpp
782 al/effects/pshifter.cpp
783 al/effects/reverb.cpp
784 al/effects/vmorpher.cpp
797 # ALC and related routines
809 alc/effects/autowah.cpp
810 alc/effects/chorus.cpp
811 alc/effects/compressor.cpp
812 alc/effects/convolution.cpp
813 alc/effects/dedicated.cpp
814 alc/effects/distortion.cpp
816 alc/effects/equalizer.cpp
817 alc/effects/fshifter.cpp
818 alc/effects/modulator.cpp
820 alc/effects/pshifter.cpp
821 alc/effects/reverb.cpp
822 alc/effects/vmorpher.cpp
839 al/eax/fx_slot_index.cpp
840 al/eax/fx_slot_index.h
850 # Include SIMD mixers
851 set(CPU_EXTS "Default")
853 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse.cpp)
854 set(CPU_EXTS "${CPU_EXTS}, SSE")
857 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse2.cpp)
858 set(CPU_EXTS "${CPU_EXTS}, SSE2")
861 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse3.cpp)
862 set(CPU_EXTS "${CPU_EXTS}, SSE3")
865 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_sse41.cpp)
866 set(CPU_EXTS "${CPU_EXTS}, SSE4.1")
869 set(CORE_OBJS ${CORE_OBJS} core/mixer/mixer_neon.cpp)
870 set(CPU_EXTS "${CPU_EXTS}, Neon")
882 set(HAVE_PORTAUDIO 0)
883 set(HAVE_PULSEAUDIO 0)
884 set(HAVE_COREAUDIO 0)
890 if(WIN32 OR HAVE_DLFCN_H)
892 macro(ADD_BACKEND_LIBS _LIBS)
895 set(IS_LINKED " (linked)")
896 macro(ADD_BACKEND_LIBS _LIBS)
897 set(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
902 set(ALC_OBJS ${ALC_OBJS}
903 alc/backends/base.cpp
905 # Default backends, always available
906 alc/backends/loopback.cpp
907 alc/backends/loopback.h
908 alc/backends/null.cpp
912 # Check PipeWire backend
913 option(ALSOFT_BACKEND_PIPEWIRE "Enable PipeWire backend" ON)
914 option(ALSOFT_REQUIRE_PIPEWIRE "Require PipeWire backend" OFF)
915 if(ALSOFT_BACKEND_PIPEWIRE AND PkgConfig_FOUND)
916 pkg_check_modules(PIPEWIRE libpipewire-0.3>=0.3.23)
919 set(BACKENDS "${BACKENDS} PipeWire${IS_LINKED},")
920 set(ALC_OBJS ${ALC_OBJS} alc/backends/pipewire.cpp alc/backends/pipewire.h)
921 add_backend_libs(${PIPEWIRE_LIBRARIES})
922 set(INC_PATHS ${INC_PATHS} ${PIPEWIRE_INCLUDE_DIRS})
925 if(ALSOFT_REQUIRE_PIPEWIRE AND NOT HAVE_PIPEWIRE)
926 message(FATAL_ERROR "Failed to enable required PipeWire backend")
929 # Check PulseAudio backend
930 option(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
931 option(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
932 if(ALSOFT_BACKEND_PULSEAUDIO)
933 find_package(PulseAudio)
935 set(HAVE_PULSEAUDIO 1)
936 set(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},")
937 set(ALC_OBJS ${ALC_OBJS} alc/backends/pulseaudio.cpp alc/backends/pulseaudio.h)
938 add_backend_libs(${PULSEAUDIO_LIBRARY})
939 set(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIR})
942 if(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
943 message(FATAL_ERROR "Failed to enable required PulseAudio backend")
948 option(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
949 option(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
950 if(ALSOFT_BACKEND_ALSA)
954 set(BACKENDS "${BACKENDS} ALSA${IS_LINKED},")
955 set(ALC_OBJS ${ALC_OBJS} alc/backends/alsa.cpp alc/backends/alsa.h)
956 add_backend_libs(${ALSA_LIBRARIES})
957 set(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS})
962 option(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
963 option(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
964 if(ALSOFT_BACKEND_OSS)
968 set(BACKENDS "${BACKENDS} OSS,")
969 set(ALC_OBJS ${ALC_OBJS} alc/backends/oss.cpp alc/backends/oss.h)
971 set(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS})
973 set(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS})
977 # Check Solaris backend
978 option(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
979 option(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
980 if(ALSOFT_BACKEND_SOLARIS)
981 find_package(AudioIO)
984 set(BACKENDS "${BACKENDS} Solaris,")
985 set(ALC_OBJS ${ALC_OBJS} alc/backends/solaris.cpp alc/backends/solaris.h)
986 set(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS})
990 # Check SndIO backend
991 option(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
992 option(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
993 if(ALSOFT_BACKEND_SNDIO)
994 find_package(SoundIO)
997 set(BACKENDS "${BACKENDS} SndIO (linked),")
998 set(ALC_OBJS ${ALC_OBJS} alc/backends/sndio.cpp alc/backends/sndio.h)
999 set(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
1000 set(INC_PATHS ${INC_PATHS} ${SOUNDIO_INCLUDE_DIRS})
1004 if(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
1005 message(FATAL_ERROR "Failed to enable required ALSA backend")
1007 if(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
1008 message(FATAL_ERROR "Failed to enable required OSS backend")
1010 if(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
1011 message(FATAL_ERROR "Failed to enable required Solaris backend")
1013 if(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
1014 message(FATAL_ERROR "Failed to enable required SndIO backend")
1017 # Check Windows-only backends
1020 # Check MMSystem backend
1021 option(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
1022 option(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
1023 if(ALSOFT_BACKEND_WINMM)
1025 set(BACKENDS "${BACKENDS} WinMM,")
1026 set(ALC_OBJS ${ALC_OBJS} alc/backends/winmm.cpp alc/backends/winmm.h)
1027 # There doesn't seem to be good way to search for winmm.lib for MSVC.
1028 # find_library doesn't find it without being told to look in a specific
1029 # place in the WindowsSDK, but it links anyway. If there ends up being
1030 # Windows targets without this, another means to detect it is needed.
1031 set(EXTRA_LIBS winmm ${EXTRA_LIBS})
1034 # Check DSound backend
1035 option(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
1036 option(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
1037 if(ALSOFT_BACKEND_DSOUND)
1038 check_include_file(dsound.h HAVE_DSOUND_H)
1040 find_path(DSOUND_INCLUDE_DIR NAMES "dsound.h"
1041 PATHS "${DXSDK_DIR}" PATH_SUFFIXES include
1042 DOC "The DirectSound include directory")
1044 if(HAVE_DSOUND_H OR DSOUND_INCLUDE_DIR)
1046 set(BACKENDS "${BACKENDS} DirectSound,")
1047 set(ALC_OBJS ${ALC_OBJS} alc/backends/dsound.cpp alc/backends/dsound.h)
1049 if(NOT HAVE_DSOUND_H)
1050 set(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIR})
1056 # Check for WASAPI backend
1057 option(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON)
1058 option(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF)
1059 if(ALSOFT_BACKEND_WASAPI)
1060 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1061 if(HAVE_MMDEVICEAPI_H)
1063 set(BACKENDS "${BACKENDS} WASAPI,")
1064 set(ALC_OBJS ${ALC_OBJS} alc/backends/wasapi.cpp alc/backends/wasapi.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")
1078 # Check JACK backend
1079 option(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
1080 option(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
1081 if(ALSOFT_BACKEND_JACK)
1085 set(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
1086 set(ALC_OBJS ${ALC_OBJS} alc/backends/jack.cpp alc/backends/jack.h)
1087 add_backend_libs(${JACK_LIBRARIES})
1088 set(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
1091 if(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
1092 message(FATAL_ERROR "Failed to enable required JACK backend")
1095 # Check CoreAudio backend
1096 option(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
1097 option(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
1098 if(ALSOFT_BACKEND_COREAUDIO)
1099 find_library(COREAUDIO_FRAMEWORK NAMES CoreAudio)
1100 find_path(AUDIOUNIT_INCLUDE_DIR NAMES AudioUnit/AudioUnit.h)
1101 if(COREAUDIO_FRAMEWORK AND AUDIOUNIT_INCLUDE_DIR)
1102 set(HAVE_COREAUDIO 1)
1103 set(ALC_OBJS ${ALC_OBJS} alc/backends/coreaudio.cpp alc/backends/coreaudio.h)
1104 set(BACKENDS "${BACKENDS} CoreAudio,")
1106 set(EXTRA_LIBS -Wl,-framework,CoreAudio ${EXTRA_LIBS})
1107 if(CMAKE_SYSTEM_NAME MATCHES "^(iOS|tvOS)$")
1108 find_library(COREFOUNDATION_FRAMEWORK NAMES CoreFoundation)
1109 if(COREFOUNDATION_FRAMEWORK)
1110 set(EXTRA_LIBS -Wl,-framework,CoreFoundation ${EXTRA_LIBS})
1113 set(EXTRA_LIBS -Wl,-framework,AudioUnit,-framework,ApplicationServices ${EXTRA_LIBS})
1116 # Some versions of OSX may need the AudioToolbox framework. Add it if
1118 find_library(AUDIOTOOLBOX_LIBRARY NAMES AudioToolbox)
1119 if(AUDIOTOOLBOX_LIBRARY)
1120 set(EXTRA_LIBS -Wl,-framework,AudioToolbox ${EXTRA_LIBS})
1123 set(INC_PATHS ${INC_PATHS} ${AUDIOUNIT_INCLUDE_DIR})
1126 if(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
1127 message(FATAL_ERROR "Failed to enable required CoreAudio backend")
1130 # Check for Oboe (Android) backend
1131 option(ALSOFT_BACKEND_OBOE "Enable Oboe backend" ON)
1132 option(ALSOFT_REQUIRE_OBOE "Require Oboe backend" OFF)
1133 if(ALSOFT_BACKEND_OBOE)
1136 set(OBOE_SOURCE "" CACHE STRING "Source directory for Oboe.")
1138 add_subdirectory(${OBOE_SOURCE} ./oboe)
1139 set(OBOE_TARGET oboe)
1141 find_package(oboe CONFIG)
1142 if(NOT TARGET oboe::oboe)
1145 if(TARGET oboe::oboe)
1146 set(OBOE_TARGET "oboe::oboe")
1153 set(ALC_OBJS ${ALC_OBJS} alc/backends/oboe.cpp alc/backends/oboe.h)
1154 set(BACKENDS "${BACKENDS} Oboe,")
1155 set(EXTRA_LIBS ${OBOE_TARGET} ${EXTRA_LIBS})
1158 if(ALSOFT_REQUIRE_OBOE AND NOT HAVE_OBOE)
1159 message(FATAL_ERROR "Failed to enable required Oboe backend")
1162 # Check for OpenSL (Android) backend
1163 option(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
1164 option(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
1165 if(ALSOFT_BACKEND_OPENSL)
1166 find_package(OpenSL)
1169 set(ALC_OBJS ${ALC_OBJS} alc/backends/opensl.cpp alc/backends/opensl.h)
1170 set(BACKENDS "${BACKENDS} OpenSL,")
1171 set(EXTRA_LIBS ${OPENSL_LIBRARIES} ${EXTRA_LIBS})
1172 set(INC_PATHS ${INC_PATHS} ${OPENSL_INCLUDE_DIRS})
1175 if(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
1176 message(FATAL_ERROR "Failed to enable required OpenSL backend")
1179 # Check PortAudio backend
1180 option(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
1181 option(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
1182 if(ALSOFT_BACKEND_PORTAUDIO)
1183 find_package(PortAudio)
1185 set(HAVE_PORTAUDIO 1)
1186 set(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},")
1187 set(ALC_OBJS ${ALC_OBJS} alc/backends/portaudio.cpp alc/backends/portaudio.h)
1188 add_backend_libs(${PORTAUDIO_LIBRARIES})
1189 set(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS})
1192 if(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
1193 message(FATAL_ERROR "Failed to enable required PortAudio backend")
1196 # Check for SDL2 backend
1197 # Off by default, since it adds a runtime dependency
1198 option(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF)
1199 option(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF)
1200 if(ALSOFT_BACKEND_SDL2)
1203 set(ALC_OBJS ${ALC_OBJS} alc/backends/sdl2.cpp alc/backends/sdl2.h)
1204 set(BACKENDS "${BACKENDS} SDL2,")
1205 set(EXTRA_LIBS ${EXTRA_LIBS} SDL2::SDL2)
1207 message(STATUS "Could NOT find SDL2")
1210 if(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND)
1211 message(FATAL_ERROR "Failed to enable required SDL2 backend")
1214 # Optionally enable the Wave Writer backend
1215 option(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
1216 if(ALSOFT_BACKEND_WAVE)
1218 set(ALC_OBJS ${ALC_OBJS} alc/backends/wave.cpp alc/backends/wave.h)
1219 set(BACKENDS "${BACKENDS} WaveFile,")
1222 # This is always available
1223 set(BACKENDS "${BACKENDS} Null")
1227 if(ALSOFT_UPDATE_BUILD_VERSION AND GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
1228 set(GIT_DIR "${OpenAL_SOURCE_DIR}/.git")
1230 # Check if this is a submodule, if it is then find the .git directory
1231 if(NOT IS_DIRECTORY "${OpenAL_SOURCE_DIR}/.git")
1232 file(READ ${GIT_DIR} submodule)
1233 string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE ${submodule})
1234 string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
1235 get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
1236 get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
1239 # Get the current working branch and its latest abbreviated commit hash
1240 add_custom_command(OUTPUT "${OpenAL_BINARY_DIR}/version_witness.txt"
1241 BYPRODUCTS "${OpenAL_BINARY_DIR}/version.h"
1242 COMMAND ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE} -D LIB_VERSION=${LIB_VERSION}
1243 -D LIB_VERSION_NUM=${LIB_VERSION_NUM} -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
1244 -D DST=${OpenAL_BINARY_DIR}/version.h -P ${OpenAL_SOURCE_DIR}/version.cmake
1245 COMMAND ${CMAKE_COMMAND} -E touch "${OpenAL_BINARY_DIR}/version_witness.txt"
1246 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1247 MAIN_DEPENDENCY "${OpenAL_SOURCE_DIR}/version.h.in"
1248 DEPENDS "${GIT_DIR}/index" "${OpenAL_SOURCE_DIR}/version.cmake"
1252 add_custom_target(build_version DEPENDS "${OpenAL_BINARY_DIR}/version_witness.txt")
1254 set(GIT_BRANCH "UNKNOWN")
1255 set(GIT_COMMIT_HASH "unknown")
1257 "${OpenAL_SOURCE_DIR}/version.h.in"
1258 "${OpenAL_BINARY_DIR}/version.h")
1262 option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" ON)
1263 if(ALSOFT_EMBED_HRTF_DATA)
1264 macro(make_hrtf_header FILENAME VARNAME)
1265 set(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}")
1266 set(outfile "${OpenAL_BINARY_DIR}/${VARNAME}.txt")
1268 add_custom_command(OUTPUT "${outfile}"
1269 COMMAND ${CMAKE_COMMAND} -D "INPUT_FILE=${infile}" -D "OUTPUT_FILE=${outfile}"
1270 -P "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1271 WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
1272 DEPENDS "${infile}" "${CMAKE_MODULE_PATH}/bin2h.script.cmake"
1275 set(ALC_OBJS ${ALC_OBJS} "${outfile}")
1278 make_hrtf_header("Default HRTF.mhr" "default_hrtf")
1283 find_package(MySOFA)
1284 if(NOT ALSOFT_NO_CONFIG_UTIL)
1285 find_package(Qt5Widgets QUIET)
1286 if(NOT Qt5Widgets_FOUND)
1287 message(STATUS "Could NOT find Qt5Widgets")
1291 if(ALSOFT_UTILS OR ALSOFT_EXAMPLES)
1292 find_package(SndFile)
1294 find_package(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
1299 set(LIBNAME "openal")
1301 set(LIBNAME "OpenAL32")
1304 # Needed for openal.pc.in
1305 set(prefix ${CMAKE_INSTALL_PREFIX})
1306 set(exec_prefix "\${prefix}")
1307 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
1308 set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
1309 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
1310 set(PACKAGE_VERSION "${LIB_VERSION}")
1311 set(PKG_CONFIG_CFLAGS )
1312 set(PKG_CONFIG_PRIVATE_LIBS )
1313 if(LIBTYPE STREQUAL "STATIC")
1314 set(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC)
1315 foreach(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1316 # If this is already a linker flag, or is a full path+file, add it
1317 # as-is. If it's an SDL2 target, add the link flag for it. Otherwise,
1318 # it's a name intended to be dressed as -lname.
1319 if(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}")
1320 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}")
1321 elseif(FLAG MATCHES "^SDL2::SDL2")
1322 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -lSDL2")
1324 set(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}")
1331 "${OpenAL_SOURCE_DIR}/config.h.in"
1332 "${OpenAL_BINARY_DIR}/config.h")
1334 "${OpenAL_SOURCE_DIR}/openal.pc.in"
1335 "${OpenAL_BINARY_DIR}/openal.pc"
1339 add_library(alcommon STATIC EXCLUDE_FROM_ALL ${COMMON_OBJS})
1340 target_include_directories(alcommon PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/include
1341 PUBLIC ${OpenAL_SOURCE_DIR}/common)
1342 target_compile_definitions(alcommon PRIVATE ${CPP_DEFS})
1343 target_compile_options(alcommon PRIVATE ${C_FLAGS})
1344 set_target_properties(alcommon PROPERTIES ${DEFAULT_TARGET_PROPS} POSITION_INDEPENDENT_CODE TRUE)
1348 set(IMPL_TARGET OpenAL) # Either OpenAL or soft_oal.
1350 # Build main library
1351 if(LIBTYPE STREQUAL "STATIC")
1352 add_library(${IMPL_TARGET} STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS})
1353 target_compile_definitions(${IMPL_TARGET} PUBLIC AL_LIBTYPE_STATIC)
1354 target_link_libraries(${IMPL_TARGET} PRIVATE ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1357 # This option is for static linking OpenAL Soft into another project
1358 # that already defines the IDs. It is up to that project to ensure all
1359 # required IDs are defined.
1360 option(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
1361 if(ALSOFT_NO_UID_DEFS)
1362 target_compile_definitions(${IMPL_TARGET} PRIVATE AL_NO_UID_DEFS)
1366 set(RC_CONFIG resources/openal32.rc)
1367 if(WIN32 AND ALSOFT_BUILD_ROUTER)
1368 add_library(OpenAL SHARED
1375 target_compile_definitions(OpenAL
1376 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES "ALC_API=${EXPORT_DECL}"
1377 "AL_API=${EXPORT_DECL}" ${CPP_DEFS})
1378 target_compile_options(OpenAL PRIVATE ${C_FLAGS})
1379 target_link_libraries(OpenAL PRIVATE alcommon ${LINKER_FLAGS})
1380 target_include_directories(OpenAL
1382 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1383 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1385 ${OpenAL_SOURCE_DIR}/common
1386 ${OpenAL_BINARY_DIR}
1388 set_target_properties(OpenAL PROPERTIES ${DEFAULT_TARGET_PROPS} PREFIX ""
1389 OUTPUT_NAME ${LIBNAME})
1390 if(TARGET build_version)
1391 add_dependencies(OpenAL build_version)
1395 set(LIBNAME "soft_oal")
1396 set(IMPL_TARGET soft_oal)
1397 set(RC_CONFIG resources/soft_oal.rc)
1400 # !important: for osx framework public header works, the headers must be in
1402 set(TARGET_PUBLIC_HEADERS include/AL/al.h include/AL/alc.h include/AL/alext.h include/AL/efx.h
1403 include/AL/efx-presets.h)
1405 add_library(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS} ${CORE_OBJS} ${RC_CONFIG}
1406 ${TARGET_PUBLIC_HEADERS})
1408 set_target_properties(${IMPL_TARGET} PROPERTIES PREFIX "")
1410 target_link_libraries(${IMPL_TARGET} PRIVATE alcommon ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
1413 set(ALSOFT_CPPWINRT_VERSION "2.0.230706.1" CACHE STRING "The soft-oal default cppwinrt version")
1415 find_program(NUGET_EXE NAMES nuget)
1417 message("NUGET.EXE not found.")
1418 message(FATAL_ERROR "Please install this executable, and run CMake again.")
1421 exec_program(${NUGET_EXE}
1422 ARGS install "Microsoft.Windows.CppWinRT" -Version ${ALSOFT_CPPWINRT_VERSION} -ExcludeVersion -OutputDirectory "\"${CMAKE_BINARY_DIR}/packages\"")
1424 set_target_properties(${IMPL_TARGET} PROPERTIES
1425 VS_PROJECT_IMPORT ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.props
1427 target_link_libraries(${IMPL_TARGET} PRIVATE ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT/build/native/Microsoft.Windows.CppWinRT.targets)
1430 if(NOT WIN32 AND NOT APPLE)
1431 # FIXME: This doesn't put a dependency on the version script. Changing
1432 # the version script will not cause a relink as it should.
1433 target_link_options(${IMPL_TARGET} PRIVATE
1434 "-Wl,--version-script=${OpenAL_SOURCE_DIR}/libopenal.version")
1437 if(APPLE AND ALSOFT_OSX_FRAMEWORK)
1438 # Sets framework name to soft_oal to avoid ambiguity with the system OpenAL.framework
1439 set(LIBNAME "soft_oal")
1441 execute_process(COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD
1443 OUTPUT_VARIABLE BUNDLE_VERSION
1444 OUTPUT_STRIP_TRAILING_WHITESPACE)
1446 set(BUNDLE_VERSION 1)
1449 # Build: Fix rpath in iOS shared libraries
1450 # If this flag is not set, the final dylib binary ld path will be
1451 # /User/xxx/*/soft_oal.framework/soft_oal, which can't be loaded by iOS devices.
1452 # See also: https://github.com/libjpeg-turbo/libjpeg-turbo/commit/c80ddef7a4ce21ace9e3ca0fd190d320cc8cdaeb
1453 if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
1454 set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
1457 set_target_properties(${IMPL_TARGET} PROPERTIES
1460 MACOSX_FRAMEWORK_NAME "${IMPL_TARGET}"
1461 MACOSX_FRAMEWORK_IDENTIFIER "org.openal-soft.openal"
1462 MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${LIB_VERSION}"
1463 MACOSX_FRAMEWORK_BUNDLE_VERSION "${BUNDLE_VERSION}"
1464 XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
1465 XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
1466 XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
1467 PUBLIC_HEADER "${TARGET_PUBLIC_HEADERS}"
1472 target_include_directories(${IMPL_TARGET}
1474 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>
1476 $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include/AL>
1477 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1478 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/AL>
1481 ${OpenAL_BINARY_DIR}
1482 ${OpenAL_SOURCE_DIR}
1483 ${OpenAL_SOURCE_DIR}/common
1486 set_target_properties(${IMPL_TARGET} PROPERTIES ${DEFAULT_TARGET_PROPS}
1487 OUTPUT_NAME ${LIBNAME}
1488 VERSION ${LIB_VERSION}
1489 SOVERSION ${LIB_MAJOR_VERSION}
1491 target_compile_definitions(${IMPL_TARGET}
1492 PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES "ALC_API=${EXPORT_DECL}" "AL_API=${EXPORT_DECL}"
1494 target_compile_options(${IMPL_TARGET} PRIVATE ${C_FLAGS})
1496 if(TARGET build_version)
1497 add_dependencies(${IMPL_TARGET} build_version)
1500 if(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC")
1501 find_program(SED_EXECUTABLE NAMES sed DOC "sed executable")
1502 if(NOT SED_EXECUTABLE OR NOT CMAKE_DLLTOOL)
1504 if(NOT SED_EXECUTABLE)
1505 message(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
1507 if(NOT CMAKE_DLLTOOL)
1508 message(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
1511 target_link_options(OpenAL PRIVATE "-Wl,--output-def,OpenAL32.def")
1512 add_custom_command(TARGET OpenAL POST_BUILD
1513 COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def
1514 COMMAND "${CMAKE_DLLTOOL}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll
1515 # Technically OpenAL32.def was created by the build, but cmake
1516 # doesn't recognize it due to -Wl,--output-def,OpenAL32.def being
1517 # manually specified. But declaring the file here allows it to be
1518 # properly cleaned, e.g. during make clean.
1519 BYPRODUCTS OpenAL32.def OpenAL32.lib
1520 COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..."
1528 message(STATUS "Building DLL router")
1532 message(STATUS "Building OpenAL with support for the following backends:")
1533 message(STATUS " ${BACKENDS}")
1535 message(STATUS "Building with support for CPU extensions:")
1536 message(STATUS " ${CPU_EXTS}")
1539 message(STATUS "Building with SSE${FPMATH_SET} codegen")
1543 message(STATUS "Building with UWP support")
1547 message(STATUS "Building with legacy EAX extension support")
1551 if(ALSOFT_EMBED_HRTF_DATA)
1552 message(STATUS "Embedding HRTF datasets")
1556 # An alias for sub-project builds
1557 add_library(OpenAL::OpenAL ALIAS OpenAL)
1559 # Install main library
1561 configure_package_config_file(OpenALConfig.cmake.in OpenALConfig.cmake
1562 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL)
1563 install(TARGETS OpenAL EXPORT OpenAL
1564 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1565 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1566 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1567 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
1568 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL)
1569 export(TARGETS OpenAL
1571 FILE OpenALTargets.cmake)
1572 install(EXPORT OpenAL
1573 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL
1575 FILE OpenALTargets.cmake)
1576 install(DIRECTORY include/AL
1577 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1578 install(FILES "${OpenAL_BINARY_DIR}/openal.pc"
1579 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
1580 install(FILES "${OpenAL_BINARY_DIR}/OpenALConfig.cmake"
1581 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL")
1583 install(TARGETS soft_oal
1584 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1586 message(STATUS "Installing library and headers")
1588 message(STATUS "NOT installing library and headers")
1591 if(ALSOFT_INSTALL_CONFIG)
1592 install(FILES alsoftrc.sample
1593 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1594 message(STATUS "Installing sample configuration")
1597 if(ALSOFT_INSTALL_HRTF_DATA)
1598 install(DIRECTORY hrtf
1599 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1600 message(STATUS "Installing HRTF data files")
1603 if(ALSOFT_INSTALL_AMBDEC_PRESETS)
1604 install(DIRECTORY presets
1605 DESTINATION ${CMAKE_INSTALL_DATADIR}/openal)
1606 message(STATUS "Installing AmbDec presets")
1612 set(UNICODE_FLAG ${UNICODE_FLAG} -municode)
1614 set(EXTRA_INSTALLS )
1616 add_executable(openal-info utils/openal-info.c)
1617 target_include_directories(openal-info PRIVATE ${OpenAL_SOURCE_DIR}/common)
1618 target_compile_options(openal-info PRIVATE ${C_FLAGS})
1619 target_link_libraries(openal-info PRIVATE ${LINKER_FLAGS} OpenAL ${UNICODE_FLAG})
1620 set_target_properties(openal-info PROPERTIES ${DEFAULT_TARGET_PROPS})
1621 if(ALSOFT_INSTALL_EXAMPLES)
1622 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} openal-info)
1626 add_executable(uhjdecoder utils/uhjdecoder.cpp)
1627 target_compile_definitions(uhjdecoder PRIVATE ${CPP_DEFS})
1628 target_include_directories(uhjdecoder
1629 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1630 target_compile_options(uhjdecoder PRIVATE ${C_FLAGS})
1631 target_link_libraries(uhjdecoder PUBLIC alcommon
1632 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1633 set_target_properties(uhjdecoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1635 add_executable(uhjencoder utils/uhjencoder.cpp)
1636 target_compile_definitions(uhjencoder PRIVATE ${CPP_DEFS})
1637 target_include_directories(uhjencoder
1638 PRIVATE ${OpenAL_BINARY_DIR} ${OpenAL_SOURCE_DIR}/common)
1639 target_compile_options(uhjencoder PRIVATE ${C_FLAGS})
1640 target_link_libraries(uhjencoder PUBLIC alcommon
1641 PRIVATE ${LINKER_FLAGS} SndFile::SndFile ${UNICODE_FLAG})
1642 set_target_properties(uhjencoder PROPERTIES ${DEFAULT_TARGET_PROPS})
1646 set(SOFA_SUPPORT_SRCS
1647 utils/sofa-support.cpp
1648 utils/sofa-support.h)
1649 add_library(sofa-support STATIC EXCLUDE_FROM_ALL ${SOFA_SUPPORT_SRCS})
1650 target_compile_definitions(sofa-support PRIVATE ${CPP_DEFS})
1651 target_include_directories(sofa-support PUBLIC ${OpenAL_SOURCE_DIR}/common)
1652 target_compile_options(sofa-support PRIVATE ${C_FLAGS})
1653 target_link_libraries(sofa-support PUBLIC alcommon MySOFA::MySOFA PRIVATE ${LINKER_FLAGS})
1654 set_target_properties(sofa-support PROPERTIES ${DEFAULT_TARGET_PROPS})
1657 utils/makemhr/loaddef.cpp
1658 utils/makemhr/loaddef.h
1659 utils/makemhr/loadsofa.cpp
1660 utils/makemhr/loadsofa.h
1661 utils/makemhr/makemhr.cpp
1662 utils/makemhr/makemhr.h)
1664 set(MAKEMHR_SRCS ${MAKEMHR_SRCS} utils/getopt.c utils/getopt.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 if(ALSOFT_INSTALL_EXAMPLES)
1714 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} altonegen alrecord)
1717 message(STATUS "Building example programs")
1720 add_executable(alplay examples/alplay.c)
1721 target_link_libraries(alplay PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1723 set_target_properties(alplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1725 add_executable(alstream examples/alstream.c)
1726 target_link_libraries(alstream PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1728 set_target_properties(alstream PROPERTIES ${DEFAULT_TARGET_PROPS})
1730 add_executable(alreverb examples/alreverb.c)
1731 target_link_libraries(alreverb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1733 set_target_properties(alreverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1735 add_executable(almultireverb examples/almultireverb.c)
1736 target_link_libraries(almultireverb
1737 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1738 set_target_properties(almultireverb PROPERTIES ${DEFAULT_TARGET_PROPS})
1740 add_executable(allatency examples/allatency.c)
1741 target_link_libraries(allatency PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1743 set_target_properties(allatency PROPERTIES ${DEFAULT_TARGET_PROPS})
1745 add_executable(alhrtf examples/alhrtf.c)
1746 target_link_libraries(alhrtf
1747 PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon ${MATH_LIB} ${UNICODE_FLAG})
1748 set_target_properties(alhrtf PROPERTIES ${DEFAULT_TARGET_PROPS})
1750 add_executable(alstreamcb examples/alstreamcb.cpp)
1751 target_link_libraries(alstreamcb PRIVATE ${LINKER_FLAGS} SndFile::SndFile al-excommon
1753 set_target_properties(alstreamcb PROPERTIES ${DEFAULT_TARGET_PROPS})
1755 add_executable(alconvolve examples/alconvolve.c)
1756 target_link_libraries(alconvolve PRIVATE ${LINKER_FLAGS} alcommon SndFile::SndFile
1757 al-excommon ${UNICODE_FLAG})
1758 set_target_properties(alconvolve PROPERTIES ${DEFAULT_TARGET_PROPS})
1760 if(ALSOFT_INSTALL_EXAMPLES)
1761 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alplay alstream alreverb almultireverb allatency
1765 message(STATUS "Building SndFile example programs")
1769 add_executable(alloopback examples/alloopback.c)
1770 target_link_libraries(alloopback
1771 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 al-excommon ${MATH_LIB})
1772 set_target_properties(alloopback PROPERTIES ${DEFAULT_TARGET_PROPS})
1774 if(ALSOFT_INSTALL_EXAMPLES)
1775 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alloopback)
1778 message(STATUS "Building SDL example programs")
1783 if(AVFORMAT_VERSION VERSION_LESS "59.27.100")
1784 message(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 59.27.100)")
1787 if(AVCODEC_VERSION VERSION_LESS "59.37.100")
1788 message(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 59.37.100)")
1791 if(AVUTIL_VERSION VERSION_LESS "57.28.100")
1792 message(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 57.28.100)")
1795 if(SWSCALE_VERSION VERSION_LESS "6.7.100")
1796 message(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 6.7.100)")
1799 if(SWRESAMPLE_VERSION VERSION_LESS "4.7.100")
1800 message(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 4.7.100)")
1805 add_executable(alffplay examples/alffplay.cpp)
1806 target_include_directories(alffplay PRIVATE ${FFMPEG_INCLUDE_DIRS})
1807 target_link_libraries(alffplay
1808 PRIVATE ${LINKER_FLAGS} SDL2::SDL2 ${FFMPEG_LIBRARIES} al-excommon)
1809 set_target_properties(alffplay PROPERTIES ${DEFAULT_TARGET_PROPS})
1811 if(ALSOFT_INSTALL_EXAMPLES)
1812 set(EXTRA_INSTALLS ${EXTRA_INSTALLS} alffplay)
1814 message(STATUS "Building SDL+FFmpeg example programs")
1821 add_subdirectory(tests)
1825 install(TARGETS ${EXTRA_INSTALLS}
1826 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1827 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
1828 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1829 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})