diff --git a/CMakeLists.txt b/CMakeLists.txt index 4be2eac0d..b73ca1160 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,12 +79,6 @@ list(APPEND OLIVE_INCLUDE_DIRS ${OIIO_INCLUDE_DIRS}) find_package(OpenEXR REQUIRED) list(APPEND OLIVE_LIBRARIES ${OPENEXR_LIBRARIES}) list(APPEND OLIVE_INCLUDE_DIRS ${OPENEXR_INCLUDES}) -if (APPLE) - # HACK: Brew on macOS separates OpenEXR and IlmBase into two folders even though they seem to - # expect to be in one. This includes the IlmBase files as if they were in the same folders - # as the OpenEXR headers. This would be better rolled into FindOpenEXR.cmake. - list(APPEND OLIVE_INCLUDE_DIRS ${ILMBASE_INCLUDES}/OpenEXR) -endif() # Link Qt 5 find_package(Qt5 5.6 REQUIRED diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index c7fbf829a..bfc0aaa11 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -21,6 +21,8 @@ #include "framehashcache.h" #include +#include +#include #include #include #include diff --git a/cmake/FindOpenEXR.cmake b/cmake/FindOpenEXR.cmake index d14e9c288..b08cd61c6 100644 --- a/cmake/FindOpenEXR.cmake +++ b/cmake/FindOpenEXR.cmake @@ -1,15 +1,118 @@ -# Module to find OpenEXR. +# Module to find OpenEXR and Imath. +# +# I'm afraid this is a mess, due to needing to support a wide range of +# OpenEXR versions. +# +# For OpenEXR & Imath 3.0, this will establish the following imported +# targets: +# +# Imath::Imath +# Imath::Half +# OpenEXR::OpenEXR +# OpenEXR::Iex +# OpenEXR::IlmThread +# +# For OpenEXR 2.4 & 2.5, it will establish the following imported targets: +# +# IlmBase::Imath +# IlmBase::Half +# IlmBase::Iex +# IlmBase::IlmThread +# OpenEXR::IlmImf +# +# For all versions -- but for OpenEXR < 2.4 the only thing this sets -- +# are the following CMake variables: # -# This module will set # OPENEXR_FOUND true, if found -# OPENEXR_INCLUDES directory where headers are found +# OPENEXR_INCLUDES directory where OpenEXR headers are found # OPENEXR_LIBRARIES libraries for OpenEXR + IlmBase -# ILMBASE_LIBRARIES libraries just IlmBase # OPENEXR_VERSION OpenEXR version (accurate for >= 2.0.0, # otherwise will just guess 1.6.1) +# IMATH_INCLUDES directory where Imath headers are found +# ILMBASE_INCLUDES directory where IlmBase headers are found +# ILMBASE_LIBRARIES libraries just IlmBase # # +# First, try to fine just the right config files +find_package(Imath CONFIG) +if (NOT TARGET Imath::Imath) + # Couldn't find Imath::Imath, maybe it's older and has IlmBase? + find_package(IlmBase CONFIG) +endif () +find_package(OpenEXR CONFIG) + +if (TARGET OpenEXR::OpenEXR AND TARGET Imath::Imath) + # OpenEXR 3.x if both of these targets are found + set (FOUND_OPENEXR_WITH_CONFIG 1) + if (NOT OpenEXR_FIND_QUIETLY) + message (STATUS "Found CONFIG for OpenEXR 3 (OPENEXR_VERSION=${OpenEXR_VERSION})") + endif () + + # Mimic old style variables + set (OPENEXR_VERSION ${OpenEXR_VERSION}) + get_target_property(IMATH_INCLUDES Imath::Imath INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(ILMBASE_INCLUDES Imath::Imath INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(ILMBASE_IMATH_LIBRARY Imath::Imath INTERFACE_LINK_LIBRARIES) + get_target_property(IMATH_LIBRARY Imath::Imath INTERFACE_LINK_LIBRARIES) + get_target_property(OPENEXR_IEX_LIBRARY OpenEXR::Iex INTERFACE_LINK_LIBRARIES) + get_target_property(OPENEXR_ILMTHREAD_LIBRARY OpenEXR::IlmThread INTERFACE_LINK_LIBRARIES) + set (ILMBASE_LIBRARIES ${ILMBASE_IMATH_LIBRARY}) + set (ILMBASE_FOUND true) + + get_target_property(OPENEXR_INCLUDES OpenEXR::OpenEXR INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(OPENEXR_ILMIMF_LIBRARY OpenEXR::OpenEXR INTERFACE_LINK_LIBRARIES) + set (OPENEXR_LIBRARIES OpenEXR::OpenEXR ${OPENEXR_ILMIMF_LIBRARY} ${OPENEXR_IEX_LIBRARY} ${OPENEXR_ILMTHREAD_LIBRARY} ${ILMBASE_LIBRARIES}) + set (OPENEXR_FOUND true) + + # Link with pthreads if required + find_package (Threads) + if (CMAKE_USE_PTHREADS_INIT) + list (APPEND ILMBASE_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) + endif () + +elseif (TARGET OpenEXR::IlmImf AND TARGET IlmBase::Imath AND + (OPENEXR_VERSION VERSION_GREATER_EQUAL 2.4 OR OpenEXR_VERSION VERSION_GREATER_EQUAL 2.4)) + # OpenEXR 2.4 or 2.5 with exported config + set (FOUND_OPENEXR_WITH_CONFIG 1) + if (NOT OpenEXR_FIND_QUIETLY) + message (STATUS "Found CONFIG for OpenEXR 2 (OPENEXR_VERSION=${OpenEXR_VERSION})") + endif () + + # Mimic old style variables + get_target_property(ILMBASE_INCLUDES IlmBase::IlmBaseConfig INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(IMATH_INCLUDES IlmBase::IlmBaseConfig INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(ILMBASE_Imath_LIBRARY IlmBase::Imath INTERFACE_LINK_LIBRARIES) + get_target_property(ILMBASE_IMATH_LIBRARY IlmBase::Imath INTERFACE_LINK_LIBRARIES) + get_target_property(ILMBASE_HALF_LIBRARY IlmBase::Half INTERFACE_LINK_LIBRARIES) + get_target_property(OPENEXR_IEX_LIBRARY IlmBase::Iex INTERFACE_LINK_LIBRARIES) + get_target_property(OPENEXR_ILMTHREAD_LIBRARY IlmBase::IlmThread INTERFACE_LINK_LIBRARIES) + set (ILMBASE_LIBRARIES ${ILMBASE_IMATH_LIBRARY} ${ILMBASE_HALF_LIBRARY} ${OPENEXR_IEX_LIBRARY} ${OPENEXR_ILMTHREAD_LIBRARY}) + set (ILMBASE_FOUND true) + + get_target_property(OPENEXR_INCLUDES OpenEXR::IlmImfConfig INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(OPENEXR_ILMIMF_LIBRARY OpenEXR::IlmImf INTERFACE_LINK_LIBRARIES) + set (OPENEXR_LIBRARIES ${OPENEXR_ILMIMF_LIBRARY} ${ILMBASE_LIBRARIES}) + set (OPENEXR_FOUND true) + + # Link with pthreads if required + find_package (Threads) + if (CMAKE_USE_PTHREADS_INIT) + list (APPEND ILMBASE_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) + endif () + + # Correct for how old OpenEXR config exports set the directory one + # level lower than we prefer it. + string(REGEX REPLACE "include/OpenEXR$" "include" ILMBASE_INCLUDES "${ILMBASE_INCLUDES}") + string(REGEX REPLACE "include/OpenEXR$" "include" IMATH_INCLUDES "${IMATH_INCLUDES}") + string(REGEX REPLACE "include/OpenEXR$" "include" OPENEXR_INCLUDES "${OPENEXR_INCLUDES}") + +else () + # OpenEXR 2.x older versions without a config or whose configs we don't + # trust. + + set (FOUND_OPENEXR_WITH_CONFIG 0) + # Other standard issue macros include (FindPackageHandleStandardArgs) include (SelectLibraryConfigurations) @@ -23,19 +126,17 @@ if (CMAKE_USE_PTHREADS_INIT) endif () # Attempt to find OpenEXR with pkgconfig -if (NOT WIN32) - find_package(PkgConfig) - if (PKG_CONFIG_FOUND) - if (NOT Ilmbase_ROOT AND NOT ILMBASE_ROOT - AND NOT DEFINED ENV{Ilmbase_ROOT} AND NOT DEFINED ENV{ILMBASE_ROOT}) - pkg_check_modules(_ILMBASE QUIET IlmBase>=2.0.0) - endif () - if (NOT OpenEXR_ROOT AND NOT OPENEXR_ROOT - AND NOT DEFINED ENV{OpenEXR_ROOT} AND NOT DEFINED ENV{OPENEXR_ROOT}) - pkg_check_modules(_OPENEXR QUIET OpenEXR>=2.0.0) - endif () - endif (PKG_CONFIG_FOUND) -endif() +find_package(PkgConfig) +if (PKG_CONFIG_FOUND) + if (NOT Ilmbase_ROOT AND NOT ILMBASE_ROOT + AND NOT DEFINED ENV{Ilmbase_ROOT} AND NOT DEFINED ENV{ILMBASE_ROOT}) + pkg_check_modules(_ILMBASE QUIET IlmBase>=2.0.0) + endif () + if (NOT OpenEXR_ROOT AND NOT OPENEXR_ROOT + AND NOT DEFINED ENV{OpenEXR_ROOT} AND NOT DEFINED ENV{OPENEXR_ROOT}) + pkg_check_modules(_OPENEXR QUIET OpenEXR>=2.0.0) + endif () +endif (PKG_CONFIG_FOUND) # List of likely places to find the headers -- note priority override of # ${OPENEXR_ROOT}/include. @@ -120,47 +221,33 @@ set (_openexr_components IlmThread IlmImf Imath Iex Half) foreach (COMPONENT ${_openexr_components}) string (TOUPPER ${COMPONENT} UPPERCOMPONENT) # First try with the version embedded - find_library (OPENEXR_${UPPERCOMPONENT}_LIBRARY_RELEASE + find_library (OPENEXR_${UPPERCOMPONENT}_LIBRARY NAMES ${COMPONENT}-${OPENEXR_VERSION_MAJOR}_${OPENEXR_VERSION_MINOR} ${COMPONENT} - HINTS ${OPENEXR_LIBRARY_DIR} $ENV{OPENEXR_LIBRARY_DIR} - ${GENERIC_LIBRARY_PATHS} ) - - find_library (OPENEXR_${UPPERCOMPONENT}_LIBRARY_DEBUG - NAMES ${COMPONENT}-${OPENEXR_VERSION_MAJOR}_${OPENEXR_VERSION_MINOR}_d + ${COMPONENT}-${OPENEXR_VERSION_MAJOR}_${OPENEXR_VERSION_MINOR}_d ${COMPONENT}_d HINTS ${OPENEXR_LIBRARY_DIR} $ENV{OPENEXR_LIBRARY_DIR} ${GENERIC_LIBRARY_PATHS} ) - - if (OPENEXR_${UPPERCOMPONENT}_LIBRARY_RELEASE AND OPENEXR_${UPPERCOMPONENT}_LIBRARY_DEBUG) - set(OPENEXR_${UPPERCOMPONENT}_LIBRARY - optimized ${OPENEXR_${UPPERCOMPONENT}_LIBRARY_RELEASE} - debug ${OPENEXR_${UPPERCOMPONENT}_LIBRARY_DEBUG}) - elseif(OPENEXR_${UPPERCOMPONENT}_LIBRARY_RELEASE) - set(OPENEXR_${UPPERCOMPONENT}_LIBRARY - ${OPENEXR_${UPPERCOMPONENT}_LIBRARY_RELEASE}) - else() - set(OPENEXR_${UPPERCOMPONENT}_LIBRARY - ${OPENEXR_${UPPERCOMPONENT}_LIBRARY_DEBUG}) - endif() - endforeach () find_package_handle_standard_args (OpenEXR REQUIRED_VARS ILMBASE_INCLUDE_PATH OPENEXR_INCLUDE_PATH OPENEXR_IMATH_LIBRARY OPENEXR_ILMIMF_LIBRARY OPENEXR_IEX_LIBRARY OPENEXR_HALF_LIBRARY - VERSION_VAR OPENEXR_VERSION ) if (OPENEXR_FOUND) + set (OpenEXR_VERSION ${OPENEXR_VERSION}) set (ILMBASE_FOUND TRUE) set (ILMBASE_INCLUDES ${ILMBASE_INCLUDE_PATH}) + set (IMATH_INCLUDES ${ILMBASE_INCLUDE_PATH}) set (OPENEXR_INCLUDES ${OPENEXR_INCLUDE_PATH}) set (ILMBASE_INCLUDE_DIR ${ILMBASE_INCLUDE_PATH}) + set (IMATH_INCLUDE_DIR ${ILMBASE_INCLUDE_PATH}) set (OPENEXR_INCLUDE_DIR ${OPENEXR_INCLUDE_PATH}) set (ILMBASE_LIBRARIES ${OPENEXR_IMATH_LIBRARY} ${OPENEXR_IEX_LIBRARY} ${OPENEXR_HALF_LIBRARY} ${OPENEXR_ILMTHREAD_LIBRARY} ${ILMBASE_PTHREADS} CACHE STRING "The libraries needed to use IlmBase") set (OPENEXR_LIBRARIES ${OPENEXR_ILMIMF_LIBRARY} ${ILMBASE_LIBRARIES} ${ZLIB_LIBRARIES} CACHE STRING "The libraries needed to use OpenEXR") + set (FINDOPENEXR_FALLBACK TRUE) endif () mark_as_advanced( @@ -172,3 +259,5 @@ mark_as_advanced( # Restore the original CMAKE_FIND_LIBRARY_SUFFIXES set (CMAKE_FIND_LIBRARY_SUFFIXES ${_openexr_orig_suffixes}) + +endif ()