-
Notifications
You must be signed in to change notification settings - Fork 442
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
modules: rewrite FindOpenAL to support static and subproject AL Soft.
Strange build breakages, I'm ready for you now!
- Loading branch information
Showing
11 changed files
with
199 additions
and
155 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,145 +1,160 @@ | ||
#.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 | ||
# false, do not try to link to OpenAL OPENAL_INCLUDE_DIR, where to find | ||
# the headers | ||
# Additionally these variables are defined for internal usage: | ||
# | ||
# $OPENALDIR is an environment variable that would correspond to the | ||
# ./configure --prefix=$OPENALDIR used in building OpenAL. | ||
# OPENAL_LIBRARY - OpenAL library | ||
# 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 | ||
# notice, this list of conditions and the following disclaimer in the | ||
# documentation and/or other materials provided with the distribution. | ||
# This file is part of Magnum. | ||
# | ||
# * Neither the names of Kitware, Inc., the Insight Software Consortium, | ||
# nor the names of their contributors may be used to endorse or promote | ||
# products derived from this software without specific prior written | ||
# permission. | ||
# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, | ||
# 2020 Vladimír Vondruš <mosra@centrum.cz> | ||
# | ||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
# 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>. | ||
# 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: | ||
# | ||
# 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. | ||
# The above copyright notice and this permission notice shall be included | ||
# in all copies or substantial portions of the Software. | ||
# | ||
# For OS X, remember that OpenAL was added by Apple in 10.4 (Tiger). | ||
# To support the framework, I originally wrote special framework detection | ||
# code in this module which I have now removed with CMake's introduction | ||
# of native support for frameworks. | ||
# In addition, OpenAL is open source, and it is possible to compile on Panther. | ||
# Furthermore, due to bugs in the initial OpenAL release, and the | ||
# transition to OpenAL 1.1, it is common to need to override the built-in | ||
# 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 | ||
# 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. | ||
# | ||
# On OS X, this will prefer the Framework version (if found) over others. | ||
# People will have to manually change the cache values of | ||
# OPENAL_LIBRARY to override this selection or set the CMake environment | ||
# CMAKE_INCLUDE_PATH to modify the search paths. | ||
|
||
# This version is modified for Magnum and was forked from | ||
# https://github.com/Kitware/CMake/blob/v3.6.1/Modules/FindOpenAL.cmake | ||
# The file was modified to add a new path suffix for finding OpenAL for | ||
# Emscripten on macOS. Additionally, in case of Emscripten, there's no library | ||
# to find but instead one says -lopenal (and if MINIMAL_RUNTIME is not | ||
# specified, this is implicit). | ||
|
||
find_path(OPENAL_INCLUDE_DIR al.h | ||
HINTS | ||
ENV OPENALDIR | ||
# The AL was added in order to make the module working for Emscripten on macOS. | ||
# Not sure why include/AL wasn't enough. | ||
PATH_SUFFIXES include/AL include/OpenAL include AL | ||
PATHS | ||
~/Library/Frameworks | ||
/Library/Frameworks | ||
/sw # Fink | ||
/opt/local # DarwinPorts | ||
/opt/csw # Blastwave | ||
/opt | ||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] | ||
) | ||
|
||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
set(_OpenAL_ARCH_DIR libs/Win64) | ||
else() | ||
set(_OpenAL_ARCH_DIR libs/Win32) | ||
|
||
# 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. | ||
if(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) | ||
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) | ||
|
||
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() | ||
|
||
# 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() | ||
find_library(OPENAL_LIBRARY | ||
NAMES OpenAL al openal OpenAL32 | ||
HINTS | ||
ENV OPENALDIR | ||
PATH_SUFFIXES lib64 lib libs64 libs ${_OpenAL_ARCH_DIR} | ||
PATHS | ||
~/Library/Frameworks | ||
/Library/Frameworks | ||
/sw | ||
/opt/local | ||
/opt/csw | ||
/opt | ||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Creative\ Labs\\OpenAL\ 1.1\ Software\ Development\ Kit\\1.00.0000;InstallDir] | ||
) | ||
# 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() | ||
|
||
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) | ||
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.