SDL_image: cmake: create SDL3_image::SDL3_image-shared for shared image library

From 08f5e2ee82a42af0d6598501958b59b438523acb Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 5 Jun 2023 02:29:31 +0200
Subject: [PATCH] cmake: create SDL3_image::SDL3_image-shared for shared image
 library

---
 CMakeLists.txt                  | 157 ++++++++++++++++----------------
 cmake/SDL3_imageConfig.cmake.in |  19 ++++
 test/CMakeLists.txt             |   8 +-
 3 files changed, 102 insertions(+), 82 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8eb723e9..3fe21572 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,7 +35,6 @@ endif()
 
 # Assume MSVC projects don't have a package manager and need vendored dependencies (by default).
 # Most other platforms have some kind of package manager.
-# FIXME: consider a package manager such as conan/vcpkg instead of vendoring
 if(MSVC)
     set(vendored_default ON)
 else()
@@ -160,12 +159,10 @@ endif()
 set(SDL3IMAGE_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 
 if(SDL3IMAGE_BUILD_SHARED_LIBS)
-    set(sdl3_image_export_name SDL3_image)
-    set(sdl3_image_install_name_infix shared)
-    set(sdl3_target_name SDL3::SDL3)
+    set(sdl3_image_target_name SDL3_image-shared)
+    set(sdl3_target_name SDL3::SDL3-shared)
 else()
-    set(sdl3_image_export_name SDL3_image-static)
-    set(sdl3_image_install_name_infix static)
+    set(sdl3_image_target_name SDL3_image-static)
     set(sdl3_target_name SDL3::SDL3-static)
 endif()
 
@@ -201,7 +198,7 @@ if(SDL3IMAGE_WERROR)
 endif()
 
 set(BUILD_SHARED_LIBS ${SDL3IMAGE_BUILD_SHARED_LIBS})
-add_library(SDL3_image
+add_library(${sdl3_image_target_name}
     IMG.c
     IMG_WIC.c
     IMG_avif.c
@@ -224,44 +221,48 @@ add_library(SDL3_image
     IMG_xv.c
     IMG_xxx.c
 )
-add_library(SDL3_image::${sdl3_image_export_name} ALIAS SDL3_image)
-target_include_directories(SDL3_image PUBLIC
+add_library(SDL3_image::${sdl3_image_target_name} ALIAS ${sdl3_image_target_name})
+if(NOT TARGET SDL3_image::SDL3_image)
+    add_library(SDL3_image::SDL3_image ALIAS ${sdl3_image_target_name})
+endif()
+target_include_directories(${sdl3_image_target_name} PUBLIC
     "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
     "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/SDL3>"
     "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
     "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/SDL3>"
 )
-target_compile_definitions(SDL3_image PRIVATE
+target_compile_definitions(${sdl3_image_target_name} PRIVATE
     BUILD_SDL
     SDL_BUILD_MAJOR_VERSION=${MAJOR_VERSION}
     SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
     SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
 )
-target_link_libraries(SDL3_image PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
-target_link_libraries(SDL3_image PRIVATE $<BUILD_INTERFACE:sdl3image_build_options>)
+target_link_libraries(${sdl3_image_target_name} PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
+target_link_libraries(${sdl3_image_target_name} PRIVATE $<BUILD_INTERFACE:sdl3image_build_options>)
 if(WIN32 AND SDL3IMAGE_BUILD_SHARED_LIBS)
-    target_sources(SDL3_image PRIVATE
+    target_sources(${sdl3_image_target_name} PRIVATE
         version.rc
     )
 endif()
-set_target_properties(SDL3_image PROPERTIES
+set_target_properties(${sdl3_image_target_name} PROPERTIES
+    OUTPUT_NAME "SDL3_image"
     DEFINE_SYMBOL DLL_EXPORT
-    EXPORT_NAME ${sdl3_image_export_name}
+    EXPORT_NAME ${sdl3_image_target_name}
     C_VISIBILITY_PRESET "hidden"
 )
 
-sdl_target_link_option_version_file(SDL3_image "${CMAKE_CURRENT_SOURCE_DIR}/SDL_image.sym")
+sdl_target_link_option_version_file(${sdl3_image_target_name} "${CMAKE_CURRENT_SOURCE_DIR}/SDL_image.sym")
 
 if(NOT ANDROID)
     if(APPLE)
         # the SOVERSION property corresponds to the compatibility version and VERSION corresponds to the current version
         # https://cmake.org/cmake/help/latest/prop_tgt/SOVERSION.html#mach-o-versions
-        set_target_properties(SDL3_image PROPERTIES
+        set_target_properties(${sdl3_image_target_name} PROPERTIES
             SOVERSION "${DYLIB_COMPAT_VERSION}"
             VERSION "${DYLIB_CURRENT_VERSION}"
         )
     else()
-        set_target_properties(SDL3_image PROPERTIES
+        set_target_properties(${sdl3_image_target_name} PROPERTIES
             SOVERSION "${SO_VERSION_MAJOR}"
             VERSION "${SO_VERSION}"
         )
@@ -269,13 +270,13 @@ if(NOT ANDROID)
 endif()
 if(SDL3IMAGE_BUILD_SHARED_LIBS)
     if(WIN32)
-        set_target_properties(SDL3_image PROPERTIES
+        set_target_properties(${sdl3_image_target_name} PROPERTIES
             PREFIX ""
         )
     endif()
 else()
     if(MSVC)
-        set_target_properties(SDL3_image PROPERTIES
+        set_target_properties(${sdl3_image_target_name} PROPERTIES
             OUTPUT_NAME "SDL3_image-static"
         )
     endif()
@@ -283,12 +284,12 @@ 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 PROPERTY INTERFACE_SDL3_SHARED ${SDL3IMAGE_BUILD_SHARED_LIBS})
-    set_property(TARGET SDL3_image APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED)
+    set_property(TARGET ${sdl3_image_target_name} PROPERTY INTERFACE_SDL3_SHARED ${SDL3IMAGE_BUILD_SHARED_LIBS})
+    set_property(TARGET ${sdl3_image_target_name} APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED)
 endif()
 
 if(SDL3IMAGE_BUILD_SHARED_LIBS)
-    sdl_target_link_options_no_undefined(SDL3_image)
+    sdl_target_link_options_no_undefined(${sdl3_image_target_name})
 endif()
 
 if(SDL3IMAGE_BUILD_SHARED_LIBS)
@@ -301,30 +302,30 @@ set(PC_LIBS)
 set(PC_REQUIRES)
 
 if(SDL3IMAGE_BACKEND_STB)
-    target_compile_definitions(SDL3_image PRIVATE USE_STBIMAGE)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE USE_STBIMAGE)
 endif()
 
 if(APPLE)
     if(SDL3IMAGE_BACKEND_IMAGEIO)
-        target_link_libraries(SDL3_image PRIVATE -Wl,-framework,ApplicationServices)
-        target_link_libraries(SDL3_image PRIVATE objc)
-        target_sources(SDL3_image PRIVATE
+        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
             IMG_ImageIO.m
         )
 
         if (SDL3IMAGE_PNG AND NOT SDL3IMAGE_BACKEND_STB)
-            target_compile_definitions(SDL3_image PRIVATE PNG_USES_IMAGEIO)
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE PNG_USES_IMAGEIO)
         endif()
         if (SDL3IMAGE_JPG AND NOT SDL3IMAGE_BACKEND_STB)
-            target_compile_definitions(SDL3_image PRIVATE JPG_USES_IMAGEIO)
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE JPG_USES_IMAGEIO)
         endif()
     else()
-        target_compile_definitions(SDL3_image PRIVATE SDL_IMAGE_USE_COMMON_BACKEND)
+        target_compile_definitions(${sdl3_image_target_name} PRIVATE SDL_IMAGE_USE_COMMON_BACKEND)
     endif()
 endif()
 
 if(SDL3IMAGE_BACKEND_WIC)
-    target_compile_definitions(SDL3_image PRIVATE SDL_IMAGE_USE_WIC_BACKEND)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE SDL_IMAGE_USE_WIC_BACKEND)
 endif()
 
 if(SDL3IMAGE_ZLIB)
@@ -352,7 +353,7 @@ if(SDL3IMAGE_ZLIB)
 endif()
 
 if(SDL3IMAGE_AVIF)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_AVIF)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_AVIF)
     if(SDL3IMAGE_AVIF_VENDORED)
         message(STATUS "${PROJECT_NAME}: Using vendored libavif")
         message(FATAL_ERROR "libavif is not vendored (yet)")
@@ -373,32 +374,32 @@ if(SDL3IMAGE_AVIF)
         endif()
     endif()
     if(SDL3IMAGE_AVIF_SHARED)
-        target_include_directories(SDL3_image PRIVATE
+        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 PRIVATE "LOAD_AVIF_DYNAMIC=\"${dynamic_avif}\"")
+        target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_AVIF_DYNAMIC=\"${dynamic_avif}\"")
         if(SDL3IMAGE_AVIF_VENDORED)
-            add_dependencies(SDL3_image avif)
+            add_dependencies(${sdl3_image_target_name} avif)
         endif()
     else()
-        target_link_libraries(SDL3_image PRIVATE avif)
+        target_link_libraries(${sdl3_image_target_name} PRIVATE avif)
     endif()
 endif()
 
 if(SDL3IMAGE_BMP)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_BMP)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_BMP)
 endif()
 
 if(SDL3IMAGE_GIF)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_GIF)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_GIF)
 endif()
 
 if(SDL3IMAGE_JPG)
-    target_compile_definitions(SDL3_image PRIVATE
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE
         LOAD_JPG
         SDL_IMAGE_SAVE_JPG=$<BOOL:${SDL3IMAGE_JPG_SAVE}>
     )
@@ -422,25 +423,25 @@ if(SDL3IMAGE_JPG)
             endif()
         endif()
         if(SDL3IMAGE_JPG_SHARED)
-            target_include_directories(SDL3_image PRIVATE
+            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 PRIVATE "LOAD_JPG_DYNAMIC=\"${dynamic_jpeg}\"")
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JPG_DYNAMIC=\"${dynamic_jpeg}\"")
             if(SDL3IMAGE_JPG_VENDORED)
-                add_dependencies(SDL3_image JPEG::JPEG)
+                add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
             endif()
         else()
-            target_link_libraries(SDL3_image PRIVATE JPEG::JPEG)
+            target_link_libraries(${sdl3_image_target_name} PRIVATE JPEG::JPEG)
         endif()
     endif()
 endif()
 
 if(SDL3IMAGE_JXL)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_JXL)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_JXL)
     if(SDL3IMAGE_JXL_VENDORED)
         enable_language(CXX)
         message(STATUS "${PROJECT_NAME}: Using vendored libjxl")
@@ -482,32 +483,32 @@ if(SDL3IMAGE_JXL)
         endif()
     endif()
     if(SDL3IMAGE_JXL_SHARED)
-        target_include_directories(SDL3_image PRIVATE
+        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 PRIVATE "LOAD_JXL_DYNAMIC=\"${dynamic_jxl}\"")
+        target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JXL_DYNAMIC=\"${dynamic_jxl}\"")
         if(SDL3IMAGE_JXL_VENDORED)
-            add_dependencies(SDL3_image libjxl::libjxl)
+            add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
         endif()
     else()
-        target_link_libraries(SDL3_image PRIVATE libjxl::libjxl)
+        target_link_libraries(${sdl3_image_target_name} PRIVATE libjxl::libjxl)
     endif()
 endif()
 
 if(SDL3IMAGE_LBM)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_LBM)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_LBM)
 endif()
 
 if(SDL3IMAGE_PCX)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_PCX)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_PCX)
 endif()
 
 if(SDL3IMAGE_PNG)
-    target_compile_definitions(SDL3_image PRIVATE
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE
         LOAD_PNG
         SDL_IMAGE_SAVE_PNG=$<BOOL:${SDL3IMAGE_PNG_SAVE}>
     )
@@ -523,7 +524,7 @@ if(SDL3IMAGE_PNG)
                 set(PNG_LIBRARY png_static)
             endif()
             add_library(PNG::PNG ALIAS ${PNG_LIBRARY})
-            target_include_directories(SDL3_image PRIVATE external/libpng)
+            target_include_directories(${sdl3_image_target_name} PRIVATE external/libpng)
             list(APPEND INSTALL_EXTRA_TARGETS ${PNG_LIBRARY})
             set_target_properties(${PNG_LIBRARY} PROPERTIES EXPORT_NAME external_libpng)
             add_library(SDL3_image::external_libpng ALIAS ${PNG_LIBRARY})
@@ -543,41 +544,41 @@ if(SDL3IMAGE_PNG)
             endif()
         endif()
         if(SDL3IMAGE_PNG_SHARED)
-            target_include_directories(SDL3_image PRIVATE
+            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 PRIVATE "LOAD_PNG_DYNAMIC=\"${dynamic_png}\"")
+            target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_PNG_DYNAMIC=\"${dynamic_png}\"")
             if(SDL3IMAGE_PNG_VENDORED)
-                add_dependencies(SDL3_image PNG::PNG)
+                add_dependencies(${sdl3_image_target_name} PNG::PNG)
             endif()
         else()
-            target_link_libraries(SDL3_image PRIVATE PNG::PNG)
+            target_link_libraries(${sdl3_image_target_name} PRIVATE PNG::PNG)
         endif()
     endif()
 endif()
 
 if(SDL3IMAGE_PNM)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_PNM)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_PNM)
 endif()
 
 if(SDL3IMAGE_QOI)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_QOI)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_QOI)
 endif()
 
 if(SDL3IMAGE_SVG)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_SVG)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_SVG)
 endif()
 
 if(SDL3IMAGE_TGA)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_TGA)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TGA)
 endif()
 
 if(SDL3IMAGE_TIF)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_TIF)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TIF)
     if(SDL3IMAGE_TIF_VENDORED)
         message(STATUS "${PROJECT_NAME}: Using vendored libtiff")
         # jpeg variable is used by vendored libtiff
@@ -618,31 +619,31 @@ if(SDL3IMAGE_TIF)
         endif()
     endif()
     if(SDL3IMAGE_TIF_SHARED)
-        target_include_directories(SDL3_image PRIVATE
+        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 PRIVATE "LOAD_TIF_DYNAMIC=\"${dynamic_tif}\"")
+        target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${dynamic_tif}\"")
         if(SDL3IMAGE_TIF_VENDORED)
-            add_dependencies(SDL3_image TIFF::TIFF)
+            add_dependencies(${sdl3_image_target_name} TIFF::TIFF)
         endif()
     else()
-        target_link_libraries(SDL3_image PRIVATE TIFF::TIFF)
+        target_link_libraries(${sdl3_image_target_name} PRIVATE TIFF::TIFF)
     endif()
 endif()
 
 if(SDL3IMAGE_WEBP)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_WEBP)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_WEBP)
     # missing cpufeatures
     if(SDL3IMAGE_WEBP_VENDORED)
         message(STATUS "${PROJECT_NAME}: Using vendored libwebp")
         sdl_check_project_in_subfolder(external/libwebp libwebp SDL3IMAGE_VENDORED)
         set(BUILD_SHARED_LIBS ${SDL3IMAGE_WEBP_SHARED})
         add_subdirectory(external/libwebp EXCLUDE_FROM_ALL)
-        target_include_directories(SDL3_image PRIVATE external/libwebp/src)
+        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)
@@ -656,7 +657,7 @@ if(SDL3IMAGE_WEBP)
         endif()
     endif()
     if(SDL3IMAGE_WEBP_SHARED)
-        target_include_directories(SDL3_image PRIVATE
+        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>
@@ -666,28 +667,28 @@ if(SDL3IMAGE_WEBP)
         )
         target_get_dynamic_library(dynamic_webpdemux WebP::webpdemux)
         message(STATUS "Dynamic libwebpdemux: ${dynamic_webpdemux}")
-        target_compile_definitions(SDL3_image PRIVATE "LOAD_WEBPDEMUX_DYNAMIC=\"${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 PRIVATE "LOAD_WEBP_DYNAMIC=\"${dynamic_webp}\"")
+        target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBP_DYNAMIC=\"${dynamic_webp}\"")
         if(SDL3IMAGE_WEBP_VENDORED)
-            add_dependencies(SDL3_image WebP::webp WebP::webpdemux)
+            add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
         endif()
     else()
-        target_link_libraries(SDL3_image PRIVATE WebP::webp WebP::webpdemux)
+        target_link_libraries(${sdl3_image_target_name} PRIVATE WebP::webp WebP::webpdemux)
     endif()
 endif()
 
 if(SDL3IMAGE_XCF)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_XCF)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XCF)
 endif()
 
 if(SDL3IMAGE_XPM)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_XPM)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XPM)
 endif()
 
 if(SDL3IMAGE_XV)
-    target_compile_definitions(SDL3_image PRIVATE LOAD_XV)
+    target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XV)
 endif()
 
 # Restore BUILD_SHARED_LIBS
@@ -695,7 +696,7 @@ set(BUILD_SHARED_LIBS ${SDL3IMAGE_BUILD_SHARED_LIBS})
 
 if(SDL3IMAGE_INSTALL)
     install(
-        TARGETS SDL3_image
+        TARGETS ${sdl3_image_target_name}
         EXPORT SDL3ImageExports
         ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
         LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
@@ -748,7 +749,7 @@ if(SDL3IMAGE_INSTALL)
         COMPONENT devel
     )
     install(EXPORT SDL3ImageExports
-        FILE SDL3_image-${sdl3_image_install_name_infix}-targets.cmake
+        FILE ${sdl3_image_target_name}-targets.cmake
         NAMESPACE SDL3_image::
         DESTINATION "${SDL3IMAGE_INSTALL_CMAKEDIR}"
         COMPONENT devel
@@ -779,7 +780,7 @@ if(SDL3IMAGE_SAMPLES)
     add_executable(showimage showimage.c)
 
     foreach(prog showanim showimage)
-        target_link_libraries(${prog} PRIVATE SDL3_image::${sdl3_image_export_name})
+        target_link_libraries(${prog} PRIVATE SDL3_image::${sdl3_image_target_name})
         target_link_libraries(${prog} PRIVATE ${sdl3_target_name})
 
         if(SDL3IMAGE_SAMPLES_INSTALL)
diff --git a/cmake/SDL3_imageConfig.cmake.in b/cmake/SDL3_imageConfig.cmake.in
index e4833dba..95012e97 100644
--- a/cmake/SDL3_imageConfig.cmake.in
+++ b/cmake/SDL3_imageConfig.cmake.in
@@ -88,3 +88,22 @@ if(NOT SDL3IMAGE_VENDORED)
     set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
     unset(_sdl_cmake_module_path)
 endif()
+
+function(_sdl_create_target_alias_compat NEW_TARGET TARGET)
+    if(CMAKE_VERSION VERSION_LESS "3.18")
+        # Aliasing local targets is not supported on CMake < 3.18, so make it global.
+        add_library(${NEW_TARGET} INTERFACE IMPORTED)
+        set_target_properties(${NEW_TARGET} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET}")
+    else()
+        add_library(${NEW_TARGET} ALIAS ${TARGET})
+    endif()
+endfunction()
+
+# Make sure SDL3_image::SDL3_image always exists
+if(NOT TARGET SDL3_image::SDL3_image)
+    if(TARGET SDL3_image::SDL3_image-shared)
+        _sdl_create_target_alias_compat(SDL3_image::SDL3_image SDL3_image::SDL3_image-shared)
+    else()
+        _sdl_create_target_alias_compat(SDL3_image::SDL3_image SDL3_image::SDL3_image-static)
+    endif()
+endif()
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index fc54a698..d6b690af 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -8,8 +8,8 @@ option(SDL3IMAGE_TESTS_INSTALL "Install unit tests?" OFF)
 
 if(SDL3IMAGE_TESTS_LINK_SHARED)
     set(sdl_name_component SDL3)
-    set(sdl_target_name SDL3::SDL3)
-    set(sdlimage_target_name SDL3_image::SDL3_image)
+    set(sdl_target_name SDL3::SDL3-shared)
+    set(sdlimage_target_name SDL3_image::SDL3_image-shared)
 else()
     set(sdl_name_component SDL3-static)
     set(sdl_target_name SDL3::SDL3-static)
@@ -65,8 +65,8 @@ set(TESTS_ENVIRONMENT
     "SDL_VIDEO_DRIVER=dummy"
 )
 
-foreach(prog ${ALL_TESTS})
-    target_compile_definitions(${prog} PRIVATE $<TARGET_PROPERTY:SDL3_image,COMPILE_DEFINITIONS>)
+foreach(prog IN LISTS ALL_TESTS)
+    target_compile_definitions(${prog} PRIVATE $<TARGET_PROPERTY:${sdlimage_target_name},COMPILE_DEFINITIONS>)
     target_link_libraries(${prog} PRIVATE ${sdlimage_target_name})
     target_link_libraries(${prog} PRIVATE SDL3::SDL3_test ${sdl_target_name})
     if(TARGET sdl3image_build_options)