SDL_ttf: cmake: version symbols using version script

From 0e30fc507edc80d75c0527f6b324e2c24333e013 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 5 Jun 2023 03:45:33 +0200
Subject: [PATCH] cmake: version symbols using version script

---
 Android.mk                      |  2 +
 CMakeLists.txt                  |  2 +
 SDL_ttf.sym                     | 92 +++++++++++++++++++++++++++++++++
 cmake/PrivateSdlFunctions.cmake | 11 ++++
 4 files changed, 107 insertions(+)
 create mode 100644 SDL_ttf.sym

diff --git a/Android.mk b/Android.mk
index 09a27894..82642817 100644
--- a/Android.mk
+++ b/Android.mk
@@ -29,6 +29,8 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
 
 LOCAL_CFLAGS += -O2
 
+LOCAL_LDFLAGS := -Wl,--no-undefined -Wl,--version-script=$(LOCAL_PATH)/SDL_ttf.sym
+
 ifneq ($(FREETYPE_LIBRARY_PATH),)
     LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(FREETYPE_LIBRARY_PATH)/include
     LOCAL_STATIC_LIBRARIES += freetype
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 38f130da..77f29ae9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -175,6 +175,8 @@ if(SDL3TTF_BUILD_SHARED_LIBS)
     sdl_target_link_options_no_undefined(${sdl3_ttf_target_name})
 endif()
 
+sdl_target_link_option_version_file(${sdl3_ttf_target_name} "${CMAKE_CURRENT_SOURCE_DIR}/SDL_ttf.sym")
+
 if(SDL3TTF_BUILD_SHARED_LIBS)
     # Make sure static library dependencies are built with -fPIC when building a shared SDL3_ttf
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
diff --git a/SDL_ttf.sym b/SDL_ttf.sym
new file mode 100644
index 00000000..91f74aa4
--- /dev/null
+++ b/SDL_ttf.sym
@@ -0,0 +1,92 @@
+SDL3_mixer_0.0.0 {
+  global:
+    TTF_ByteSwappedUNICODE;
+    TTF_CloseFont;
+    TTF_FontAscent;
+    TTF_FontDescent;
+    TTF_FontFaceFamilyName;
+    TTF_FontFaceIsFixedWidth;
+    TTF_FontFaceStyleName;
+    TTF_FontFaces;
+    TTF_FontHeight;
+    TTF_FontLineSkip;
+    TTF_GetFontHinting;
+    TTF_GetFontKerning;
+    TTF_GetFontKerningSize;
+    TTF_GetFontKerningSizeGlyphs;
+    TTF_GetFontKerningSizeGlyphs32;
+    TTF_GetFontOutline;
+    TTF_GetFontSDF;
+    TTF_GetFontStyle;
+    TTF_GetFontWrappedAlign;
+    TTF_GetFreeTypeVersion;
+    TTF_GetHarfBuzzVersion;
+    TTF_GlyphIsProvided;
+    TTF_GlyphIsProvided32;
+    TTF_GlyphMetrics;
+    TTF_GlyphMetrics32;
+    TTF_Init;
+    TTF_IsFontScalable;
+    TTF_Linked_Version;
+    TTF_MeasureText;
+    TTF_MeasureUNICODE;
+    TTF_MeasureUTF8;
+    TTF_OpenFont;
+    TTF_OpenFontDPI;
+    TTF_OpenFontDPIRW;
+    TTF_OpenFontIndex;
+    TTF_OpenFontIndexDPI;
+    TTF_OpenFontIndexDPIRW;
+    TTF_OpenFontIndexRW;
+    TTF_OpenFontRW;
+    TTF_Quit;
+    TTF_RenderGlyph32_Blended;
+    TTF_RenderGlyph32_LCD;
+    TTF_RenderGlyph32_Shaded;
+    TTF_RenderGlyph32_Solid;
+    TTF_RenderGlyph_Blended;
+    TTF_RenderGlyph_LCD;
+    TTF_RenderGlyph_Shaded;
+    TTF_RenderGlyph_Solid;
+    TTF_RenderText_Blended;
+    TTF_RenderText_Blended_Wrapped;
+    TTF_RenderText_LCD;
+    TTF_RenderText_LCD_Wrapped;
+    TTF_RenderText_Shaded;
+    TTF_RenderText_Shaded_Wrapped;
+    TTF_RenderText_Solid;
+    TTF_RenderText_Solid_Wrapped;
+    TTF_RenderUNICODE_Blended;
+    TTF_RenderUNICODE_Blended_Wrapped;
+    TTF_RenderUNICODE_LCD;
+    TTF_RenderUNICODE_LCD_Wrapped;
+    TTF_RenderUNICODE_Shaded;
+    TTF_RenderUNICODE_Shaded_Wrapped;
+    TTF_RenderUNICODE_Solid;
+    TTF_RenderUNICODE_Solid_Wrapped;
+    TTF_RenderUTF8_Blended;
+    TTF_RenderUTF8_Blended_Wrapped;
+    TTF_RenderUTF8_LCD;
+    TTF_RenderUTF8_LCD_Wrapped;
+    TTF_RenderUTF8_Shaded;
+    TTF_RenderUTF8_Shaded_Wrapped;
+    TTF_RenderUTF8_Solid;
+    TTF_RenderUTF8_Solid_Wrapped;
+    TTF_SetDirection;
+    TTF_SetFontDirection;
+    TTF_SetFontHinting;
+    TTF_SetFontKerning;
+    TTF_SetFontOutline;
+    TTF_SetFontSDF;
+    TTF_SetFontScriptName;
+    TTF_SetFontSize;
+    TTF_SetFontSizeDPI;
+    TTF_SetFontStyle;
+    TTF_SetFontWrappedAlign;
+    TTF_SetScript;
+    TTF_SizeText;
+    TTF_SizeUNICODE;
+    TTF_SizeUTF8;
+    TTF_WasInit;
+  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()