From f1416aa6d1d6dfeb59ea5f5b927c15e1a105a7fe Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 22 Jan 2024 01:44:43 +0100 Subject: [PATCH] Support cmake config for libdeflate (#1613) * Support cmake config and shared library for libdeflate When not using the internal deflate, the only option was pkgconfig which is not well supported on Windows. This adds support for using the libdeflate cmake config files when available. This change also affects the generated OpenEXR cmake config files. For a static OpenEXR library, INTERFACE_LINK_LIBRARIES now appropriately includes libdeflate along with the existing dependencies like Imath. It also turns the internal libdeflate into a target for consistency. Resolves #1588 Signed-off-by: Brecht Van Lommel * Back out of adding a target for internal libdeflate Signed-off-by: Brecht Van Lommel * Use Requires.private for generated pkgconfig file Signed-off-by: Brecht Van Lommel --------- Signed-off-by: Brecht Van Lommel --- cmake/OpenEXR.pc.in | 3 ++- cmake/OpenEXRSetup.cmake | 47 ++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/cmake/OpenEXR.pc.in b/cmake/OpenEXR.pc.in index bce35c2b1f..68d71c3c84 100644 --- a/cmake/OpenEXR.pc.in +++ b/cmake/OpenEXR.pc.in @@ -14,7 +14,8 @@ Name: OpenEXR Description: OpenEXR image library Version: @OPENEXR_VERSION@ -Libs: @exr_pthread_libs@ -L${libdir} -lOpenEXR${libsuffix} -lOpenEXRUtil${libsuffix} -lOpenEXRCore${libsuffix} -lIex${libsuffix} -lIlmThread${libsuffix} @EXR_DEFLATE_LDFLAGS@ +Libs: @exr_pthread_libs@ -L${libdir} -lOpenEXR${libsuffix} -lOpenEXRUtil${libsuffix} -lOpenEXRCore${libsuffix} -lIex${libsuffix} -lIlmThread${libsuffix} Cflags: -I${includedir} -I${OpenEXR_includedir} @exr_pthread_cflags@ Requires: Imath +Requires.private: @EXR_DEFLATE_PKGCONFIG_REQUIRES@ diff --git a/cmake/OpenEXRSetup.cmake b/cmake/OpenEXRSetup.cmake index ef5c6c0853..0a7dabcc6f 100644 --- a/cmake/OpenEXRSetup.cmake +++ b/cmake/OpenEXRSetup.cmake @@ -160,15 +160,40 @@ set(OPENEXR_DEFLATE_TAG "v1.18" CACHE STRING "Tag to use for libdeflate source r if(NOT OPENEXR_FORCE_INTERNAL_DEFLATE) #TODO: ^^ Release should not clone from main, this is a place holder set(CMAKE_IGNORE_PATH "${CMAKE_CURRENT_BINARY_DIR}/_deps/deflate-src/config;${CMAKE_CURRENT_BINARY_DIR}/_deps/deflate-build/config") - include(FindPkgConfig) - pkg_check_modules(deflate IMPORTED_TARGET GLOBAL libdeflate) - set(CMAKE_IGNORE_PATH) - if (deflate_FOUND) - message(STATUS "Using libdeflate from ${deflate_LINK_LIBRARIES}") + # First try cmake config + find_package(libdeflate CONFIG QUIET) + if(libdeflate_FOUND) + if(TARGET libdeflate::libdeflate_shared) + set(EXR_DEFLATE_LIB libdeflate::libdeflate_shared) + else() + set(EXR_DEFLATE_LIB libdeflate::libdeflate_static) + endif() + set(EXR_DEFLATE_VERSION ${libdeflate_VERSION}) + message(STATUS "Using libdeflate from ${libdeflate_DIR}") + else() + # If not found, try pkgconfig + find_package(PkgConfig) + if(PKG_CONFIG_FOUND) + include(FindPkgConfig) + pkg_check_modules(deflate IMPORTED_TARGET GLOBAL libdeflate) + if(deflate_FOUND) + set(EXR_DEFLATE_LIB PkgConfig::deflate) + set(EXR_DEFLATE_VERSION ${deflate_VERSION}) + message(STATUS "Using libdeflate from ${deflate_LINK_LIBRARIES}") + endif() + endif() endif() + set(CMAKE_IGNORE_PATH) endif() -if(NOT TARGET PkgConfig::deflate AND NOT deflate_FOUND) +if(EXR_DEFLATE_LIB) + # Using external library + set(EXR_DEFLATE_SOURCES) + set(EXR_DEFLATE_INCLUDE_DIR) + # For OpenEXR.pc.in for static build + set(EXR_DEFLATE_PKGCONFIG_REQUIRES "libdeflate >= ${EXR_DEFLATE_VERSION}") +else() + # Using internal deflate if(OPENEXR_FORCE_INTERNAL_DEFLATE) message(STATUS "libdeflate forced internal, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})") else() @@ -213,16 +238,6 @@ if(NOT TARGET PkgConfig::deflate AND NOT deflate_FOUND) list(TRANSFORM EXR_DEFLATE_SOURCES PREPEND ${deflate_SOURCE_DIR}/) set(EXR_DEFLATE_INCLUDE_DIR ${deflate_SOURCE_DIR}) set(EXR_DEFLATE_LIB) -else() - set(EXR_DEFLATE_INCLUDE_DIR) - set(EXR_DEFLATE_LIB ${deflate_LIBRARIES}) - # set EXR_DEFATE_LDFLAGS for OpenEXR.pc.in for static build - if (BUILD_SHARED_LIBS) - set(EXR_DEFLATE_LDFLAGS "") - else() - set(EXR_DEFLATE_LDFLAGS "-l${deflate_LIBRARIES}") - endif() - set(EXR_DEFLATE_SOURCES) endif() #######################################