Files
UnrealEngine/Engine/Source/ThirdParty/OpenVDB/openvdb-12.0.0/cmake/FindOpenEXR.cmake
2025-05-18 13:04:45 +08:00

443 lines
15 KiB
CMake

# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
#
#[=======================================================================[.rst:
FindOpenEXR
-----------
Find OpenEXR include dirs and libraries
Use this module by invoking find_package with the form::
find_package(OpenEXR
[version] [EXACT] # Minimum or EXACT version
[REQUIRED] # Fail with error if OpenEXR is not found
[COMPONENTS <libs>...] # OpenEXR libraries by their canonical name
# e.g. "IlmImf" for "libIlmImf"
)
IMPORTED Targets
^^^^^^^^^^^^^^^^
``OpenEXR::IlmImf``
The IlmImf library target.
``OpenEXR::IlmImfUtil``
The IlmImfUtil library target.
Result Variables
^^^^^^^^^^^^^^^^
This will define the following variables:
``OpenEXR_FOUND``
True if the system has the OpenEXR library.
``OpenEXR_VERSION``
The version of the OpenEXR library which was found.
``OpenEXR_INCLUDE_DIRS``
Include directories needed to use OpenEXR.
``OpenEXR_RELEASE_LIBRARIES``
Libraries needed to link to the release version of OpenEXR.
``OpenEXR_RELEASE_LIBRARY_DIRS``
OpenEXR release library directories.
``OpenEXR_DEBUG_LIBRARIES``
Libraries needed to link to the debug version of OpenEXR.
``OpenEXR_DEBUG_LIBRARY_DIRS``
OpenEXR debug library directories.
``OpenEXR_DEFINITIONS``
Definitions to use when compiling code that uses OpenEXR.
``OpenEXR_{COMPONENT}_FOUND``
True if the system has the named OpenEXR component.
Deprecated - use [RELEASE|DEBUG] variants:
``OpenEXR_LIBRARIES``
Libraries needed to link to OpenEXR.
``OpenEXR_LIBRARY_DIRS``
OpenEXR library directories.
Cache Variables
^^^^^^^^^^^^^^^
The following cache variables may also be set:
``OpenEXR_INCLUDE_DIR``
The directory containing ``OpenEXR/config-auto.h``.
``OpenEXR_{COMPONENT}_LIBRARY``
Individual component libraries for OpenEXR. may include target_link_libraries() debug/optimized keywords.
``OpenEXR_{COMPONENT}_LIBRARY_RELEASE``
Individual component libraries for OpenEXR release
``OpenEXR_{COMPONENT}_LIBRARY_DEBUG``
Individual component libraries for OpenEXR debug
Hints
^^^^^
Instead of explicitly setting the cache variables, the following variables
may be provided to tell this module where to look.
``OpenEXR_ROOT``
Preferred installation prefix.
``OPENEXR_INCLUDEDIR``
Preferred include directory e.g. <prefix>/include
``OPENEXR_LIBRARYDIR``
Preferred library directory e.g. <prefix>/lib
``OPENEXR_DEBUG_SUFFIX``
Suffix of the debug version of openexr libs. Defaults to "_d".
``SYSTEM_LIBRARY_PATHS``
Global list of library paths intended to be searched by and find_xxx call
``OPENEXR_USE_STATIC_LIBS``
Only search for static openexr libraries
``DISABLE_CMAKE_SEARCH_PATHS``
Disable CMakes default search paths for find_xxx calls in this module
#]=======================================================================]
cmake_minimum_required(VERSION 3.20)
include(GNUInstallDirs)
mark_as_advanced(
OpenEXR_INCLUDE_DIR
OpenEXR_LIBRARY
)
set(_FIND_OPENEXR_ADDITIONAL_OPTIONS "")
if(DISABLE_CMAKE_SEARCH_PATHS)
set(_FIND_OPENEXR_ADDITIONAL_OPTIONS NO_DEFAULT_PATH)
endif()
# Set _OPENEXR_ROOT based on a user provided root var. Xxx_ROOT and ENV{Xxx_ROOT}
# are prioritised over the legacy capitalized XXX_ROOT variables for matching
# CMake 3.12 behaviour
# @todo deprecate -D and ENV OPENEXR_ROOT from CMake 3.12
if(OpenEXR_ROOT)
set(_OPENEXR_ROOT ${OpenEXR_ROOT})
elseif(DEFINED ENV{OpenEXR_ROOT})
set(_OPENEXR_ROOT $ENV{OpenEXR_ROOT})
elseif(OPENEXR_ROOT)
set(_OPENEXR_ROOT ${OPENEXR_ROOT})
elseif(DEFINED ENV{OPENEXR_ROOT})
set(_OPENEXR_ROOT $ENV{OPENEXR_ROOT})
endif()
# Additionally try and use pkconfig to find OpenEXR
if(USE_PKGCONFIG)
if(NOT DEFINED PKG_CONFIG_FOUND)
find_package(PkgConfig)
endif()
pkg_check_modules(PC_OpenEXR QUIET OpenEXR)
endif()
# ------------------------------------------------------------------------
# Search for OpenEXR include DIR
# ------------------------------------------------------------------------
set(_OPENEXR_INCLUDE_SEARCH_DIRS "")
list(APPEND _OPENEXR_INCLUDE_SEARCH_DIRS
${OPENEXR_INCLUDEDIR}
${_OPENEXR_ROOT}
${PC_OpenEXR_INCLUDEDIR}
${SYSTEM_LIBRARY_PATHS}
)
# Look for a standard OpenEXR header file.
find_path(OpenEXR_INCLUDE_DIR OpenEXRConfig.h
${_FIND_OPENEXR_ADDITIONAL_OPTIONS}
PATHS ${_OPENEXR_INCLUDE_SEARCH_DIRS}
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR}/OpenEXR include/OpenEXR OpenEXR
)
if(EXISTS "${OpenEXR_INCLUDE_DIR}/OpenEXRConfig.h")
# Get the EXR version information from the config header
file(STRINGS "${OpenEXR_INCLUDE_DIR}/OpenEXRConfig.h"
_openexr_version_major_string REGEX "#define OPENEXR_VERSION_MAJOR "
)
string(REGEX REPLACE "#define OPENEXR_VERSION_MAJOR" ""
_openexr_version_major_string "${_openexr_version_major_string}"
)
string(STRIP "${_openexr_version_major_string}" OpenEXR_VERSION_MAJOR)
file(STRINGS "${OpenEXR_INCLUDE_DIR}/OpenEXRConfig.h"
_openexr_version_minor_string REGEX "#define OPENEXR_VERSION_MINOR "
)
string(REGEX REPLACE "#define OPENEXR_VERSION_MINOR" ""
_openexr_version_minor_string "${_openexr_version_minor_string}"
)
string(STRIP "${_openexr_version_minor_string}" OpenEXR_VERSION_MINOR)
unset(_openexr_version_major_string)
unset(_openexr_version_minor_string)
set(OpenEXR_VERSION ${OpenEXR_VERSION_MAJOR}.${OpenEXR_VERSION_MINOR})
endif()
if(${OpenEXR_VERSION} VERSION_GREATER_EQUAL 3.0)
set(_OPENEXR_COMPONENT_LIST OpenEXR OpenEXRUtil Iex IlmThread)
else()
set(_OPENEXR_COMPONENT_LIST IlmImf IlmImfUtil)
endif()
if(OpenEXR_FIND_COMPONENTS)
set(OPENEXR_COMPONENTS_PROVIDED TRUE)
set(_IGNORED_COMPONENTS "")
foreach(COMPONENT ${OpenEXR_FIND_COMPONENTS})
if(NOT ${COMPONENT} IN_LIST _OPENEXR_COMPONENT_LIST)
list(APPEND _IGNORED_COMPONENTS ${COMPONENT})
endif()
endforeach()
if(_IGNORED_COMPONENTS)
message(STATUS "Ignoring unknown components of OpenEXR:")
foreach(COMPONENT ${_IGNORED_COMPONENTS})
message(STATUS " ${COMPONENT}")
endforeach()
list(REMOVE_ITEM OpenEXR_FIND_COMPONENTS ${_IGNORED_COMPONENTS})
endif()
else()
set(OPENEXR_COMPONENTS_PROVIDED FALSE)
set(OpenEXR_FIND_COMPONENTS ${_OPENEXR_COMPONENT_LIST})
endif()
# ------------------------------------------------------------------------
# Search for OPENEXR lib DIR
# ------------------------------------------------------------------------
if(NOT DEFINED OPENEXR_DEBUG_SUFFIX)
set(OPENEXR_DEBUG_SUFFIX _d)
endif()
set(_OPENEXR_LIBRARYDIR_SEARCH_DIRS "")
# Append to _OPENEXR_LIBRARYDIR_SEARCH_DIRS in priority order
list(APPEND _OPENEXR_LIBRARYDIR_SEARCH_DIRS
${OPENEXR_LIBRARYDIR}
${_OPENEXR_ROOT}
${PC_OpenEXR_LIBDIR}
${SYSTEM_LIBRARY_PATHS}
)
set(OpenEXR_LIB_COMPONENTS "")
list(APPEND OPENEXR_BUILD_TYPES RELEASE DEBUG)
foreach(COMPONENT ${OpenEXR_FIND_COMPONENTS})
foreach(BUILD_TYPE ${OPENEXR_BUILD_TYPES})
set(_TMP_SUFFIX "")
if(BUILD_TYPE STREQUAL DEBUG)
set(_TMP_SUFFIX ${OPENEXR_DEBUG_SUFFIX})
endif()
set(_OpenEXR_Version_Suffix "-${OpenEXR_VERSION_MAJOR}_${OpenEXR_VERSION_MINOR}")
set(_OPENEXR_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
if(WIN32)
if(OPENEXR_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_TMP_SUFFIX}.lib")
endif()
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_OpenEXR_Version_Suffix}${_TMP_SUFFIX}.lib")
else()
if(OPENEXR_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_TMP_SUFFIX}.a")
else()
if(APPLE)
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_OpenEXR_Version_Suffix}${_TMP_SUFFIX}.dylib")
else()
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_OpenEXR_Version_Suffix}${_TMP_SUFFIX}.so")
endif()
endif()
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_OpenEXR_Version_Suffix}${_TMP_SUFFIX}.a")
endif()
# Find the lib
find_library(OpenEXR_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${COMPONENT}
${_FIND_OPENEXR_ADDITIONAL_OPTIONS}
PATHS ${_OPENEXR_LIBRARYDIR_SEARCH_DIRS}
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
)
if(EXISTS ${OpenEXR_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
list(APPEND OpenEXR_LIB_COMPONENTS ${OpenEXR_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
list(APPEND OpenEXR_LIB_COMPONENTS_${BUILD_TYPE} ${OpenEXR_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
endif()
# Reset library suffix
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_OPENEXR_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
unset(_OPENEXR_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
unset(_OpenEXR_Version_Suffix)
unset(_TMP_SUFFIX)
endforeach()
if(OpenEXR_${COMPONENT}_LIBRARY_DEBUG AND OpenEXR_${COMPONENT}_LIBRARY_RELEASE)
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
# single-config generators, set optimized and debug libraries
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(_isMultiConfig OR CMAKE_BUILD_TYPE)
set(OpenEXR_${COMPONENT}_LIBRARY optimized ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE} debug ${OpenEXR_${COMPONENT}_LIBRARY_DEBUG})
else()
# For single-config generators where CMAKE_BUILD_TYPE has no value,
# just use the release libraries
set(OpenEXR_${COMPONENT}_LIBRARY ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE})
endif()
# FIXME: This probably should be set for both cases
set(OpenEXR_${COMPONENT}_LIBRARIES optimized ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE} debug ${OpenEXR_${COMPONENT}_LIBRARY_DEBUG})
endif()
# if only the release version was found, set the debug variable also to the release version
if(OpenEXR_${COMPONENT}_LIBRARY_RELEASE AND NOT OpenEXR_${COMPONENT}_LIBRARY_DEBUG)
set(OpenEXR_${COMPONENT}_LIBRARY_DEBUG ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE})
set(OpenEXR_${COMPONENT}_LIBRARY ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE})
set(OpenEXR_${COMPONENT}_LIBRARIES ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE})
endif()
# if only the debug version was found, set the release variable also to the debug version
if(OpenEXR_${COMPONENT}_LIBRARY_DEBUG AND NOT OpenEXR_${COMPONENT}_LIBRARY_RELEASE)
set(OpenEXR_${COMPONENT}_LIBRARY_RELEASE ${OpenEXR_${COMPONENT}_LIBRARY_DEBUG})
set(OpenEXR_${COMPONENT}_LIBRARY ${OpenEXR_${COMPONENT}_LIBRARY_DEBUG})
set(OpenEXR_${COMPONENT}_LIBRARIES ${OpenEXR_${COMPONENT}_LIBRARY_DEBUG})
endif()
# If the debug & release library ends up being the same, omit the keywords
if("${OpenEXR_${COMPONENT}_LIBRARY_RELEASE}" STREQUAL "${OpenEXR_${COMPONENT}_LIBRARY_DEBUG}")
set(OpenEXR_${COMPONENT}_LIBRARY ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE} )
set(OpenEXR_${COMPONENT}_LIBRARIES ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE} )
endif()
if(OpenEXR_${COMPONENT}_LIBRARY)
set(OpenEXR_${COMPONENT}_FOUND TRUE)
else()
set(OpenEXR_${COMPONENT}_FOUND FALSE)
endif()
endforeach()
# ------------------------------------------------------------------------
# Cache and set OPENEXR_FOUND
# ------------------------------------------------------------------------
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(OpenEXR
FOUND_VAR OpenEXR_FOUND
REQUIRED_VARS
OpenEXR_INCLUDE_DIR
OpenEXR_LIB_COMPONENTS
VERSION_VAR OpenEXR_VERSION
HANDLE_COMPONENTS
)
if(NOT OpenEXR_FOUND)
if(OpenEXR_FIND_REQUIRED)
message(FATAL_ERROR "Unable to find OpenEXR")
endif()
return()
endif()
# Partition release/debug lib vars
set(OpenEXR_RELEASE_LIBRARIES "")
set(OpenEXR_RELEASE_LIBRARY_DIRS "")
set(OpenEXR_DEBUG_LIBRARIES "")
set(OpenEXR_DEBUG_LIBRARY_DIRS "")
foreach(LIB ${OpenEXR_LIB_COMPONENTS_RELEASE})
get_filename_component(_EXR_LIBDIR ${LIB} DIRECTORY)
list(APPEND OpenEXR_RELEASE_LIBRARIES ${LIB})
list(APPEND OpenEXR_RELEASE_LIBRARY_DIRS ${_EXR_LIBDIR})
endforeach()
foreach(LIB ${OpenEXR_LIB_COMPONENTS_DEBUG})
get_filename_component(_EXR_LIBDIR ${LIB} DIRECTORY)
list(APPEND OpenEXR_DEBUG_LIBRARIES ${LIB})
list(APPEND OpenEXR_DEBUG_LIBRARY_DIRS ${_EXR_LIBDIR})
endforeach()
list(REMOVE_DUPLICATES OpenEXR_RELEASE_LIBRARY_DIRS)
list(REMOVE_DUPLICATES OpenEXR_DEBUG_LIBRARY_DIRS)
set(OpenEXR_LIBRARIES ${OpenEXR_RELEASE_LIBRARIES})
set(OpenEXR_LIBRARY_DIRS ${OpenEXR_RELEASE_LIBRARY_DIRS})
# We have to add both include and include/OpenEXR to the include
# path in case OpenEXR and IlmBase are installed separately.
#
# Make sure we get the absolute path to avoid issues where
# /usr/include/OpenEXR/../ is picked up and passed to gcc from cmake
# which won't correctly compute /usr/include as an implicit system
# dir if the path is relative:
#
# https://github.com/AcademySoftwareFoundation/openvdb/issues/632
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129
set(_OpenEXR_Parent_Dir "")
get_filename_component(_OpenEXR_Parent_Dir
${OpenEXR_INCLUDE_DIR}/../ ABSOLUTE)
set(OpenEXR_INCLUDE_DIRS)
list(APPEND OpenEXR_INCLUDE_DIRS
${_OpenEXR_Parent_Dir}
${OpenEXR_INCLUDE_DIR}
)
unset(_OpenEXR_Parent_Dir)
# Configure imported target
foreach(COMPONENT ${OpenEXR_FIND_COMPONENTS})
# Configure lib type. If XXX_USE_STATIC_LIBS, we always assume a static
# lib is in use. If win32, we can't mark the import .libs as shared, so
# these are always marked as UNKNOWN. Otherwise, infer from extension.
set(OpenEXR_${COMPONENT}_LIB_TYPE UNKNOWN)
if(OPENEXR_USE_STATIC_LIBS)
set(OpenEXR_${COMPONENT}_LIB_TYPE STATIC)
elseif(UNIX)
get_filename_component(_OpenEXR_${COMPONENT}_EXT ${OpenEXR_${COMPONENT}_LIBRARY_RELEASE} EXT)
if(${_OpenEXR_${COMPONENT}_EXT} STREQUAL ".a")
set(OpenEXR_${COMPONENT}_LIB_TYPE STATIC)
elseif(${_OpenEXR_${COMPONENT}_EXT} STREQUAL ".so" OR
${_OpenEXR_${COMPONENT}_EXT} STREQUAL ".dylib")
set(OpenEXR_${COMPONENT}_LIB_TYPE SHARED)
endif()
endif()
set(OpenEXR_${COMPONENT}_DEFINITIONS)
# Add the OPENEXR_DLL define if the library is not static on WIN32
if(WIN32)
if(NOT OpenEXR_${COMPONENT}_LIB_TYPE STREQUAL STATIC)
list(APPEND OpenEXR_${COMPONENT}_DEFINITIONS OPENEXR_DLL)
endif()
endif()
if(NOT TARGET OpenEXR::${COMPONENT})
add_library(OpenEXR::${COMPONENT} ${OpenEXR_${COMPONENT}_LIB_TYPE} IMPORTED)
set_target_properties(OpenEXR::${COMPONENT} PROPERTIES
INTERFACE_COMPILE_OPTIONS "${PC_OpenEXR_CFLAGS_OTHER}"
INTERFACE_COMPILE_DEFINITIONS "${OpenEXR_${COMPONENT}_DEFINITIONS}"
INTERFACE_INCLUDE_DIRECTORIES "${OpenEXR_INCLUDE_DIRS}")
# Standard location
set_target_properties(OpenEXR::${COMPONENT} PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${OpenEXR_${COMPONENT}_LIBRARY}")
# Release location
if(EXISTS "${OpenEXR_${COMPONENT}_LIBRARY_RELEASE}")
set_property(TARGET OpenEXR::${COMPONENT} APPEND PROPERTY
IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(OpenEXR::${COMPONENT} PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
IMPORTED_LOCATION_RELEASE "${OpenEXR_${COMPONENT}_LIBRARY_RELEASE}")
endif()
# Debug location
if(EXISTS "${OpenEXR_${COMPONENT}_LIBRARY_DEBUG}")
set_property(TARGET OpenEXR::${COMPONENT} APPEND PROPERTY
IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(OpenEXR::${COMPONENT} PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
IMPORTED_LOCATION_DEBUG "${OpenEXR_${COMPONENT}_LIBRARY_DEBUG}")
endif()
endif()
endforeach()