mirror of https://github.com/mosra/magnum.git
11 changed files with 199 additions and 155 deletions
@ -1,145 +1,160 @@ |
|||||||
#.rst: |
#.rst: |
||||||
# FindOpenAL |
# Find OpenAL |
||||||
# ---------- |
# ----------- |
||||||
# |
# |
||||||
|
# Finds the OpenAL library. This module defines: |
||||||
# |
# |
||||||
|
# OpenAL_FOUND - True if the OpenAL library is found |
||||||
|
# OpenAL::OpenAL - OpenAL imported target |
||||||
# |
# |
||||||
# Locate OpenAL This module defines OPENAL_LIBRARY OPENAL_FOUND, if |
# Additionally these variables are defined for internal usage: |
||||||
# false, do not try to link to OpenAL OPENAL_INCLUDE_DIR, where to find |
|
||||||
# the headers |
|
||||||
# |
# |
||||||
# $OPENALDIR is an environment variable that would correspond to the |
# OPENAL_LIBRARY - OpenAL library |
||||||
# ./configure --prefix=$OPENALDIR used in building OpenAL. |
# OPENAL_DLL_RELEASE - OpenAL release DLL on Windows, if found. Note that |
||||||
|
# (at least 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 |
||||||
# |
# |
||||||
# Created by Eric Wing. This was influenced by the FindSDL.cmake |
|
||||||
# module. |
|
||||||
|
|
||||||
#============================================================================= |
|
||||||
# CMake - Cross Platform Makefile Generator |
|
||||||
# Copyright 2000-2016 Kitware, Inc. |
|
||||||
# Copyright 2000-2011 Insight Software Consortium |
|
||||||
# All rights reserved. |
|
||||||
# |
|
||||||
# Redistribution and use in source and binary forms, with or without |
|
||||||
# modification, are permitted provided that the following conditions |
|
||||||
# are met: |
|
||||||
# |
|
||||||
# * Redistributions of source code must retain the above copyright |
|
||||||
# notice, this list of conditions and the following disclaimer. |
|
||||||
# |
# |
||||||
# * Redistributions in binary form must reproduce the above copyright |
# This file is part of Magnum. |
||||||
# notice, this list of conditions and the following disclaimer in the |
|
||||||
# documentation and/or other materials provided with the distribution. |
|
||||||
# |
# |
||||||
# * Neither the names of Kitware, Inc., the Insight Software Consortium, |
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, |
||||||
# nor the names of their contributors may be used to endorse or promote |
# 2020 Vladimír Vondruš <mosra@centrum.cz> |
||||||
# products derived from this software without specific prior written |
|
||||||
# permission. |
|
||||||
# |
# |
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
# Permission is hereby granted, free of charge, to any person obtaining a |
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
# copy of this software and associated documentation files (the "Software"), |
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
# to deal in the Software without restriction, including without limitation |
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
# the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||||
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
# and/or sell copies of the Software, and to permit persons to whom the |
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
# Software is furnished to do so, subject to the following conditions: |
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
#============================================================================= |
|
||||||
|
|
||||||
# This makes the presumption that you are include al.h like |
|
||||||
# #include "al.h" |
|
||||||
# and not |
|
||||||
# #include <AL/al.h> |
|
||||||
# The reason for this is that the latter is not entirely portable. |
|
||||||
# Windows/Creative Labs does not by default put their headers in AL/ and |
|
||||||
# OS X uses the convention <OpenAL/al.h>. |
|
||||||
# |
# |
||||||
# For Windows, Creative Labs seems to have added a registry key for their |
# The above copyright notice and this permission notice shall be included |
||||||
# OpenAL 1.1 installer. I have added that key to the list of search paths, |
# in all copies or substantial portions of the Software. |
||||||
# 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. |
|
||||||
# |
# |
||||||
# For OS X, remember that OpenAL was added by Apple in 10.4 (Tiger). |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
# To support the framework, I originally wrote special framework detection |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
# code in this module which I have now removed with CMake's introduction |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||||
# of native support for frameworks. |
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
# In addition, OpenAL is open source, and it is possible to compile on Panther. |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||||
# Furthermore, due to bugs in the initial OpenAL release, and the |
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||||
# transition to OpenAL 1.1, it is common to need to override the built-in |
# DEALINGS IN THE SOFTWARE. |
||||||
# framework. |
|
||||||
# Per my request, CMake should search for frameworks first in |
|
||||||
# the following order: |
|
||||||
# ~/Library/Frameworks/OpenAL.framework/Headers |
|
||||||
# /Library/Frameworks/OpenAL.framework/Headers |
|
||||||
# /System/Library/Frameworks/OpenAL.framework/Headers |
|
||||||
# |
# |
||||||
# On OS X, this will prefer the Framework version (if found) over others. |
|
||||||
# People will have to manually change the cache values of |
# OpenAL Soft installs cmake package config files which handles dependencies in |
||||||
# OPENAL_LIBRARY to override this selection or set the CMake environment |
# case OpenAL Soft is built statically. Try to find first, quietly, so it |
||||||
# CMAKE_INCLUDE_PATH to modify the search paths. |
# 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 |
||||||
# This version is modified for Magnum and was forked from |
# subproject -- don't attempt to find the package in that case. |
||||||
# https://github.com/Kitware/CMake/blob/v3.6.1/Modules/FindOpenAL.cmake |
if(NOT TARGET OpenAL) |
||||||
# The file was modified to add a new path suffix for finding OpenAL for |
find_package(OpenAL CONFIG QUIET) |
||||||
# Emscripten on macOS. Additionally, in case of Emscripten, there's no library |
endif() |
||||||
# to find but instead one says -lopenal (and if MINIMAL_RUNTIME is not |
|
||||||
# specified, this is implicit). |
# 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. |
||||||
find_path(OPENAL_INCLUDE_DIR al.h |
if(TARGET OpenAL OR TARGET OpenAL::OpenAL) |
||||||
HINTS |
# OpenAL Soft config file already defines this one, so this is just for |
||||||
ENV OPENALDIR |
# the subproject case. |
||||||
# The AL was added in order to make the module working for Emscripten on macOS. |
if(NOT TARGET OpenAL::OpenAL) |
||||||
# Not sure why include/AL wasn't enough. |
# Aliases of (global) targets are only supported in CMake 3.11, so we |
||||||
PATH_SUFFIXES include/AL include/OpenAL include AL |
# work around it by this. This is easier than fetching all possible |
||||||
PATHS |
# properties (which are impossible to track of) and then attempting to |
||||||
~/Library/Frameworks |
# rebuild them into a new target. |
||||||
/Library/Frameworks |
add_library(OpenAL::OpenAL INTERFACE IMPORTED) |
||||||
/sw # Fink |
set_target_properties(OpenAL::OpenAL PROPERTIES INTERFACE_LINK_LIBRARIES OpenAL) |
||||||
/opt/local # DarwinPorts |
|
||||||
/opt/csw # Blastwave |
# The OpenAL target doesn't define any usable |
||||||
/opt |
# INTERFACE_INCLUDE_DIRECTORIES for some reason (apparently the |
||||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] |
# $<BUILD_INTERFACE:> in there doesn't work or whatever), so let's do |
||||||
) |
# that ourselves. |
||||||
|
get_target_property(_OPENAL_SOURCE_DIR OpenAL SOURCE_DIR) |
||||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
set_target_properties(OpenAL::OpenAL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${_OPENAL_SOURCE_DIR}/include/AL) |
||||||
set(_OpenAL_ARCH_DIR libs/Win64) |
endif() |
||||||
else() |
|
||||||
set(_OpenAL_ARCH_DIR libs/Win32) |
# 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) |
||||||
|
|
||||||
|
if(CORRADE_TARGET_WINDOWS) |
||||||
|
# TODO: investigate if OpenAL Soft has IMPORTED_LOCATION_ / IMPLIB like |
||||||
|
# GLFW does so we can provide OPENAL_DLL |
||||||
|
endif() |
||||||
|
|
||||||
|
return() |
||||||
endif() |
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) |
if(CORRADE_TARGET_EMSCRIPTEN) |
||||||
set(OPENAL_LIBRARY openal CACHE STRING "Path to a library." FORCE) |
set(OPENAL_LIBRARY openal CACHE STRING "Path to a library." FORCE) |
||||||
else() |
else() |
||||||
find_library(OPENAL_LIBRARY |
# OpenAL Soft Windows binary distribution puts the library into a subdir, |
||||||
NAMES OpenAL al openal OpenAL32 |
# the legacy one from Creative uses the same. OpenAL Soft puts DLLs into |
||||||
HINTS |
# bin/Win{32,64}/soft_oal.dll |
||||||
ENV OPENALDIR |
if(WIN32) |
||||||
PATH_SUFFIXES lib64 lib libs64 libs ${_OpenAL_ARCH_DIR} |
if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
||||||
PATHS |
set(_OPENAL_LIBRARY_PATH_SUFFIX libs/Win64) |
||||||
~/Library/Frameworks |
set(_OPENAL_DLL_PATH_SUFFIX bin/Win64) |
||||||
/Library/Frameworks |
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) |
||||||
/sw |
set(_OPENAL_LIBRARY_PATH_SUFFIX libs/Win32) |
||||||
/opt/local |
set(_OPENAL_DLL_PATH_SUFFIX bin/Win32) |
||||||
/opt/csw |
endif() |
||||||
/opt |
endif() |
||||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] |
|
||||||
) |
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() |
endif() |
||||||
|
|
||||||
unset(_OpenAL_ARCH_DIR) |
# 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 |
||||||
|
) |
||||||
|
|
||||||
|
# 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() |
||||||
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set OPENAL_FOUND to TRUE if |
|
||||||
# all listed variables are TRUE |
|
||||||
include(FindPackageHandleStandardArgs) |
include(FindPackageHandleStandardArgs) |
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenAL DEFAULT_MSG OPENAL_LIBRARY OPENAL_INCLUDE_DIR) |
find_package_handle_standard_args(OpenAL DEFAULT_MSG |
||||||
|
OPENAL_LIBRARY |
||||||
|
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() |
||||||
|
|
||||||
|
set_target_properties(OpenAL::OpenAL PROPERTIES |
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${OPENAL_INCLUDE_DIR}) |
||||||
|
endif() |
||||||
|
|
||||||
mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR) |
mark_as_advanced(OPENAL_LIBRARY OPENAL_INCLUDE_DIR) |
||||||
|
|||||||
Loading…
Reference in new issue