Skip to content

Commit

Permalink
Support cmake config and shared library for libdeflate
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
brechtvl committed Jan 10, 2024
1 parent e571107 commit bc3153d
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 24 deletions.
3 changes: 0 additions & 3 deletions cmake/LibraryDefine.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
58 changes: 40 additions & 18 deletions cmake/OpenEXRSetup.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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()

#######################################
Expand Down
6 changes: 3 additions & 3 deletions src/lib/OpenEXRCore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit bc3153d

Please sign in to comment.