SDL_mixer: cmake: create SDL3_mixer::SDL3_mixer-shared for shared mixer library

From eac3063d3982dead5d8ddae3b1086f9df00e79ac Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 5 Jun 2023 03:16:08 +0200
Subject: [PATCH] cmake: create SDL3_mixer::SDL3_mixer-shared for shared mixer
 library

---
 CMakeLists.txt                  | 202 ++++++++++++++++----------------
 cmake/SDL3_mixerConfig.cmake.in |  19 +++
 2 files changed, 121 insertions(+), 100 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f9157cca..7e329e8b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -197,12 +197,10 @@ endif()
 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)
-    set(sdl3_target_name SDL3::SDL3)
+    set(sdl3_mixer_target_name SDL3_mixer-shared)
+    set(sdl3_target_name SDL3::SDL3-shared)
 else()
-    set(sdl3_mixer_export_name SDL3_mixer-static)
-    set(sdl3_mixer_install_name_infix static)
+    set(sdl3_mixer_target_name SDL3_mixer-static)
     set(sdl3_target_name SDL3::SDL3-static)
 endif()
 
@@ -225,7 +223,7 @@ if(SDL3MIXER_WERROR)
 endif()
 
 set(BUILD_SHARED_LIBS ${SDL3MIXER_BUILD_SHARED_LIBS})
-add_library(SDL3_mixer
+add_library(${sdl3_mixer_target_name}
     src/codecs/load_aiff.c
     src/codecs/load_voc.c
     src/codecs/load_sndfile.c
@@ -253,8 +251,11 @@ add_library(SDL3_mixer
     src/music.c
     src/utils.c
 )
-add_library(SDL3_mixer::${sdl3_mixer_export_name} ALIAS SDL3_mixer)
-target_include_directories(SDL3_mixer
+add_library(SDL3_mixer::${sdl3_mixer_target_name} ALIAS ${sdl3_mixer_target_name})
+if(NOT TARGET SDL3_mixer::SDL3_mixer)
+    add_library(SDL3_mixer::SDL3_mixer ALIAS ${sdl3_mixer_target_name})
+endif()
+target_include_directories(${sdl3_mixer_target_name}
     PUBLIC
         "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
         "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/SDL3>"
@@ -264,34 +265,35 @@ target_include_directories(SDL3_mixer
         src
         src/codecs
 )
-target_compile_definitions(SDL3_mixer PRIVATE
+target_compile_definitions(${sdl3_mixer_target_name} PRIVATE
     BUILD_SDL
     SDL_BUILD_MAJOR_VERSION=${MAJOR_VERSION}
     SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
     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>)
+target_link_libraries(${sdl3_mixer_target_name} PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
+target_link_libraries(${sdl3_mixer_target_name} PRIVATE $<BUILD_INTERFACE:sdl3mixer_build_options>)
 if(WIN32 AND BUILD_SHARED_LIBS)
-    target_sources(SDL3_mixer PRIVATE
+    target_sources(${sdl3_mixer_target_name} PRIVATE
         version.rc
     )
 endif()
-set_target_properties(SDL3_mixer PROPERTIES
+set_target_properties(${sdl3_mixer_target_name} PROPERTIES
     DEFINE_SYMBOL DLL_EXPORT
-    EXPORT_NAME ${sdl3_mixer_export_name}
+    EXPORT_NAME ${sdl3_mixer_target_name}
     C_VISIBILITY_PRESET "hidden"
+    OUTPUT_NAME "SDL3_mixer"
 )
 if(NOT ANDROID)
     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
+        set_target_properties(${sdl3_mixer_target_name} PROPERTIES
             SOVERSION "${DYLIB_COMPAT_VERSION}"
             VERSION "${DYLIB_CURRENT_VERSION}"
         )
     else()
-        set_target_properties(SDL3_mixer PROPERTIES
+        set_target_properties(${sdl3_mixer_target_name} PROPERTIES
             SOVERSION "${SO_VERSION_MAJOR}"
             VERSION "${SO_VERSION}"
         )
@@ -299,13 +301,13 @@ if(NOT ANDROID)
 endif()
 if(SDL3MIXER_BUILD_SHARED_LIBS)
     if(WIN32)
-        set_target_properties(SDL3_mixer PROPERTIES
+        set_target_properties(${sdl3_mixer_target_name} PROPERTIES
             PREFIX ""
         )
     endif()
 else()
     if(MSVC)
-        set_target_properties(SDL3_mixer PROPERTIES
+        set_target_properties(${sdl3_mixer_target_name} PROPERTIES
             OUTPUT_NAME "SDL3_mixer-static"
         )
     endif()
@@ -313,12 +315,12 @@ endif()
 
 # Use `Compatible Interface Properties` to ensure a shared SDL3_mixer is linked to a shared SDL3 library
 if(SDL3MIXER_BUILD_SHARED_LIBS)
-    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)
+    set_property(TARGET ${sdl3_mixer_target_name} PROPERTY INTERFACE_SDL3_SHARED ${SDL3MIXER_BUILD_SHARED_LIBS})
+    set_property(TARGET ${sdl3_mixer_target_name} APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED)
 endif()
 
 if(SDL3MIXER_BUILD_SHARED_LIBS)
-    sdl_target_link_options_no_undefined(SDL3_mixer)
+    sdl_target_link_options_no_undefined(${sdl3_mixer_target_name})
 endif()
 
 if(SDL3MIXER_BUILD_SHARED_LIBS)
@@ -331,20 +333,20 @@ set(PC_LIBS)
 set(PC_REQUIRES)
 
 if(SDL3MIXER_CMD)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_CMD)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_CMD)
     set(fork_found OFF)
     if(NOT fork_found)
         check_symbol_exists(fork unistd.h HAVE_FORK)
         if(HAVE_FORK)
             set(fork_found ON)
-            target_compile_definitions(SDL3_mixer PRIVATE HAVE_FORK)
+            target_compile_definitions(${sdl3_mixer_target_name} PRIVATE HAVE_FORK)
         endif()
     endif()
     if(NOT fork_found)
         check_symbol_exists(vfork unistd.h HAVE_VFORK)
         if(HAVE_VFORK)
             set(fork_found ON)
-            target_compile_definitions(SDL3_mixer PRIVATE HAVE_VFORK)
+            target_compile_definitions(${sdl3_mixer_target_name} PRIVATE HAVE_VFORK)
         endif()
     endif()
     if(NOT fork_found)
@@ -353,7 +355,7 @@ if(SDL3MIXER_CMD)
 endif()
 
 if(SDL3MIXER_SNDFILE)
-    target_compile_definitions(SDL3_mixer PRIVATE LOAD_SNDFILE)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE LOAD_SNDFILE)
     if(SDL3MIXER_VENDORED)
         message(STATUS "Using vendored libsndfile")
         message(FATAL_ERROR "libsndfile is not vendored.")
@@ -365,19 +367,19 @@ if(SDL3MIXER_SNDFILE)
         endif()
     endif()
     if(SDL3MIXER_SNDFILE_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:SndFile::sndfile,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:SndFile::sndfile,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:SndFile::sndfile,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_sndfile SndFile::sndfile)
         message(STATUS "Dynamic libsndfile: ${dynamic_sndfile}")
-        target_compile_definitions(SDL3_mixer PRIVATE "SNDFILE_DYNAMIC=\"${dynamic_sndfile}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "SNDFILE_DYNAMIC=\"${dynamic_sndfile}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer SndFile::sndfile)
+            add_dependencies(${sdl3_mixer_target_name} SndFile::sndfile)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE SndFile::sndfile)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE SndFile::sndfile)
     endif()
 endif()
 
@@ -397,7 +399,7 @@ if(SDL3MIXER_OGG)
 endif()
 
 if(SDL3MIXER_OPUS)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OPUS)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_OPUS)
     if(SDL3MIXER_VENDORED)
         # vendored libogg already handled
         if(NOT TARGET ogg)
@@ -425,7 +427,7 @@ if(SDL3MIXER_OPUS)
             COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/opus"
             COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/opusfile.h" "${CMAKE_CURRENT_BINARY_DIR}/opus/opusfile.h"
         )
-        target_include_directories(SDL3_mixer PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
 
         if(NOT TARGET OpusFile::opusfile)
             add_library(OpusFile::opusfile ALIAS opusfile)
@@ -444,30 +446,30 @@ if(SDL3MIXER_OPUS)
         endif()
     endif()
     if(SDL3MIXER_OPUS_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:OpusFile::opusfile,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:OpusFile::opusfile,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:OpusFile::opusfile,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_opusfile OpusFile::opusfile)
         message(STATUS "Dynamic opus (opusfile): ${dynamic_opusfile}")
-        target_compile_definitions(SDL3_mixer PRIVATE "OPUS_DYNAMIC=\"${dynamic_opusfile}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "OPUS_DYNAMIC=\"${dynamic_opusfile}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer OpusFile::opusfile)
+            add_dependencies(${sdl3_mixer_target_name} OpusFile::opusfile)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE OpusFile::opusfile)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE OpusFile::opusfile)
     endif()
 endif()
 
 if(SDL3MIXER_VORBIS_STB)
     message(STATUS "Enabled ogg music: using stb_vorbis")
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OGG)
-    target_compile_definitions(SDL3_mixer PRIVATE OGG_USE_STB)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_OGG)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE OGG_USE_STB)
 endif()
 
 if(SDL3MIXER_VORBIS_TREMOR)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OGG OGG_USE_TREMOR)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_OGG OGG_USE_TREMOR)
     if(SDL3MIXER_VENDORED)
         # vendored libogg already handled
         if(NOT TARGET ogg)
@@ -486,7 +488,7 @@ if(SDL3MIXER_VORBIS_TREMOR)
             COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/tremor"
             COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/ivorbisfile.h" "${CMAKE_CURRENT_BINARY_DIR}/tremor/ivorbisfile.h"
         )
-        target_include_directories(SDL3_mixer PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
         if(SDL3MIXER_VORBIS_TREMOR_SHARED OR NOT SDL3MIXER_BUILD_SHARED_LIBS)
             list(APPEND INSTALL_EXTRA_TARGETS vorbisidec)
         endif()
@@ -501,24 +503,24 @@ if(SDL3MIXER_VORBIS_TREMOR)
         endif()
     endif()
     if(SDL3MIXER_VORBIS_TREMOR_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:tremor::tremor,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:tremor::tremor,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:tremor::tremor,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_tremor tremor::tremor)
         message(STATUS "Dynamic vorbis (tremor): ${dynamic_tremor}")
-        target_compile_definitions(SDL3_mixer PRIVATE "OGG_DYNAMIC=\"${dynamic_tremor}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "OGG_DYNAMIC=\"${dynamic_tremor}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer tremor::tremor)
+            add_dependencies(${sdl3_mixer_target_name} tremor::tremor)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE tremor::tremor)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE tremor::tremor)
     endif()
 endif()
 
 if(SDL3MIXER_VORBIS_VORBISFILE)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_OGG)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_OGG)
     if(SDL3MIXER_VENDORED)
         # vendored libogg already handled
         if(NOT TARGET ogg)
@@ -545,24 +547,24 @@ if(SDL3MIXER_VORBIS_VORBISFILE)
         endif()
     endif()
     if(SDL3MIXER_VORBIS_VORBISFILE_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:Vorbis::vorbisfile,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:Vorbis::vorbisfile,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:Vorbis::vorbisfile,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_vorbisfile Vorbis::vorbisfile)
         message(STATUS "Dynamic vorbisfile: ${dynamic_vorbisfile}")
-        target_compile_definitions(SDL3_mixer PRIVATE "OGG_DYNAMIC=\"${dynamic_vorbisfile}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "OGG_DYNAMIC=\"${dynamic_vorbisfile}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer Vorbis::vorbisfile)
+            add_dependencies(${sdl3_mixer_target_name} Vorbis::vorbisfile)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE Vorbis::vorbisfile)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE Vorbis::vorbisfile)
     endif()
 endif()
 
 if(SDL3MIXER_FLAC_LIBFLAC)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_FLAC_LIBFLAC)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_FLAC_LIBFLAC)
     if(SDL3MIXER_VENDORED)
         # vendored libogg already handled
         if(NOT TARGET ogg)
@@ -593,28 +595,28 @@ if(SDL3MIXER_FLAC_LIBFLAC)
         endif()
     endif()
     if(SDL3MIXER_FLAC_LIBFLAC_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:FLAC::FLAC,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:FLAC::FLAC,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:FLAC::FLAC,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_flac FLAC::FLAC)
         message(STATUS "Dynamic libflac: ${dynamic_flac}")
-        target_compile_definitions(SDL3_mixer PRIVATE "FLAC_DYNAMIC=\"${dynamic_flac}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "FLAC_DYNAMIC=\"${dynamic_flac}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer FLAC)
+            add_dependencies(${sdl3_mixer_target_name} FLAC)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE FLAC::FLAC)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE FLAC::FLAC)
     endif()
 endif()
 
 if(SDL3MIXER_FLAC_DRFLAC)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_FLAC_DRFLAC)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_FLAC_DRFLAC)
 endif()
 
 if(SDL3MIXER_GME)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_GME)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_GME)
     if(SDL3MIXER_VENDORED)
         set(BUILD_SHARED_LIBS "${SDL3MIXER_GME_SHARED}")
         set(ENABLE_UBSAN OFF CACHE BOOL "UB sanitizer")
@@ -638,24 +640,24 @@ if(SDL3MIXER_GME)
         endif()
     endif()
     if(SDL3MIXER_GME_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} 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}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "GME_DYNAMIC=\"${dynamic_gme}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer gme::gme)
+            add_dependencies(${sdl3_mixer_target_name} gme::gme)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE gme::gme)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE gme::gme)
     endif()
 endif()
 
 if(SDL3MIXER_MOD_MODPLUG)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MOD_MODPLUG)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MOD_MODPLUG)
     if(SDL3MIXER_VENDORED)
         message(STATUS "Using vendored libmodplug")
         message(FATAL_ERROR "libmodplug is not vendored.")
@@ -667,24 +669,24 @@ if(SDL3MIXER_MOD_MODPLUG)
         endif()
     endif()
     if(SDL3MIXER_MOD_MODPLUG_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:modplug::modplug,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:modplug::modplug,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:modplug::modplug,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_modplug modplug::modplug)
         message(STATUS "Dynamic modplug: ${dynamic_modplug}")
-        target_compile_definitions(SDL3_mixer PRIVATE "MODPLUG_DYNAMIC=\"${dynamic_modplug}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "MODPLUG_DYNAMIC=\"${dynamic_modplug}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer modplug::modplug)
+            add_dependencies(${sdl3_mixer_target_name} modplug::modplug)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE modplug::modplug)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE modplug::modplug)
     endif()
 endif()
 
 if(SDL3MIXER_MOD_XMP)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MOD_XMP)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MOD_XMP)
     if(SDL3MIXER_VENDORED)
         message(STATUS "Using vendored libxmp")
         sdl_check_project_in_subfolder(external/libxmp libxmp SDL3MIXER_VENDORED)
@@ -725,28 +727,28 @@ if(SDL3MIXER_MOD_XMP)
         endif()
     endif()
     if(SDL3MIXER_MOD_XMP_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:${tgt_xmp},INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:${tgt_xmp},INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:${tgt_xmp},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_xmp ${tgt_xmp})
         message(STATUS "Dynamic ${xmp_name}: ${dynamic_xmp}")
-        target_compile_definitions(SDL3_mixer PRIVATE "XMP_DYNAMIC=\"${dynamic_xmp}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "XMP_DYNAMIC=\"${dynamic_xmp}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer ${tgt_xmp})
+            add_dependencies(${sdl3_mixer_target_name} ${tgt_xmp})
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE ${tgt_xmp})
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE ${tgt_xmp})
     endif()
 endif()
 
 if(SDL3MIXER_MP3_DRMP3)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MP3_DRMP3)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MP3_DRMP3)
 endif()
 
 if(SDL3MIXER_MP3_MPG123)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MP3_MPG123)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MP3_MPG123)
     if(SDL3MIXER_VENDORED)
         message(STATUS "Using vendored mpg123")
         sdl_check_project_in_subfolder(external/mpg123/ports/cmake mpg123 SDL3MIXER_VENDORED)
@@ -771,24 +773,24 @@ if(SDL3MIXER_MP3_MPG123)
         endif()
     endif()
     if(SDL3MIXER_MP3_MPG123_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:MPG123::libmpg123,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:MPG123::libmpg123,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:MPG123::libmpg123,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_mpg123 MPG123::libmpg123)
         message(STATUS "Dynamic mpg123}: ${dynamic_mpg123}")
-        target_compile_definitions(SDL3_mixer PRIVATE "MPG123_DYNAMIC=\"${dynamic_mpg123}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "MPG123_DYNAMIC=\"${dynamic_mpg123}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer MPG123::libmpg123)
+            add_dependencies(${sdl3_mixer_target_name} MPG123::libmpg123)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE MPG123::libmpg123)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE MPG123::libmpg123)
     endif()
 endif()
 
 if(SDL3MIXER_MIDI_FLUIDSYNTH)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MID_FLUIDSYNTH)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MID_FLUIDSYNTH)
     if(SDL3MIXER_VENDORED)
         message(STATUS "Using vendored FluidSynth")
         message(FATAL_ERROR "FluidSynth is not vendored.")
@@ -800,44 +802,44 @@ if(SDL3MIXER_MIDI_FLUIDSYNTH)
         endif()
     endif()
     if(SDL3MIXER_MIDI_FLUIDSYNTH_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:FluidSynth::libfluidsynth,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:FluidSynth::libfluidsynth,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:FluidSynth::libfluidsynth,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_fluidsynth FluidSynth::libfluidsynth)
         message(STATUS "Dynamic fluidsynth: ${dynamic_fluidsynth}")
-        target_compile_definitions(SDL3_mixer PRIVATE "FLUIDSYNTH_DYNAMIC=\"${dynamic_fluidsynth}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "FLUIDSYNTH_DYNAMIC=\"${dynamic_fluidsynth}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer FluidSynth::libfluidsynth)
+            add_dependencies(${sdl3_mixer_target_name} FluidSynth::libfluidsynth)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE FluidSynth::libfluidsynth)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE FluidSynth::libfluidsynth)
     endif()
 endif()
 
 if(SDL3MIXER_MIDI_NATIVE)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MID_NATIVE)
-    target_sources(SDL3_mixer PRIVATE
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MID_NATIVE)
+    target_sources(${sdl3_mixer_target_name} PRIVATE
         src/codecs/native_midi/native_midi_common.c
         src/codecs/native_midi/native_midi_common.h
     )
     if(WIN32)
-        target_sources(SDL3_mixer PRIVATE src/codecs/native_midi/native_midi_win32.c)
-        target_link_libraries(SDL3_mixer PRIVATE winmm)
+        target_sources(${sdl3_mixer_target_name} PRIVATE src/codecs/native_midi/native_midi_win32.c)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE winmm)
     elseif(APPLE)
-        target_sources(SDL3_mixer PRIVATE src/codecs/native_midi/native_midi_macosx.c)
-        target_link_libraries(SDL3_mixer PRIVATE -Wl,-framework,AudioToolbox -Wl,-framework,AudioUnit -Wl,-framework,CoreServices)
+        target_sources(${sdl3_mixer_target_name} PRIVATE src/codecs/native_midi/native_midi_macosx.c)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE -Wl,-framework,AudioToolbox -Wl,-framework,AudioUnit -Wl,-framework,CoreServices)
     elseif(HAIKU)
         enable_language(CXX)
-        target_sources(SDL3_mixer PRIVATE src/codecs/native_midi/native_midi_haiku.cpp)
-        target_link_libraries(SDL3_mixer PRIVATE midi)
+        target_sources(${sdl3_mixer_target_name} PRIVATE src/codecs/native_midi/native_midi_haiku.cpp)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE midi)
     endif()
 endif()
 
 if(SDL3MIXER_MIDI_TIMIDITY)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_MID_TIMIDITY)
-    target_sources(SDL3_mixer PRIVATE
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_MID_TIMIDITY)
+    target_sources(${sdl3_mixer_target_name} PRIVATE
         src/codecs/timidity/common.c
         src/codecs/timidity/instrum.c
         src/codecs/timidity/mix.c
@@ -851,11 +853,11 @@ if(SDL3MIXER_MIDI_TIMIDITY)
 endif()
 
 if(SDL3MIXER_WAVE)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_WAV)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_WAV)
 endif()
 
 if(SDL3MIXER_WAVPACK)
-    target_compile_definitions(SDL3_mixer PRIVATE MUSIC_WAVPACK)
+    target_compile_definitions(${sdl3_mixer_target_name} PRIVATE MUSIC_WAVPACK)
     if(SDL3MIXER_VENDORED)
         message(STATUS "Using vendored WevPack")
         sdl_check_project_in_subfolder(external/wavpack WavPack SDL3MIXER_VENDORED)
@@ -871,7 +873,7 @@ if(SDL3MIXER_WAVPACK)
         if(NOT SDL3MIXER_WAVPACK_SHARED)
             list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:WavPack::WavPack>)
         endif()
-        target_compile_definitions(SDL3_mixer PRIVATE HAVE_WAVPACK_H)
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE HAVE_WAVPACK_H)
     else()
         message(STATUS "Using system WavPack")
         find_package(wavpack REQUIRED)
@@ -880,19 +882,19 @@ if(SDL3MIXER_WAVPACK)
         endif()
     endif()
     if(SDL3MIXER_WAVPACK_SHARED)
-        target_include_directories(SDL3_mixer PRIVATE
+        target_include_directories(${sdl3_mixer_target_name} PRIVATE
             $<TARGET_PROPERTY:WavPack::WavPack,INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:WavPack::WavPack,INTERFACE_INCLUDE_DIRECTORIES>
             $<TARGET_PROPERTY:WavPack::WavPack,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
         )
         target_get_dynamic_library(dynamic_wavpack WavPack::WavPack)
         message(STATUS "Dynamic WavPack: ${dynamic_wavpack}")
-        target_compile_definitions(SDL3_mixer PRIVATE "WAVPACK_DYNAMIC=\"${dynamic_wavpack}\"")
+        target_compile_definitions(${sdl3_mixer_target_name} PRIVATE "WAVPACK_DYNAMIC=\"${dynamic_wavpack}\"")
         if(SDL3MIXER_VENDORED)
-            add_dependencies(SDL3_mixer WavPack::WavPack)
+            add_dependencies(${sdl3_mixer_target_name} WavPack::WavPack)
         endif()
     else()
-        target_link_libraries(SDL3_mixer PRIVATE WavPack::WavPack)
+        target_link_libraries(${sdl3_mixer_target_name} PRIVATE WavPack::WavPack)
     endif()
 endif()
 
@@ -901,7 +903,7 @@ set(BUILD_SHARED_LIBS ${SDL3MIXER_BUILD_SHARED_LIBS})
 
 if(SDL3MIXER_INSTALL)
     install(
-        TARGETS SDL3_mixer
+        TARGETS ${sdl3_mixer_target_name}
         EXPORT SDL3MixerTargets
         ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
         LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
@@ -964,7 +966,7 @@ if(SDL3MIXER_INSTALL)
         COMPONENT devel
     )
     install(EXPORT SDL3MixerTargets
-        FILE SDL3_mixer-${sdl3_mixer_install_name_infix}-targets.cmake
+        FILE ${sdl3_mixer_target_name}-targets.cmake
         NAMESPACE SDL3_mixer::
         DESTINATION "${SDL3MIXER_INSTALL_CMAKEDIR}"
         COMPONENT devel
@@ -1005,7 +1007,7 @@ if(SDL3MIXER_SAMPLES)
     add_executable(playwave playwave.c)
 
     foreach(prog playmus playwave)
-        target_link_libraries(${prog} PRIVATE SDL3_mixer::${sdl3_mixer_export_name})
+        target_link_libraries(${prog} PRIVATE SDL3_mixer::${sdl3_mixer_target_name})
         target_link_libraries(${prog} PRIVATE ${sdl3_target_name})
         if(HAVE_SIGNAL_H)
             target_compile_definitions(${prog} PRIVATE HAVE_SIGNAL_H)
diff --git a/cmake/SDL3_mixerConfig.cmake.in b/cmake/SDL3_mixerConfig.cmake.in
index b644605d..0b7200aa 100644
--- a/cmake/SDL3_mixerConfig.cmake.in
+++ b/cmake/SDL3_mixerConfig.cmake.in
@@ -126,3 +126,22 @@ if(NOT SDL3MIXER_VENDORED)
 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.
+        add_library(${NEW_TARGET} INTERFACE IMPORTED)
+        set_target_properties(${NEW_TARGET} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET}")
+    else()
+        add_library(${NEW_TARGET} ALIAS ${TARGET})
+    endif()
+endfunction()
+
+# Make sure SDL3_mixer::SDL3_mixer always exists
+if(NOT TARGET SDL3_mixer::SDL3_mixer)
+    if(TARGET SDL3_mixer::SDL3_mixer-shared)
+        _sdl_create_target_alias_compat(SDL3_mixer::SDL3_mixer SDL3_mixer::SDL3_mixer-shared)
+    else()
+        _sdl_create_target_alias_compat(SDL3_mixer::SDL3_mixer SDL3_mixer::SDL3_mixer-static)
+    endif()
+endif()