SDL_image: cmake: use pkg-config information for finding webp and libjxl

From 7821e4e093c10c2c6af0e73a37cdefe15ba40208 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 4 Sep 2026 00:18:05 +0200
Subject: [PATCH] cmake: use pkg-config information for finding webp and libjxl

---
 CMakeLists.txt                  | 11 ++++++-
 cmake/Findlibjxl.cmake          | 18 ++++++++---
 cmake/Findwebp.cmake            | 56 ++++++++++++++++++++++++++-------
 cmake/PkgConfigHelper.cmake     | 34 ++++++++++++++++++++
 cmake/SDL3_imageConfig.cmake.in |  1 +
 5 files changed, 103 insertions(+), 17 deletions(-)
 create mode 100644 cmake/PkgConfigHelper.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a12d0ceb..9cec4af29 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,6 +18,7 @@ project(SDL3_image
 )
 
 include("${CMAKE_CURRENT_LIST_DIR}/cmake/GetGitRevisionDescription.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/cmake/PkgConfigHelper.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/cmake/PrivateSdlFunctions.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlcpu.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlplatform.cmake")
@@ -1254,10 +1255,18 @@ if(SDLIMAGE_INSTALL)
         FILES
             "${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfig.cmake"
             "${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfigVersion.cmake"
-            ${INSTALL_EXTRA_CMAKE_MODULES}
         DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
         COMPONENT devel
     )
+    if(INSTALL_EXTRA_CMAKE_MODULES)
+        install(
+            FILES
+                cmake/PkgConfigHelper.cmake
+                ${INSTALL_EXTRA_CMAKE_MODULES}
+            DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
+            COMPONENT devel
+        )
+    endif()
     install(EXPORT SDL3ImageExports
         FILE ${sdl3_image_target_name}-targets.cmake
         NAMESPACE SDL3_image::
diff --git a/cmake/Findlibjxl.cmake b/cmake/Findlibjxl.cmake
index e74f265d3..7249e3d24 100644
--- a/cmake/Findlibjxl.cmake
+++ b/cmake/Findlibjxl.cmake
@@ -1,5 +1,8 @@
 include(FindPackageHandleStandardArgs)
 
+find_package(PkgConfig QUIET)
+pkg_check_modules(PC_LIBJXL QUIET libjxl)
+
 find_library(libjxl_LIBRARY
     NAMES jxl
 )
@@ -8,11 +11,17 @@ find_path(libjxl_INCLUDE_PATH
     NAMES jxl/decode.h
 )
 
-set(libjxl_COMPILE_OPTIONS "" CACHE STRING "Extra compile options of libjxl")
+if(PC_LIBJXL_FOUND)
+  get_flags_from_pkg_config("${libjxl_LIBRARY}" "PC_LIBJXL" "_libjxl")
+endif()
+
+set(libjxl_COMPILE_OPTIONS "${_libjxl_compile_options}" CACHE STRING "Extra compile options of libjxl")
+
+set(libjxl_LINK_LIBRARIES "${_libjxl_link_libraries}" CACHE STRING "Extra link libraries of libjxl")
 
-set(libjxl_LINK_LIBRARIES "" CACHE STRING "Extra link libraries of libjxl")
+set(libjxl_LINK_OPTIONS "${_libjxl_link_options}" CACHE STRING "Extra link options of libjxl")
 
-set(libjxl_LINK_FLAGS "" CACHE STRING "Extra link flags of libjxl")
+set(libjxl_LINK_DIRECTORIES "${_libjxl_link_directories}" CACHE PATH "Extra link flags of libjxl")
 
 find_package_handle_standard_args(libjxl
     REQUIRED_VARS libjxl_LIBRARY libjxl_INCLUDE_PATH
@@ -26,7 +35,8 @@ if (libjxl_FOUND)
             INTERFACE_INCLUDE_DIRECTORIES "${libjxl_INCLUDE_PATH}"
             INTERFACE_COMPILE_OPTIONS "${libjxl_COMPILE_OPTIONS}"
             INTERFACE_LINK_LIBRARIES "${libjxl_LINK_LIBRARIES}"
-            INTERFACE_LINK_FLAGS "${libjxl_LINK_FLAGS}"
+            INTERFACE_LINK_OPTIONS "${libjxl_LINK_OPTIONS}"
+            INTERFACE_LINK_DIRECTORIES "${libjxl_LINK_DIRECTORIES}"
         )
     endif()
 endif()
diff --git a/cmake/Findwebp.cmake b/cmake/Findwebp.cmake
index ce1a1bee6..999b3cf6d 100644
--- a/cmake/Findwebp.cmake
+++ b/cmake/Findwebp.cmake
@@ -1,46 +1,75 @@
 include(FindPackageHandleStandardArgs)
 
+find_package(PkgConfig QUIET)
+pkg_check_modules(PC_WEBP QUIET libwebp)
+pkg_check_modules(PC_WEBPDEMUX QUIET libwebpdemux)
+pkg_check_modules(PC_WEBPMUX QUIET libwebpmux)
+
 find_library(webp_LIBRARY
     NAMES webp
+    HINTS ${PC_WEBP_LIBDIR}
 )
 
 find_path(webp_INCLUDE_PATH
     NAMES webp/decode.h
+    HINTS ${PC_WEBP_INCLUDEDIR}
 )
 
-set(webp_COMPILE_OPTIONS "" CACHE STRING "Extra compile options of webp")
+if(PC_WEBP_FOUND)
+    get_flags_from_pkg_config("${webp_LIBRARY}" "PC_WEBP" "_webp")
+endif()
+
+set(webp_COMPILE_OPTIONS "${_webp_compile_options}" CACHE STRING "Extra compile options of webp")
 
-set(webp_LINK_LIBRARIES "" CACHE STRING "Extra link libraries of webp")
+set(webp_LINK_LIBRARIES "${_webp_link_libraries}" CACHE STRING "Extra link libraries of webp")
 
-set(webp_LINK_FLAGS "" CACHE STRING "Extra link flags of webp")
+set(webp_LINK_OPTIONS "${_webp_link_options}" CACHE STRING "Extra link options of webp")
+
+set(webp_LINK_DIRECTORIES "${_webp_link_directories}" CACHE STRING "Extra link directories of webp")
 
 find_library(webpdemux_LIBRARY
     NAMES webpdemux
+    HINTS ${PC_WEBPDEMUX_LIBDIR}
 )
 
 find_path(webpdemux_INCLUDE_PATH
     NAMES webp/demux.h
+    HINTS ${PC_WEBPDEMUX_INCLUDEDIR}
 )
 
-set(webpdemux_COMPILE_OPTIONS "" CACHE STRING "Extra compile options of webpdemux")
+if(PC_WEBPDEMUX_FOUND)
+  get_flags_from_pkg_config("${webpdemux_LIBRARY}" "PC_WEBPDEMUX" "_webpdemux")
+endif()
+
+set(webpdemux_COMPILE_OPTIONS "${_webpdemux_compile_options}" CACHE STRING "Extra compile options of webpdemux")
+
+set(webpdemux_LINK_LIBRARIES "${_webpdemux_link_libraries}" CACHE STRING "Extra link libraries of webpdemux")
 
-set(webpdemux_LINK_LIBRARIES "" CACHE STRING "Extra link libraries of webpdemux")
+set(webpdemux_LINK_OPTIONS "${_webpdemux_link_options}" CACHE STRING "Extra link options of webpdemux")
 
-set(webpdemux_LINK_FLAGS "" CACHE STRING "Extra link flags of webpdemux")
+set(webpdemux_LINK_DIRECTORIES "${_webpdemux_link_directories}" CACHE STRING "Extra link directories of webpdemux")
 
 find_library(webpmux_LIBRARY
     NAMES webpmux
+    HINTS ${PC_WEBPMUX_LIBDIR}
 )
 
 find_path(webpmux_INCLUDE_PATH
     NAMES webp/mux.h
+    HINTS ${PC_WEBPMUX_INCLUDEDIR}
 )
 
-set(webpmux_COMPILE_OPTIONS "" CACHE STRING "Extra compile options of webpmux")
+if(PC_WEBPMUX_FOUND)
+  get_flags_from_pkg_config("${webpmux_LIBRARY}" "PC_WEBPMUX" "_webpmux")
+endif()
+
+set(webpmux_COMPILE_OPTIONS "${_webpmux_compile_options}" CACHE STRING "Extra compile options of webpmux")
+
+set(webpmux_LINK_LIBRARIES "${_webpmux_link_libraries}" CACHE STRING "Extra link libraries of webpmux")
 
-set(webpmux_LINK_LIBRARIES "" CACHE STRING "Extra link libraries of webpmux")
+set(webpmux_LINK_OPTIONS "${_webpmux_link_options}" CACHE STRING "Extra link options of webpmux")
 
-set(webpmux_LINK_FLAGS "" CACHE STRING "Extra link flags of webpmux")
+set(webpmux_LINK_DIRECTORIES "${_webpmux_link_directories}" CACHE STRING "Extra link directories of webpmux")
 
 find_package_handle_standard_args(webp
     REQUIRED_VARS webp_LIBRARY webp_INCLUDE_PATH webpdemux_LIBRARY webpdemux_INCLUDE_PATH webpmux_LIBRARY webpmux_INCLUDE_PATH
@@ -54,7 +83,8 @@ if (webp_FOUND)
             INTERFACE_INCLUDE_DIRECTORIES "${webp_INCLUDE_PATH}"
             INTERFACE_COMPILE_OPTIONS "${webp_COMPILE_FLAGS}"
             INTERFACE_LINK_LIBRARIES "${webp_LINK_LIBRARIES}"
-            INTERFACE_LINK_FLAGS "${webp_LINK_FLAGS}"
+            INTERFACE_LINK_OPTIONS "${webp_LINK_OPTIONS}"
+            INTERFACE_LINK_DIRECTORIES "${webp_LINK_DIRECTORIES}"
         )
     endif()
     if (NOT TARGET WebP::webpdemux)
@@ -64,7 +94,8 @@ if (webp_FOUND)
             INTERFACE_INCLUDE_DIRECTORIES "${webpdemux_INCLUDE_PATH}"
             INTERFACE_COMPILE_OPTIONS "${webpdemux_COMPILE_FLAGS}"
             INTERFACE_LINK_LIBRARIES "${webpdemux_LINK_LIBRARIES}"
-            INTERFACE_LINK_FLAGS "${webpdemux_LINK_FLAGS}"
+            INTERFACE_LINK_OPTIONS "${webpdemux_LINK_OPTIONS}"
+            INTERFACE_LINK_DIRECTORIES "${webpdemux_LINK_DIRECTORIES}"
         )
     endif()
     if (NOT TARGET WebP::libwebpmux)
@@ -74,7 +105,8 @@ if (webp_FOUND)
             INTERFACE_INCLUDE_DIRECTORIES "${webpmux_INCLUDE_PATH}"
             INTERFACE_COMPILE_OPTIONS "${webpmux_COMPILE_FLAGS}"
             INTERFACE_LINK_LIBRARIES "${webpmux_LINK_LIBRARIES}"
-            INTERFACE_LINK_FLAGS "${webpmux_LINK_FLAGS}"
+            INTERFACE_LINK_OPTIONS "${webpmux_LINK_OPTIONS}"
+            INTERFACE_LINK_DIRECTORIES "${webpmux_LINK_DIRECTORIES}"
         )
     endif()
 endif()
diff --git a/cmake/PkgConfigHelper.cmake b/cmake/PkgConfigHelper.cmake
new file mode 100644
index 000000000..7070fac79
--- /dev/null
+++ b/cmake/PkgConfigHelper.cmake
@@ -0,0 +1,34 @@
+# Helper for Find modules
+
+function(get_flags_from_pkg_config _library _pc_prefix _out_prefix)
+  if("${_library}" MATCHES "${CMAKE_STATIC_LIBRARY_SUFFIX}$")
+    set(_cflags ${_pc_prefix}_STATIC_CFLAGS_OTHER)
+    set(_link_libraries ${_pc_prefix}_STATIC_LIBRARIES)
+    set(_link_options ${_pc_prefix}_STATIC_LDFLAGS_OTHER)
+    set(_library_dirs ${_pc_prefix}_STATIC_LIBRARY_DIRS)
+  else()
+    set(_cflags ${_pc_prefix}_CFLAGS_OTHER)
+    set(_link_libraries ${_pc_prefix}_LIBRARIES)
+    set(_link_options ${_pc_prefix}_LDFLAGS_OTHER)
+    set(_library_dirs ${_pc_prefix}_LIBRARY_DIRS)
+  endif()
+
+  # The *_LIBRARIES lists always start with the library itself
+  list(POP_FRONT "${_link_libraries}")
+
+  # Work around CMake's flag deduplication when pc files use `-framework A` instead of `-Wl,-framework,A`
+  string(REPLACE "-framework;" "-Wl,-framework," "_filtered_link_options" "${${_link_options}}")
+
+  set(${_out_prefix}_compile_options
+      "${${_cflags}}"
+      PARENT_SCOPE)
+  set(${_out_prefix}_link_libraries
+      "${${_link_libraries}}"
+      PARENT_SCOPE)
+  set(${_out_prefix}_link_options
+      "${_filtered_link_options}"
+      PARENT_SCOPE)
+  set(${_out_prefix}_link_directories
+      "${${_library_dirs}}"
+      PARENT_SCOPE)
+endfunction()
diff --git a/cmake/SDL3_imageConfig.cmake.in b/cmake/SDL3_imageConfig.cmake.in
index b4fa7e9bc..52c71cf24 100644
--- a/cmake/SDL3_imageConfig.cmake.in
+++ b/cmake/SDL3_imageConfig.cmake.in
@@ -82,6 +82,7 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
         list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
 
         include(CMakeFindDependencyMacro)
+        include(PkgConfigHelper)
 
         if(SDLIMAGE_AVIF AND NOT TARGET avif AND NOT SDLIMAGE_AVIF_SHARED)
             find_package(libavif 1.0 QUIET)