SDL_image: cmake: allow combination of static SDL3_image with static SDL3

From 192ffe3c20ca8ee13effbe72d923e7f20dc47773 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sun, 18 Jun 2023 14:56:48 +0200
Subject: [PATCH] cmake: allow combination of static SDL3_image with static
 SDL3

---
 CMakeLists.txt            | 15 +++++++++++----
 cmake/test/CMakeLists.txt |  6 +++---
 test/CMakeLists.txt       | 24 ++++++++++++------------
 test/main.c               |  8 --------
 4 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index de413cf9..c7aa0a11 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -158,16 +158,20 @@ endif()
 # Save BUILD_SHARED_LIBS variable
 set(SDL3IMAGE_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 
+set(sdl_required_components Headers)
+
 if(SDL3IMAGE_BUILD_SHARED_LIBS)
     set(sdl3_image_target_name SDL3_image-shared)
     set(sdl3_target_name SDL3::SDL3-shared)
+
+    list(APPEND sdl_required_components SDL3-shared)
 else()
     set(sdl3_image_target_name SDL3_image-static)
-    set(sdl3_target_name SDL3::SDL3-static)
+    set(sdl3_target_name SDL3::SDL3)
 endif()
 
-if(NOT TARGET ${sdl3_target_name})
-    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED)
+if(NOT TARGET SDL3::Headers)
+    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS ${sdl_required_components})
 endif()
 
 # Set PROJECT_VERSION of subprojects to "" if it's project call does not set VERSION
@@ -226,7 +230,10 @@ target_compile_definitions(${sdl3_image_target_name} PRIVATE
     SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
     SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
 )
-target_link_libraries(${sdl3_image_target_name} PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
+target_link_libraries(${sdl3_image_target_name} PUBLIC SDL3::Headers)
+if(SDL3IMAGE_BUILD_SHARED_LIBS)
+    target_link_libraries(${sdl3_image_target_name} PUBLIC SDL3::SDL3-shared)
+endif()
 sdl_add_warning_options(${sdl3_image_target_name} WARNING_AS_ERROR ${SDL3IMAGE_WERROR})
 if(WIN32 AND SDL3IMAGE_BUILD_SHARED_LIBS)
     target_sources(${sdl3_image_target_name} PRIVATE
diff --git a/cmake/test/CMakeLists.txt b/cmake/test/CMakeLists.txt
index 853b13a2..62104192 100644
--- a/cmake/test/CMakeLists.txt
+++ b/cmake/test/CMakeLists.txt
@@ -20,16 +20,16 @@ if(TEST_SHARED)
     find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     find_package(SDL3_image REQUIRED CONFIG)
     add_executable(main_shared main.c)
-    target_link_libraries(main_shared PRIVATE SDL3::SDL3 SDL3_image::SDL3_image)
+    target_link_libraries(main_shared PRIVATE SDL3_image::SDL3_image SDL3::SDL3)
 endif()
 
 if(TEST_STATIC)
-    find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3-static)
+    find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     # some static vendored libraries use c++ (enable CXX after `find_package` might show a warning)
     enable_language(CXX)
     find_package(SDL3_image REQUIRED CONFIG)
     add_executable(main_static main.c)
-    target_link_libraries(main_static PRIVATE SDL3::SDL3-static SDL3_image::SDL3_image-static)
+    target_link_libraries(main_static PRIVATE SDL3_image::SDL3_image-static SDL3::SDL3)
 endif()
 
 feature_summary(WHAT ALL)
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index d85179fb..29bcc8ac 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -3,23 +3,21 @@ project(SDL3_image_tests)
 
 enable_testing()
 
-option(SDL3IMAGE_TESTS_LINK_SHARED "link tests to shared SDL library" ON)
+option(SDL3IMAGE_TESTS_LINK_SHARED "link tests to shared SDL_image library" ${BUILD_SHARED_LIBS})
 option(SDL3IMAGE_TESTS_INSTALL "Install unit tests?" OFF)
 
+set(SDL_REQUIRED_VERSION 3.0.0)
+
 if(SDL3IMAGE_TESTS_LINK_SHARED)
-    set(sdl_name_component SDL3)
-    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)
     set(sdlimage_target_name SDL3_image::SDL3_image-static)
 endif()
 
-if(NOT TARGET ${sdl_target_name})
-    find_package(SDL3 3.0.0 REQUIRED)
-    if(NOT TARGET ${sdl_target_name})
-        message(FATAL_ERROR "find_package(SDL3) did not create ${sdl_target_name}.")
+if(NOT TARGET SDL3::SDL3 OR NOT TARGET SDL3::SDL3_test)
+    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS SDL3 SDL3_test)
+    if(NOT TARGET SDL3::SDL3 OR NOT TARGET SDL3::SDL3_test)
+        message(FATAL_ERROR "find_package(SDL3) did not create SDL3::SDL3.")
     endif()
 endif()
 if(NOT TARGET ${sdlimage_target_name})
@@ -66,10 +64,12 @@ set(TESTS_ENVIRONMENT
 )
 
 foreach(prog IN LISTS ALL_TESTS)
-    target_compile_definitions(${prog} PRIVATE $<TARGET_PROPERTY:${sdlimage_target_name},COMPILE_DEFINITIONS>)
+    target_compile_definitions(${prog} PRIVATE
+        "SDL_IMAGE_SAVE_JPG=$<BOOL:${SDL3IMAGE_JPG_SAVE}>"
+        "SDL_IMAGE_SAVE_PNG=$<BOOL:${SDL3IMAGE_PNG_SAVE}>"
+    )
     sdl_add_warning_options(${prog} WARNING_AS_ERROR ${SDL3IMAGE_WERROR})
-    target_link_libraries(${prog} PRIVATE ${sdlimage_target_name})
-    target_link_libraries(${prog} PRIVATE SDL3::SDL3_test ${sdl_target_name})
+    target_link_libraries(${prog} PRIVATE ${sdlimage_target_name} SDL3::SDL3_test SDL3::SDL3)
     if(TARGET sdl3image_build_options)
         target_link_libraries(${prog} PRIVATE $<BUILD_INTERFACE:sdl3image_build_options>)
     endif()
diff --git a/test/main.c b/test/main.c
index 576a5dd4..07aa93a2 100644
--- a/test/main.c
+++ b/test/main.c
@@ -18,14 +18,6 @@
 
 #include <stdlib.h>
 
-/* We'll have JPG save support by default: see IMG_jpg.c */
-#ifndef SDL_IMAGE_SAVE_JPG
-#define SDL_IMAGE_SAVE_JPG    1
-#endif
-
-
-
-
 #if defined(SDL_FILESYSTEM_OS2) || defined(SDL_FILESYSTEM_WINDOWS)
 static const char pathsep[] = "\\";
 #elif defined(SDL_FILESYSTEM_RISCOS)