|
|
|
|
#.rst:
|
|
|
|
|
# Find OpenAL
|
|
|
|
|
# -----------
|
|
|
|
|
#
|
|
|
|
|
# Finds the OpenAL library. This module defines:
|
|
|
|
|
#
|
|
|
|
|
# OpenAL_FOUND - True if the OpenAL library is found
|
|
|
|
|
# OpenAL::OpenAL - OpenAL imported target
|
|
|
|
|
#
|
|
|
|
|
# Additionally these variables are defined for internal usage:
|
|
|
|
|
#
|
|
|
|
|
# OPENAL_LIBRARY - OpenAL library
|
|
|
|
|
# OPENAL_DLL_RELEASE - OpenAL release DLL on Windows, if found. Note that
|
|
|
|
|
# in case of the binary OpenAL Soft distribution it's named soft_oal.dll and
|
|
|
|
|
# you need to rename it to OpenAL32.dll to make it work.
|
|
|
|
|
# OPENAL_INCLUDE_DIR - Include dir
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# This file is part of Magnum.
|
|
|
|
|
#
|
|
|
|
|
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
|
|
|
|
|
# 2020, 2021, 2022 Vladimír Vondruš <mosra@centrum.cz>
|
|
|
|
|
#
|
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
# copy of this software and associated documentation files (the "Software"),
|
|
|
|
|
# to deal in the Software without restriction, including without limitation
|
|
|
|
|
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
|
# and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
|
# Software is furnished to do so, subject to the following conditions:
|
|
|
|
|
#
|
|
|
|
|
# The above copyright notice and this permission notice shall be included
|
|
|
|
|
# in all copies or substantial portions of the Software.
|
|
|
|
|
#
|
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
|
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
|
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
|
# DEALINGS IN THE SOFTWARE.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
# OpenAL Soft installs cmake package config files which handles dependencies in
|
|
|
|
|
# case OpenAL Soft is built statically. Try to find first, quietly, so it
|
|
|
|
|
# doesn't print loud messages when it's not found, since that's okay. If the
|
|
|
|
|
# OpenAL target already exists, it means we're using it through a CMake
|
|
|
|
|
# subproject -- don't attempt to find the package in that case.
|
|
|
|
|
#
|
|
|
|
|
# In case of Emscripten we don't want any of this -- the library name and
|
|
|
|
|
# includes are implicit.
|
|
|
|
|
if(NOT CORRADE_TARGET_EMSCRIPTEN AND NOT TARGET OpenAL)
|
|
|
|
|
find_package(OpenAL CONFIG QUIET)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# If either an OpenAL Soft config file was found or we have a subproject, point
|
|
|
|
|
# OpenAL::OpenAL to that and exit -- nothing else to do here.
|
|
|
|
|
if(TARGET OpenAL OR TARGET OpenAL::OpenAL)
|
|
|
|
|
# OpenAL Soft config file already defines this one, so this is just for
|
|
|
|
|
# the subproject case.
|
|
|
|
|
if(NOT TARGET OpenAL::OpenAL)
|
|
|
|
|
# Aliases of (global) targets are only supported in CMake 3.11, so we
|
|
|
|
|
# work around it by this. This is easier than fetching all possible
|
|
|
|
|
# properties (which are impossible to track of) and then attempting to
|
|
|
|
|
# rebuild them into a new target.
|
|
|
|
|
add_library(OpenAL::OpenAL INTERFACE IMPORTED)
|
|
|
|
|
set_target_properties(OpenAL::OpenAL PROPERTIES INTERFACE_LINK_LIBRARIES OpenAL)
|
|
|
|
|
|
|
|
|
|
# The OpenAL target doesn't define any usable
|
|
|
|
|
# INTERFACE_INCLUDE_DIRECTORIES for some reason (apparently the
|
|
|
|
|
# $<BUILD_INTERFACE:> in there doesn't work or whatever), so let's do
|
|
|
|
|
# that ourselves.
|
|
|
|
|
get_target_property(_OPENAL_SOURCE_DIR OpenAL SOURCE_DIR)
|
|
|
|
|
set_target_properties(OpenAL::OpenAL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${_OPENAL_SOURCE_DIR}/include/AL)
|
|
|
|
|
|
|
|
|
|
# For the imported target get the DLL location
|
|
|
|
|
else()
|
|
|
|
|
if(CORRADE_TARGET_WINDOWS)
|
|
|
|
|
get_target_property(OPENAL_DLL_DEBUG OpenAL::OpenAL IMPORTED_LOCATION_DEBUG)
|
|
|
|
|
get_target_property(OPENAL_DLL_RELEASE OpenAL::OpenAL IMPORTED_LOCATION_RELEASE)
|
|
|
|
|
# Release not found, fall back to RelWithDebInfo
|
|
|
|
|
if(NOT OPENAL_DLL_RELEASE)
|
|
|
|
|
get_target_property(OPENAL_DLL_RELEASE OpenAL::OpenAL IMPORTED_LOCATION_RELWITHDEBINFO)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Just to make FPHSA print some meaningful location, nothing else.
|
|
|
|
|
# Fortunately because of the INTERFACE_INCLUDE_DIRECTORIES workaround above
|
|
|
|
|
# we can have the same handling both in case of an imported target and a
|
|
|
|
|
# CMake subproject.
|
|
|
|
|
get_target_property(_OPENAL_INTERFACE_INCLUDE_DIRECTORIES OpenAL::OpenAL INTERFACE_INCLUDE_DIRECTORIES)
|
|
|
|
|
|
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
|
|
|
find_package_handle_standard_args("OpenAL" DEFAULT_MSG
|
|
|
|
|
_OPENAL_INTERFACE_INCLUDE_DIRECTORIES)
|
|
|
|
|
|
|
|
|
|
return()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Under Emscripten, OpenAL is linked implicitly. With MINIMAL_RUNTIME you need
|
|
|
|
|
# to specify -lopenal. Simply set the library name to that.
|
|
|
|
|
if(CORRADE_TARGET_EMSCRIPTEN)
|
|
|
|
|
set(OPENAL_LIBRARY openal CACHE STRING "Path to a library." FORCE)
|
|
|
|
|
else()
|
|
|
|
|
# OpenAL Soft Windows binary distribution puts the library into a subdir,
|
|
|
|
|
# the legacy one from Creative uses the same. OpenAL Soft puts DLLs into
|
|
|
|
|
# bin/Win{32,64}/soft_oal.dll
|
|
|
|
|
if(WIN32)
|
|
|
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
|
|
|
set(_OPENAL_LIBRARY_PATH_SUFFIX libs/Win64)
|
|
|
|
|
set(_OPENAL_DLL_PATH_SUFFIX bin/Win64)
|
|
|
|
|
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
|
|
|
set(_OPENAL_LIBRARY_PATH_SUFFIX libs/Win32)
|
|
|
|
|
set(_OPENAL_DLL_PATH_SUFFIX bin/Win32)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
find_library(OPENAL_LIBRARY
|
|
|
|
|
# Names same as in CMake's vanilla FindOpenAL
|
|
|
|
|
NAMES OpenAL al openal OpenAL32
|
|
|
|
|
# For binary OpenAL Soft distribution on Windows
|
|
|
|
|
PATH_SUFFIXES ${_OPENAL_LIBRARY_PATH_SUFFIX}
|
|
|
|
|
# The other PATHS from CMake's vanilla FindOpenAL seem to be a legacy
|
|
|
|
|
# cruft, skipping those. The Windows registry used by the vanilla
|
|
|
|
|
# FindOpenAL doesn't seem to be set anymore either.
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Include dir
|
|
|
|
|
find_path(OPENAL_INCLUDE_DIR NAMES al.h
|
|
|
|
|
# AL/ used by OpenAL Soft, OpenAL/ used by the macOS framework. The legacy
|
|
|
|
|
# Creative SDK puts al.h directly into include/, ffs.
|
|
|
|
|
PATH_SUFFIXES AL OpenAL
|
|
|
|
|
# As above, skipping the obsolete PATHS and registry in vanilla FindOpenAL
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# (Static) macOS / iOS dependencies
|
|
|
|
|
if(CORRADE_TARGET_APPLE AND OPENAL_LIBRARY MATCHES "${CMAKE_STATIC_LIBRARY_SUFFIX}$")
|
|
|
|
|
find_library(_OPENAL_CoreAudio_LIBRARY CoreAudio)
|
|
|
|
|
mark_as_advanced(_OPENAL_CoreAudio_LIBRARY)
|
|
|
|
|
set(_OPENAL_FRAMEWORK_LIBRARIES ${_OPENAL_CoreAudio_LIBRARY})
|
|
|
|
|
set(_OPENAL_FRAMEWORK_LIBRARY_NAMES _OPENAL_CoreAudio_LIBRARY)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# OpenAL DLL on Windows
|
|
|
|
|
if(CORRADE_TARGET_WINDOWS)
|
|
|
|
|
# TODO: debug?
|
|
|
|
|
find_file(OPENAL_DLL_RELEASE
|
|
|
|
|
NAMES soft_oal.dll
|
|
|
|
|
PATH_SUFFIXES ${_OPENAL_DLL_PATH_SUFFIX})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
|
|
|
find_package_handle_standard_args(OpenAL DEFAULT_MSG
|
|
|
|
|
OPENAL_LIBRARY
|
|
|
|
|
${_OPENAL_FRAMEWORK_LIBRARY_NAMES}
|
|
|
|
|
OPENAL_INCLUDE_DIR)
|
|
|
|
|
|
|
|
|
|
if(NOT TARGET OpenAL::OpenAL)
|
|
|
|
|
# Work around BUGGY framework support on macOS. Do this also in case of
|
|
|
|
|
# Emscripten, since there we don't have a location either.
|
|
|
|
|
# http://public.kitware.com/pipermail/cmake/2016-April/063179.html
|
|
|
|
|
if((APPLE AND ${OPENAL_LIBRARY} MATCHES "\\.framework$") OR CORRADE_TARGET_EMSCRIPTEN)
|
|
|
|
|
add_library(OpenAL::OpenAL INTERFACE IMPORTED)
|
|
|
|
|
set_property(TARGET OpenAL::OpenAL APPEND PROPERTY
|
|
|
|
|
INTERFACE_LINK_LIBRARIES ${OPENAL_LIBRARY})
|
|
|
|
|
else()
|
|
|
|
|
add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
|
|
|
|
|
set_property(TARGET OpenAL::OpenAL PROPERTY
|
|
|
|
|
IMPORTED_LOCATION ${OPENAL_LIBRARY})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Link frameworks on macOS / iOS if we have a static SDL
|
|
|
|
|
if(CORRADE_TARGET_APPLE AND OPENAL_LIBRARY MATCHES "${CMAKE_STATIC_LIBRARY_SUFFIX}$")
|
|
|
|
|
set_property(TARGET OpenAL::OpenAL APPEND PROPERTY
|
|
|
|
|
INTERFACE_LINK_LIBRARIES ${_OPENAL_FRAMEWORK_LIBRARIES})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
set_target_properties(OpenAL::OpenAL PROPERTIES
|
|
|
|
|
INTERFACE_INCLUDE_DIRECTORIES ${OPENAL_INCLUDE_DIR})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR)
|