# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file LICENSE.rst or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindOpenAL ---------- Finds the Open Audio Library (OpenAL). OpenAL is a cross-platform 3D audio API designed for efficient rendering of multichannel three-dimensional positional audio. It is commonly used in games and multimedia applications to provide immersive and spatialized sound. Projects using this module should include the OpenAL header file using ``#include ``, and **not** ``#include ``. The reason for this is that the latter is not portable. For example, Windows/Creative Labs does not by default put OpenAL headers in ``AL/`` and macOS uses the convention of ````. Imported Targets ^^^^^^^^^^^^^^^^ This module provides the following :ref:`Imported Targets`: ``OpenAL::OpenAL`` .. versionadded:: 3.25 Target encapsulating the OpenAL library usage requirements, available only if the OpenAL library is found. Result Variables ^^^^^^^^^^^^^^^^ This module defines the following variables: ``OpenAL_FOUND`` Boolean indicating whether the OpenAL is found. For backward compatibility, the ``OPENAL_FOUND`` variable is also set to the same value. ``OPENAL_VERSION_STRING`` Human-readable string containing the version of OpenAL found. Cache Variables ^^^^^^^^^^^^^^^ The following cache variables may also be set: ``OPENAL_INCLUDE_DIR`` The include directory containing headers needed to use the OpenAL library. ``OPENAL_LIBRARY`` The path to the OpenAL library. Hints ^^^^^ This module accepts the following variables: ``OPENALDIR`` Environment variable which can be used to set the installation prefix of OpenAL to be found in non-standard locations. OpenAL is searched in the following order: 1. By default on macOS, system framework is searched first: ``/System/Library/Frameworks``, whose priority can be changed by setting the :variable:`CMAKE_FIND_FRAMEWORK` variable. 2. Environment variable ``ENV{OPENALDIR}``. 3. System paths. 4. User-compiled framework: ``~/Library/Frameworks``. 5. Manually compiled framework: ``/Library/Frameworks``. 6. Add-on package: ``/opt``. Examples ^^^^^^^^ Finding the OpenAL library and linking it to a project target: .. code-block:: cmake find_package(OpenAL) target_link_libraries(project_target PRIVATE OpenAL::OpenAL) #]=======================================================================] # For Windows, Creative Labs seems to have added a registry key for their # OpenAL 1.1 installer. I have added that key to the list of search paths, # however, the key looks like it could be a little fragile depending on # if they decide to change the 1.00.0000 number for bug fix releases. # Also, they seem to have laid down groundwork for multiple library platforms # which puts the library in an extra subdirectory. Currently there is only # Win32 and I have hardcoded that here. This may need to be adjusted as # platforms are introduced. # The OpenAL 1.0 installer doesn't seem to have a useful key I can use. # I do not know if the Nvidia OpenAL SDK has a registry key. find_path(OPENAL_INCLUDE_DIR al.h HINTS ENV OPENALDIR PATHS ~/Library/Frameworks /Library/Frameworks /opt [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] PATH_SUFFIXES include/AL include/OpenAL include AL OpenAL ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(_OpenAL_ARCH_DIR libs/Win64) else() set(_OpenAL_ARCH_DIR libs/Win32) endif() find_library(OPENAL_LIBRARY NAMES OpenAL al openal OpenAL32 HINTS ENV OPENALDIR PATHS ~/Library/Frameworks /Library/Frameworks /opt [HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] PATH_SUFFIXES libx32 lib64 lib libs64 libs ${_OpenAL_ARCH_DIR} ) unset(_OpenAL_ARCH_DIR) include(FindPackageHandleStandardArgs) find_package_handle_standard_args( OpenAL REQUIRED_VARS OPENAL_LIBRARY OPENAL_INCLUDE_DIR VERSION_VAR OPENAL_VERSION_STRING ) mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR) if(OpenAL_FOUND AND NOT TARGET OpenAL::OpenAL) add_library(OpenAL::OpenAL UNKNOWN IMPORTED) set_target_properties(OpenAL::OpenAL PROPERTIES IMPORTED_LOCATION "${OPENAL_LIBRARY}") set_target_properties(OpenAL::OpenAL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OPENAL_INCLUDE_DIR}") endif()