SDL_mixer: cmake: support vendored fluidsynth

From 408d8b065f004c28d27bac173de52fd8ebdb58f1 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sun, 19 Jul 2026 02:56:49 +0200
Subject: [PATCH] cmake: support vendored fluidsynth

---
 .gitmodules                     |  4 ++++
 CMakeLists.txt                  | 35 +++++++++++++++++++++++++++------
 cmake/SDL3_mixerConfig.cmake.in |  2 +-
 external/fluidsynth             |  1 +
 4 files changed, 35 insertions(+), 7 deletions(-)
 create mode 160000 external/fluidsynth

diff --git a/.gitmodules b/.gitmodules
index c33e17cf..ffa99603 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -38,3 +38,7 @@
 	path = external/libgme
 	url = https://github.com/libsdl-org/game-music-emu.git
 	branch = v0.6.4-SDL
+[submodule "external/fluidsynth"]
+	path = external/fluidsynth
+	url = https://github.com/libsdl-org/fluidsynth.git
+	branch = v2.5.7-SDL
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3a7b8b5a..1f1b7d57 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -151,7 +151,7 @@ cmake_dependent_option(SDLMIXER_MP3_MPG123_SHARED "Dynamically load mpg123" "${S
 
 option(SDLMIXER_MIDI "Enable MIDI audio" ON)
 
-cmake_dependent_option(SDLMIXER_MIDI_FLUIDSYNTH "Support FluidSynth MIDI output" ON "SDLMIXER_MIDI;NOT SDLMIXER_VENDORED" OFF)
+cmake_dependent_option(SDLMIXER_MIDI_FLUIDSYNTH "Support FluidSynth MIDI output" ON SDLMIXER_MIDI OFF)
 cmake_dependent_option(SDLMIXER_MIDI_FLUIDSYNTH_SHARED "Dynamically load libfluidsynth" "${SDLMIXER_DEPS_SHARED}" SDLMIXER_MIDI_FLUIDSYNTH OFF)
 
 cmake_dependent_option(SDLMIXER_MIDI_TIMIDITY "Support timidity MIDI output" ON SDLMIXER_MIDI OFF)
@@ -913,9 +913,31 @@ list(APPEND SDLMIXER_BACKENDS MIDI_FLUIDSYNTH)
 set(SDLMIXER_MIDI_FLUIDSYNTH_ENABLED FALSE)
 if(SDLMIXER_MIDI_FLUIDSYNTH)
     if(SDLMIXER_VENDORED)
-        message(STATUS "Using vendored FluidSynth")
-        message(${fatal_error} "FluidSynth is not vendored.")
-        set(SDLMIXER_MIDI_FLUIDSYNTH_ENABLED FALSE)
+        set(SDLMIXER_MIDI_FLUIDSYNTH_ENABLED TRUE)
+        message(STATUS "Using vendored fluidsynth")
+        sdl_check_project_in_subfolder(external/fluidsynth fluidsynth SDLMIXER_VENDORED)
+        set(disabled_opts enable-alsa  enable-aufile enable-dbus enable-ipv6 enable-jack enable-ladspa
+          enable-libinstpatch enable-libsndfile enable-midishare enable-opensles enable-oboe enable-network
+          enable-oss enable-dsound enable-wasapi enable-waveout enable-winmidi enable-sdl3 enable-pulseaudio
+          enable-pipewire enable-readline enable-threads enable-openmp enable-unicode enable-native enable-signalsmith
+          enable-framework enable-systemd enable-coreaudio enable-coremidi enable-dart enable-kai)
+        foreach(opt ${disabled_opts})
+          set(${opt} FALSE CACHE BOOL "FluidSynth ${opt} option")
+        endforeach()
+        enable_language(CXX)
+        set(osal "cpp11" CACHE STRING "FluidSynth OS Abstraction layer")
+        set(BUILD_SHARED_LIBS "${SDLMIXER_MIDI_FLUIDSYNTH_SHARED}")
+        add_subdirectory(external/fluidsynth external/fluidsynth-build EXCLUDE_FROM_ALL)
+        register_license(fluidsynth external/fluidsynth/LICENSE)
+        if(NOT TARGET FluidSynth::libfluidsynth)
+            add_library(FluidSynth::libfluidsynth ALIAS libfluidsynth)
+        endif()
+        if(SDLMIXER_MIDI_FLUIDSYNTH_SHARED OR NOT SDLMIXER_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS libfluidsynth)
+        endif()
+        if(NOT SDLMIXER_MIDI_FLUIDSYNTH_SHARED)
+            list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:FluidSynth::libfluidsynth>)
+        endif()
     elseif(SDLMIXER_MIDI_FLUIDSYNTH_SHARED AND DEFINED SDLMIXER_DYNAMIC_MIDI_FLUIDSYNTH AND EXISTS "${SDLMIXER_DYNAMIC_MIDI_FLUIDSYNTH}")
         message(STATUS "${PROJECT_NAME}: Using FluidSynth from CMake variable")
         set(SDLMIXER_MIDI_FLUIDSYNTH_ENABLED TRUE)
@@ -1173,10 +1195,11 @@ if(SDLMIXER_INSTALL)
 
     string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
     string(JOIN " " PC_LIBS ${PC_LIBS})
-    configure_file(cmake/sdl3-mixer.pc.in sdl3-mixer.pc @ONLY)
+    configure_file(cmake/sdl3-mixer.pc.in sdl3-mixer.pc.pre-config @ONLY)
+    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/sdl3-mixer-$<CONFIG>.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/sdl3-mixer.pc.pre-config")
 
     # Always install sdl3-mixer.pc file: libraries might be different between config modes
-    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdl3-mixer.pc"
+    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdl3-mixer-$<CONFIG>.pc" RENAME "sdl3-mixer.pc"
         DESTINATION "${SDLMIXER_PKGCONFIG_INSTALLDIR}" COMPONENT devel)
 
     install(FILES "LICENSE.txt"
diff --git a/cmake/SDL3_mixerConfig.cmake.in b/cmake/SDL3_mixerConfig.cmake.in
index 815faa42..eab8250f 100644
--- a/cmake/SDL3_mixerConfig.cmake.in
+++ b/cmake/SDL3_mixerConfig.cmake.in
@@ -53,7 +53,7 @@ set(SDL3_mixer_SDL3_mixer-static FALSE)
 if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_mixer-static-targets.cmake")
 
     if(SDLMIXER_VENDORED)
-        if(SDLMIXER_GME)
+        if(SDLMIXER_MIDI_FLUIDSYNTH OR SDLMIXER_GME)
             include(CheckLanguage)
             check_language(CXX)
             if(NOT CMAKE_CXX_COMPILER)
diff --git a/external/fluidsynth b/external/fluidsynth
new file mode 160000
index 00000000..b53de280
--- /dev/null
+++ b/external/fluidsynth
@@ -0,0 +1 @@
+Subproject commit b53de2809bc5e4bffdaec59f447f81ba55ce4fe1