From 8fb71f56dbd9e3f4997100f4132c5ba0136ae505 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 22 Jan 2024 01:08:19 +0100
Subject: [PATCH] cmake: add SDL3IMAGE_STRICT option
OFF means not having a 3rd party dependency installed, means no configure failure.
ON means a configure failure.
---
.github/workflows/main.yml | 1 +
CMakeLists.txt | 368 ++++++++++++++++++++++----------
cmake/SDL3_imageConfig.cmake.in | 33 +--
3 files changed, 268 insertions(+), 134 deletions(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 79c42d75..428907f6 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -115,6 +115,7 @@ jobs:
-DSDL3IMAGE_JXL=${{ !matrix.platform.nojxl }} \
-DSDL3IMAGE_TIF=ON \
-DSDL3IMAGE_WEBP=ON \
+ -DSDL3IMAGE_STRICT=ON \
-DSDL3IMAGE_WERROR=ON \
-DCMAKE_INSTALL_PREFIX=prefix_cmake \
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE=$PWD/build \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f3081f9c..dd0f96ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,14 @@ cmake_dependent_option(SDL3IMAGE_DEPS_SHARED "Load dependencies dynamically" ON
option(SDL3IMAGE_VENDORED "Use vendored third-party libraries" ${vendored_default})
option(SDL3IMAGE_WERROR "Treat warnings as errors" OFF)
+option(SDL3IMAGE_STRICT "Fail when a dependency could not be found" OFF)
+set(required "")
+set(fatal_error "STATUS")
+if(SDL3IMAGE_STRICT)
+ set(required "REQUIRED")
+ set(fatal_error "FATAL_ERROR")
+endif()
+
option(SDL3IMAGE_SAMPLES "Build the SDL3_image sample program(s)" ${SDL3IMAGE_SAMPLES_DEFAULT})
cmake_dependent_option(SDL3IMAGE_SAMPLES_INSTALL "Install the SDL3_image sample program(s)" OFF "SDL3IMAGE_SAMPLES;SDL3IMAGE_INSTALL" OFF)
@@ -327,13 +335,20 @@ set(INSTALL_EXTRA_TARGETS)
set(INSTALL_EXTRA_CMAKE_MODULES)
set(PC_LIBS)
set(PC_REQUIRES)
+set(SDL3IMAGE_BACKENDS)
+list(APPEND SDL3IMAGE_BACKENDS STB)
+set(SDL3IMAGE_STB_ENABLED FALSE)
if(SDL3IMAGE_BACKEND_STB)
+ set(SDL3IMAGE_STB_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE USE_STBIMAGE)
endif()
+list(APPEND SDL3IMAGE_BACKENDS IMAGEIO)
+set(SDL3IMAGE_IMAGEIO_ENABLED FALSE)
if(APPLE)
if(SDL3IMAGE_BACKEND_IMAGEIO)
+ set(SDL3IMAGE_IMAGEIO_ENABLED TRUE)
target_link_libraries(${sdl3_image_target_name} PRIVATE -Wl,-framework,ApplicationServices)
target_link_libraries(${sdl3_image_target_name} PRIVATE objc)
target_sources(${sdl3_image_target_name} PRIVATE
@@ -351,7 +366,10 @@ if(APPLE)
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS WIC)
+set(SDL3IMAGE_WIC_ENABLED FALSE)
if(SDL3IMAGE_BACKEND_WIC)
+ set(SDL3IMAGE_WIC_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE SDL_IMAGE_USE_WIC_BACKEND)
endif()
@@ -381,8 +399,7 @@ if(SDL3IMAGE_ZLIB)
set_target_properties(${ZLIB_LIBRARY} PROPERTIES EXPORT_NAME external_zlib)
add_library(SDL3_image::external_zlib ALIAS ${ZLIB_LIBRARY})
else()
- message(STATUS "${PROJECT_NAME}: Using system zlib")
- find_package(ZLIB REQUIRED)
+ message(FATAL_ERROR "Internal error (zlib is only required when requesting vendored dependencies)")
endif()
endif()
@@ -396,13 +413,15 @@ if(SDL3IMAGE_DAV1D)
list(APPEND INSTALL_EXTRA_TARGETS dav1d)
endif()
else()
- message(FATAL_ERROR "Not implemented")
+ message(FATAL_ERROR "Internal error (dav1d is only required when requesting vendored dependencies)")
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS AVIF)
+set(SDL3IMAGE_AVIF_ENABLED FALSE)
if(SDL3IMAGE_AVIF)
- target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_AVIF)
if(SDL3IMAGE_AVIF_VENDORED)
+ set(SDL3IMAGE_AVIF_ENABLED TRUE)
message(STATUS "${PROJECT_NAME}: Using vendored libavif")
sdl_check_project_in_subfolder(external/libavif libavif SDL3IMAGE_VENDORED)
set(BUILD_SHARED_LIBS ${SDL3IMAGE_AVIF_SHARED})
@@ -426,54 +445,63 @@ if(SDL3IMAGE_AVIF)
endif()
endif()
else()
- message(STATUS "${PROJECT_NAME}: Using system libavif")
find_package(libavif 1.0 QUIET)
if(NOT libavif_FOUND)
- message(STATUS "libavif-1.0 or compatible not found")
find_package(libavif ${LIBAVIF_MINIMUM_VERSION} QUIET)
endif()
if(libavif_FOUND)
- message(STATUS "libavif-${libavif_VERSION} found")
+ message(STATUS "${PROJECT_NAME}: Using system libavif")
+ set(SDL3IMAGE_AVIF_ENABLED TRUE)
+ if(NOT SDL3IMAGE_AVIF_SHARED)
+ list(APPEND PC_REQUIRES libavif)
+ endif()
else()
message(STATUS "libavif-${LIBAVIF_MINIMUM_VERSION} or compatible not found")
- message(FATAL_ERROR "libavif NOT found")
- endif()
- if(NOT SDL3IMAGE_AVIF_SHARED)
- list(APPEND PC_REQUIRES libavif)
+ message(${fatal_error} "libavif NOT found")
endif()
endif()
- if(SDL3IMAGE_AVIF_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:avif,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:avif,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:avif,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_avif avif)
- message(STATUS "Dynamic libavif: ${dynamic_avif}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_AVIF_DYNAMIC=\"${dynamic_avif}\"")
- if(SDL3IMAGE_AVIF_VENDORED)
- add_dependencies(${sdl3_image_target_name} avif)
+ if(SDL3IMAGE_AVIF_ENABLED)
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_AVIF)
+ if(SDL3IMAGE_AVIF_SHARED)
+ target_include_directories(${sdl3_image_target_name} PRIVATE
+ $<TARGET_PROPERTY:avif,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:avif,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:avif,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ )
+ target_get_dynamic_library(dynamic_avif avif)
+ message(STATUS "Dynamic libavif: ${dynamic_avif}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_AVIF_DYNAMIC=\"${dynamic_avif}\"")
+ if(SDL3IMAGE_AVIF_VENDORED)
+ add_dependencies(${sdl3_image_target_name} avif)
+ endif()
+ else()
+ target_link_libraries(${sdl3_image_target_name} PRIVATE avif)
endif()
- else()
- target_link_libraries(${sdl3_image_target_name} PRIVATE avif)
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS BMP)
+set(SDL3IMAGE_BMP_ENABLED FALSE)
if(SDL3IMAGE_BMP)
+ set(SDL3IMAGE_BMP_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_BMP)
endif()
+list(APPEND SDL3IMAGE_BACKENDS GIF)
+set(SDL3IMAGE_GIF_ENABLED FALSE)
if(SDL3IMAGE_GIF)
+ set(SDL3IMAGE_GIF_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_GIF)
endif()
+list(APPEND SDL3IMAGE_BACKENDS JPG)
+set(SDL3IMAGE_JPG_ENABLED FALSE)
if(SDL3IMAGE_JPG)
- target_compile_definitions(${sdl3_image_target_name} PRIVATE
- LOAD_JPG
- SDL_IMAGE_SAVE_JPG=$<BOOL:${SDL3IMAGE_JPG_SAVE}>
- )
- if(NOT SDL3IMAGE_BACKEND_STB AND NOT SDL3IMAGE_BACKEND_WIC AND NOT SDL3IMAGE_BACKEND_IMAGEIO)
+ if(SDL3IMAGE_BACKEND_STB OR SDL3IMAGE_BACKEND_WIC OR SDL3IMAGE_BACKEND_IMAGEIO)
+ set(SDL3IMAGE_JPG_ENABLED TRUE)
+ else()
if(SDL3IMAGE_JPG_VENDORED)
+ set(SDL3IMAGE_JPG_ENABLED TRUE)
message(STATUS "${PROJECT_NAME}: Using vendored libjpeg")
sdl_check_project_in_subfolder(external/jpeg libjpeg SDL3IMAGE_VENDORED)
set(BUILD_SHARED_LIBS ${SDL3IMAGE_JPG_SHARED})
@@ -487,33 +515,48 @@ if(SDL3IMAGE_JPG)
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:jpeg>)
endif()
else()
- message(STATUS "${PROJECT_NAME}: Using system libjpeg")
- find_package(JPEG REQUIRED)
- if(NOT SDL3IMAGE_JPG_SHARED)
- list(APPEND PC_REQUIRES libjpeg)
+ find_package(JPEG ${required})
+ if(JPEG_FOUND)
+ message(STATUS "${PROJECT_NAME}: Using system libjpeg")
+ set(SDL3IMAGE_JPG_ENABLED TRUE)
+ if(NOT SDL3IMAGE_JPG_SHARED)
+ list(APPEND PC_REQUIRES libjpeg)
+ endif()
+ else()
+ message(${fatal_error} "libjpeg NOT found")
endif()
endif()
- if(SDL3IMAGE_JPG_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:JPEG::JPEG,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:JPEG::JPEG,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:JPEG::JPEG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_jpeg JPEG::JPEG)
- message(STATUS "Dynamic libjpeg: ${dynamic_jpeg}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JPG_DYNAMIC=\"${dynamic_jpeg}\"")
- if(SDL3IMAGE_JPG_VENDORED)
- add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
+ if(SDL3IMAGE_JPG_ENABLED)
+ if(SDL3IMAGE_JPG_SHARED)
+ target_include_directories(${sdl3_image_target_name} PRIVATE
+ $<TARGET_PROPERTY:JPEG::JPEG,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:JPEG::JPEG,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:JPEG::JPEG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ )
+ target_get_dynamic_library(dynamic_jpeg JPEG::JPEG)
+ message(STATUS "Dynamic libjpeg: ${dynamic_jpeg}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JPG_DYNAMIC=\"${dynamic_jpeg}\"")
+ if(SDL3IMAGE_JPG_VENDORED)
+ add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
+ endif()
+ else()
+ target_link_libraries(${sdl3_image_target_name} PRIVATE JPEG::JPEG)
endif()
- else()
- target_link_libraries(${sdl3_image_target_name} PRIVATE JPEG::JPEG)
- endif()
+ endif()
+ endif()
+ if(SDL3IMAGE_JPG_ENABLED)
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE
+ LOAD_JPG
+ SDL_IMAGE_SAVE_JPG=$<BOOL:${SDL3IMAGE_JPG_SAVE}>
+ )
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS JXL)
+set(SDL3IMAGE_JXL_ENABLED FALSE)
if(SDL3IMAGE_JXL)
- target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_JXL)
if(SDL3IMAGE_JXL_VENDORED)
+ set(SDL3IMAGE_JXL_ENABLED TRUE)
enable_language(CXX)
message(STATUS "${PROJECT_NAME}: Using vendored libjxl")
# BUILD_TESTING variable is used by libjxl
@@ -553,45 +596,60 @@ if(SDL3IMAGE_JXL)
add_library(libjxl::libjxl ALIAS ${jxl_lib})
endif()
else()
- message(STATUS "${PROJECT_NAME}: Using system libjxl")
- find_package(libjxl REQUIRED)
- if(NOT SDL3IMAGE_JXL_SHARED)
- list(APPEND PC_REQUIRES libjxl)
- list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findlibjxl.cmake)
+ find_package(libjxl ${required})
+ if(libjxl_FOUND)
+ message(STATUS "${PROJECT_NAME}: Using system libjxl")
+ set(SDL3IMAGE_JXL_ENABLED TRUE)
+ if(NOT SDL3IMAGE_JXL_SHARED)
+ list(APPEND PC_REQUIRES libjxl)
+ list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findlibjxl.cmake)
+ endif()
+ else()
+ message(${fatal_error} "libjxl NOT found")
endif()
endif()
- if(SDL3IMAGE_JXL_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:libjxl::libjxl,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:libjxl::libjxl,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:libjxl::libjxl,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_jxl libjxl::libjxl)
- message(STATUS "Dynamic libjxl: ${dynamic_jxl}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JXL_DYNAMIC=\"${dynamic_jxl}\"")
- if(SDL3IMAGE_JXL_VENDORED)
- add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
+ if(SDL3IMAGE_JXL_ENABLED)
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_JXL)
+ if(SDL3IMAGE_JXL_SHARED)
+ target_include_directories(${sdl3_image_target_name} PRIVATE
+ $<TARGET_PROPERTY:libjxl::libjxl,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:libjxl::libjxl,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:libjxl::libjxl,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ )
+ target_get_dynamic_library(dynamic_jxl libjxl::libjxl)
+ message(STATUS "Dynamic libjxl: ${dynamic_jxl}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JXL_DYNAMIC=\"${dynamic_jxl}\"")
+ if(SDL3IMAGE_JXL_VENDORED)
+ add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
+ endif()
+ else()
+ target_link_libraries(${sdl3_image_target_name} PRIVATE libjxl::libjxl)
endif()
- else()
- target_link_libraries(${sdl3_image_target_name} PRIVATE libjxl::libjxl)
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS LBM)
+set(SDL3IMAGE_LBM_ENABLED FALSE)
if(SDL3IMAGE_LBM)
+ set(SDL3IMAGE_LBM_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_LBM)
endif()
+list(APPEND SDL3IMAGE_BACKENDS PCX)
+set(SDL3IMAGE_PCX_ENABLED FALSE)
if(SDL3IMAGE_PCX)
+ set(SDL3IMAGE_PCX_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_PCX)
endif()
+list(APPEND SDL3IMAGE_BACKENDS PNG)
+set(SDL3IMAGE_PNG_ENABLED FALSE)
if(SDL3IMAGE_PNG)
- target_compile_definitions(${sdl3_image_target_name} PRIVATE
- LOAD_PNG
- SDL_IMAGE_SAVE_PNG=$<BOOL:${SDL3IMAGE_PNG_SAVE}>
- )
- if(NOT SDL3IMAGE_BACKEND_STB AND NOT SDL3IMAGE_BACKEND_WIC AND NOT SDL3IMAGE_BACKEND_IMAGEIO)
+ if(SDL3IMAGE_BACKEND_STB OR SDL3IMAGE_BACKEND_WIC OR SDL3IMAGE_BACKEND_IMAGEIO)
+ set(SDL3IMAGE_PNG_ENABLED TRUE)
+ else()
if(SDL3IMAGE_PNG_VENDORED)
+ set(SDL3IMAGE_PNG_ENABLED TRUE)
message(STATUS "${PROJECT_NAME}: Using vendored libpng")
set(PNG_TESTS OFF CACHE BOOL "Build PNG Tests" FORCE)
sdl_check_project_in_subfolder(external/libpng libpng SDL3IMAGE_VENDORED)
@@ -618,10 +676,15 @@ if(SDL3IMAGE_PNG)
endif()
endif()
else()
- message(STATUS "${PROJECT_NAME}: Using system libpng")
- find_package(PNG REQUIRED)
- if(NOT SDL3IMAGE_PNG_SHARED)
- list(APPEND PC_REQUIRES libpng)
+ find_package(PNG ${required})
+ if(PNG_FOUND)
+ message(STATUS "${PROJECT_NAME}: Using system libpng")
+ set(SDL3IMAGE_PNG_ENABLED TRUE)
+ if(NOT SDL3IMAGE_PNG_SHARED)
+ list(APPEND PC_REQUIRES libpng)
+ endif()
+ else()
+ message(${FATAL_ERROR} "libpnb NOT found")
endif()
endif()
if(SDL3IMAGE_PNG_SHARED)
@@ -640,27 +703,47 @@ if(SDL3IMAGE_PNG)
target_link_libraries(${sdl3_image_target_name} PRIVATE PNG::PNG)
endif()
endif()
+ if(SDL3IMAGE_PNG_ENABLED)
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE
+ LOAD_PNG
+ SDL_IMAGE_SAVE_PNG=$<BOOL:${SDL3IMAGE_PNG_SAVE}>
+ )
+ endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS PNM)
+set(SDL3IMAGE_PNM_ENABLED FALSE)
if(SDL3IMAGE_PNM)
+ set(SDL3IMAGE_PNM_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_PNM)
endif()
+list(APPEND SDL3IMAGE_BACKENDS QOI)
+set(SDL3IMAGE_QOI_ENABLED FALSE)
if(SDL3IMAGE_QOI)
+ set(SDL3IMAGE_QOI_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_QOI)
endif()
+list(APPEND SDL3IMAGE_BACKENDS SVG)
+set(SDL3IMAGE_SVG_ENABLED FALSE)
if(SDL3IMAGE_SVG)
+ set(SDL3IMAGE_SVG_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_SVG)
endif()
+list(APPEND SDL3IMAGE_BACKENDS TGA)
+set(SDL3IMAGE_TGA_ENABLED FALSE)
if(SDL3IMAGE_TGA)
+ set(SDL3IMAGE_TGA_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TGA)
endif()
+list(APPEND SDL3IMAGE_BACKENDS TIF)
+set(SDL3IMAGE_TIF_ENABLED FALSE)
if(SDL3IMAGE_TIF)
- target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TIF)
if(SDL3IMAGE_TIF_VENDORED)
+ set(SDL3IMAGE_TIF_ENABLED TRUE)
message(STATUS "${PROJECT_NAME}: Using vendored libtiff")
# tiff-tests variable is used by vendored libtiff
set(tiff-tests OFF CACHE BOOL "libtiff: tests" FORCE)
@@ -697,33 +780,43 @@ if(SDL3IMAGE_TIF)
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:tiff>)
endif()
else()
- message(STATUS "${PROJECT_NAME}: Using system libtiff")
- find_package(TIFF REQUIRED)
- if(NOT SDL3IMAGE_TIF_SHARED)
- list(APPEND PC_REQUIRES libtiff-4)
+ find_package(TIFF ${required})
+ if(TIFF_FOUND)
+ message(STATUS "${PROJECT_NAME}: Using system libtiff")
+ set(SDL3IMAGE_TIF_ENABLED TRUE)
+ if(NOT SDL3IMAGE_TIF_SHARED)
+ list(APPEND PC_REQUIRES libtiff-4)
+ endif()
+ else()
+ message(${fatal_error} "libtiff NOT found")
endif()
endif()
- if(SDL3IMAGE_TIF_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:TIFF::TIFF,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:TIFF::TIFF,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:TIFF::TIFF,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_tif TIFF::TIFF)
- message(STATUS "Dynamic libtiff: ${dynamic_tif}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${dynamic_tif}\"")
- if(SDL3IMAGE_TIF_VENDORED)
- add_dependencies(${sdl3_image_target_name} TIFF::TIFF)
+ if(SDL3IMAGE_TIF_ENABLED)
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TIF)
+ if(SDL3IMAGE_TIF_SHARED)
+ target_include_directories(${sdl3_image_target_name} PRIVATE
+ $<TARGET_PROPERTY:TIFF::TIFF,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:TIFF::TIFF,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:TIFF::TIFF,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ )
+ target_get_dynamic_library(dynamic_tif TIFF::TIFF)
+ message(STATUS "Dynamic libtiff: ${dynamic_tif}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${dynamic_tif}\"")
+ if(SDL3IMAGE_TIF_VENDORED)
+ add_dependencies(${sdl3_image_target_name} TIFF::TIFF)
+ endif()
+ else()
+ target_link_libraries(${sdl3_image_target_name} PRIVATE TIFF::TIFF)
endif()
- else()
- target_link_libraries(${sdl3_image_target_name} PRIVATE TIFF::TIFF)
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS WEBP)
+set(SDL3IMAGE_WEBP_ENABLED FALSE)
if(SDL3IMAGE_WEBP)
- target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_WEBP)
# missing cpufeatures
if(SDL3IMAGE_WEBP_VENDORED)
+ set(SDL3IMAGE_WEBP_ENABLED TRUE)
message(STATUS "${PROJECT_NAME}: Using vendored libwebp")
sdl_check_project_in_subfolder(external/libwebp libwebp SDL3IMAGE_VENDORED)
set(BUILD_SHARED_LIBS ${SDL3IMAGE_WEBP_SHARED})
@@ -742,45 +835,62 @@ if(SDL3IMAGE_WEBP)
set_target_properties(sharpyuv PROPERTIES EXPORT_NAME "external_sharpyuv")
add_library(SDL3_image::external_libwebp ALIAS webp)
else()
- message(STATUS "${PROJECT_NAME}: Using system libwebp")
- find_package(webp REQUIRED)
- if(NOT SDL3IMAGE_WEBP_SHARED)
- list(APPEND PC_REQUIRES libwebp)
- list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findwebp.cmake)
+ find_package(webp ${required})
+ if(webp_FOUND)
+ message(STATUS "${PROJECT_NAME}: Using system libwebp")
+ set(SDL3IMAGE_WEBP_ENABLED TRUE)
+ if(NOT SDL3IMAGE_WEBP_SHARED)
+ list(APPEND PC_REQUIRES libwebp)
+ list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findwebp.cmake)
+ endif()
+ else()
+ message(${fatal_error} "libwebp NOT found")
endif()
endif()
- if(SDL3IMAGE_WEBP_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:WebP::webp,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:WebP::webp,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:WebP::webp,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:WebP::webpdemux,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:WebP::webpdemux,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:WebP::webpdemux,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_webpdemux WebP::webpdemux)
- message(STATUS "Dynamic libwebpdemux: ${dynamic_webpdemux}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBPDEMUX_DYNAMIC=\"${dynamic_webpdemux}\"")
- target_get_dynamic_library(dynamic_webp WebP::webp)
- message(STATUS "Dynamic libwebp: ${dynamic_webp}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBP_DYNAMIC=\"${dynamic_webp}\"")
- if(SDL3IMAGE_WEBP_VENDORED)
- add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
+ if(SDL3IMAGE_WEBP_ENABLED)
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_WEBP)
+ if(SDL3IMAGE_WEBP_SHARED)
+ target_include_directories(${sdl3_image_target_name} PRIVATE
+ $<TARGET_PROPERTY:WebP::webp,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:WebP::webp,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:WebP::webp,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:WebP::webpdemux,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:WebP::webpdemux,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:WebP::webpdemux,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ )
+ target_get_dynamic_library(dynamic_webpdemux WebP::webpdemux)
+ message(STATUS "Dynamic libwebpdemux: ${dynamic_webpdemux}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBPDEMUX_DYNAMIC=\"${dynamic_webpdemux}\"")
+ target_get_dynamic_library(dynamic_webp WebP::webp)
+ message(STATUS "Dynamic libwebp: ${dynamic_webp}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBP_DYNAMIC=\"${dynamic_webp}\"")
+ if(SDL3IMAGE_WEBP_VENDORED)
+ add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
+ endif()
+ else()
+ target_link_libraries(${sdl3_image_target_name} PRIVATE WebP::webp WebP::webpdemux)
endif()
- else()
- target_link_libraries(${sdl3_image_target_name} PRIVATE WebP::webp WebP::webpdemux)
endif()
endif()
+list(APPEND SDL3IMAGE_BACKENDS XCF)
+set(SDL3IMAGE_XCF_ENABLED FALSE)
if(SDL3IMAGE_XCF)
+ set(SDL3IMAGE_XCF_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XCF)
endif()
+list(APPEND SDL3IMAGE_BACKENDS XPM)
+set(SDL3IMAGE_XPM_ENABLED FALSE)
if(SDL3IMAGE_XPM)
+ set(SDL3IMAGE_XPM_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XPM)
endif()
+list(APPEND SDL3IMAGE_BACKENDS XV)
+set(SDL3IMAGE_XV_ENABLED FALSE)
if(SDL3IMAGE_XV)
+ set(SDL3IMAGE_XV_ENABLED TRUE)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XV)
endif()
@@ -933,3 +1043,25 @@ if(SDL3IMAGE_TESTS)
enable_testing()
add_subdirectory(test)
endif()
+
+
+set(available_deps)
+set(unavailable_deps)
+foreach(dep IN LISTS SDL3IMAGE_BACKENDS)
+ set(var SDL3IMAGE_${dep}_ENABLED)
+ if(NOT DEFINED ${var})
+ message(AUTHOR_WARNING "${var} not defined")
+ endif()
+ if(${var})
+ list(APPEND available_deps ${dep})
+ else()
+ list(APPEND unavailable_deps ${dep})
+ endif()
+endforeach()
+string(JOIN " " avail_str ${available_deps})
+string(TOLOWER "${avail_str}" avail_str)
+string(JOIN " " unavail_str ${unavailable_deps})
+string(TOLOWER "${unavail_str}" unavail_str)
+message(STATUS "SDL3_image backends:")
+message(STATUS "- enabled: ${avail_str}")
+message(STATUS "- disabled: ${unavail_str}")
diff --git a/cmake/SDL3_imageConfig.cmake.in b/cmake/SDL3_imageConfig.cmake.in
index 16e50bf5..d8507cb0 100644
--- a/cmake/SDL3_imageConfig.cmake.in
+++ b/cmake/SDL3_imageConfig.cmake.in
@@ -8,27 +8,28 @@ set_package_properties(SDL3_image PROPERTIES
set(SDL3_image_FOUND ON)
-set(SDL3IMAGE_AVIF @SDL3IMAGE_AVIF@)
+set(SDL3IMAGE_AVIF @SDL3IMAGE_AVIF_ENABLED@)
set(SDL3IMAGE_AVIF_SHARED @SDL3IMAGE_AVIF_SHARED@)
-set(SDL3IMAGE_BMP @SDL3IMAGE_BMP@)
-set(SDL3IMAGE_GIF @SDL3IMAGE_GIF@)
-set(SDL3IMAGE_JPG @SDL3IMAGE_JPG@)
+set(SDL3IMAGE_BMP @SDL3IMAGE_BMP_ENABLED@)
+set(SDL3IMAGE_GIF @SDL3IMAGE_GIF_ENABLED@)
+set(SDL3IMAGE_JPG @SDL3IMAGE_JPG_ENABLED@)
set(SDL3IMAGE_JPG_SHARED @SDL3IMAGE_JPG_SHARED@)
-set(SDL3IMAGE_JXL @SDL3IMAGE_JXL@)
+set(SDL3IMAGE_JXL @SDL3IMAGE_JXL_ENABLED@)
set(SDL3IMAGE_JXL_SHARED @SDL3IMAGE_JXL_SHARED@)
-set(SDL3IMAGE_LBM @SDL3IMAGE_LBM@)
-set(SDL3IMAGE_PCX @SDL3IMAGE_PCX@)
-set(SDL3IMAGE_PNG @SDL3IMAGE_PNG@)
+set(SDL3IMAGE_LBM @SDL3IMAGE_LBM_ENABLED@)
+set(SDL3IMAGE_PCX @SDL3IMAGE_PCX_ENABLED@)
+set(SDL3IMAGE_PNG @SDL3IMAGE_PNG_ENABLED@)
set(SDL3IMAGE_PNG_SHARED @SDL3IMAGE_PNG_SHARED@)
-set(SDL3IMAGE_PNM @SDL3IMAGE_PNM@)
-set(SDL3IMAGE_QOI @SDL3IMAGE_QOI@)
-set(SDL3IMAGE_SVG @SDL3IMAGE_SVG@)
-set(SDL3IMAGE_TGA @SDL3IMAGE_TGA@)
-set(SDL3IMAGE_TIF @SDL3IMAGE_TIF@)
+set(SDL3IMAGE_PNM @SDL3IMAGE_PNM_ENABLED@)
+set(SDL3IMAGE_QOI @SDL3IMAGE_QOI_ENABLED@)
+set(SDL3IMAGE_SVG @SDL3IMAGE_SVG_ENABLED@)
+set(SDL3IMAGE_TGA @SDL3IMAGE_TGA_ENABLED@)
+set(SDL3IMAGE_TIF @SDL3IMAGE_TIF_ENABLED@)
set(SDL3IMAGE_TIF_SHARED @SDL3IMAGE_TIF_SHARED@)
-set(SDL3IMAGE_XCF @SDL3IMAGE_XCF@)
-set(SDL3IMAGE_XPM @SDL3IMAGE_XPM@)
-set(SDL3IMAGE_XV @SDL3IMAGE_XV@)
+set(SDL3IMAGE_XCF @SDL3IMAGE_XCF_ENABLED@)
+set(SDL3IMAGE_XPM @SDL3IMAGE_XPM_ENABLED@)
+set(SDL3IMAGE_XV @SDL3IMAGE_XV_ENABLED@)
+set(SDL3IMAGE_WEBP @SDL3IMAGE_WEBP_ENABLED@)
set(SDL3IMAGE_WEBP_SHARED @SDL3IMAGE_WEBP_SHARED@)
set(SDL3IMAGE_JPG_SAVE @SDL3IMAGE_JPG_SAVE@)