SDL_image: Allow parallel installation of shared and static SDL2_image

From 342803c547a9507afdc8d9b84470afb454851756 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Thu, 12 May 2022 01:07:50 +0200
Subject: [PATCH] Allow parallel installation of shared and static SDL2_image

---
 CMakeLists.txt                                | 46 +++++++++++++++----
 ...nfig.cmake.in => SDL2_imageConfig.cmake.in | 26 ++++++++++-
 2 files changed, 61 insertions(+), 11 deletions(-)
 rename SDL2_image-config.cmake.in => SDL2_imageConfig.cmake.in (66%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d14819f..e941aa2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -260,7 +260,6 @@ option(SUPPORT_XV "Support loading XV images" ON)
 
 option(BUILD_SAMPLES "Build the SDL2_image sample program(s)" ON)
 option(BUILD_SHARED_LIBS "Build the library as a shared library" ON)
-
 # FIXME: use vendored libavif when available
 set(SUPPORT_AVIF_VENDORED OFF)
 #cmake_dependent_option(SUPPORT_AVIF_VENDORED "Use vendored libavif" ${VENDORED_DEFAULT} SUPPORT_AVIF OFF)
@@ -293,6 +292,14 @@ if (NOT BUILD_SHARED_LIBS)
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 endif()
 
+if(BUILD_SHARED_LIBS)
+    set(sdl2_image_export_name SDL2_image)
+    set(sdl2_image_install_name_infix shared)
+else()
+    set(sdl2_image_export_name SDL2_image-static)
+    set(sdl2_image_install_name_infix static)
+endif()
+
 add_library(SDL2_image
     IMG.c
     IMG_avif.c
@@ -316,7 +323,7 @@ add_library(SDL2_image
     IMG_xv.c
     IMG_xxx.c
     )
-add_library(SDL2_image::SDL2_image ALIAS SDL2_image)
+add_library(SDL2_image::${sdl2_image_export_name} ALIAS SDL2_image)
 
 target_compile_definitions(SDL2_image PRIVATE
     SDL_BUILD_MAJOR_VERSION=${MAJOR_VERSION}
@@ -352,13 +359,17 @@ endif()
 
 set(INSTALL_EXTRA_TARGETS)
 set(PC_REQUIRES)
+set(PC_LIBS)
 
 if (SUPPORT_AVIF)
     target_compile_definitions(SDL2_image PRIVATE LOAD_AVIF)
     if (SUPPORT_AVIF_VENDORED)
         message(FATAL_ERROR "libavif is not vendored yet")
         add_subdirectory(external/libavif EXCLUDE_FROM_ALL)
-        # list(APPEND INSTALL_EXTRA_TARGETS libavif)
+        list(APPEND INSTALL_EXTRA_TARGETS libavif)
+        if (NOT SUPPORT_AVIF_SHARED)
+            list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:avif>)
+        endif()
     else()
         find_package(libavif REQUIRED)
         list(APPEND PC_REQUIRES libavif)
@@ -396,6 +407,9 @@ if (SUPPORT_JPG)
             add_subdirectory(external/jpeg EXCLUDE_FROM_ALL)
             add_library(JPEG::JPEG ALIAS jpeg)
             list(APPEND INSTALL_EXTRA_TARGETS jpeg)
+            if (NOT SUPPORT_JPG_SHARED)
+                list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:jpeg>)
+            endif()
         else()
             find_package(JPEG REQUIRED)
             list(APPEND PC_REQUIRES libjpeg)
@@ -426,6 +440,11 @@ if (SUPPORT_JXL)
         if (BUILD_SHARED_LIBS)
             set(jxl_lib jxl)
             list(APPEND INSTALL_EXTRA_TARGETS brotlidec brotlicommon brotlienc ${jxl_lib})
+            if (NOT SUPPORT_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()
         else()
             set(jxl_lib jxl-static)
             list(APPEND INSTALL_EXTRA_TARGETS brotlidec-static brotlicommon-static brotlienc-static hwy ${jxl_lib})
@@ -487,6 +506,9 @@ if (SUPPORT_PNG)
                     set(ZLIB_LIBRARY zlibstatic)
                 endif()
                 list(APPEND INSTALL_EXTRA_TARGETS ${ZLIB_LIBRARY})
+                if (NOT SUPPORT_PNG_SHARED)
+                    list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:${ZLIB_LIBRARY}>)
+                endif()
             endif()
             set(SKIP_INSTALL_EXPORT ON)
             add_subdirectory(external/libpng EXCLUDE_FROM_ALL)
@@ -498,6 +520,9 @@ if (SUPPORT_PNG)
             add_library(PNG::PNG ALIAS ${PNG_LIBRARY})
             target_include_directories(SDL2_image PRIVATE external/libpng)
             list(APPEND INSTALL_EXTRA_TARGETS ${PNG_LIBRARY})
+            if (NOT SUPPORT_PNG_SHARED)
+                list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:${PNG_LIBRARY}>)
+            endif()
         else()
             find_package(PNG REQUIRED)
             list(APPEND PC_REQUIRES libpng)
@@ -543,6 +568,9 @@ if (SUPPORT_TIF)
         add_subdirectory(external/libtiff EXCLUDE_FROM_ALL)
         add_library(TIFF::TIFF ALIAS tiff)
         list(APPEND INSTALL_EXTRA_TARGETS tiff)
+        if (NOT SUPPORT_TIF_SHARED)
+            list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:tiff>)
+        endif()
     else()
         find_package(TIFF REQUIRED)
         list(APPEND PC_REQUIRES libtiff-4)
@@ -626,7 +654,7 @@ target_include_directories(SDL2_image
 set_target_properties(SDL2_image PROPERTIES
     DEFINE_SYMBOL DLL_EXPORT
     PUBLIC_HEADER SDL_image.h
-    EXPORT_NAME SDL2_image
+    EXPORT_NAME ${sdl2_image_export_name}
     C_VISIBILITY_PRESET "hidden"
     )
 if (UNIX AND NOT APPLE AND NOT ANDROID)
@@ -670,7 +698,7 @@ if (NOT SDL2_IMAGE_DISABLE_INSTALL)
             )
     endif()
 
-    configure_package_config_file(SDL2_image-config.cmake.in SDL2_image-config.cmake
+    configure_package_config_file(SDL2_imageConfig.cmake.in SDL2_imageConfig.cmake
         INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_image")
 
     set(prefix "${CMAKE_INSTALL_PREFIX}")
@@ -681,11 +709,11 @@ if (NOT SDL2_IMAGE_DISABLE_INSTALL)
     set(VERSION "${FULL_VERSION}")
     set(SDL_VERSION "${SDL_REQUIRED_VERSION}")
     string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
-    file(GENERATE OUTPUT SDL2_image.pc INPUT SD2_image.pc.in)
+    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL2_image.pc" INPUT "${PROJECT_SOURCE_DIR}/SDL2_image.pc.in")
 
     install(EXPORT SDL2ImageExports NAMESPACE SDL2_image::
-        DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_image" FILE SDL2_image-targets.cmake)
-    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SDL2_image-config.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_image")
+        DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_image" FILE SDL2_image-${sdl2_image_install_name_infix}-targets.cmake)
+    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SDL2_imageConfig.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_image")
     install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SDL2_image.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
     install(FILES "LICENSE.txt" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}")
     if (NOT (WIN32 OR CYGWIN OR MINGW))
@@ -712,7 +740,7 @@ if (BUILD_SAMPLES)
             target_link_libraries(${prog} PRIVATE mingw32)
             target_link_options(${prog} PRIVATE -mwindows)
         endif()
-        target_link_libraries(${prog} PRIVATE SDL2_image::SDL2_image)
+        target_link_libraries(${prog} PRIVATE SDL2_image::${sdl2_image_export_name})
         if (TARGET SDL2::SDL2main)
             target_link_libraries(${prog} PRIVATE SDL2::SDL2main)
         endif()
diff --git a/SDL2_image-config.cmake.in b/SDL2_imageConfig.cmake.in
similarity index 66%
rename from SDL2_image-config.cmake.in
rename to SDL2_imageConfig.cmake.in
index 5f13510..51698b9 100644
--- a/SDL2_image-config.cmake.in
+++ b/SDL2_imageConfig.cmake.in
@@ -50,7 +50,29 @@ if(SDL2_IMAGE_SUPPORT_TIF AND NOT @SUPPORT_TIF_VENDORED@)
 endif()
 
 if(SDL2_IMAGE_SUPPORT_WEBP AND NOT @SUPPORT_WEBP_VENDORED@)
-	find_package(WebP REQUIRED)
+	if (NOT TARGET WebP::webp)
+		find_library(WEBP_LIBRARY NAMES webp)
+		if (NOT WEBP_LIBRARY)
+			message(FATAL_ERROR "Could not find webp library")
+		endif()
+		find_path(WEBP_INCLUDE NAMES webp/decode.h)
+		if (NOT WEBP_INCLUDE)
+			message(FATAL_ERROR "Could not find webp include directory")
+		endif()
+		add_library(webp UNKNOWN IMPORTED)
+		set_target_properties(webp PROPERTIES
+			IMPORTED_LOCATION "${WEBP_LIBRARY}"
+			INTERFACE_INCLUDE_DIRECTORIES "${WEBP_INCLUDE}"
+			)
+		list(APPEND PC_REQUIRES libwebp)
+		add_library(WebP::webp ALIAS webp)
+	endif()
+endif()
+
+if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL2_image-shared-targets.cmake")
+	include("${CMAKE_CURRENT_LIST_DIR}/SDL2_image-shared-targets.cmake")
 endif()
 
-include("${CMAKE_CURRENT_LIST_DIR}/SDL2_image-targets.cmake")
+if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL2_image-static-targets.cmake")
+	include("${CMAKE_CURRENT_LIST_DIR}/SDL2_image-static-targets.cmake")
+endif()