SDL_mixer: cmake: add support for vendored libxmp

From 9ad5eb2c35b72e6a69e381e94471ddbfb2ad8a6c Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sun, 17 Jul 2022 22:49:44 +0200
Subject: [PATCH] cmake: add support for vendored libxmp

---
 CMakeLists.txt  | 50 +++++++++++++++++++++++++++++++++----------------
 external/libxmp |  2 +-
 2 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index dfba021d..d73c2cea 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -82,7 +82,7 @@ cmake_dependent_option(SDL2MIXER_MOD_MODPLUG "Support loading MOD music via modp
 cmake_dependent_option(SDL2MIXER_MOD_MODPLUG_SHARED "Dynamically load modplug" "${SDL2MIXER_DEPS_SHARED}" SDL2MIXER_MOD_MODPLUG OFF)
 
 cmake_dependent_option(SDL2MIXER_MOD_XMP "Support loading MOD music via libxmp" ON SDL2MIXER_MOD OFF)
-cmake_dependent_option(SDL2MIXER_MOD_XMP_LITE "Use libxmp-lite instead of libxmp" OFF SDL2MIXER_MOD_XMP OFF)
+cmake_dependent_option(SDL2MIXER_MOD_XMP_LITE "Use libxmp-lite instead of libxmp" OFF "SDL2MIXER_MOD_XMP;NOT SDL2MIXER_VENDORED" OFF)
 cmake_dependent_option(SDL2MIXER_MOD_XMP_SHARED "Dynamically load libxmp(-lite)" "${SDL2MIXER_DEPS_SHARED}" SDL2MIXER_MOD_XMP OFF)
 
 if(SDL2MIXER_MOD AND NOT (SDL2MIXER_MOD_MODPLUG OR SDL2MIXER_MOD_XMP))
@@ -583,24 +583,42 @@ endif()
 if(SDL2MIXER_MOD_XMP)
     target_compile_definitions(SDL2_mixer PRIVATE MUSIC_MOD_XMP)
     if(SDL2MIXER_VENDORED)
-        message(STATUS "Using vendored libxmp/libxmp-lite")
-        message(WARNING "Neither libxmp or libxmp-lite are vendored. Using system libxmp instead.")
-    endif()
-    if(SDL2MIXER_MOD_XMP_LITE)
-        message(STATUS "Using system libxmp-lite")
-        find_package(libxmp-lite REQUIRED)
-        set(tgt_xmp libxmp-lite::libxmp-lite)
-        set(xmp_name libxmp-lite)
-        if(NOT SDL2MIXER_MOD_XMP_SHARED)
-            list(APPEND PC_REQUIRES libxmplite)
+        message(STATUS "Using vendored libxmp")
+        sdl_check_project_in_subfolder(external/libxmp libxmp SDL2MIXER_VENDORED)
+        if(SDL2MIXER_MOD_XMP_SHARED)
+            set(BUILD_STATIC OFF)
+            set(BUILD_SHARED ON)
+            set(tgt_xmp xmp_shared)
+        else()
+            set(BUILD_STATIC ON)
+            set(BUILD_SHARED OFF)
+            set(tgt_xmp xmp_static)
         endif()
-    else()
-        message(STATUS "Using system libxmp")
-        find_package(libxmp REQUIRED)
-        set(tgt_xmp libxmp::libxmp)
         set(xmp_name libxmp)
+        add_subdirectory(external/libxmp EXCLUDE_FROM_ALL)
+        if(SDL2MIXER_MOD_XMP_SHARED OR NOT SDL2MIXER_BUILD_SHARED_LIBS)
+            list(APPEND INSTALL_EXTRA_TARGETS ${tgt_xmp})
+        endif()
         if(NOT SDL2MIXER_MOD_XMP_SHARED)
-            list(APPEND PC_REQUIRES libxmp)
+            list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:${tgt_xmp}>)
+        endif()
+    else()
+        if(SDL2MIXER_MOD_XMP_LITE)
+            message(STATUS "Using system libxmp-lite")
+            find_package(libxmp-lite REQUIRED)
+            set(tgt_xmp libxmp-lite::libxmp-lite)
+            set(xmp_name libxmp-lite)
+            if(NOT SDL2MIXER_MOD_XMP_SHARED)
+                list(APPEND PC_REQUIRES libxmplite)
+            endif()
+        else()
+            message(STATUS "Using system libxmp")
+            find_package(libxmp REQUIRED)
+            set(tgt_xmp libxmp::libxmp)
+            set(xmp_name libxmp)
+            if(NOT SDL2MIXER_MOD_XMP_SHARED)
+                list(APPEND PC_REQUIRES libxmp)
+            endif()
         endif()
     endif()
     if(SDL2MIXER_MOD_XMP_SHARED)
diff --git a/external/libxmp b/external/libxmp
index 1d71f847..0e40b134 160000
--- a/external/libxmp
+++ b/external/libxmp
@@ -1 +1 @@
-Subproject commit 1d71f84719ab970606c46ea824b7d5a7a014feaf
+Subproject commit 0e40b1349bf60011eff6d78fe128e5a95d93408d