SDL_mixer: cmake: version symbols using version script

From 4202aa781dfe2a51248d748c4d9d072248bd2f03 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 5 Jun 2023 03:21:38 +0200
Subject: [PATCH] cmake: version symbols using version script

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

diff --git a/Android.mk b/Android.mk
index 023da93f..133a5481 100644
--- a/Android.mk
+++ b/Android.mk
@@ -83,6 +83,7 @@ LOCAL_SRC_FILES :=                                      \
 
 LOCAL_CFLAGS :=
 LOCAL_LDLIBS :=
+LOCAL_LDFLAGS := -Wl,--no-undefined -Wl,--version-script=$(LOCAL_PATH)/SDL_mixer.sym
 LOCAL_STATIC_LIBRARIES :=
 LOCAL_SHARED_LIBRARIES := SDL3
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7e329e8b..c1b0533b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -323,6 +323,8 @@ if(SDL3MIXER_BUILD_SHARED_LIBS)
     sdl_target_link_options_no_undefined(${sdl3_mixer_target_name})
 endif()
 
+sdl_target_link_option_version_file(${sdl3_mixer_target_name} "${CMAKE_CURRENT_SOURCE_DIR}/SDL_mixer.sym")
+
 if(SDL3MIXER_BUILD_SHARED_LIBS)
     # Make sure static library dependencies are built with -fPIC when building a shared SDL3_mixer
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
diff --git a/SDL_mixer.sym b/SDL_mixer.sym
new file mode 100644
index 00000000..b009cdc5
--- /dev/null
+++ b/SDL_mixer.sym
@@ -0,0 +1,96 @@
+SDL3_mixer_0.0.0 {
+  global:
+    Mix_AllocateChannels;
+    Mix_CloseAudio;
+    Mix_ExpireChannel;
+    Mix_FadeInChannel;
+    Mix_FadeInChannelTimed;
+    Mix_FadeInMusic;
+    Mix_FadeInMusicPos;
+    Mix_FadeOutChannel;
+    Mix_FadeOutGroup;
+    Mix_FadeOutMusic;
+    Mix_FadingChannel;
+    Mix_FadingMusic;
+    Mix_FreeChunk;
+    Mix_FreeMusic;
+    Mix_GetChunk;
+    Mix_GetChunkDecoder;
+    Mix_GetMusicAlbumTag;
+    Mix_GetMusicArtistTag;
+    Mix_GetMusicCopyrightTag;
+    Mix_GetMusicDecoder;
+    Mix_GetMusicHookData;
+    Mix_GetMusicLoopEndTime;
+    Mix_GetMusicLoopLengthTime;
+    Mix_GetMusicLoopStartTime;
+    Mix_GetMusicPosition;
+    Mix_GetMusicTitle;
+    Mix_GetMusicTitleTag;
+    Mix_GetMusicType;
+    Mix_GetMusicVolume;
+    Mix_GetNumChunkDecoders;
+    Mix_GetNumMusicDecoders;
+    Mix_GetNumTracks;
+    Mix_GetSoundFonts;
+    Mix_GetSynchroValue;
+    Mix_GetTimidityCfg;
+    Mix_GroupAvailable;
+    Mix_GroupChannel;
+    Mix_GroupChannels;
+    Mix_GroupCount;
+    Mix_GroupNewer;
+    Mix_GroupOldest;
+    Mix_HaltChannel;
+    Mix_HaltGroup;
+    Mix_HaltMusic;
+    Mix_HasChunkDecoder;
+    Mix_HasMusicDecoder;
+    Mix_Init;
+    Mix_Linked_Version;
+    Mix_LoadMUS;
+    Mix_LoadMUSType_RW;
+    Mix_LoadMUS_RW;
+    Mix_LoadWAV;
+    Mix_LoadWAV_RW;
+    Mix_MasterVolume;
+    Mix_ModMusicJumpToOrder;
+    Mix_MusicDuration;
+    Mix_OpenAudio;
+    Mix_OpenAudioDevice;
+    Mix_Pause;
+    Mix_PauseAudio;
+    Mix_PauseMusic;
+    Mix_Paused;
+    Mix_PausedMusic;
+    Mix_PlayChannel;
+    Mix_PlayChannelTimed;
+    Mix_PlayMusic;
+    Mix_Playing;
+    Mix_PlayingMusic;
+    Mix_QuerySpec;
+    Mix_QuickLoad_RAW;
+    Mix_QuickLoad_WAV;
+    Mix_Quit;
+    Mix_RegisterEffect;
+    Mix_ReserveChannels;
+    Mix_Resume;
+    Mix_ResumeMusic;
+    Mix_RewindMusic;
+    Mix_SetDistance;
+    Mix_SetMusicCMD;
+    Mix_SetMusicPosition;
+    Mix_SetPanning;
+    Mix_SetPosition;
+    Mix_SetReverseStereo;
+    Mix_SetSoundFonts;
+    Mix_SetSynchroValue;
+    Mix_SetTimidityCfg;
+    Mix_StartTrack;
+    Mix_UnregisterAllEffects;
+    Mix_UnregisterEffect;
+    Mix_Volume;
+    Mix_VolumeChunk;
+    Mix_VolumeMusic;
+  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()