From d464f8a2ca6e77251232c99420c8c6370986b2b6 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 14 Nov 2023 15:05:44 +0100 Subject: [PATCH] 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 --- cmake/LibraryDefine.cmake | 3 -- cmake/OpenEXRSetup.cmake | 58 ++++++++++++++++++++---------- src/lib/OpenEXRCore/CMakeLists.txt | 6 ++-- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/cmake/LibraryDefine.cmake b/cmake/LibraryDefine.cmake index a242ec8519..0e2dbf6c17 100644 --- a/cmake/LibraryDefine.cmake +++ b/cmake/LibraryDefine.cmake @@ -27,9 +27,6 @@ function(OPENEXR_DEFINE_LIBRARY libname) PRIVATE cxx_std_${OPENEXR_CXX_STANDARD} INTERFACE cxx_std_11 ) - # we are embedding libdeflate - target_include_directories(${objlib} PRIVATE ${EXR_DEFLATE_INCLUDE_DIR}) - if(OPENEXR_CURLIB_PRIV_EXPORT AND BUILD_SHARED_LIBS) target_compile_definitions(${objlib} PRIVATE ${OPENEXR_CURLIB_PRIV_EXPORT}) if(WIN32) diff --git a/cmake/OpenEXRSetup.cmake b/cmake/OpenEXRSetup.cmake index 7d01362c84..3a446cd157 100644 --- a/cmake/OpenEXRSetup.cmake +++ b/cmake/OpenEXRSetup.cmake @@ -160,15 +160,45 @@ 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) + if(libdeflate_FOUND) + if(TARGET libdeflate::libdeflate_shared) + set(EXR_DEFLATE_TARGET libdeflate::libdeflate_shared) + else() + set(EXR_DEFLATE_TARGET libdeflate::libdeflate_static) + endif() + set(EXR_DEFLATE_SOURCES) + set(EXR_DEFLATE_LDFLAGS) + # Set EXR_DEFATE_LDFLAGS for OpenEXR.pc.in for static build + if(NOT BUILD_SHARED_LIBS) + get_target_property(deflate_LIBRARIES ${EXR_DEFLATE_TARGET} LOCATION) + set(EXR_DEFLATE_LDFLAGS "-l${deflate_LIBRARIES}") + endif() + 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_TARGET PkgConfig::deflate) + set(EXR_DEFLATE_SOURCES) + set(EXR_DEFLATE_LDFLAGS) + # Set EXR_DEFATE_LDFLAGS for OpenEXR.pc.in for static build + if(NOT BUILD_SHARED_LIBS) + set(EXR_DEFLATE_LDFLAGS "-l${deflate_LIBRARIES}") + endif() + 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(NOT EXR_DEFLATE_TARGET) + # Using internal deflate. if(OPENEXR_FORCE_INTERNAL_DEFLATE) message(STATUS "libdeflate forced internal, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})") else() @@ -211,18 +241,10 @@ if(NOT TARGET PkgConfig::deflate AND NOT deflate_FOUND) # cmake makes fetch content name lowercase for the properties (to deflate) 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) + + add_library(libdeflate_internal_static STATIC IMPORTED) + set_target_properties(libdeflate_internal_static PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${deflate_SOURCE_DIR}") + set(EXR_DEFLATE_TARGET libdeflate_internal_static) endif() ####################################### diff --git a/src/lib/OpenEXRCore/CMakeLists.txt b/src/lib/OpenEXRCore/CMakeLists.txt index f4bd54efb3..3b209a3a63 100644 --- a/src/lib/OpenEXRCore/CMakeLists.txt +++ b/src/lib/OpenEXRCore/CMakeLists.txt @@ -104,10 +104,10 @@ openexr_define_library(OpenEXRCore Imath::Imath ) -if (DEFINED EXR_DEFLATE_LIB) +if (DEFINED EXR_DEFLATE_TARGET) if (BUILD_SHARED_LIBS) - target_link_libraries(OpenEXRCore PRIVATE ${EXR_DEFLATE_LIB}) + target_link_libraries(OpenEXRCore PRIVATE ${EXR_DEFLATE_TARGET}) else() - target_link_libraries(OpenEXRCore PUBLIC ${EXR_DEFLATE_LIB}) + target_link_libraries(OpenEXRCore PUBLIC ${EXR_DEFLATE_TARGET}) endif() endif()