blob: dad9ada1284dcd28d5849cc9523fb1b39ba32c92 [file] [log] [blame]
# 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 <al.h>``, and **not** ``#include <AL/al.h>``. 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
``<OpenAL/al.h>``.
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()