SDL_image: cmake: version symbols using version script

From d33ddcb9d658f8c4d29477c54701c2b6155eb12b Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 5 Jun 2023 01:44:14 +0200
Subject: [PATCH] cmake: version symbols using version script

---
 Android.mk                      |  1 +
 CMakeLists.txt                  |  2 ++
 SDL_image.sym                   | 63 +++++++++++++++++++++++++++++++++
 cmake/PrivateSdlFunctions.cmake | 11 ++++++
 4 files changed, 77 insertions(+)
 create mode 100644 SDL_image.sym

diff --git a/Android.mk b/Android.mk
index d93d282b..6b2c8ace 100644
--- a/Android.mk
+++ b/Android.mk
@@ -98,6 +98,7 @@ LOCAL_CFLAGS := -DLOAD_BMP -DLOAD_GIF -DLOAD_LBM -DLOAD_PCX -DLOAD_PNM \
                 -DLOAD_SVG -DLOAD_TGA -DLOAD_XCF -DLOAD_XPM -DLOAD_XV  \
                 -DLOAD_QOI
 LOCAL_LDLIBS :=
+LOCAL_LDFLAGS := -Wl,--no-undefined -Wl,--version-script=$(LOCAL_PATH)/SDL_image.sym
 LOCAL_STATIC_LIBRARIES :=
 LOCAL_SHARED_LIBRARIES := SDL3
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c0000ea0..8eb723e9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -250,6 +250,8 @@ set_target_properties(SDL3_image PROPERTIES
     C_VISIBILITY_PRESET "hidden"
 )
 
+sdl_target_link_option_version_file(SDL3_image "${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
diff --git a/SDL_image.sym b/SDL_image.sym
new file mode 100644
index 00000000..67746df8
--- /dev/null
+++ b/SDL_image.sym
@@ -0,0 +1,63 @@
+SDL3_image_0.0.0 {
+  global:
+    IMG_FreeAnimation;
+    IMG_Init;
+    IMG_Linked_Version;
+    IMG_Load;
+    IMG_LoadAVIF_RW;
+    IMG_LoadAnimation;
+    IMG_LoadAnimationTyped_RW;
+    IMG_LoadAnimation_RW;
+    IMG_LoadBMP_RW;
+    IMG_LoadCUR_RW;
+    IMG_LoadGIFAnimation_RW;
+    IMG_LoadGIF_RW;
+    IMG_LoadICO_RW;
+    IMG_LoadJPG_RW;
+    IMG_LoadJXL_RW;
+    IMG_LoadLBM_RW;
+    IMG_LoadPCX_RW;
+    IMG_LoadPNG_RW;
+    IMG_LoadPNM_RW;
+    IMG_LoadQOI_RW;
+    IMG_LoadSVG_RW;
+    IMG_LoadSizedSVG_RW;
+    IMG_LoadTGA_RW;
+    IMG_LoadTIF_RW;
+    IMG_LoadTexture;
+    IMG_LoadTextureTyped_RW;
+    IMG_LoadTexture_RW;
+    IMG_LoadTyped_RW;
+    IMG_LoadWEBPAnimation_RW;
+    IMG_LoadWEBP_RW;
+    IMG_LoadXCF_RW;
+    IMG_LoadXPM_RW;
+    IMG_LoadXV_RW;
+    IMG_Load_RW;
+    IMG_Quit;
+    IMG_ReadXPMFromArray;
+    IMG_ReadXPMFromArrayToRGB888;
+    IMG_SaveJPG;
+    IMG_SaveJPG_RW;
+    IMG_SavePNG;
+    IMG_SavePNG_RW;
+    IMG_isAVIF;
+    IMG_isBMP;
+    IMG_isCUR;
+    IMG_isGIF;
+    IMG_isICO;
+    IMG_isJPG;
+    IMG_isJXL;
+    IMG_isLBM;
+    IMG_isPCX;
+    IMG_isPNG;
+    IMG_isPNM;
+    IMG_isQOI;
+    IMG_isSVG;
+    IMG_isTIF;
+    IMG_isWEBP;
+    IMG_isXCF;
+    IMG_isXPM;
+    IMG_isXV;
+  local: *;
+};
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 0f11b245..034f2cef 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -226,3 +226,14 @@ function(sdl_target_link_options_no_undefined TARGET)
         endif()
     endif()
 endfunction()
+
+function(sdl_target_link_option_version_file TARGET VERSION_SCRIPT)
+    sdl_check_linker_flag("-Wl,--version-script=${VERSION_SCRIPT}" HAVE_WL_VERSION_SCRIPT)
+    if(HAVE_WL_VERSION_SCRIPT)
+        target_link_options(${TARGET} PRIVATE "-Wl,--version-script=${VERSION_SCRIPT}")
+    else()
+        if(LINUX OR ANDROID)
+            message(FATAL_ERROR "Linker does not support '-Wl,--version-script=xxx.sym'. This is required on the current host platform.")
+        endif()
+    endif()
+endfunction()