SDL_mixer: cmake: always allow linking to shared SDL3 library

From ee0e509e46ace94cb05266297d86bffeacb771ef Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sun, 2 Jul 2023 23:15:34 +0200
Subject: [PATCH] cmake: always allow linking to shared SDL3 library

---
 CMakeLists.txt                  |  19 ++++--
 cmake/PrivateSdlFunctions.cmake |   9 +++
 cmake/SDL3_mixerConfig.cmake.in | 115 +++++++++++++++++---------------
 cmake/test/CMakeLists.txt       |   6 +-
 4 files changed, 85 insertions(+), 64 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8251fcd1..cc1bb837 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -56,7 +56,7 @@ else()
 endif()
 
 set(sdl3mixer_install_enableable ON)
-if ((TARGET SDL3 OR TARGET SDL3-static) AND SDL3_DISABLE_INSTALL)
+if((TARGET SDL3-shared OR TARGET SDL3-static) AND SDL_DISABLE_INSTALL)
     # Cannot install SDL3_mixer when SDL3 is built in same built, and is not installed.
     set(sdl3mixer_install_enableable OFF)
 endif()
@@ -196,16 +196,20 @@ endif()
 # Save BUILD_SHARED_LIBS variable
 set(SDL3MIXER_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 
+set(sdl_required_components Headers)
+
 if(SDL3MIXER_BUILD_SHARED_LIBS)
     set(sdl3_mixer_target_name SDL3_mixer-shared)
     set(sdl3_target_name SDL3::SDL3-shared)
+
+    list(APPEND sdl_required_components SDL3-shared)
 else()
     set(sdl3_mixer_target_name SDL3_mixer-static)
-    set(sdl3_target_name SDL3::SDL3-static)
+    set(sdl3_target_name SDL3::SDL3)
 endif()
 
-if(NOT TARGET ${sdl3_target_name})
-    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED)
+if(NOT TARGET SDL3::Headers OR NOT TARGET ${sdl3_target_name})
+    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS ${sdl_required_components})
 endif()
 
 set(BUILD_SHARED_LIBS ${SDL3MIXER_BUILD_SHARED_LIBS})
@@ -257,7 +261,10 @@ target_compile_definitions(${sdl3_mixer_target_name} PRIVATE
     SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
     SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
 )
-target_link_libraries(${sdl3_mixer_target_name} PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
+target_link_libraries(${sdl3_mixer_target_name} PUBLIC SDL3::Headers)
+if(SDL3MIXER_BUILD_SHARED_LIBS)
+    target_link_libraries(${sdl3_mixer_target_name} PRIVATE SDL3::SDL3-shared)
+endif()
 sdl_add_warning_options(${sdl3_mixer_target_name} WARNING_AS_ERROR ${SDL3MIXER_WERROR})
 if(WIN32 AND BUILD_SHARED_LIBS)
     target_sources(${sdl3_mixer_target_name} PRIVATE
@@ -265,10 +272,10 @@ if(WIN32 AND BUILD_SHARED_LIBS)
     )
 endif()
 set_target_properties(${sdl3_mixer_target_name} PROPERTIES
+    OUTPUT_NAME "SDL3_mixer"
     DEFINE_SYMBOL DLL_EXPORT
     EXPORT_NAME ${sdl3_mixer_target_name}
     C_VISIBILITY_PRESET "hidden"
-    OUTPUT_NAME "SDL3_mixer"
 )
 if(NOT ANDROID)
     if(APPLE)
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 7c1dfc46..592e83c3 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -1,5 +1,7 @@
 # This file is shared amongst SDL_image/SDL_mixer/SDL_ttf
 
+include(CheckCCompilerFlag)
+
 macro(sdl_calculate_derived_version_variables MAJOR MINOR MICRO)
     set(SO_VERSION_MAJOR "0")
     set(SO_VERSION_MINOR "${MINOR_VERSION}")
@@ -253,3 +255,10 @@ function(sdl_add_warning_options TARGET)
         endif()
     endif()
 endfunction()
+
+function(sdl_no_deprecated_errors TARGET)
+    check_c_compiler_flag(-Wno-error=deprecated-declarations HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS)
+        if(HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS)
+    target_compile_options(${TARGET} PRIVATE "-Wno-error=deprecated-declarations")
+endif()
+endfunction()
diff --git a/cmake/SDL3_mixerConfig.cmake.in b/cmake/SDL3_mixerConfig.cmake.in
index 0b7200aa..86d0db8f 100644
--- a/cmake/SDL3_mixerConfig.cmake.in
+++ b/cmake/SDL3_mixerConfig.cmake.in
@@ -48,85 +48,90 @@ set(SDL3MIXER_WAVPACK               @SDL3MIXER_WAVPACK@)
 
 set(SDL3MIXER_SDL3_REQUIRED_VERSION @SDL_REQUIRED_VERSION@)
 
-if(NOT SDL3MIXER_VENDORED)
-    set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
-    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
-endif()
-
 if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_mixer-shared-targets.cmake")
     include("${CMAKE_CURRENT_LIST_DIR}/SDL3_mixer-shared-targets.cmake")
 endif()
 
 if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_mixer-static-targets.cmake")
 
-    include(CMakeFindDependencyMacro)
-    include(PkgConfigHelper)
+    if(SDL3MIXER_VENDORED)
+        if(SDL3MIXER_GME)
+            include(CheckLanguage)
+            check_language(CXX)
+            if(NOT CMAKE_CXX_COMPILER)
+                message(WARNING "CXX language not enabled. Linking to SDL3_mixer::SDL3_mixer-static might fail.")
+            endif()
+        endif()
+    else()
+        include(CMakeFindDependencyMacro)
+        include(PkgConfigHelper)
 
-    if(NOT DEFINED CMAKE_FIND_PACKAGE_PREFER_CONFIG)
-        set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
-    endif()
+        set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
+        list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
 
-    if(SDL3MIXER_SNDFILE AND NOT SDL3MIXER_VENDORED AND NOT TARGET SndFile::sndfile)
-        find_dependency(SndFile)
-    endif()
+        if(NOT DEFINED CMAKE_FIND_PACKAGE_PREFER_CONFIG)
+            set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
+        endif()
 
-    if(SDL3MIXER_FLAC_LIBFLAC AND NOT SDL3MIXER_VENDORED AND NOT TARGET FLAC::FLAC)
-        find_dependency(FLAC)
-    endif()
+        if(SDL3MIXER_SNDFILE AND NOT TARGET SndFile::sndfile)
+            find_dependency(SndFile)
+        endif()
 
-    if(SDL3MIXER_MOD_MODPLUG AND NOT SDL3MIXER_VENDORED AND NOT TARGET modplug::modplug)
-        find_dependency(modplug)
-    endif()
+        if(SDL3MIXER_FLAC_LIBFLAC AND NOT TARGET FLAC::FLAC)
+            find_dependency(FLAC)
+        endif()
 
-    if(SDL3MIXER_MOD_XMP AND NOT SDL3MIXER_VENDORED AND NOT TARGET libxmp::libxmp)
-        find_dependency(libxmp)
-    endif()
+        if(SDL3MIXER_MOD_MODPLUG AND NOT TARGET modplug::modplug)
+            find_dependency(modplug)
+        endif()
 
-    if(SDL3MIXER_MOD_XMP_LITE AND NOT SDL3MIXER_VENDORED AND NOT TARGET libxmp-lite::libxmp-lite)
-        find_dependency(libxmp-lite)
-    endif()
+        if(SDL3MIXER_MOD_XMP AND NOT TARGET libxmp::libxmp)
+            find_dependency(libxmp)
+        endif()
 
-    if(SDL3MIXER_MP3_MPG123 AND NOT SDL3MIXER_VENDORED AND NOT TARGET MPG123::mpg123)
-        find_dependency(mpg123)
-    endif()
+        if(SDL3MIXER_MOD_XMP_LITE AND NOT TARGET libxmp-lite::libxmp-lite)
+            find_dependency(libxmp-lite)
+        endif()
 
-    if(SDL3MIXER_MIDI_FLUIDSYNTH AND NOT SDL3MIXER_VENDORED AND NOT TARGET FluidSynth::libfluidsynth)
-        find_dependency(FluidSynth)
-    endif()
+        if(SDL3MIXER_MP3_MPG123 AND NOT TARGET MPG123::mpg123)
+            find_dependency(mpg123)
+        endif()
 
-    if(SDL3MIXER_VORBIS_TREMOR AND NOT SDL3MIXER_VENDORED AND NOT TARGET tremor::tremor)
-        find_dependency(tremor)
-    endif()
+        if(SDL3MIXER_MIDI_FLUIDSYNTH AND NOT TARGET FluidSynth::libfluidsynth)
+            find_dependency(FluidSynth)
+        endif()
 
-    if(SDL3MIXER_VORBIS_VORBISFILE AND NOT SDL3MIXER_VENDORED AND NOT TARGET Vorbis::vorbisfile)
-        find_dependency(Vorbis)
-    endif()
+        if(SDL3MIXER_VORBIS_TREMOR AND NOT TARGET tremor::tremor)
+            find_dependency(tremor)
+        endif()
 
-    if(SDL3MIXER_OPUS AND NOT SDL3MIXER_VENDORED AND NOT TARGET OpusFile::opusfile)
-        find_dependency(OpusFile)
-    endif()
+        if(SDL3MIXER_VORBIS_VORBISFILE AND NOT TARGET Vorbis::vorbisfile)
+            find_dependency(Vorbis)
+        endif()
 
-    if(SDL3MIXER_WAVPACK AND NOT SDL3MIXER_VENDORED AND NOT TARGET WavPack::WavPack)
-        find_dependency(wavpack)
-    endif()
+        if(SDL3MIXER_OPUS AND NOT TARGET OpusFile::opusfile)
+            find_dependency(OpusFile)
+        endif()
+
+        if(SDL3MIXER_WAVPACK AND NOT TARGET WavPack::WavPack)
+            find_dependency(wavpack)
+        endif()
+
+        set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
+        unset(_sdl_cmake_module_path)
 
-    if((NOT SDL3MIXER_VENDORED AND SDL3MIXER_MOD_MODPLUG) OR (HAIKU AND SDL3MIXER_MIDI_NATIVE))
-        include(CheckLanguage)
-        check_language(CXX)
-        if(NOT CMAKE_CXX_COMPILER)
-            message(WARNING "CXX language not enabled. Linking to SDL3_mixer::SDL3_mixer-static might fail.")
+        if(HAIKU AND SDL3MIXER_MIDI_NATIVE)
+            include(CheckLanguage)
+            check_language(CXX)
+            if(NOT CMAKE_CXX_COMPILER)
+                message(WARNING "CXX language not enabled. Linking to SDL3_mixer::SDL3_mixer-static might fail.")
+            endif()
         endif()
     endif()
-    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_mixer-static-targets.cmake")
-endif()
 
-if(NOT SDL3MIXER_VENDORED)
-    set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
-    unset(_sdl_cmake_module_path)
+    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_mixer-static-targets.cmake")
 endif()
 
-check_required_components(SDL3_mixer)
-
 function(_sdl_create_target_alias_compat NEW_TARGET TARGET)
     if(CMAKE_VERSION VERSION_LESS "3.18")
         # Aliasing local targets is not supported on CMake < 3.18, so make it global.
diff --git a/cmake/test/CMakeLists.txt b/cmake/test/CMakeLists.txt
index 32d37f1e..aebc7059 100644
--- a/cmake/test/CMakeLists.txt
+++ b/cmake/test/CMakeLists.txt
@@ -20,16 +20,16 @@ if(TEST_SHARED)
     find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     find_package(SDL3_mixer REQUIRED CONFIG)
     add_executable(main_shared main.c)
-    target_link_libraries(main_shared PRIVATE SDL3::SDL3 SDL3_mixer::SDL3_mixer)
+    target_link_libraries(main_shared PRIVATE SDL3::SDL3 SDL3_mixer::SDL3_mixer-shared)
 endif()
 
 if(TEST_STATIC)
-    find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3-static)
+    find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     # some static vendored libraries use c++ (enable CXX after `find_package` might show a warning)
     enable_language(CXX)
     find_package(SDL3_mixer REQUIRED CONFIG)
     add_executable(main_static main.c)
-    target_link_libraries(main_static PRIVATE SDL3::SDL3-static SDL3_mixer::SDL3_mixer-static)
+    target_link_libraries(main_static PRIVATE SDL3::SDL3 SDL3_mixer::SDL3_mixer-static)
 endif()
 
 feature_summary(WHAT ALL)