SDL_mixer: CMake updates for SDL3

From 655395f0b860cb24c7314272e7ffd2684f726efe Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sat, 7 Jan 2023 13:49:27 +0100
Subject: [PATCH] CMake updates for SDL3

---
 .editorconfig                                 |   9 +
 .github/workflows/main.yml                    |  45 ++--
 .gitmodules                                   |   3 +
 CMakeLists.txt                                | 227 +++++++++---------
 SDL3_mixer.pc.in                              |  13 -
 .../pkg-support/cmake/sdl2_mixer-config.cmake |  76 ------
 ....cmake => sdl3_mixer-config-version.cmake} |  10 +-
 .../pkg-support/cmake/sdl3_mixer-config.cmake |  78 ++++++
 .../resources/CMake/sdl2_mixer-config.cmake   |  64 -----
 ....cmake => sdl3_mixer-config-version.cmake} |   6 +-
 .../resources/CMake/sdl3_mixer-config.cmake   |  66 +++++
 build-scripts/android-prefab.sh               |  42 ++--
 cmake/Findgme.cmake                           |  36 +++
 cmake/Findlibxmp-lite.cmake                   |   1 -
 cmake/PrivateSdlFunctions.cmake               |  63 ++---
 .../SDL3_mixerConfig.cmake.in                 |   2 +
 cmake/sdl3-mixer.pc.in                        |  13 +
 external/libgme                               |   1 +
 .../cmake/sdl2_mixer-config-version.cmake     |  19 --
 .../pkg-support/cmake/sdl2_mixer-config.cmake |  22 --
 .../cmake/sdl3_mixer-config-version.cmake     |  19 ++
 .../pkg-support/cmake/sdl3_mixer-config.cmake |  22 ++
 sdl3_mixer-config-version.cmake.in            |  12 -
 sdl3_mixer-config.cmake.in                    | 147 ------------
 src/codecs/music_wav.c                        |   4 +-
 25 files changed, 439 insertions(+), 561 deletions(-)
 create mode 100644 .editorconfig
 delete mode 100644 SDL3_mixer.pc.in
 delete mode 100644 VisualC/pkg-support/cmake/sdl2_mixer-config.cmake
 rename VisualC/pkg-support/cmake/{sdl2_mixer-config-version.cmake => sdl3_mixer-config-version.cmake} (82%)
 create mode 100644 VisualC/pkg-support/cmake/sdl3_mixer-config.cmake
 delete mode 100644 Xcode/pkg-support/resources/CMake/sdl2_mixer-config.cmake
 rename Xcode/pkg-support/resources/CMake/{sdl2_mixer-config-version.cmake => sdl3_mixer-config-version.cmake} (94%)
 create mode 100644 Xcode/pkg-support/resources/CMake/sdl3_mixer-config.cmake
 create mode 100644 cmake/Findgme.cmake
 rename SDL3_mixerConfig.cmake.in => cmake/SDL3_mixerConfig.cmake.in (98%)
 create mode 100644 cmake/sdl3-mixer.pc.in
 create mode 160000 external/libgme
 delete mode 100644 mingw/pkg-support/cmake/sdl2_mixer-config-version.cmake
 delete mode 100644 mingw/pkg-support/cmake/sdl2_mixer-config.cmake
 create mode 100644 mingw/pkg-support/cmake/sdl3_mixer-config-version.cmake
 create mode 100644 mingw/pkg-support/cmake/sdl3_mixer-config.cmake
 delete mode 100644 sdl3_mixer-config-version.cmake.in
 delete mode 100644 sdl3_mixer-config.cmake.in

diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..2e270580
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+indent_style = space
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index d794d3e8..709f7864 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -15,15 +15,15 @@ jobs:
       fail-fast: false
       matrix:
         platform:
-        - { name: Windows (MSVC+CMake),         os: windows-2019, shell: sh,   cmake: '-DSDL2MIXER_VENDORED=ON -GNinja', msvc: 1, shared: 1, static: 0 }
+        - { name: Windows (MSVC+CMake),         os: windows-2019, shell: sh,   cmake: '-DSDL3MIXER_VENDORED=ON -GNinja', msvc: 1, shared: 1, static: 0 }
         - { name: Windows (mingw32+autotools),  os: windows-latest, shell: 'msys2 {0}', msystem: mingw32, msys-env: mingw-w64-i686, shared: 1, static: 1 }
         - { name: Windows (mingw64+CMake),      os: windows-latest, shell: 'msys2 {0}', msystem: mingw64, msys-env: mingw-w64-x86_64, shared: 1, static: 0,
-            cmake: '-DSDL2MIXER_VENDORED=OFF -G "Ninja Multi-Config"' }
+            cmake: '-DSDL3MIXER_VENDORED=OFF -G "Ninja Multi-Config"' }
         - { name: Linux (autotools),            os: ubuntu-20.04,   shell: sh, shared: 1, static: 1}
-        - { name: Linux (CMake),                os: ubuntu-20.04,   shell: sh, cmake: '-DSDL2MIXER_VENDORED=ON -GNinja', shared: 1, static: 0 }
-        - { name: 'Linux (CMake, static)',      os: ubuntu-20.04,   shell: sh, cmake: '-DSDL2MIXER_VENDORED=ON -DBUILD_SHARED_LIBS=OFF -GNinja', shared: 0, static: 1 }
+        - { name: Linux (CMake),                os: ubuntu-20.04,   shell: sh, cmake: '-DSDL3MIXER_VENDORED=ON -GNinja', shared: 1, static: 0 }
+        - { name: 'Linux (CMake, static)',      os: ubuntu-20.04,   shell: sh, cmake: '-DSDL3MIXER_VENDORED=ON -DBUILD_SHARED_LIBS=OFF -GNinja', shared: 0, static: 1 }
         - { name: Macos (autotools),            os: macos-latest,   shell: sh, shared: 1, static: 1 }
-        - { name: Macos (CMake),                os: macos-latest,   shell: sh, cmake: '-DSDL2MIXER_VENDORED=ON -GNinja', shared: 1, static: 0 }
+        - { name: Macos (CMake),                os: macos-latest,   shell: sh, cmake: '-DSDL3MIXER_VENDORED=ON -GNinja', shared: 1, static: 0 }
 
 
     steps:
@@ -33,12 +33,13 @@ jobs:
       with:
         msystem: ${{ matrix.platform.msystem }}
         install: >-
-          ${{ matrix.platform.msys-env }}-SDL2
+          ${{ matrix.platform.msys-env }}-SDL3
           ${{ matrix.platform.msys-env }}-autotools
           ${{ matrix.platform.msys-env }}-cmake
           ${{ matrix.platform.msys-env }}-gcc
           ${{ matrix.platform.msys-env }}-flac
           ${{ matrix.platform.msys-env }}-fluidsynth
+          ${{ matrix.platform.msys-env }}-libgme
           ${{ matrix.platform.msys-env }}-libvorbis
           ${{ matrix.platform.msys-env }}-libxmp
           ${{ matrix.platform.msys-env }}-mpg123
@@ -50,7 +51,7 @@ jobs:
       if: runner.os == 'macOS'
       run: |
         brew install \
-          sdl2 \
+          sdl3 \
           autoconf \
           automake \
           libtool \
@@ -58,6 +59,7 @@ jobs:
           pkg-config \
           flac \
           fluidsynth \
+          game-music-emu \
           libvorbis \
           libxmp \
           mpg123 \
@@ -72,9 +74,10 @@ jobs:
           autoconf \
           automake \
           cmake \
-          libsdl2-dev \
+          libsdl3-dev \
           libflac-dev \
           libfluidsynth-dev \
+          libgme-dev \
           libmpg123-dev \
           libopusfile-dev \
           libvorbis-dev \
@@ -93,7 +96,7 @@ jobs:
       run: |
         echo "::group::Downloading SDL"
         .github/fetch_sdl_vc.ps1
-        echo "SDL2_DIR=$Env:GITHUB_WORKSPACE/SDL2-devel-VC" >> $Env:GITHUB_ENV
+        echo "SDL3_DIR=$Env:GITHUB_WORKSPACE/SDL3-devel-VC" >> $Env:GITHUB_ENV
         echo "::endgroup::"
         echo "::group::Downloading yasm"
         .github/fetch_yasm.ps1
@@ -116,7 +119,7 @@ jobs:
 
     - name: Setup (CMake)
       if: ${{ matrix.platform.cmake && !matrix.platform.msystem && !matrix.platform.msvc }}
-      uses: jwlawson/actions-setup-cmake@v1.12
+      uses: jwlawson/actions-setup-cmake@v1.13.1
       with:
         cmake-version: '3.16'
     - name: Configure (CMake)
@@ -125,15 +128,17 @@ jobs:
         set -- \
           -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
           -DCMAKE_BUILD_TYPE=Release \
-          -DSDL2MIXER_FLAC=ON \
-          -DSDL2MIXER_FLAC_LIBFLAC=ON \
-          -DSDL2MIXER_MOD_XMP=ON \
-          -DSDL2MIXER_MP3_MPG123=ON \
-          -DSDL2MIXER_OPUS=ON \
-          -DSDL2MIXER_VORBIS=VORBISFILE \
+          -DSDL3MIXER_FLAC=ON \
+          -DSDL3MIXER_FLAC_LIBFLAC=ON \
+          -DSDL3MIXER_GME=ON \
+          -DSDL3MIXER_MOD_XMP=ON \
+          -DSDL3MIXER_MP3_MPG133=ON \
+          -DSDL3MIXER_OPUS=ON \
+          -DSDL3MIXER_VORBIS=VORBISFILE \
+          -DSDL3MIXER_WERROR=ON \
           -DCMAKE_INSTALL_PREFIX=prefix_cmake \
           ${NULL+}
-        
+
         cmake -B build \
           "$@" \
           ${{ matrix.platform.cmake }}
@@ -147,7 +152,7 @@ jobs:
         set -eu
         rm -fr prefix_cmake
         cmake --install build/ --config Release
-        echo "SDL2_mixer_DIR=$(pwd)/prefix_cmake" >> $GITHUB_ENV
+        echo "SDL3_mixer_DIR=$(pwd)/prefix_cmake" >> $GITHUB_ENV
         ( cd prefix_cmake; find . ) | LC_ALL=C sort -u
 
     - name: Configure (Autotools)
@@ -173,14 +178,14 @@ jobs:
         parallel="$(getconf _NPROCESSORS_ONLN)"
         rm -rf prefix_autotools
         make -j"${parallel}" -C build-autotools install V=1
-        echo "SDL2_mixer_DIR=$(pwd)/prefix_autotools" >> $GITHUB_ENV
+        echo "SDL3_mixer_DIR=$(pwd)/prefix_autotools" >> $GITHUB_ENV
         ( cd prefix_autotools; find ) | LC_ALL=C sort -u
 
     - name: Verify CMake configuration files
       run: |
         cmake -S cmake/test -B cmake_config_build \
           -DCMAKE_BUILD_TYPE=Release \
-          -DCMAKE_PREFIX_PATH="${{ env.SDL2_mixer_DIR }};${{ env.SDL2_DIR }}" \
+          -DCMAKE_PREFIX_PATH="${{ env.SDL3_mixer_DIR }};${{ env.SDL3_DIR }}" \
           -DTEST_SHARED=${{ matrix.platform.shared }} \
           -DTEST_STATIC=${{ matrix.platform.static }}
         cmake --build cmake_config_build --verbose --config Release
diff --git a/.gitmodules b/.gitmodules
index 78669f4b..695951e7 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -34,3 +34,6 @@
 	path = external/wavpack
 	url = https://github.com/libsdl-org/wavpack.git
 	branch = 5.6.0-sdl
+[submodule "external/libgme"]
+	path = external/libgme
+	url = https://github.com/libsdl-org/game-music-emu.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 04e46a5e..d8314a3d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,18 +8,18 @@ set(MINOR_VERSION 0)
 set(MICRO_VERSION 0)
 set(SDL_REQUIRED_VERSION 3.0.0)
 
-include(PrivateSdlFunctions)
-sdl_calculate_derived_version_variables()
-
 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
     message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL_mixer source code and call cmake from there")
 endif()
 
 project(SDL3_mixer
     LANGUAGES C
-    VERSION "${FULL_VERSION}"
+    VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}"
 )
 
+include(PrivateSdlFunctions)
+sdl_calculate_derived_version_variables(${MAJOR_VERSION} ${MINOR_VERSION} ${MICRO_VERSION})
+
 message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}")
 
 if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
@@ -38,11 +38,6 @@ if(POLICY CMP0112)
     cmake_policy(SET CMP0112 NEW)
 endif()
 
-# Set defaults preventing destination file conflicts
-set(SDL3MIXER_DEBUG_POSTFIX "d"
-    CACHE STRING "Name suffix for debug builds")
-mark_as_advanced(SDL3MIXER_DEBUG_POSTFIX)
-
 # Assume MSVC projects don't have a package manager and need vendored dependencies (by default).
 # Most other platforms have some kind of package manager.
 # FIXME: consider a package manager such as conan/vcpkg instead of vendoring
@@ -60,12 +55,10 @@ include(GNUInstallDirs)
 option(CMAKE_POSITION_INDEPENDENT_CODE "Build static libraries with -fPIC" ON)
 option(BUILD_SHARED_LIBS "Build the library as a shared library" ON)
 
-# Save BUILD_SHARED_LIBS variable as soon as possible
-set(SDL3MIXER_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
-
 option(SDL3MIXER_INSTALL "Enable SDL3mixer install target" ${SDL3MIXER_ROOTPROJECT})
 option(SDL3MIXER_DEPS_SHARED "Default value for loading dependencies dynamically" ON)
 option(SDL3MIXER_VENDORED "Use vendored third-party libraries" ${vendored_default})
+option(SDL3MIXER_WERROR "Treat warnings as errors" OFF)
 
 option(SDL3MIXER_SAMPLES "Build the SDL3_mixer sample program(s)" ${SDL3MIXER_SAMPLES_DEFAULT})
 cmake_dependent_option(SDL3MIXER_SAMPLES_INSTALL "Install the SDL3_mixer sample program(s)" OFF "SDL3MIXER_SAMPLES;SDL3MIXER_INSTALL" OFF)
@@ -84,6 +77,9 @@ cmake_dependent_option(SDL3MIXER_FLAC_LIBFLAC_SHARED "Dynamically load LIBFLAC"
 
 cmake_dependent_option(SDL3MIXER_FLAC_DRFLAC "Enable FLAC music using drflac" ON SDL3MIXER_FLAC OFF)
 
+option(SDL3MIXER_GME "Support loading GME music via game-music-emu" OFF)
+option(SDL3MIXER_GME_SHARED "Dynamically load libgme" "${SDL3MIXER_DEPS_SHARED}")
+
 option(SDL3MIXER_MOD "Support loading MOD music" ON)
 
 cmake_dependent_option(SDL3MIXER_MOD_MODPLUG "Support loading MOD music via modplug" OFF SDL3MIXER_MOD OFF)
@@ -172,6 +168,9 @@ else()
     set(SDL3MIXER_OGG FALSE)
 endif()
 
+# Save BUILD_SHARED_LIBS variable
+set(SDL3MIXER_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
+
 if(SDL3MIXER_BUILD_SHARED_LIBS)
     set(sdl3_mixer_export_name SDL3_mixer)
     set(sdl3_mixer_install_name_infix shared)
@@ -182,7 +181,23 @@ else()
     set(sdl3_target_name SDL3::SDL3-static)
 endif()
 
-sdl_find_sdl3(${sdl3_target_name} ${SDL_REQUIRED_VERSION})
+if(NOT TARGET ${sdl3_target_name})
+    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED)
+endif()
+
+add_library(sdl3mixer_build_options INTERFACE)
+if(MSVC)
+    target_compile_options(sdl3mixer_build_options INTERFACE /W2)
+else()
+    target_compile_options(sdl3mixer_build_options INTERFACE -Wall -Wextra)
+endif()
+if(SDL3MIXER_WERROR)
+    if(MSVC)
+        target_compile_options(sdl3mixer_build_options INTERFACE /WX)
+    else()
+        target_compile_options(sdl3mixer_build_options INTERFACE -Werror)
+    endif()
+endif()
 
 set(BUILD_SHARED_LIBS ${SDL3MIXER_BUILD_SHARED_LIBS})
 add_library(SDL3_mixer
@@ -194,6 +209,7 @@ add_library(SDL3_mixer
     src/codecs/music_drmp3.c
     src/codecs/music_flac.c
     src/codecs/music_fluidsynth.c
+    src/codecs/music_gme.c
     src/codecs/music_modplug.c
     src/codecs/music_mpg123.c
     src/codecs/music_nativemidi.c
@@ -229,6 +245,7 @@ target_compile_definitions(SDL3_mixer PRIVATE
     SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
 )
 target_link_libraries(SDL3_mixer PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
+target_link_libraries(SDL3_mixer PRIVATE $<BUILD_INTERFACE:sdl3mixer_build_options>)
 if(WIN32 AND BUILD_SHARED_LIBS)
     target_sources(SDL3_mixer PRIVATE
         version.rc
@@ -240,56 +257,36 @@ set_target_properties(SDL3_mixer PROPERTIES
     C_VISIBILITY_PRESET "hidden"
 )
 if(NOT ANDROID)
-    set_target_properties(SDL3_mixer PROPERTIES
-        DEBUG_POSTFIX "${SDL3MIXER_DEBUG_POSTFIX}"
-    )
     if(APPLE)
         # the SOVERSION property corresponds to the compatibility version and VERSION corresponds to the current version
         # https://cmake.org/cmake/help/latest/prop_tgt/SOVERSION.html#mach-o-versions
         set_target_properties(SDL3_mixer PROPERTIES
-            SOVERSION "${DYLIB_COMPATIBILITY_VERSION}"
+            SOVERSION "${DYLIB_COMPAT_VERSION}"
             VERSION "${DYLIB_CURRENT_VERSION}"
         )
     else()
         set_target_properties(SDL3_mixer PROPERTIES
-            SOVERSION "${LT_MAJOR}"
-            VERSION "${LT_VERSION}"
+            SOVERSION "${SO_VERSION_MAJOR}"
+            VERSION "${SO_VERSION}"
         )
     endif()
 endif()
-if(SDL3MIXER_BUILD_SHARED_LIBS AND (APPLE OR (UNIX AND NOT ANDROID)))
-    add_custom_command(TARGET SDL3_mixer POST_BUILD
-        COMMAND "${CMAKE_COMMAND}" -E create_symlink "$<TARGET_SONAME_FILE_NAME:SDL3_mixer>" "libSDL3_mixer$<$<CONFIG:Debug>:${SDL3MIXER_DEBUG_POSTFIX}>$<TARGET_FILE_SUFFIX:SDL3_mixer>"
-        # BYPRODUCTS "libSDL3_mixer$<$<CONFIG:Debug>:${SDL3MIXER_DEBUG_POSTFIX}>$<TARGET_FILE_SUFFIX:SDL3_mixer>" # Needs CMake 3.20
-        WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
-    )
-endif()
 if(SDL3MIXER_BUILD_SHARED_LIBS)
-    if(WIN32 OR OS2)
+    if(WIN32)
         set_target_properties(SDL3_mixer PROPERTIES
             PREFIX ""
         )
     endif()
-    if(OS2)
-        # OS/2 doesn't support a DLL name longer than 8 characters.
-        set_target_properties(SDL3_mixer PROPERTIES
-            OUTPUT_NAME "SDL3mix"
-        )
-    elseif(UNIX AND NOT ANDROID)
-        set_target_properties(SDL3_mixer PROPERTIES
-            OUTPUT_NAME "SDL3_mixer-${LT_RELEASE}"
-        )
-    endif()
 else()
-    if(MSVC OR (WATCOM AND (WIN32 OR OS2)))
+    if(MSVC)
         set_target_properties(SDL3_mixer PROPERTIES
             OUTPUT_NAME "SDL3_mixer-static"
         )
     endif()
 endif()
 
+# Use `Compatible Interface Properties` to ensure a shared SDL3_mixer is linked to a shared SDL3 library
 if(SDL3MIXER_BUILD_SHARED_LIBS)
-    # Use `Compatible Interface Properties` to ensure a shared SDL3_mixer is linked to a shared SDL3 library
     set_property(TARGET SDL3_mixer PROPERTY INTERFACE_SDL3_SHARED ${SDL3MIXER_BUILD_SHARED_LIBS})
     set_property(TARGET SDL3_mixer APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED)
 endif()
@@ -343,7 +340,7 @@ endif()
 if(SDL3MIXER_OPUS)
     target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OPUS)
     if(SDL3MIXER_VENDORED)
-        # vendored libogg alread handled
+        # vendored libogg already handled
         if(NOT TARGET ogg)
             message(FATAL_ERROR "ogg target not present")
         endif()
@@ -413,7 +410,7 @@ endif()
 if(SDL3MIXER_VORBIS_TREMOR)
     target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OGG OGG_USE_TREMOR)
     if(SDL3MIXER_VENDORED)
-        # vendored libogg alread handled
+        # vendored libogg already handled
         if(NOT TARGET ogg)
             message(FATAL_ERROR "ogg target not present")
         endif()
@@ -464,7 +461,7 @@ endif()
 if(SDL3MIXER_VORBIS_VORBISFILE)
     target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OGG)
     if(SDL3MIXER_VENDORED)
-        # vendored libogg alread handled
+        # vendored libogg already handled
         if(NOT TARGET ogg)
             message(FATAL_ERROR "ogg target not present")
         endif()
@@ -508,7 +505,7 @@ endif()
 if(SDL3MIXER_FLAC_LIBFLAC)
     target_compile_definitions(SDL3_mixer PRIVATE MUSIC_FLAC_LIBFLAC)
     if(SDL3MIXER_VENDORED)
-        # vendored libogg alread handled
+        # vendored libogg already handled
         if(NOT TARGET ogg)
             message(FATAL_ERROR "ogg target not present")
         endif()
@@ -557,6 +554,47 @@ if(SDL3MIXER_FLAC_DRFLAC)
     target_compile_definitions(SDL3_mixer PRIVATE MUSIC_FLAC_DRFLAC)
 endif()
 
+if(SDL3MIXER_GME)
+    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_GME)
+    if(SDL3MIXER_VENDORED)
+        set(BUILD_SHARED_LIBS "${SDL3MIXER_GME_SHARED}")
+        set(ENABLE_UBSAN OFF CACHE BOOL "UB sanitizer")
+        set(BUILD_FRAMEWORK OFF CACHE BOOL "macos framework")
+        set(GME_ZLIB OFF CACHE BOOL "GME supports compressed formats")
+        message(STATUS "Using vendored libgme")
+        sdl_check_project_in_subfolder(external/libgme libgme SDL3MIXER_VENDORED)
+        add_subdirectory(external/libgme EXCLUDE_FROM_ALL)
+        add_library(gme::gme ALIAS gme)
+        if(SDL3MIXER_GME_SHARED)
+            list(APPEND INSTALL_EXTRA_TARGETS gme)
+        endif()
+        if(NOT SDL3MIXER_GME_SHARED)
+            list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:gme>)
+        endif()
+    else()
+        message(STATUS "Using system libgme")
+        find_package(gme REQUIRED)
+        if(NOT SDL3MIXER_GME_SHARED)
+            list(APPEND PC_REQUIRES libgme)
+        endif()
+    endif()
+    if(SDL3MIXER_GME_SHARED)
+        target_include_directories(SDL3_mixer PRIVATE
+            $<TARGET_PROPERTY:gme::gme,INCLUDE_DIRECTORIES>
+            $<TARGET_PROPERTY:gme::gme,INTERFACE_INCLUDE_DIRECTORIES>
+            $<TARGET_PROPERTY:gme::gme,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+        )
+        target_get_dynamic_library(dynamic_gme gme::gme)
+        message(STATUS "Dynamic libgme: ${dynamic_gme}")
+        target_compile_definitions(SDL3_mixer PRIVATE "GME_DYNAMIC=\"${dynamic_gme}\"")
+        if(SDL3MIXER_VENDORED)
+            add_dependencies(SDL3_mixer gme::gme)
+        endif()
+    else()
+        target_link_libraries(SDL3_mixer PRIVATE gme::gme)
+    endif()
+endif()
+
 if(SDL3MIXER_MOD_MODPLUG)
     target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MOD_MODPLUG)
     if(SDL3MIXER_VENDORED)
@@ -799,6 +837,9 @@ if(SDL3MIXER_WAVPACK)
     endif()
 endif()
 
+# Restore BUILD_SHARED_LIBS
+set(BUILD_SHARED_LIBS ${SDL3MIXER_BUILD_SHARED_LIBS})
+
 if(SDL3MIXER_INSTALL)
     install(
         TARGETS SDL3_mixer
@@ -806,7 +847,6 @@ if(SDL3MIXER_INSTALL)
         ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
         LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
         RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT library
-        PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/SDL3" COMPONENT devel
     )
     install(FILES
         "${CMAKE_CURRENT_SOURCE_DIR}/include/SDL3/SDL_mixer.h"
@@ -823,89 +863,65 @@ if(SDL3MIXER_INSTALL)
         )
     endif()
 
-    ##### export files #####
     if(WIN32 AND NOT MINGW)
-        set(SDLMIXER_INSTALL_CMAKEDIR_DEFAULT "cmake")
+        set(SDL3MIXER_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake")
     else()
-        set(SDLMIXER_INSTALL_CMAKEDIR_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake/SDL3_mixer")
+        set(SDL3MIXER_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake")
     endif()
-    set(SDLMIXER_INSTALL_CMAKEDIR "${SDLMIXER_INSTALL_CMAKEDIR_DEFAULT}" CACHE STRING "Location where to install SDL3_mixerConfig.cmake")
+    set(SDL3MIXER_INSTALL_CMAKEDIR_ROOT "${SDL3MIXER_INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3Config.cmake related files (SDL3 subfolder for MSVC projects)")
 
-    configure_package_config_file(SDL3_mixerConfig.cmake.in SDL3_mixerConfig.cmake
-        INSTALL_DESTINATION "${SDLMIXER_INSTALL_CMAKEDIR}"
+    if(WIN32 AND NOT MINGW)
+        set(SDL3MIXER_INSTALL_CMAKEDIR "${SDL3MIXER_INSTALL_CMAKEDIR_ROOT}")
+        set(LICENSES_PREFIX "licenses/SDL3_mixer")
+    else()
+        set(SDL3MIXER_INSTALL_CMAKEDIR "${SDL3MIXER_INSTALL_CMAKEDIR_ROOT}/SDL3_mixer")
+        set(LICENSES_PREFIX "${CMAKE_INSTALL_DATAROOTDIR}/licenses/SDL3_mixer")
+    endif()
+
+    configure_package_config_file(cmake/SDL3_mixerConfig.cmake.in SDL3_mixerConfig.cmake
+        INSTALL_DESTINATION "${SDL3MIXER_INSTALL_CMAKEDIR}"
     )
     write_basic_package_version_file("${PROJECT_BINARY_DIR}/SDL3_mixerConfigVersion.cmake"
-        VERSION ${FULL_VERSION}
         COMPATIBILITY AnyNewerVersion
     )
     install(
         FILES
             "${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixerConfig.cmake"
             "${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixerConfigVersion.cmake"
-        DESTINATION "${SDLMIXER_INSTALL_CMAKEDIR}"
+            cmake/FindFLAC.cmake
+            cmake/FindFluidSynth.cmake
+            cmake/Findgme.cmake
+            cmake/Findlibxmp.cmake
+            cmake/Findlibxmp-lite.cmake
+            cmake/Findmodplug.cmake
+            cmake/FindOpusFile.cmake
+            cmake/FindMPG123.cmake
+            cmake/FindVorbis.cmake
+            cmake/Findtremor.cmake
+            cmake/Findwavpack.cmake
+        DESTINATION "${SDL3MIXER_INSTALL_CMAKEDIR}"
         COMPONENT devel
     )
-    if(NOT SDL3MIXER_BUILD_SHARED_LIBS)
-        install(
-            FILES
-                cmake/FindFLAC.cmake
-                cmake/FindFluidSynth.cmake
-                cmake/Findlibxmp.cmake
-                cmake/Findlibxmp-lite.cmake
-                cmake/Findmodplug.cmake
-                cmake/FindOpusFile.cmake
-                cmake/FindMPG123.cmake
-                cmake/FindVorbis.cmake
-                cmake/Findtremor.cmake
-                cmake/Findwavpack.cmake
-            DESTINATION "${SDLMIXER_INSTALL_CMAKEDIR}"
-            COMPONENT devel
-        )
-    endif()
     install(EXPORT SDL3MixerTargets
         FILE SDL3_mixer-${sdl3_mixer_install_name_infix}-targets.cmake
         NAMESPACE SDL3_mixer::
-        DESTINATION "${SDLMIXER_INSTALL_CMAKEDIR}"
+        DESTINATION "${SDL3MIXER_INSTALL_CMAKEDIR}"
         COMPONENT devel
     )
 
-    set(VERSION ${FULL_VERSION})
-    set(SDL_VERSION ${SDL_REQUIRED_VERSION})
-    set(prefix "${CMAKE_INSTALL_PREFIX}")
-    set(exec_prefix "\${prefix}")
-    set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
-    set(bindir "\${exec_prefix}/bin")
-    set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
     string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
     string(JOIN " " PC_LIBS ${PC_LIBS})
-    configure_file(SDL3_mixer.pc.in ${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixer.pc.intermediate @ONLY)
-    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixer-$<CONFIG>.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixer.pc.intermediate")
+    configure_file(cmake/sdl3-mixer.pc.in sdl3-mixer.pc @ONLY)
 
-    set(PC_DESTDIR)
     if(CMAKE_SYSTEM_NAME MATCHES FreeBSD)
         # FreeBSD uses ${PREFIX}/libdata/pkgconfig
         set(PC_DESTDIR "libdata/pkgconfig")
     else()
         set(PC_DESTDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
     endif()
-    # Always install SDL3_mixer.pc file: libraries might be different between config modes
-    install(CODE "
-        # FIXME: use file(COPY_FILE) if minimum CMake version >= 3.21
-        execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E copy_if_different
-            \"${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixer-$<CONFIG>.pc\"
-            \"${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixer.pc\")
-        file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${PC_DESTDIR}\"
-            TYPE FILE
-            FILES \"${CMAKE_CURRENT_BINARY_DIR}/SDL3_mixer.pc\")" COMPONENT devel)
-
-    if(SDL3MIXER_BUILD_SHARED_LIBS AND (APPLE OR (UNIX AND NOT ANDROID)))
-        install(
-            FILES
-                "${PROJECT_BINARY_DIR}/libSDL3_mixer$<$<CONFIG:Debug>:${SDL3MIXER_DEBUG_POSTFIX}>$<TARGET_FILE_SUFFIX:SDL3_mixer>"
-            DESTINATION "${CMAKE_INSTALL_LIBDIR}"
-            COMPONENT devel
-        )
-    endif()
+    # Always install sdl3-mixer.pc file: libraries might be different between config modes
+    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdl3-mixer.pc"
+        DESTINATION "${PC_DESTDIR}" COMPONENT devel)
 
     install(FILES "LICENSE.txt"
         DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}"
@@ -918,11 +934,6 @@ if(SDL3MIXER_SAMPLES)
     add_executable(playwave playwave.c)
 
     foreach(prog playmus playwave)
-        # FIXME: mingw should be handled by SDL3::SDL3(-static) target
-        if(MINGW)
-            target_link_libraries(${prog} PRIVATE mingw32)
-            target_link_options(${prog} PRIVATE -mwindows)
-        endif()
         target_link_libraries(${prog} PRIVATE SDL3_mixer::${sdl3_mixer_export_name})
         target_link_libraries(${prog} PRIVATE ${sdl3_target_name})
 
@@ -933,13 +944,3 @@ if(SDL3MIXER_SAMPLES)
         endif()
     endforeach()
 endif()
-
-add_library(SDL3::mixer INTERFACE IMPORTED GLOBAL)
-set_target_properties(SDL3::mixer PROPERTIES
-    INTERFACE_LINK_LIBRARIES "SDL3_mixer"
-)
-if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.17")
-    set_target_properties(SDL3::mixer PROPERTIES
-        DEPRECATION "Use SDL3_mixer::SDL3_mixer or SDL3_mixer::SDL3_mixer-static instead"
-    )
-endif()
diff --git a/SDL3_mixer.pc.in b/SDL3_mixer.pc.in
deleted file mode 100644
index b213c105..00000000
--- a/SDL3_mixer.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: SDL3_mixer
-Description: mixer library for Simple DirectMedia Layer
-Version: @VERSION@
-Requires: sdl3 >= @SDL_VERSION@
-Libs: -L${libdir} -lSDL3_mixer
-Cflags: -I${includedir}/SDL3
-Requires.private: @PC_REQUIRES@
-Libs.private: @PC_LIBS@
diff --git a/VisualC/pkg-support/cmake/sdl2_mixer-config.cmake b/VisualC/pkg-support/cmake/sdl2_mixer-config.cmake
deleted file mode 100644
index 7cec3cc6..00000000
--- a/VisualC/pkg-support/cmake/sdl2_mixer-config.cmake
+++ /dev/null
@@ -1,76 +0,0 @@
-# SDL2_mixer CMake configuration file:
-# This file is meant to be placed in a cmake subfolder of SDL2_mixer-devel-2.x.y-VC
-
-include(FeatureSummary)
-set_package_properties(SDL2_mixer PROPERTIES
-    URL "https://www.libsdl.org/projects/SDL_mixer/"
-    DESCRIPTION "SDL_mixer is a sample multi-channel audio mixer library"
-)
-
-cmake_minimum_required(VERSION 3.0)
-
-set(SDL2_mixer_FOUND                TRUE)
-
-set(SDL2MIXER_VENDORED              TRUE)
-
-set(SDL2MIXER_CMD                   FALSE)
-
-set(SDL2MIXER_FLAC_LIBFLAC          FALSE)
-set(SDL2MIXER_FLAC_DRFLAC           TRUE)
-
-set(SDL2MIXER_MOD                   TRUE)
-set(SDL2MIXER_MOD_MODPLUG           TRUE)
-set(SDL2MIXER_MOD_XMP               FALSE)
-set(SDL2MIXER_MOD_XMP_LITE          FALSE)
-
-set(SDL2MIXER_MP3                   TRUE)
-set(SDL2MIXER_MP3_DRMP3             TRUE)
-set(SDL2MIXER_MP3_MPG123            FALSE)
-
-set(SDL2MIXER_MIDI                  TRUE)
-set(SDL2MIXER_MIDI_FLUIDSYNTH       FALSE)
-set(SDL2MIXER_MIDI_NATIVE           TRUE)
-set(SDL2MIXER_MIDI_TIMIDITY         TRUE)
-
-set(SDL2MIXER_OPUS                  TRUE)
-
-set(SDL2MIXER_VORBIS                STB)
-set(SDL2MIXER_VORBIS_STB            TRUE)
-set(SDL2MIXER_VORBIS_TREMOR         FALSE)
-set(SDL2MIXER_VORBIS_VORBISFILE     FALSE)
-
-set(SDL2MIXER_WAVE                  TRUE)
-
-if(CMAKE_SIZEOF_VOID_P STREQUAL "4")
-    set(_sdl_arch_subdir "x86")
-elseif(CMAKE_SIZEOF_VOID_P STREQUAL "8")
-    set(_sdl_arch_subdir "x64")
-else()
-    unset(_sdl_arch_subdir)
-    set(SDL2_mixer_FOUND FALSE)
-    return()
-endif()
-
-set(_sdl2mixer_incdir       "${CMAKE_CURRENT_LIST_DIR}/../include")
-set(_sdl2mixer_library      "${CMAKE_CURRENT_LIST_DIR}/../lib/${_sdl_arch_subdir}/SDL2_mixer.lib")
-set(_sdl2mixer_dll          "${CMAKE_CURRENT_LIST_DIR}/../lib/${_sdl_arch_subdir}/SDL2_mixer.dll")
-
-# All targets are created, even when some might not be requested though COMPONENTS.
-# This is done for compatibility with CMake generated SDL2_mixer-target.cmake files.
-
-if(NOT TARGET SDL2_mixer::SDL2_mixer)
-    add_library(SDL2_mixer::SDL2_mixer SHARED IMPORTED)
-    set_target_properties(SDL2_mixer::SDL2_mixer
-        PROPERTIES
-            INTERFACE_INCLUDE_DIRECTORIES "${_sdl2mixer_incdir}"
-            IMPORTED_IMPLIB "${_sdl2mixer_library}"
-            IMPORTED_LOCATION "${_sdl2mixer_dll}"
-            COMPATIBLE_INTERFACE_BOOL "SDL2_SHARED"
-            INTERFACE_SDL2_SHARED "ON"
-    )
-endif()
-
-unset(_sdl_arch_subdir)
-unset(_sdl2mixer_incdir)
-unset(_sdl2mixer_library)
-unset(_sdl2mixer_dll)
diff --git a/VisualC/pkg-support/cmake/sdl2_mixer-config-version.cmake b/VisualC/pkg-support/cmake/sdl3_mixer-config-version.cmake
similarity index 82%
rename from VisualC/pkg-support/cmake/sdl2_mixer-config-version.cmake
rename to VisualC/pkg-support/cmake/sdl3_mixer-config-version.cmake
index 4f4fea6c..ad998996 100644
--- a/VisualC/pkg-support/cmake/sdl2_mixer-config-version.cmake
+++ b/VisualC/pkg-support/cmake/sdl3_mixer-config-version.cmake
@@ -1,14 +1,14 @@
 # based on the files generated by CMake's write_basic_package_version_file
 
-# SDL2_mixer CMake version configuration file:
-# This file is meant to be placed in a cmake subfolder of SDL2_mixer-devel-2.x.y-VC
+# SDL3_mixer CMake version configuration file:
+# This file is meant to be placed in a cmake subfolder of SDL3_mixer-devel-3.x.y-VC
 
-if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/../include/SDL_mixer.h")
-    message(AUTHOR_WARNING "Could not find SDL_mixer.h. This script is meant to be placed in a CMake subfolder of SDL2_mixer-devel-2.x.y-VC")
+if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/../include/SDL3/SDL_mixer.h")
+    message(AUTHOR_WARNING "Could not find SDL3/SDL_mixer.h. This script is meant to be placed in a CMake subfolder of SDL3_mixer-devel-3.x.y-VC")
     return()
 endif()
 
-file(READ "${CMA

(Patch may be truncated, please check the link at the top of this post.)