SDL: dmg: fix sdl3-config.cmake

From 4defea47e1749633e6bd47185e2c2e6a1c5eabce Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Thu, 3 Aug 2023 07:43:21 +0200
Subject: [PATCH] dmg: fix sdl3-config.cmake

---
 Xcode/SDL/SDL.xcodeproj/project.pbxproj       |  2 +-
 .../resources/CMake/sdl3-config-version.cmake | 26 ++++--
 .../resources/CMake/sdl3-config.cmake         | 82 +++++++++++++++----
 3 files changed, 88 insertions(+), 22 deletions(-)

diff --git a/Xcode/SDL/SDL.xcodeproj/project.pbxproj b/Xcode/SDL/SDL.xcodeproj/project.pbxproj
index affeb7f2bea57..fb7326f011dcf 100644
--- a/Xcode/SDL/SDL.xcodeproj/project.pbxproj
+++ b/Xcode/SDL/SDL.xcodeproj/project.pbxproj
@@ -2633,7 +2633,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "mkdir -p build/dmg-tmp\ncp -a build/SDL3.xcframework build/dmg-tmp/\n\ncp pkg-support/resources/License.txt build/dmg-tmp\ncp pkg-support/resources/ReadMe.txt build/dmg-tmp\n\n# remove the .DS_Store files if any (we may want to provide one in the future for fancy .dmgs)\nfind build/dmg-tmp -name .DS_Store -exec rm -f \"{}\" \\;\n\n# for fancy .dmg\nmkdir -p build/dmg-tmp/.logo\ncp pkg-support/resources/SDL_DS_Store build/dmg-tmp/.DS_Store\ncp pkg-support/sdl_logo.pdf build/dmg-tmp/.logo\n\n# create the dmg\nhdiutil create -ov -fs HFS+ -volname SDL3 -srcfolder build/dmg-tmp build/SDL3.dmg\n\n# clean up\nrm -rf build/dmg-tmp\n";
+			shellScript = "mkdir -p build/dmg-tmp/share/cmake/SDL3\ncp -a build/SDL3.xcframework build/dmg-tmp/\n\ncp pkg-support/resources/License.txt build/dmg-tmp\ncp pkg-support/resources/ReadMe.txt build/dmg-tmp\ncp pkg-support/resources/CMake/sdl3-config.cmake build/dmg-tmp/share/cmake/SDL3\ncp pkg-support/resources/CMake/sdl3-config-version.cmake build/dmg-tmp/share/cmake/SDL3\n\n\nmkdir -p \n\n# remove the .DS_Store files if any (we may want to provide one in the future for fancy .dmgs)\nfind build/dmg-tmp -name .DS_Store -exec rm -f \"{}\" \\;\n\n# for fancy .dmg\nmkdir -p build/dmg-tmp/.logo\ncp pkg-support/resources/SDL_DS_Store build/dmg-tmp/.DS_Store\ncp pkg-support/sdl_logo.pdf build/dmg-tmp/.logo\n\n# create the dmg\nhdiutil create -ov -fs HFS+ -volname SDL3 -srcfolder build/dmg-tmp build/SDL3.dmg\n\n# clean up\nrm -rf build/dmg-tmp\n";
 		};
 		F3B38CF0296F63D1005DA6D3 /* ShellScript */ = {
 			isa = PBXShellScriptBuildPhase;
diff --git a/Xcode/SDL/pkg-support/resources/CMake/sdl3-config-version.cmake b/Xcode/SDL/pkg-support/resources/CMake/sdl3-config-version.cmake
index 6dbcf129888f6..fbc9a3ceee5ef 100644
--- a/Xcode/SDL/pkg-support/resources/CMake/sdl3-config-version.cmake
+++ b/Xcode/SDL/pkg-support/resources/CMake/sdl3-config-version.cmake
@@ -1,14 +1,21 @@
 # based on the files generated by CMake's write_basic_package_version_file
 
 # SDL CMake version configuration file:
-# This file is meant to be placed in Resources/CMake of a SDL3 framework
+# This file is meant to be placed in share/cmake/SDL3, next to SDL3.xcframework
 
-if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/../../Headers/SDL_version.h")
-    message(AUTHOR_WARNING "Could not find SDL_version.h. This script is meant to be placed in the Resources/CMake directory of SDL3.framework")
+cmake_minimum_required(VERSION 3.12)
+
+get_filename_component(_sdl3_xcframework_parent_path "../.." ABSOLUTE)
+
+set(_sdl3_xcframework "${_sdl3_xcframework_parent_path}/SDL3.xcframework")
+set(_sdl3_version_h "${_sdl3_xcframework}/macos-arm64_x86_64/SDL3.framework/Headers/SDL_version.h")
+
+if(NOT EXISTS "${_sdl3_version_h}")
+    message(AUTHOR_WARNING "Cannot not find SDL_version.h. This script is meant to be placed in share/cmake/SDL3, next to SDL3.xcframework")
     return()
 endif()
 
-file(READ "${CMAKE_CURRENT_LIST_DIR}/../../Headers/SDL_version.h" _sdl_version_h)
+file(READ "${_sdl3_version_h}" _sdl_version_h)
 string(REGEX MATCH "#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)" _sdl_major_re "${_sdl_version_h}")
 set(_sdl_major "${CMAKE_MATCH_1}")
 string(REGEX MATCH "#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)" _sdl_minor_re "${_sdl_version_h}")
@@ -22,6 +29,9 @@ else()
     return()
 endif()
 
+unset(_sdl3_xcframework)
+unset(_sdl3_version_h)
+
 if(PACKAGE_FIND_VERSION_RANGE)
     # Package version must be in the requested version range
     if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN)
@@ -42,7 +52,11 @@ else()
     endif()
 endif()
 
-# if the using project doesn't have CMAKE_SIZEOF_VOID_P set, fail.
-if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "")
+# The SDL3.xcframework only contains 64-bit archives
+if(NOT "${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+    set(PACKAGE_VERSION_UNSUITABLE TRUE)
+endif()
+
+if(NOT CMAKE_SYSTEM_NAME MATCHES "^(Darwin|iOS|tvOS)$")
     set(PACKAGE_VERSION_UNSUITABLE TRUE)
 endif()
diff --git a/Xcode/SDL/pkg-support/resources/CMake/sdl3-config.cmake b/Xcode/SDL/pkg-support/resources/CMake/sdl3-config.cmake
index 2fd2d7c3e20e7..1e5151bd1b300 100644
--- a/Xcode/SDL/pkg-support/resources/CMake/sdl3-config.cmake
+++ b/Xcode/SDL/pkg-support/resources/CMake/sdl3-config.cmake
@@ -1,5 +1,5 @@
 # SDL CMake configuration file:
-# This file is meant to be placed in Resources/CMake of a SDL3 framework
+# This file is meant to be placed in share/cmake/SDL3, next to SDL3.xcframework
 
 # INTERFACE_LINK_OPTIONS needs CMake 3.12
 cmake_minimum_required(VERSION 3.12)
@@ -31,15 +31,50 @@ endmacro()
 
 set(SDL3_FOUND TRUE)
 
-# Compute the installation prefix relative to this file.
-get_filename_component(_sdl3_framework_path "${CMAKE_CURRENT_LIST_FILE}" PATH)      # /SDL3.framework/Resources/CMake/
-get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" PATH)         # /SDL3.framework/Resources/
-get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" PATH)         # /SDL3.framework/
-get_filename_component(_sdl3_framework_parent_path "${_sdl3_framework_path}" PATH)  # /
+macro(_check_target_is_simulator)
+    include(CheckCSourceCompiles)
+    check_c_source_compiles([===[
+    #include <TargetConditionals.h>
+    #if defined(TARGET_OS_SIMULATOR)
+    int target_is_simulator;
+    #endif
+    int main(int argc, char *argv[]) { return target_is_simulator; }
+    ]===] SDL_TARGET_IS_SIMULATOR)
+endmacro()
+
+if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
+    _check_target_is_simulator()
+    if(SDL_TARGET_IS_SIMULATOR)
+        set(_xcfw_target_subdir "ios-arm64_x86_64-simulator")
+    else()
+        set(_xcfw_target_subdir "ios-arm64")
+    endif()
+elseif(CMAKE_SYSTEM_NAME STREQUAL "tvOS")
+    _check_target_is_simulator()
+    if(SDL_TARGET_IS_SIMULATOR)
+        set(_xcfw_target_subdir "tvos-arm64_x86_64-simulator")
+    else()
+        set(_xcfw_target_subdir "tvos-arm64")
+    endif()
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+    set(_xcfw_target_subdir "macos-arm64_x86_64")
+else()
+    message(WARNING "Unsupported Apple platform (${CMAKE_SYSTEM_NAME}) and broken sdl3-config-version.cmake")
+    set(SDL3_FOUND FALSE)
+    return()
+endif()
 
+# Compute the installation prefix relative to this file.
+get_filename_component(_sdl3_xcframework_parent_path "${CMAKE_CURRENT_LIST_DIR}" REALPATH)              # /share/cmake/SDL3/
+get_filename_component(_sdl3_xcframework_parent_path "${_sdl3_xcframework_parent_path}" REALPATH)       # /share/cmake/SDL3/
+get_filename_component(_sdl3_xcframework_parent_path "${_sdl3_xcframework_parent_path}" PATH)           # /share/cmake
+get_filename_component(_sdl3_xcframework_parent_path "${_sdl3_xcframework_parent_path}" PATH)           # /share
+get_filename_component(_sdl3_xcframework_parent_path "${_sdl3_xcframework_parent_path}" PATH)           # /
+set_and_check(_sdl3_xcframework_path "${_sdl3_xcframework_parent_path}/SDL3.xcframework")               # /SDL3.xcframework
+set_and_check(_sdl3_framework_parent_path "${_sdl3_xcframework_path}/${_xcfw_target_subdir}")           # /SDL3.xcframework/macos-arm64_x86_64
+set_and_check(_sdl3_framework_path "${_sdl3_framework_parent_path}/SDL3.framework")                     # /SDL3.xcframework/macos-arm64_x86_64/SDL3.framework
 set_and_check(_sdl3_include_dirs "${_sdl3_framework_path}/Headers")
 
-set(SDL3_LIBRARIES "SDL3::SDL3")
 
 # All targets are created, even when some might not be requested though COMPONENTS.
 # This is done for compatibility with CMake generated SDL3-target.cmake files.
@@ -53,16 +88,26 @@ if(NOT TARGET SDL3::Headers)
     )
 endif()
 set(SDL3_Headers_FOUND TRUE)
-unset(_sdl3_include_dirs)
 
 if(NOT TARGET SDL3::SDL3-shared)
     add_library(SDL3::SDL3-shared SHARED IMPORTED)
+    if(CMAKE_VERSION GREATER_EQUAL "3.28")
+        set_target_properties(SDL3::SDL3-shared
+            PROPERTIES
+                FRAMEWORK "TRUE"
+                IMPORTED_LOCATION "${_sdl3_xcframework_path}"
+                INTERFACE_LINK_LIBRARIES "SDL3::Headers"
+        )
+    else()
+        set_target_properties(SDL3::SDL3-shared
+            PROPERTIES
+                FRAMEWORK "TRUE"
+                IMPORTED_LOCATION "${_sdl3_framework_path}/SDL3"
+                INTERFACE_LINK_LIBRARIES "SDL3::Headers"
+        )
+    endif()
     set_target_properties(SDL3::SDL3-shared
         PROPERTIES
-            FRAMEWORK "TRUE"
-            INTERFACE_LINK_LIBRARIES "SDL3::Headers"
-            IMPORTED_LOCATION "${_sdl3_framework_path}/SDL3"
-            IMPORTED_SONAME "${_sdl3_framework_path}/SDL3"
             COMPATIBLE_INTERFACE_BOOL "SDL3_SHARED"
             INTERFACE_SDL3_SHARED "ON"
             COMPATIBLE_INTERFACE_STRING "SDL_VERSION"
@@ -75,10 +120,13 @@ set(SDL3_SDL3-static FALSE)
 
 set(SDL3_SDL3_test FALSE)
 
+unset(_sdl3_xcframework_parent_path)
+unset(_sdl3_xcframework_path)
 unset(_sdl3_framework_parent_path)
 unset(_sdl3_framework_path)
+unset(_sdl3_include_dirs)
 
-if(SDL3_SDL3-shared_FOUND OR SDL3_SDL3-static_FOUND)
+if(SDL3_SDL3-shared_FOUND)
     set(SDL3_SDL3_FOUND TRUE)
 endif()
 
@@ -96,9 +144,13 @@ endfunction()
 if(NOT TARGET SDL3::SDL3)
     if(TARGET SDL3::SDL3-shared)
         _sdl_create_target_alias_compat(SDL3::SDL3 SDL3::SDL3-shared)
-    else()
-        _sdl_create_target_alias_compat(SDL3::SDL3 SDL3::SDL3-static)
     endif()
 endif()
 
 check_required_components(SDL3)
+
+set(SDL3_LIBRARIES SDL3::SDL3)
+set(SDL3_STATIC_LIBRARIES SDL3::SDL3-static)
+set(SDL3_STATIC_PRIVATE_LIBS)
+
+set(SDL3TEST_LIBRARY SDL3::SDL3_test)