Subject: [bug#69638] [PATCH v2] gnu: sdl: Replace with sdl12-compat.

From: [email-masked]
Date: Fri, 8 Mar 2024 23:06:48 +0800

From: 宋文武 <[email-masked]>

* gnu/packages/sdl.scm (sdl12-compat): New package.
(sdl): Remove package, defined as sdl12-compat.
(sdl2): Don't inherit from sdl.
(propagated-inputs-with-sdl2): Add case for sdl12-compat.
(sdl-union): Hardcode version to "1.2.15" to avoid rebuilds.
* gnu/packages/patches/sdl-libx11-1.6.patch: Remove file.
* gnu/local.mk (dist_patch_DATA): Unregister it.

Change-Id: I843d349b3d69164cc640c7db204464a51819a0df
---
 gnu/local.mk                              |   1 -
 gnu/packages/patches/sdl-libx11-1.6.patch |  13 --
 gnu/packages/sdl.scm                      | 173 +++++++++++++---------
 3 files changed, 102 insertions(+), 85 deletions(-)
 delete mode 100644 gnu/packages/patches/sdl-libx11-1.6.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 16241ee441..0f76d0c771 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -2027,7 +2027,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/scons-test-environment.patch		\
   %D%/packages/patches/screen-hurd-path-max.patch		\
   %D%/packages/patches/scsh-nonstring-search-path.patch	\
-  %D%/packages/patches/sdl-libx11-1.6.patch			\
   %D%/packages/patches/seed-webkit.patch			\
   %D%/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch	\
   %D%/packages/patches/sendgmail-remove-domain-restriction.patch	\
diff --git a/gnu/packages/patches/sdl-libx11-1.6.patch b/gnu/packages/patches/sdl-libx11-1.6.patch
deleted file mode 100644
index 73ba9ac071..0000000000
--- a/gnu/packages/patches/sdl-libx11-1.6.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Update _XData32 declaration in SDL_x11sym.h to match that of libx11 1.6.
-
---- SDL-1.2.15/src/video/x11/SDL_x11sym.h.~1~	2012-01-19 01:30:06.000000000 -0500
-+++ SDL-1.2.15/src/video/x11/SDL_x11sym.h	2014-12-26 00:22:36.445067694 -0500
-@@ -165,7 +165,7 @@
-  */
- #ifdef LONG64
- SDL_X11_MODULE(IO_32BIT)
--SDL_X11_SYM(int,_XData32,(Display *dpy,register long *data,unsigned len),(dpy,data,len),return)
-+SDL_X11_SYM(int,_XData32,(Display *dpy,register _Xconst long *data,unsigned len),(dpy,data,len),return)
- SDL_X11_SYM(void,_XRead32,(Display *dpy,register long *data,long len),(dpy,data,len),)
- #endif
- 
diff --git a/gnu/packages/sdl.scm b/gnu/packages/sdl.scm
index 3a4aafcaa7..3d81baf368 100644
--- a/gnu/packages/sdl.scm
+++ b/gnu/packages/sdl.scm
@@ -43,6 +43,7 @@ (define-module (gnu packages sdl)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
+  #:use-module (guix build-system cmake)
   #:use-module (guix build-system copy)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
@@ -67,35 +68,48 @@ (define-module (gnu packages sdl)
   #:use-module (gnu packages xorg)
   #:export (sdl-union))
 
-(define-public sdl
+(define-public sdl2
   (package
-    (name "sdl")
-    (version "1.2.15")
+    (name "sdl2")
+    (version "2.28.5")
     (source (origin
-             (method url-fetch)
-             (uri
-              (string-append "https://libsdl.org/release/SDL-"
-                             version ".tar.gz"))
-             (sha256
-              (base32
-               "005d993xcac8236fpvd1iawkz4wqjybkpn8dbwaliqz5jfkidlyn"))
-             (patches (search-patches "sdl-libx11-1.6.patch"))))
+              (method url-fetch)
+              (uri
+               (string-append "https://libsdl.org/release/SDL2-"
+                              version ".tar.gz"))
+              (sha256
+               (base32
+                "1r36cspzv6h8abiqbbkrgm17g975p9wiziir2xabj3721dyv6b1k"))))
     (build-system gnu-build-system)
+    ;; TODO: Remove 'append' and 'cons*', was used to avoid rebuilds.
     (arguments
-     '(;; Explicitly link against shared libraries instead of dlopening them.
-       ;; For X11, ALSA, and PulseAudio.
-       ;; OpenGL library is still dlopened at runtime.
-       #:configure-flags '("--disable-alsa-shared"
-                           "--disable-pulseaudio-shared"
-                           "--disable-x11-shared"
-                           ;; Explicitly link with mesa.
-                           ;; This add mesa to libsdl's RUNPATH, to make dlopen
-                           ;; finding the libGL from mesa at runtime.
-                           "LDFLAGS=-lGL")
-
-       #:make-flags '("V=1")            ;build verbosely
-
-       #:tests? #f)) ; no check target
+     (list
+      #:tests? #f                  ;no check target
+      ;; Explicitly link against shared libraries instead of dlopening them.
+      ;; For X11, ALSA, and PulseAudio.
+      ;; OpenGL library is still dlopened at runtime.
+      #:configure-flags
+      #~(append
+         '("--disable-wayland-shared"
+           "--enable-video-kmsdrm"
+           "--disable-kmsdrm-shared")
+         '("--disable-alsa-shared"
+           "--disable-pulseaudio-shared"
+           "--disable-x11-shared"
+           ;; Explicitly link with mesa.
+           ;; This add mesa to libsdl's RUNPATH, to make dlopen
+           ;; finding the libGL from mesa at runtime.
+           "LDFLAGS=-lGL"))
+      #:make-flags
+      #~(cons*
+         ;; SDL dlopens libudev and libvulkan, so make sure they are in
+         ;; rpath. This overrides the LDFLAG set in sdl’s configure-flags,
+         ;; which isn’t necessary as sdl2 includes Mesa by default.
+         (string-append "LDFLAGS=-Wl,-rpath,"
+                        #$(this-package-input "eudev") "/lib"
+                        ",-rpath,"
+                        #$(this-package-input "vulkan-loader") "/lib")
+         '("V=1"))))                  ;build verbosely
     (propagated-inputs
      ;; SDL headers include X11 headers.
      (list libx11
@@ -105,60 +119,75 @@ (define-public sdl
            ;; change in pkg-config.
            mesa))
     (native-inputs (list pkg-config))
-    (inputs (list libxrandr glu alsa-lib pulseaudio))
+    (inputs
+     ;; SDL2 needs to be built with ibus support otherwise some systems
+     ;; experience a bug where input events are doubled.
+     ;;
+     ;; For more information, see: https://dev.solus-project.com/T1721
+     (list
+      libxrandr
+      glu
+      alsa-lib
+      pulseaudio
+      dbus
+      eudev                             ;for discovering input devices
+      glib
+      ibus-minimal
+      libxkbcommon
+      libxcursor                        ;enables X11 cursor support
+      vulkan-loader
+      wayland
+      wayland-protocols))
     (outputs '("out" "debug"))
     (synopsis "Cross platform game development library")
-    (description "Simple DirectMedia Layer is a cross-platform development
-library designed to provide low level access to audio, keyboard, mouse,
-joystick, and graphics hardware.")
+    (description
+     "Simple DirectMedia Layer is a cross-platform development library designed to
+provide low level access to audio, keyboard, mouse, joystick, and graphics
+hardware.")
     (home-page "https://libsdl.org/")
-    (license license:lgpl2.1)))
+    (license license:bsd-3)))
 
-(define-public sdl2
+(define-public sdl12-compat
   (package
-    (inherit sdl)
-    (name "sdl2")
-    (version "2.28.5")
+    (name "sdl12-compat")
+    (version "1.2.68")
     (source (origin
-              (method url-fetch)
-              (uri
-               (string-append "https://libsdl.org/release/SDL2-"
-                              version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/libsdl-org/sdl12-compat")
+                    (commit (string-append "release-" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1r36cspzv6h8abiqbbkrgm17g975p9wiziir2xabj3721dyv6b1k"))))
+                "0qsjlzi1wqszi6k4pc3k9xdvzid5cx6ql8wbjw6qdapzpvf6arvz"))))
+    (build-system cmake-build-system)
     (arguments
-     (substitute-keyword-arguments (package-arguments sdl)
-       ((#:configure-flags flags)
-        #~(append '("--disable-wayland-shared" "--enable-video-kmsdrm"
-                    "--disable-kmsdrm-shared")
-                  #$flags))
-       ((#:make-flags flags ''())
-        #~(cons*
-           ;; SDL dlopens libudev and libvulkan, so make sure they are in
-           ;; rpath. This overrides the LDFLAG set in sdl’s configure-flags,
-           ;; which isn’t necessary as sdl2 includes Mesa by default.
-           (string-append "LDFLAGS=-Wl,-rpath,"
-                          #$(this-package-input "eudev") "/lib"
-                          ",-rpath,"
-                          #$(this-package-input "vulkan-loader") "/lib")
-           #$flags))))
-    (inputs
-     ;; SDL2 needs to be built with ibus support otherwise some systems
-     ;; experience a bug where input events are doubled.
-     ;;
-     ;; For more information, see: https://dev.solus-project.com/T1721
-     (modify-inputs (package-inputs sdl)
-       (append dbus
-               eudev                    ;for discovering input devices
-               glib
-               ibus-minimal
-               libxkbcommon
-               libxcursor               ;enables X11 cursor support
-               vulkan-loader
-               wayland
-               wayland-protocols)))
-    (license license:bsd-3)))
+     (list #:tests? #f                  ;no check target
+           #:configure-flags
+           ;; This add SDL2 to sdl12-compat's RUNPATH, to make dlopen finding the
+           ;; libSDL2 at runtime.
+           #~'("-DCMAKE_SHARED_LINKER_FLAGS=-lSDL2")
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'install 'install-sdl.pc
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((pcdir (string-append (assoc-ref outputs "out")
+                                               "/lib/pkgconfig")))
+                     (symlink (string-append pcdir "/sdl12_compat.pc")
+                              (string-append pcdir "/sdl.pc"))))))))
+    (inputs (list sdl2))
+    (propagated-inputs (list glu))      ;required by SDL_opengl.h
+    (synopsis "Cross platform game development library")
+    (description "Simple DirectMedia Layer is a cross-platform development library
+designed to provide low level access to audio, keyboard, mouse, joystick, and
+graphics hardware.  This package is a compatibility layer; it provides a binary and
+source compatible API for programs written against SDL 1.2, but it uses SDL 2.0
+behind the scenes.")
+    (home-page "https://libsdl.org/")
+    ;; dr_mp3 code are under public domain.
+    (license (list license:zlib license:public-domain))))
+
+(define-public sdl sdl12-compat)
 
 (define-public sdl2-2.0
   (package
@@ -423,7 +452,7 @@ (define* (sdl-union #:optional (packages (list sdl sdl-gfx sdl-net sdl-ttf
 If PACKAGES are not specified, all SDL packages are used."
   (package
     (name "sdl-union")
-    (version (package-version sdl))
+    (version "1.2.15")                  ;TODO: use correct SDL version
     (source #f)
     (build-system trivial-build-system)
     (arguments
@@ -452,6 +481,8 @@ (define (propagated-inputs-with-sdl2 package)
   (map (match-lambda
          (("sdl" _)
           `("sdl2" ,sdl2))
+         (("sdl12-compat" _)
+          `("sdl2" ,sdl2))
          (other other))
        (package-propagated-inputs package)))

base-commit: de3f86443837b7bd6e3bad11dbaeed2550d4207c
-- 
2.41.0