sdl2-compat: cmake: port SO and DYLIB versioning of SDL to SDL2-compat

From 1c56af18e7f064a31dd9e6d59f57685b1ba259ee Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Tue, 29 Nov 2022 23:47:03 +0100
Subject: [PATCH] cmake: port SO and DYLIB versioning of SDL to SDL2-compat

---
 CMakeLists.txt | 61 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 46 insertions(+), 15 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f4d8a10..21bb0c0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,9 +3,42 @@
 #        cmake -DSDL3_INCLUDE_DIRS=/opt/SDL3/include [other stuff ....]
 
 cmake_minimum_required(VERSION 3.0.0)
-project(sdl2_compat
-        VERSION 2.90.0
-        LANGUAGES C)
+project(sdl2_compat VERSION 2.90.0 LANGUAGES C)
+
+set(SDL_MAJOR_VERSION ${sdl2_compat_VERSION_MAJOR})
+set(SDL_MINOR_VERSION ${sdl2_compat_VERSION_MINOR})
+set(SDL_MICRO_VERSION ${sdl2_compat_VERSION_PATCH})
+set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
+
+# Calculate libtool-compatible SO version
+set(SDL_SO_VERSION_MAJOR "0")
+if(SDL_MINOR_VERSION MATCHES "[02468]$")
+  # Stable branch, 2.24.1 -> libSDL2-2.0.so.0.2400.1
+  math(EXPR SDL_SO_VERSION_MINOR "${SDL_MINOR_VERSION} * 100")
+  set(SDL_SO_VERSION_MICRO ${SDL_MICRO_VERSION})
+else()
+  # Development branch, 2.23.1 -> libSDL2-2.0.so.0.2301.0
+  math(EXPR SDL_SO_VERSION_MINOR "${SDL_MINOR_VERSION} * 100 + ${SDL_MICRO_VERSION}")
+  set(SDL_SO_VERSION_MICRO 0)
+endif()
+set(SDL_SO_VERSION "${SDL_SO_VERSION_MAJOR}.${SDL_SO_VERSION_MINOR}.${SDL_SO_VERSION_MICRO}")
+
+if(SDL_MINOR_VERSION MATCHES "[02468]$")
+  math(EXPR SDL_DYLIB_COMPAT_VERSION_MAJOR "100 * ${SDL_MINOR_VERSION} + 1")
+  set(SDL_DYLIB_COMPAT_VERSION_MINOR "0")
+  math(EXPR SDL_DYLIB_CURRENT_VERSION_MAJOR "${SDL_DYLIB_COMPAT_VERSION_MAJOR}")
+  set(SDL_DYLIB_CURRENT_VERSION_MINOR "${SDL_MICRO_VERSION}")
+else()
+  math(EXPR SDL_DYLIB_COMPAT_VERSION_MAJOR "100 * ${SDL_MINOR_VERSION} + ${SDL_MICRO_VERSION} + 1")
+  set(SDL_DYLIB_COMPAT_VERSION_MINOR "0")
+  math(EXPR SDL_DYLIB_CURRENT_VERSION_MAJOR "${SDL_DYLIB_COMPAT_VERSION_MAJOR}")
+  set(SDL_DYLIB_CURRENT_VERSION_MINOR "0")
+endif()
+set(SDL_DYLIB_COMPAT_VERSION_MICRO "0")
+set(SDL_DYLIB_CURRENT_VERSION_MICRO "0")
+
+set(SDL_DYLIB_CURRENT_VERSION "${SDL_DYLIB_CURRENT_VERSION_MAJOR}.${SDL_DYLIB_CURRENT_VERSION_MINOR}.${SDL_DYLIB_CURRENT_VERSION_MICRO}")
+set(SDL_DYLIB_COMPAT_VERSION "${SDL_DYLIB_COMPAT_VERSION_MAJOR}.${SDL_DYLIB_COMPAT_VERSION_MINOR}.${SDL_DYLIB_COMPAT_VERSION_MICRO}")
 
 option(SDL2COMPAT_TESTS "Enable to build SDL2 test programs" ON)
 option(SDL2COMPAT_DEVEL "Enable installing SDL2 development headers" ON)
@@ -72,13 +105,13 @@ endif()
 if(GIT_REVISION_STATUS EQUAL 0)
   if(GIT_REVISION MATCHES "^[0-9a-f]+$")
     # Just a truncated sha1, so prefix it with the version number
-    set(SDL_REVISION "SDL-${sdl2_compat_VERSION}-g${GIT_REVISION}")
+    set(SDL_REVISION "SDL-${SDL_VERSION}-g${GIT_REVISION}")
   else()
     # e.g. release-2.24.0-542-g96361fc47
     set(SDL_REVISION "SDL-${GIT_REVISION}")
   endif()
 else()
-  set(SDL_REVISION "SDL-${sdl2_compat_VERSION}-no-vcs")
+  set(SDL_REVISION "SDL-${SDL_VERSION}-no-vcs")
 endif()
 
 configure_file(include/SDL2/SDL_revision.h.cmake include/SDL2/SDL_revision.h @ONLY)
@@ -161,34 +194,32 @@ if(APPLE)
   # !!! FIXME: check OUTPUT_NAME value.
   set_target_properties(SDL2 PROPERTIES COMPILE_DEFINITIONS "_THREAD_SAFE")
   target_link_libraries(SDL2 PRIVATE
-    "-Wl,-compatibility_version,${DYLIB_COMPAT_VERSION}"
-    "-Wl,-current_version,${DYLIB_CURRENT_VERSION}"
+    "-Wl,-compatibility_version,${SDL_DYLIB_COMPAT_VERSION_MICRO}"
+    "-Wl,-current_version,${SDL_DYLIB_CURRENT_VERSION_MICRO}"
     "-Wl,-framework,AppKit"
   )
   set_target_properties(SDL2 PROPERTIES
-      OUTPUT_NAME "SDL2-2.0.0"
+      OUTPUT_NAME "SDL2-2.0"
+      SOVERSION "0"
   )
 elseif(UNIX AND NOT ANDROID)
   # !!! FIXME: check OUTPUT_NAME value
   set_target_properties(SDL2 PROPERTIES
-    VERSION "${PROJECT_VERSION}"
-    SOVERSION "0"
     OUTPUT_NAME "SDL2-2.0"
+    VERSION "${SDL_SO_VERSION}"
+    SOVERSION "${SDL_SO_VERSION_MAJOR}"
   )
 elseif(WIN32)
   set_target_properties(SDL2 PROPERTIES DEFINE_SYMBOL "DLL_EXPORT")
   # avoid DLL having 'lib' prefix with MinGW
   set_target_properties(SDL2 PROPERTIES
-    VERSION "${PROJECT_VERSION}"
-    SOVERSION "0"
     OUTPUT_NAME "SDL2"
     PREFIX ""
   )
 elseif(OS2)
   set_target_properties(SDL2 PROPERTIES
-    VERSION "${PROJECT_VERSION}"
-    SOVERSION "0"
     OUTPUT_NAME "SDL2"
+    VERSION "${SDL_VERSION}"
   )
 else()
   set_target_properties(SDL2 PROPERTIES
@@ -493,7 +524,7 @@ if(SDL2COMPAT_DEVEL)
     INSTALL_DESTINATION "${SDL23COMPAT_INSTALL_CMAKEDIR}"
   )
   write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/SDL2ConfigVersion.cmake"
-    VERSION ${sdl2_compat_VERSION}
+    VERSION ${SDL_VERSION}
     COMPATIBILITY AnyNewerVersion
   )
   install(