SDL_image: cmake: allow overriding SDLIMAGE_DYNAMIC_<XXX> variables

From 4ff27afa450eabd2a827e49ed86fab9e3bf826c5 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Thu, 23 Jan 2025 03:31:30 +0100
Subject: [PATCH] cmake: allow overriding SDLIMAGE_DYNAMIC_<XXX> variables

CFLAGS are assumed to be configured through CMAKE_C_FLAGS
---
 CMakeLists.txt                  | 171 ++++++++++++++++-----------
 build-scripts/build-release.py  |  13 ++-
 build-scripts/release-info.json |  14 ++-
 cmake/PrivateSdlFunctions.cmake | 198 +++++++++++++++++---------------
 4 files changed, 225 insertions(+), 171 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 35e996d0..0a0cc03b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -531,6 +531,9 @@ if(SDLIMAGE_AVIF)
             target_link_options(avif PRIVATE "-Wl,--no-undefined")
           endif()
         endif()
+    elseif(SDLIMAGE_AVIF_SHARED AND DEFINED SDLIMAGE_DYNAMIC_AVIF AND EXISTS "${SDLIMAGE_DYNAMIC_AVIF}")
+        message(STATUS "${PROJECT_NAME}: Using libavif from CMake variable")
+        set(SDLIMAGE_AVIF_ENABLED TRUE)
     else()
         find_package(libavif "${LIBAVIF_MINIMUM_VERSION}" QUIET ${required})
         if(libavif_FOUND)
@@ -550,17 +553,19 @@ if(SDLIMAGE_AVIF)
             SDL_IMAGE_SAVE_AVIF=$<BOOL:${SDLIMAGE_AVIF_SAVE}>
         )
         if(SDLIMAGE_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(SDLIMAGE_AVIF_VENDORED)
-                add_dependencies(${sdl3_image_target_name} avif)
+            if(NOT DEFINED SDLIMAGE_DYNAMIC_AVIF)
+                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>
+                )
+                if(SDLIMAGE_AVIF_VENDORED)
+                    add_dependencies(${sdl3_image_target_name} avif)
+                endif()
             endif()
+            target_get_dynamic_library(SDLIMAGE_DYNAMIC_AVIF avif)
+            message(STATUS "Dynamic libavif: ${SDLIMAGE_DYNAMIC_AVIF}")
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_AVIF_DYNAMIC=\"${SDLIMAGE_DYNAMIC_AVIF}\"")
         else()
             target_link_libraries(${sdl3_image_target_name} PRIVATE avif)
         endif()
@@ -602,6 +607,9 @@ if(SDLIMAGE_JPG)
             if(NOT SDLIMAGE_JPG_SHARED)
                 list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:jpeg>)
             endif()
+        elseif(SDLIMAGE_JPG_SHARED AND DEFINED SDLIMAGE_DYNAMIC_JPEG AND EXISTS "${SDLIMAGE_DYNAMIC_JPEG}")
+            message(STATUS "${PROJECT_NAME}: Using libjpeg from CMake variable")
+            set(SDLIMAGE_JPG_ENABLED TRUE)
         else()
             find_package(JPEG ${required})
             if(JPEG_FOUND)
@@ -616,17 +624,19 @@ if(SDLIMAGE_JPG)
         endif()
         if(SDLIMAGE_JPG_ENABLED)
             if(SDLIMAGE_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(SDLIMAGE_JPG_VENDORED)
-                    add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
+                if(NOT DEFINED SDLIMAGE_DYNAMIC_JPEG)
+                    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>
+                    )
+                    if(SDLIMAGE_JPG_VENDORED)
+                      add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
+                    endif()
                 endif()
+                target_get_dynamic_library(SDLIMAGE_DYNAMIC_JPEG JPEG::JPEG)
+                message(STATUS "Dynamic libjpeg: ${SDLIMAGE_DYNAMIC_JPEG}")
+                target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JPG_DYNAMIC=\"${SDLIMAGE_DYNAMIC_JPEG}\"")
             else()
                 target_link_libraries(${sdl3_image_target_name} PRIVATE JPEG::JPEG)
             endif()
@@ -684,6 +694,9 @@ if(SDLIMAGE_JXL)
         if(NOT TARGET libjxl::libjxl)
             add_library(libjxl::libjxl ALIAS ${jxl_lib})
         endif()
+    elseif(SDLIMAGE_JXL_SHARED AND DEFINED SDLIMAGE_DYNAMIC_JXL AND EXISTS "${SDLIMAGE_DYNAMIC_JXL}")
+      message(STATUS "${PROJECT_NAME}: Using libjxl from CMake variable")
+      set(SDLIMAGE_JXL_ENABLED TRUE)
     else()
         find_package(libjxl ${required})
         if(libjxl_FOUND)
@@ -700,17 +713,19 @@ if(SDLIMAGE_JXL)
     if(SDLIMAGE_JXL_ENABLED)
         target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_JXL)
         if(SDLIMAGE_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(SDLIMAGE_JXL_VENDORED)
-                add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
+           if(NOT DEFINED SDLIMAGE_DYNAMIC_JXL)
+                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>
+                )
+                if(SDLIMAGE_JXL_VENDORED)
+                    add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
+                endif()
             endif()
+           target_get_dynamic_library(SDLIMAGE_DYNAMIC_JXL libjxl::libjxl)
+           message(STATUS "Dynamic libjxl: ${SDLIMAGE_DYNAMIC_JXL}")
+           target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JXL_DYNAMIC=\"${SDLIMAGE_DYNAMIC_JXL}\"")
         else()
             target_link_libraries(${sdl3_image_target_name} PRIVATE libjxl::libjxl)
         endif()
@@ -766,6 +781,9 @@ if(SDLIMAGE_PNG)
                     list(APPEND PC_REQUIRES zlib)
                 endif()
             endif()
+        elseif(SDLIMAGE_PNG_SHARED AND DEFINED SDLIMAGE_DYNAMIC_PNG AND EXISTS "${SDLIMAGE_DYNAMIC_PNG}")
+            message(STATUS "${PROJECT_NAME}: Using libpng from CMake variable")
+            set(SDLIMAGE_PNG_ENABLED TRUE)
         else()
             find_package(PNG ${required})
             if(PNG_FOUND)
@@ -780,17 +798,19 @@ if(SDLIMAGE_PNG)
         endif()
         if(SDLIMAGE_PNG_ENABLED)
             if(SDLIMAGE_PNG_SHARED)
-                target_include_directories(${sdl3_image_target_name} PRIVATE
-                    $<TARGET_PROPERTY:PNG::PNG,INCLUDE_DIRECTORIES>
-                    $<TARGET_PROPERTY:PNG::PNG,INTERFACE_INCLUDE_DIRECTORIES>
-                    $<TARGET_PROPERTY:PNG::PNG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
-                )
-                target_get_dynamic_library(dynamic_png PNG::PNG)
-                message(STATUS "Dynamic libpng: ${dynamic_png}")
-                target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_PNG_DYNAMIC=\"${dynamic_png}\"")
-                if(SDLIMAGE_PNG_VENDORED)
-                    add_dependencies(${sdl3_image_target_name} PNG::PNG)
+                if(NOT DEFINED SDLIMAGE_DYNAMIC_PNG)
+                    target_include_directories(${sdl3_image_target_name} PRIVATE
+                        $<TARGET_PROPERTY:PNG::PNG,INCLUDE_DIRECTORIES>
+                        $<TARGET_PROPERTY:PNG::PNG,INTERFACE_INCLUDE_DIRECTORIES>
+                        $<TARGET_PROPERTY:PNG::PNG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+                    )
+                    if(SDLIMAGE_PNG_VENDORED)
+                      add_dependencies(${sdl3_image_target_name} PNG::PNG)
+                    endif()
                 endif()
+                target_get_dynamic_library(SDLIMAGE_DYNAMIC_PNG PNG::PNG)
+                message(STATUS "Dynamic libpng: ${SDLIMAGE_DYNAMIC_PNG}")
+                target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_PNG_DYNAMIC=\"${SDLIMAGE_DYNAMIC_PNG}\"")
             else()
                 target_link_libraries(${sdl3_image_target_name} PRIVATE PNG::PNG)
             endif()
@@ -868,7 +888,7 @@ if(SDLIMAGE_TIF)
             add_subdirectory(external/libtiff EXCLUDE_FROM_ALL)
             register_license(tiff external/libtiff/LICENSE.md)
             add_library(TIFF::TIFF ALIAS tiff)
-            set(SDL2IMAGE_TIF_TARGET "TIFF::tiff")
+            set(SDLIMAGE_TIF_TARGET "TIFF::tiff")
             if(SDLIMAGE_TIF_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
               list(APPEND INSTALL_EXTRA_TARGETS tiff)
             endif()
@@ -877,6 +897,10 @@ if(SDLIMAGE_TIF)
             if(NOT SDLIMAGE_TIF_SHARED)
                 list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:tiff>)
             endif()
+        elseif(SDLIMAGE_TIF_SHARED AND DEFINED SDLIMAGE_DYNAMIC_TIF AND EXISTS "${SDLIMAGE_DYNAMIC_TIF}")
+            message(STATUS "${PROJECT_NAME}: Using libtiff from CMake variable")
+            set(SDLIMAGE_TIF_ENABLED TRUE)
+            set(SDLIMAGE_TIF_TARGET "tiff-non-existing-target")
         else()
             find_package(TIFF ${required})
             if(TIFF_FOUND)
@@ -888,9 +912,9 @@ if(SDLIMAGE_TIF)
                 if(TARGET TIFF::tiff)
                     # introduced in CMake 3.28
                     # TIFF::TIFF still exists, but it is an INTERFACE library linking to TIFF::tiff (no ALIAS library)
-                    set(SDL2IMAGE_TIF_TARGET "TIFF::tiff")
+                    set(SDLIMAGE_TIF_TARGET "TIFF::tiff")
                 else()
-                    set(SDL2IMAGE_TIF_TARGET "TIFF::TIFF")
+                    set(SDLIMAGE_TIF_TARGET "TIFF::TIFF")
                 endif()
             else()
                 message(${fatal_error} "libtiff NOT found")
@@ -899,19 +923,21 @@ if(SDLIMAGE_TIF)
         if(SDLIMAGE_TIF_ENABLED)
             target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TIF)
             if(SDLIMAGE_TIF_SHARED)
-                target_include_directories(${sdl3_image_target_name} PRIVATE
-                    $<TARGET_PROPERTY:${SDL2IMAGE_TIF_TARGET},INCLUDE_DIRECTORIES>
-                    $<TARGET_PROPERTY:${SDL2IMAGE_TIF_TARGET},INTERFACE_INCLUDE_DIRECTORIES>
-                    $<TARGET_PROPERTY:${SDL2IMAGE_TIF_TARGET},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
-                )
-                target_get_dynamic_library(dynamic_tif ${SDL2IMAGE_TIF_TARGET})
-                message(STATUS "Dynamic libtiff: ${dynamic_tif}")
-                target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${dynamic_tif}\"")
-                if(SDLIMAGE_TIF_VENDORED)
-                    add_dependencies(${sdl3_image_target_name} ${SDL2IMAGE_TIF_TARGET})
+                if(NOT DEFINED SDLIMAGE_DYNAMIC_TIF)
+                    target_include_directories(${sdl3_image_target_name} PRIVATE
+                        $<TARGET_PROPERTY:${SDLIMAGE_TIF_TARGET},INCLUDE_DIRECTORIES>
+                        $<TARGET_PROPERTY:${SDLIMAGE_TIF_TARGET},INTERFACE_INCLUDE_DIRECTORIES>
+                        $<TARGET_PROPERTY:${SDLIMAGE_TIF_TARGET},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+                    )
+                    if(SDLIMAGE_TIF_VENDORED)
+                      add_dependencies(${sdl3_image_target_name} ${SDLIMAGE_TIF_TARGET})
+                    endif()
                 endif()
+                target_get_dynamic_library(SDLIMAGE_DYNAMIC_TIF ${SDLIMAGE_TIF_TARGET})
+                message(STATUS "Dynamic libtiff: ${SDLIMAGE_DYNAMIC_TIF}")
+                target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${SDLIMAGE_DYNAMIC_TIF}\"")
             else()
-                target_link_libraries(${sdl3_image_target_name} PRIVATE ${SDL2IMAGE_TIF_TARGET})
+                target_link_libraries(${sdl3_image_target_name} PRIVATE ${SDLIMAGE_TIF_TARGET})
             endif()
         endif()
     endif()
@@ -941,6 +967,9 @@ if(SDLIMAGE_WEBP)
         set_target_properties(webpdemux PROPERTIES EXPORT_NAME "external_webpdemux")
         set_target_properties(sharpyuv PROPERTIES EXPORT_NAME "external_sharpyuv")
         add_library(SDL3_image::external_libwebp ALIAS webp)
+    elseif(SDLIMAGE_WEBP_SHARED AND DEFINED SDLIMAGE_DYNAMIC_WEBP AND EXISTS "${SDLIMAGE_DYNAMIC_WEBP}" AND DEFINED SDLIMAGE_DYNAMIC_WEBPDEMUX AND EXISTS "${SDLIMAGE_DYNAMIC_WEBPDEMUX}")
+        message(STATUS "${PROJECT_NAME}: Using libwebp from CMake variable")
+        set(SDLIMAGE_WEBP_ENABLED TRUE)
     else()
         find_package(webp ${required})
         if(webp_FOUND)
@@ -957,23 +986,25 @@ if(SDLIMAGE_WEBP)
     if(SDLIMAGE_WEBP_ENABLED)
         target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_WEBP)
         if(SDLIMAGE_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(SDLIMAGE_WEBP_VENDORED)
-                add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
+           if(NOT DEFINED SDLIMAGE_DYNAMIC_WEBP AND NOT DEFINED SDLIMAGE_DYNAMIC_WEBPDEMUX)
+                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>
+                )
+                if(SDLIMAGE_WEBP_VENDORED)
+                    add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
+                endif()
             endif()
+            target_get_dynamic_library(SDLIMAGE_DYNAMIC_WEBPDEMUX WebP::webpdemux)
+            message(STATUS "Dynamic libwebpdemux: ${SDLIMAGE_DYNAMIC_WEBPDEMUX}")
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBPDEMUX_DYNAMIC=\"${SDLIMAGE_DYNAMIC_WEBPDEMUX}\"")
+            target_get_dynamic_library(SDLIMAGE_DYNAMIC_WEBP WebP::webp)
+            message(STATUS "Dynamic libwebp: ${SDLIMAGE_DYNAMIC_WEBP}")
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBP_DYNAMIC=\"${SDLIMAGE_DYNAMIC_WEBP}\"")
         else()
             target_link_libraries(${sdl3_image_target_name} PRIVATE WebP::webp WebP::webpdemux)
         endif()
diff --git a/build-scripts/build-release.py b/build-scripts/build-release.py
index f3faa06c..27b28fca 100755
--- a/build-scripts/build-release.py
+++ b/build-scripts/build-release.py
@@ -700,7 +700,8 @@ def verify_mingw_library(self, triplet: str, path: Path):
         libraries = re.findall(r"DLL Name: ([^\n]+)", objdump_output)
         logger.info("%s (%s) libraries: %r", path, triplet, libraries)
         illegal_libraries = list(filter(RE_ILLEGAL_MINGW_LIBRARIES.match, libraries))
-        logger.error("Detected 'illegal' libraries: %r", illegal_libraries)
+        if illegal_libraries:
+            logger.error("Detected 'illegal' libraries: %r", illegal_libraries)
         if illegal_libraries:
             raise Exception(f"{path} links to illegal libraries: {illegal_libraries}")
 
@@ -834,7 +835,16 @@ def extract_filter(member: tarfile.TarInfo, path: str, /):
                     "ARCH": arch,
                     "DEP_PREFIX": str(mingw_deps_path / triplet),
                 })
+                my_cflags = f"-ffile-prefix-map={self.root}=/src/{self.project}"
                 extra_args = configure_text_list(text_list=self.release_info["mingw"]["cmake"]["args"], context=context)
+                try:
+                    extra_cflags_i, extra_cmake_c_flags = next((arg_i, a) for (arg_i, a) in enumerate(extra_args) if a.startswith("-DCMAKE_C_FLAGS"))
+                    extra_cflags = extra_cmake_c_flags.removeprefix("-DCMAKE_C_FLAGS=")
+                    assert extra_cflags[:1] not in "'\"" and extra_cflags[:-1] not in "'\""
+                    extra_args[extra_cflags_i] = f"-DCMAKE_C_FLAGS={extra_cflags} {my_cflags}"
+                except StopIteration:
+                    extra_args.append(f"-DCMAKE_C_FLAGS={my_cflags}")
+
 
                 build_path = build_parent_dir / f"build-{triplet}"
                 install_path = build_parent_dir / f"install-{triplet}"
@@ -851,7 +861,6 @@ def extract_filter(member: tarfile.TarInfo, path: str, /):
                             f"cmake",
                             f"-S", str(self.root), "-B", str(build_path),
                             f"-DCMAKE_BUILD_TYPE={build_type}",
-                            f'''-DCMAKE_C_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
                             f'''-DCMAKE_CXX_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
                             f"-DCMAKE_PREFIX_PATH={mingw_deps_path / triplet}",
                             f"-DCMAKE_INSTALL_PREFIX={install_path}",
diff --git a/build-scripts/release-info.json b/build-scripts/release-info.json
index f60dc81e..ee8617cd 100644
--- a/build-scripts/release-info.json
+++ b/build-scripts/release-info.json
@@ -36,7 +36,7 @@
       "archs": ["x86", "x64"],
       "args": [
         "-DBUILD_SHARED_LIBS=ON",
-        "-DSDLIMAGE_AVIF=OFF",
+        "-DSDLIMAGE_AVIF=ON",
         "-DSDLIMAGE_BMP=ON",
         "-DSDLIMAGE_GIF=ON",
         "-DSDLIMAGE_JPG=ON",
@@ -48,15 +48,21 @@
         "-DSDLIMAGE_QOI=ON",
         "-DSDLIMAGE_SVG=ON",
         "-DSDLIMAGE_TGA=ON",
-        "-DSDLIMAGE_TIF=OFF",
-        "-DSDLIMAGE_WEBP=OFF",
+        "-DSDLIMAGE_TIF=ON",
+        "-DSDLIMAGE_WEBP=ON",
         "-DSDLIMAGE_XCF=ON",
         "-DSDLIMAGE_XPM=ON",
         "-DSDLIMAGE_XV=ON",
         "-DSDLIMAGE_RELOCATABLE=ON",
         "-DSDLIMAGE_SAMPLES=OFF",
         "-DSDLIMAGE_TESTS=OFF",
-        "-DSDLIMAGE_VENDORED=OFF"
+        "-DSDLIMAGE_VENDORED=OFF",
+        "-DSDLIMAGE_DEPS_SHARED=ON",
+        "-DCMAKE_C_FLAGS=-I@<@PROJECT_ROOT@>@/VisualC/external/include",
+        "-DSDLIMAGE_DYNAMIC_AVIF=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libavif-16.dll",
+        "-DSDLIMAGE_DYNAMIC_TIF=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libtiff-6.dll",
+        "-DSDLIMAGE_DYNAMIC_WEBP=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libwebp-7.dll",
+        "-DSDLIMAGE_DYNAMIC_WEBPDEMUX=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libwebpdemux-2.dll"
       ],
       "shared-static": "args"
     },
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 5fde085f..e6965fae 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -111,114 +111,122 @@ endfunction()
 
 function(target_get_dynamic_library DEST TARGET)
     set(result)
-    get_actual_target(TARGET)
-    if(WIN32)
-        # Use the target dll of the import library
-        set(props_to_check IMPORTED_IMPLIB)
-        if(CMAKE_BUILD_TYPE)
-            list(APPEND props_to_check IMPORTED_IMPLIB_${CMAKE_BUILD_TYPE})
+    if(DEFINED ${DEST})
+        if(NOT EXISTS "${${DEST}}")
+            message(FATAL_ERROR "${DEST}=${${DEST}} does not exist")
         endif()
-        list(APPEND props_to_check IMPORTED_LOCATION)
-        if(CMAKE_BUILD_TYPE)
-            list(APPEND props_to_check IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
-        endif()
-        foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
-            list(APPEND props_to_check IMPORTED_IMPLIB_${config_type})
-            list(APPEND props_to_check IMPORTED_LOCATION_${config_type})
-        endforeach()
+        get_filename_component(filename ${${DEST}} NAME)
+        set(${DEST} ${filename} PARENT_SCOPE)
+    else()
+        get_actual_target(TARGET)
+        if(WIN32)
+            # Use the target dll of the import library
+            set(props_to_check IMPORTED_IMPLIB)
+            if(CMAKE_BUILD_TYPE)
+                list(APPEND props_to_check IMPORTED_IMPLIB_${CMAKE_BUILD_TYPE})
+            endif()
+            list(APPEND props_to_check IMPORTED_LOCATION)
+            if(CMAKE_BUILD_TYPE)
+                list(APPEND props_to_check IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
+            endif()
+            foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
+                list(APPEND props_to_check IMPORTED_IMPLIB_${config_type})
+                list(APPEND props_to_check IMPORTED_LOCATION_${config_type})
+            endforeach()
 
-        foreach(prop_to_check ${props_to_check})
-            if(NOT result)
-                get_target_property(propvalue "${TARGET}" ${prop_to_check})
-                if(propvalue AND EXISTS "${propvalue}")
-                    win32_implib_identify_dll(result "${propvalue}" NOTFATAL)
+            foreach(prop_to_check ${props_to_check})
+                if(NOT result)
+                    get_target_property(propvalue "${TARGET}" ${prop_to_check})
+                    if(propvalue AND EXISTS "${propvalue}")
+                        win32_implib_identify_dll(result "${propvalue}" NOTFATAL)
+                    endif()
                 endif()
-            endif()
-        endforeach()
-    else()
-        # 1. find the target library a file might be symbolic linking to
-        # 2. find all other files in the same folder that symolic link to it
-        # 3. sort all these files, and select the 1st item on Linux, and last on Macos
-        set(location_properties IMPORTED_LOCATION)
-        if(CMAKE_BUILD_TYPE)
-            list(APPEND location_properties IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
-        endif()
-        foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
-            list(APPEND location_properties IMPORTED_LOCATION_${config_type})
-        endforeach()
-        if(APPLE)
-            set(valid_shared_library_regex "\\.[0-9]+\\.dylib$")
+            endforeach()
         else()
-            set(valid_shared_library_regex "\\.so\\.([0-9.]+)?[0-9]")
-        endif()
-        foreach(location_property ${location_properties})
-            if(NOT result)
-                get_target_property(library_path "${TARGET}" ${location_property})
-                message(DEBUG "get_target_property(${TARGET} ${location_propert}) -> ${library_path}")
-                if(EXISTS "${library_path}")
-                    get_filename_component(library_path "${library_path}" ABSOLUTE)
-                    while (IS_SYMLINK "${library_path}")
-                        read_absolute_symlink(library_path "${library_path}")
-                    endwhile()
-                    message(DEBUG "${TARGET} -> ${library_path}")
-                    get_filename_component(libdir "${library_path}" DIRECTORY)
-                    file(GLOB subfiles "${libdir}/*")
-                    set(similar_files "${library_path}")
-                    foreach(subfile ${subfiles})
-                        if(IS_SYMLINK "${subfile}")
-                            read_absolute_symlink(subfile_target "${subfile}")
-                            while(IS_SYMLINK "${subfile_target}")
-                                read_absolute_symlink(subfile_target "${subfile_target}")
-                            endwhile()
-                            get_filename_component(subfile_target "${subfile_target}" ABSOLUTE)
-                            if(subfile_target STREQUAL library_path AND subfile MATCHES "${valid_shared_library_regex}")
-                                list(APPEND similar_files "${subfile}")
+            # 1. find the target library a file might be symbolic linking to
+            # 2. find all other files in the same folder that symolic link to it
+            # 3. sort all these files, and select the 1st item on Linux, and last on Macos
+            set(location_properties IMPORTED_LOCATION)
+            if(CMAKE_BUILD_TYPE)
+                list(APPEND location_properties IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
+            endif()
+            foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
+                list(APPEND location_properties IMPORTED_LOCATION_${config_type})
+            endforeach()
+            if(APPLE)
+                set(valid_shared_library_regex "\\.[0-9]+\\.dylib$")
+            else()
+                set(valid_shared_library_regex "\\.so\\.([0-9.]+)?[0-9]")
+            endif()
+            foreach(location_property ${location_properties})
+                if(NOT result)
+                    get_target_property(library_path "${TARGET}" ${location_property})
+                    message(DEBUG "get_target_property(${TARGET} ${location_propert}) -> ${library_path}")
+                    if(EXISTS "${library_path}")
+                        get_filename_component(library_path "${library_path}" ABSOLUTE)
+                        while (IS_SYMLINK "${library_path}")
+                            read_absolute_symlink(library_path "${library_path}")
+                        endwhile()
+                        message(DEBUG "${TARGET} -> ${library_path}")
+                        get_filename_component(libdir "${library_path}" DIRECTORY)
+                        file(GLOB subfiles "${libdir}/*")
+                        set(similar_files "${library_path}")
+                        foreach(subfile ${subfiles})
+                            if(IS_SYMLINK "${subfile}")
+                                read_absolute_symlink(subfile_target "${subfile}")
+                                while(IS_SYMLINK "${subfile_target}")
+                                    read_absolute_symlink(subfile_target "${subfile_target}")
+                                endwhile()
+                                get_filename_component(subfile_target "${subfile_target}" ABSOLUTE)
+                                if(subfile_target STREQUAL library_path AND subfile MATCHES "${valid_shared_library_regex}")
+                                    list(APPEND similar_files "${subfile}")
+                                endif()
                             endif()
+                        endforeach()
+                        list(SORT similar_files)
+                        message(DEBUG "files that are similar to \"${library_path}\"=${similar_files}")
+                        if(APPLE)
+                            list(REVERSE similar_files)
                         endif()
-                    endforeach()
-                    list(SORT similar_files)
-                    message(DEBUG "files that are similar to \"${library_path}\"=${similar_files}")
-                    if(APPLE)
-                        list(REVERSE similar_files)
+                        list(GET similar_files 0 item)
+                        get_filename_component(result "${item}" NAME)
                     endif()
-                    list(GET similar_files 0 item)
-                    get_filename_component(result "${item}" NAME)
                 endif()
-            endif()
-        endforeach()
-    endif()
-    if(result)
-        string(TOLOWER "${result}" result_lower)
-        if(WIN32 OR OS2)
-            if(NOT result_lower MATCHES ".*dll")
-                message(FATAL_ERROR "\"${result}\" is not a .dll library")
-            endif()
-        elseif(APPLE)
-            if(NOT result_lower MATCHES ".*dylib.*")
-                message(FATAL_ERROR "\"${result}\" is not a .dylib shared library")
+            endforeach()
+        endif()
+        if(result)
+            string(TOLOWER "${result}" result_lower)
+            if(WIN32 OR OS2)
+                if(NOT result_lower MATCHES ".*dll")
+                    message(FATAL_ERROR "\"${result}\" is not a .dll library")
+                endif()
+            elseif(APPLE)
+                if(NOT result_lower MATCHES ".*dylib.*")
+                    message(FATAL_ERROR "\"${result}\" is not a .dylib shared library")
+                endif()
+            else()
+                if(NOT result_lower MATCHES ".*so.*")
+                    message(FATAL_ERROR "\"${result}\" is not a .so shared library")
+                endif()
             endif()
         else()
-            if(NOT result_lower MATCHES ".*so.*")
-                message(FATAL_ERROR "\"${result}\" is not a .so shared library")
+            get_target_property(target_type ${TARGET} TYPE)
+            if(target_type MATCHES "SHARED_LIBRARY|MODULE_LIBRARY")
+                # OK
+            elseif(target_type MATCHES "STATIC_LIBRARY|OBJECT_LIBRARY|INTERFACE_LIBRARY|EXECUTABLE")
+                message(SEND_ERROR "${TARGET} is not a shared library, but has type=${target_type}")
+            else()
+                message(WARNING "Unable to extract dynamic library from target=${TARGET}, type=${target_type}.")
+            endif()
+            # TARGET_SONAME_FILE is not allowed for DLL target platforms.
+            if(WIN32)
+              set(result "$<TARGET_FILE_NAME:${TARGET}>")
+            else()
+  

(Patch may be truncated, please check the link at the top of this post.)