SDL_image: cmake: don't install static vendored libraries when SDL3_image is built as a shared library

From 330bc90f4f41191d578094a316fbc9b25007c083 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 22 Sep 2023 03:22:09 +0200
Subject: [PATCH] cmake: don't install static vendored libraries when
 SDL3_image is built as a shared library

The library is already built-in. No need for an extra static library.
---
 CMakeLists.txt                  | 70 ++++++++++++++++++++++-----------
 cmake/SDL3_imageConfig.cmake.in | 63 ++++++++++++++++++-----------
 cmake/test/main.c               | 24 +++++++++--
 test/CMakeLists.txt             |  2 +
 4 files changed, 110 insertions(+), 49 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d93c6c92..968c582d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -299,7 +299,7 @@ endif()
 
 # Use `Compatible Interface Properties` to ensure a shared SDL3_image is built with a shared SDL3
 if(SDL3IMAGE_BUILD_SHARED_LIBS)
-    set_property(TARGET ${sdl3_image_target_name} PROPERTY INTERFACE_SDL3_SHARED ${SDL3IMAGE_BUILD_SHARED_LIBS})
+    set_property(TARGET ${sdl3_image_target_name} PROPERTY INTERFACE_SDL3_SHARED TRUE)
     set_property(TARGET ${sdl3_image_target_name} APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED)
 endif()
 
@@ -313,6 +313,7 @@ if(SDL3IMAGE_BUILD_SHARED_LIBS)
 endif()
 
 set(INSTALL_EXTRA_TARGETS)
+set(INSTALL_EXTRA_CMAKE_MODULES)
 set(PC_LIBS)
 set(PC_REQUIRES)
 
@@ -358,7 +359,9 @@ if(SDL3IMAGE_ZLIB)
         else()
             set(ZLIB_LIBRARY zlibstatic)
         endif()
-        list(APPEND INSTALL_EXTRA_TARGETS ${ZLIB_LIBRARY})
+        if(SDL3IMAGE_ZLIB_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS ${ZLIB_LIBRARY})
+        endif()
         set_target_properties(${ZLIB_LIBRARY} PROPERTIES EXPORT_NAME external_zlib)
         add_library(SDL3_image::external_zlib ALIAS ${ZLIB_LIBRARY})
     else()
@@ -370,9 +373,12 @@ endif()
 if(SDL3IMAGE_DAV1D)
     if(SDL3IMAGE_DAV1D_VENDORED)
         message(STATUS "${PROJECT_NAME}: Using vendored dav1d")
+        set(BUILD_SHARED_LIBS ${SDL3IMAGE_DAV1D_SHARED})
         add_subdirectory(external/dav1d)
         set(DAV1D_LIBRARY dav1d)
-        list(APPEND INSTALL_EXTRA_TARGETS dav1d)
+        if(SDL3IMAGE_DAV1D_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS dav1d)
+        endif()
     else()
         message(FATAL_ERROR "Not implemented")
     endif()
@@ -387,8 +393,11 @@ if(SDL3IMAGE_AVIF)
         set(AVIF_CODEC_DAV1D ON CACHE BOOL "Use dav1d codec for decoding" FORCE)
         set(AVIF_LOCAL_DAV1D OFF CACHE BOOL "Build dav1d by libaf" FORCE)
         set(LIBAVIF_WITH_SHARPYUV_SDLIMAGE ${SDL3IMAGE_WEBP} CACHE BOOL "Build libavif with sharpyuv support (re-use sharpyuv built by libwebp)" FORCE)
+        set(BUILD_SHARED_LIBS ${SDL3IMAGE_AVIF_SHARED})
         add_subdirectory(external/libavif EXCLUDE_FROM_ALL)
-        list(APPEND INSTALL_EXTRA_TARGETS avif)
+        if(SDL3IMAGE_AVIF_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS avif)
+        endif()
         set_target_properties(avif PROPERTIES EXPORT_NAME external_libavif)
         add_library(SDL3_image::external_libavif ALIAS avif)
         if(NOT SDL3IMAGE_AVIF_SHARED)
@@ -453,7 +462,9 @@ if(SDL3IMAGE_JPG)
             sdl_check_project_in_subfolder(external/jpeg libjpeg SDL3IMAGE_VENDORED)
             set(BUILD_SHARED_LIBS ${SDL3IMAGE_JPG_SHARED})
             add_subdirectory(external/jpeg EXCLUDE_FROM_ALL)
-            list(APPEND INSTALL_EXTRA_TARGETS jpeg)
+            if(SDL3IMAGE_JPG_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+                list(APPEND INSTALL_EXTRA_TARGETS jpeg)
+            endif()
             set_target_properties(jpeg PROPERTIES EXPORT_NAME external_libjpeg)
             add_library(SDL3_image::external_libjpeg ALIAS jpeg)
             if(NOT SDL3IMAGE_JPG_SHARED)
@@ -491,6 +502,8 @@ if(SDL3IMAGE_JXL)
         message(STATUS "${PROJECT_NAME}: Using vendored libjxl")
         # BUILD_TESTING variable is used by libjxl
         set(BUILD_TESTING OFF CACHE BOOL "build testing")
+        # JPEGXL_ENABLE_BENCHMARK variable is used by libjxl
+        set(JPEGXL_ENABLE_BENCHMARK OFF CACHE BOOL "libjpegxl benchmark" FORCE)
         # JPEGXL_ENABLE_TOOLS variable is used by libjxl
         set(JPEGXL_ENABLE_JNI OFF CACHE BOOL "build jpegxl fni")
         # JPEGXL_ENABLE_MANPAGES variable is used by libjxl
@@ -504,18 +517,19 @@ if(SDL3IMAGE_JXL)
         sdl_check_project_in_subfolder(external/libjxl libjxl SDL3IMAGE_VENDORED)
         set(BUILD_SHARED_LIBS ${SDL3IMAGE_JXL_SHARED})
         add_subdirectory(external/libjxl EXCLUDE_FROM_ALL)
-        if(BUILD_SHARED_LIBS)
+        if(SDL3IMAGE_JXL_SHARED)
             set(jxl_lib jxl)
-            list(APPEND INSTALL_EXTRA_TARGETS brotlidec brotlicommon brotlienc ${jxl_lib})
-            if(NOT SDL3IMAGE_JXL_SHARED)
-                list(APPEND PC_LIBS
-                    -l$<TARGET_FILE_BASE_NAME:brotlidec> -l$<TARGET_FILE_BASE_NAME:brotlicommon>
-                    -l$<TARGET_FILE_BASE_NAME:brotlienc> -l$<TARGET_FILE_BASE_NAME:${jxl_lib}>
-                )
-            endif()
+            set(jxl_install_libs brotlidec brotlicommon brotlienc jxl)
         else()
             set(jxl_lib jxl_dec-static)
-            list(APPEND INSTALL_EXTRA_TARGETS brotlidec-static brotlicommon-static hwy ${jxl_lib})
+            set(jxl_install_libs brotlidec-static brotlicommon-static hwy jxl_dec-static)
+            list(APPEND PC_LIBS
+                -l$<TARGET_FILE_BASE_NAME:brotlidec> -l$<TARGET_FILE_BASE_NAME:brotlicommon>
+                -l$<TARGET_FILE_BASE_NAME:brotlienc> -l$<TARGET_FILE_BASE_NAME:jxl>
+            )
+        endif()
+        if(SDL3IMAGE_JXL_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS ${jxl_install_libs})
         endif()
         set_target_properties(${jxl_lib} PROPERTIES EXPORT_NAME external_libjxl)
         add_library(SDL3_image::external_libjxl ALIAS ${jxl_lib})
@@ -527,6 +541,7 @@ if(SDL3IMAGE_JXL)
         find_package(libjxl REQUIRED)
         if(NOT SDL3IMAGE_JXL_SHARED)
             list(APPEND PC_REQUIRES libjxl)
+            list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findlibjxl.cmake)
         endif()
     endif()
     if(SDL3IMAGE_JXL_SHARED)
@@ -571,8 +586,11 @@ if(SDL3IMAGE_PNG)
                 set(PNG_LIBRARY png_static)
             endif()
             add_library(PNG::PNG ALIAS ${PNG_LIBRARY})
+            set_property(TARGET ${PNG_LIBRARY} PROPERTY DEBUG_POSTFIX "")
             target_include_directories(${sdl3_image_target_name} PRIVATE external/libpng)
-            list(APPEND INSTALL_EXTRA_TARGETS ${PNG_LIBRARY})
+            if(SDL3IMAGE_PNG_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+                list(APPEND INSTALL_EXTRA_TARGETS ${PNG_LIBRARY})
+            endif()
             set_target_properties(${PNG_LIBRARY} PROPERTIES EXPORT_NAME external_libpng)
             add_library(SDL3_image::external_libpng ALIAS ${PNG_LIBRARY})
             if(NOT SDL3IMAGE_PNG_SHARED)
@@ -654,7 +672,9 @@ if(SDL3IMAGE_TIF)
         set(BUILD_SHARED_LIBS ${SDL3IMAGE_TIF_SHARED})
         add_subdirectory(external/libtiff EXCLUDE_FROM_ALL)
         add_library(TIFF::TIFF ALIAS tiff)
-        list(APPEND INSTALL_EXTRA_TARGETS tiff)
+        if(SDL3IMAGE_TIF_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+          list(APPEND INSTALL_EXTRA_TARGETS tiff)
+        endif()
         set_target_properties(tiff PROPERTIES EXPORT_NAME external_libtiff)
         add_library(SDL3_image::external_libtiff ALIAS tiff)
         if(NOT SDL3IMAGE_TIF_SHARED)
@@ -695,9 +715,11 @@ if(SDL3IMAGE_WEBP)
         target_include_directories(${sdl3_image_target_name} PRIVATE external/libwebp/src)
         add_library(WebP::webp ALIAS webp)
         add_library(WebP::webpdemux ALIAS webpdemux)
-        list(APPEND INSTALL_EXTRA_TARGETS webp webpdemux)
-        if(NOT BUILD_SHARED_LIBS)
-            list(APPEND INSTALL_EXTRA_TARGETS sharpyuv)
+        if(SDL3IMAGE_WEBP_SHARED OR NOT SDL3IMAGE_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS webp webpdemux)
+            if(NOT SDL3IMAGE_WEBP_SHARED)
+                list(APPEND INSTALL_EXTRA_TARGETS sharpyuv)
+            endif()
         endif()
         set_target_properties(webp PROPERTIES EXPORT_NAME "external_libwebp")
         set_target_properties(webpdemux PROPERTIES EXPORT_NAME "external_webpdemux")
@@ -708,6 +730,7 @@ if(SDL3IMAGE_WEBP)
         find_package(webp REQUIRED)
         if(NOT SDL3IMAGE_WEBP_SHARED)
             list(APPEND PC_REQUIRES libwebp)
+            list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findwebp.cmake)
         endif()
     endif()
     if(SDL3IMAGE_WEBP_SHARED)
@@ -763,10 +786,14 @@ if(SDL3IMAGE_INSTALL)
 
     if(INSTALL_EXTRA_TARGETS)
         set_property(TARGET ${INSTALL_EXTRA_TARGETS} PROPERTY PUBLIC_HEADER "")
+        set(archive_destination)
+        if(NOT BUILD_SHARED_LIBS)
+            set(archive_destination ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel)
+        endif()
         install(
             TARGETS ${INSTALL_EXTRA_TARGETS}
             EXPORT SDL3ImageExports
-            ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
+            ${archive_destination}
             LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
             RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT library
         )
@@ -798,8 +825,7 @@ if(SDL3IMAGE_INSTALL)
         FILES
             "${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfig.cmake"
             "${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfigVersion.cmake"
-            cmake/Findlibjxl.cmake
-            cmake/Findwebp.cmake
+            ${INSTALL_EXTRA_CMAKE_MODULES}
         DESTINATION "${SDL3IMAGE_INSTALL_CMAKEDIR}"
         COMPONENT devel
     )
diff --git a/cmake/SDL3_imageConfig.cmake.in b/cmake/SDL3_imageConfig.cmake.in
index ddac56f3..16e50bf5 100644
--- a/cmake/SDL3_imageConfig.cmake.in
+++ b/cmake/SDL3_imageConfig.cmake.in
@@ -8,23 +8,28 @@ set_package_properties(SDL3_image PROPERTIES
 
 set(SDL3_image_FOUND ON)
 
-set(SDL3IMAGE_AVIF  @SDL3IMAGE_AVIF@)
-set(SDL3IMAGE_BMP   @SDL3IMAGE_BMP@)
-set(SDL3IMAGE_GIF   @SDL3IMAGE_GIF@)
-set(SDL3IMAGE_JPG   @SDL3IMAGE_JPG@)
-set(SDL3IMAGE_JXL   @SDL3IMAGE_JXL@)
-set(SDL3IMAGE_LBM   @SDL3IMAGE_LBM@)
-set(SDL3IMAGE_PCX   @SDL3IMAGE_PCX@)
-set(SDL3IMAGE_PNG   @SDL3IMAGE_PNG@)
-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_XCF   @SDL3IMAGE_XCF@)
-set(SDL3IMAGE_XPM   @SDL3IMAGE_XPM@)
-set(SDL3IMAGE_XV    @SDL3IMAGE_XV@)
-set(SDL3IMAGE_WEBP  @SDL3IMAGE_WEBP@)
+set(SDL3IMAGE_AVIF          @SDL3IMAGE_AVIF@)
+set(SDL3IMAGE_AVIF_SHARED   @SDL3IMAGE_AVIF_SHARED@)
+set(SDL3IMAGE_BMP           @SDL3IMAGE_BMP@)
+set(SDL3IMAGE_GIF           @SDL3IMAGE_GIF@)
+set(SDL3IMAGE_JPG           @SDL3IMAGE_JPG@)
+set(SDL3IMAGE_JPG_SHARED    @SDL3IMAGE_JPG_SHARED@)
+set(SDL3IMAGE_JXL           @SDL3IMAGE_JXL@)
+set(SDL3IMAGE_JXL_SHARED    @SDL3IMAGE_JXL_SHARED@)
+set(SDL3IMAGE_LBM           @SDL3IMAGE_LBM@)
+set(SDL3IMAGE_PCX           @SDL3IMAGE_PCX@)
+set(SDL3IMAGE_PNG           @SDL3IMAGE_PNG@)
+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_TIF_SHARED    @SDL3IMAGE_TIF_SHARED@)
+set(SDL3IMAGE_XCF           @SDL3IMAGE_XCF@)
+set(SDL3IMAGE_XPM           @SDL3IMAGE_XPM@)
+set(SDL3IMAGE_XV            @SDL3IMAGE_XV@)
+set(SDL3IMAGE_WEBP_SHARED   @SDL3IMAGE_WEBP_SHARED@)
 
 set(SDL3IMAGE_JPG_SAVE @SDL3IMAGE_JPG_SAVE@)
 set(SDL3IMAGE_PNG_SAVE @SDL3IMAGE_PNG_SAVE@)
@@ -44,23 +49,35 @@ endif()
 if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
 
     if(SDL3IMAGE_VENDORED)
-        if(SDL3IMAGE_WEBP)
+        if(SDL3IMAGE_AVIF AND NOT SDL3IMAGE_AVIF_SHARED)
             find_package(Threads)
         endif()
-        if(SDL3IMAGE_JXL)
+        if(SDL3IMAGE_JXL AND NOT SDL3IMAGE_JXL_SHARED)
             include(CheckLanguage)
             check_language(CXX)
             if(NOT CMAKE_CXX_COMPILER AND NOT _sdl3image_nowarning)
                 message(WARNING "CXX language not enabled. Linking to SDL3_image::SDL3_image-static might fail.")
             endif()
         endif()
+        if(SDL3IMAGE_TIF AND NOT SDL3IMAGE_TIF_SHARED)
+            if(NOT TARGET CMath::CMath)
+                add_library(CMath::CMath INTERFACE IMPORTED)
+                find_library(CMATH_LIBRARY NAMES m)
+                if(CMATH_LIBRARY)
+                    set_property(TARGET CMath::CMath PROPERTY INTERFACE_LINK_LIBRARIES "${CMAKE_LIBRARY}")
+                endif()
+            endif()
+        endif()
+        if(SDL3IMAGE_WEBP AND NOT SDL3IMAGE_WEBP_SHARED)
+            find_package(Threads)
+        endif()
     else()
         set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
         list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
 
         include(CMakeFindDependencyMacro)
 
-        if(SDL3IMAGE_AVIF AND NOT TARGET avif)
+        if(SDL3IMAGE_AVIF AND NOT TARGET avif AND NOT SDL3IMAGE_AVIF_SHARED)
             find_package(libavif 1.0 QUIET)
             if(NOT libavif_FOUND)
                 find_package(libavif @LIBAVIF_MINIMUM_VERSION@ QUIET)
@@ -71,7 +88,7 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
             endif()
         endif()
 
-        if(SDL3IMAGE_JPG AND NOT TARGET JPEG::JPEG)
+        if(SDL3IMAGE_JPG AND NOT TARGET JPEG::JPEG AND NOT SDL3IMAGE_JPG_SHARED)
             find_dependency(JPEG)
         endif()
 
@@ -80,7 +97,7 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
             find_dependency(libjxl)
         endif()
 
-        if(SDL3IMAGE_PNG AND NOT TARGET PNG::PNG)
+        if(SDL3IMAGE_PNG AND NOT TARGET PNG::PNG AND NOT SDL3IMAGE_PNG_SHARED)
             find_dependency(PNG)
         endif()
 
@@ -88,7 +105,7 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
             find_dependency(TIFF)
         endif()
 
-        if(SDL3IMAGE_WEBP AND NOT TARGET WebP::webp)
+        if(SDL3IMAGE_WEBP AND NOT TARGET WebP::webp AND NOT SDL3IMAGE_WEBP_SHARED)
             list(APPEND webp_ROOT "${CMAKE_CURRENT_LIST_DIR}")
             find_dependency(webp)
         endif()
diff --git a/cmake/test/main.c b/cmake/test/main.c
index 22fde13c..2f1ce62b 100644
--- a/cmake/test/main.c
+++ b/cmake/test/main.c
@@ -2,15 +2,31 @@
 #include <SDL3/SDL_main.h>
 #include <SDL3_image/SDL_image.h>
 
+#define TEST_INIT_FLAG(FLAG) do {                   \
+        if ((IMG_Init(FLAG) & FLAG) == FLAG) {      \
+            SDL_Log("IMG_Init("#FLAG") succeeded"); \
+        } else {                                    \
+            SDL_Log("IMG_Init("#FLAG") failed");    \
+        }                                           \
+    } while (0);
+
+#define FOREACH_INIT_FLAGS(X) \
+    X(IMG_INIT_JPG)           \
+    X(IMG_INIT_PNG)           \
+    X(IMG_INIT_TIF)           \
+    X(IMG_INIT_WEBP)          \
+    X(IMG_INIT_JXL)           \
+    X(IMG_INIT_AVIF)          \
+
 int main(int argc, char *argv[])
 {
     if (SDL_Init(0) < 0) {
-        SDL_Log("Could not initialize SDL: %s\n", SDL_GetError());
+        SDL_Log("SDL_Init(0) failed: %s\n", SDL_GetError());
         return 1;
     }
-    if (IMG_Init(0) == 0) {
-        SDL_Log("No image formats supported\n");
-    }
+
+    FOREACH_INIT_FLAGS(TEST_INIT_FLAG)
+
     IMG_Quit();
     SDL_Quit();
     return 0;
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index e6efdf9d..0a008285 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -2,6 +2,8 @@
 
 enable_testing()
 
+set(CMAKE_POSITION_INDEPENDENT_CODE OFF)
+
 set(RESOURCE_FILES
     palette.bmp
     palette.gif