ambevar-dotfiles/.guix-packages/ambrevar/streetsofrage.scm

269 lines
12 KiB
Scheme

(define-module (ambrevar streetsofrage)
#:use-module (ice-9 match)
#:use-module ((guix licenses) :prefix license:)
#:use-module (guix packages)
#:use-module (guix build-system trivial)
#:use-module (guix download)
#:use-module (gnu packages base)
#:use-module (gnu packages bash)
#:use-module (gnu packages compression)
#:use-module (gnu packages elf)
#:use-module (gnu packages gcc)
#:use-module (gnu packages image)
#:use-module (gnu packages linux)
#:use-module (gnu packages sdl)
#:use-module (gnu packages tls))
(define (to32 package64)
"Build package for i686-linux.
Only x86_64-linux and i686-linux are supported.
- If i686-linux, return the package unchanged.
- If x86_64-linux, return the 32-bit version of the package."
(match (%current-system)
("x86_64-linux"
(package
(inherit package64)
(name (string-append (package-name package64) "32"))
(arguments `(#:system "i686-linux"
,@(package-arguments package64)))))
(_ package64)))
;; TODO: Package https://aur.archlinux.org/packages/bennugd-core/.
(define streets-of-rage-remake-containerized
(package
(name "streets-of-rage-remake-containerized")
(version "5.1")
(source (origin
(method url-fetch)
(uri (string-append "http://launchpad.net/~ubuntugames/+archive/ubuntu/games/+files/sorr_"
version ".orig.tar.gz"))
(sha256
(base32
"1gld4i6ma265j7jw06c1drfp7pbg3n8dpm4lg9xgg28dkl5flwai"))))
(build-system trivial-build-system)
(inputs
`(("bash" ,bash-minimal)
("glibc" ,(to32 glibc))
("zlib" ,(to32 zlib))
("alsa-lib" ,(to32 alsa-lib)) ; TODO: Do we really need alsa-lib?
("sdl" ,(to32 sdl))
("sdl-mixer" ,(to32 sdl-mixer))
("libpng" ,(to32 libpng-1.2))))
(native-inputs
`(("tar" ,tar)
("gzip" ,gzip)))
(arguments
`(#:modules ((guix build utils))
#:builder
(begin
(use-modules (guix build utils))
(let ((out (assoc-ref %outputs "out")))
(setenv "PATH" (string-append
(assoc-ref %build-inputs "gzip") "/bin:"
(assoc-ref %build-inputs "tar") "/bin"))
(invoke "tar" "xvf" (assoc-ref %build-inputs "source"))
(mkdir-p out)
(copy-recursively "." out)
(chdir out)
;; (mkdir-p "share/applications/")
;; (rename-file "sorr.desktop" "share/applications/sorr.desktop")
;; (mkdir-p "share/icons/hicolor/48x48/apps/")
;; (rename-file "sorr.png" "share/icons/hicolor/48x48/apps/sorr.png")
;; (mkdir-p "bin")
;; (rename-file "bgdi" "bin/bgdi")
;; (rename-file "data" "lib")
;; (mkdir-p "bin")
;; (rename-file "bennugd/libbgdrtm.so" "lib/libbgdrtm.so")
;; (mkdir-p "share/streetsofrageremake")
;; (for-each (lambda (f) (rename-file f (string-append "share/streetsofrageremake/" f)))
;; '("SorMaker.dat" "SorR.dat" "manual" "manual.html"
;; "mod" "palettes" "Readme.txt"))
(delete-file "sorr")
;; Remove the unneeded executable bit.
(for-each (lambda (file)
(chmod file #o644))
(find-files "." ".*"))
(chmod "bgdi" #o755)
;; TODO: Remove bennugd/ once all libs are available as inputs:
;; libSDL-1.2.so.0
;; libSDL_mixer-1.2.so.0
;; libcrypto.so.1.0.0
;; libdraw.so
;; libmad.so.0
;; libssl.so.1.0.0
;; libvideo.so
;; Patch the executable to use the right interpreter.
;; TODO: Sort out data from bennugd:
(for-each (lambda (f) (rename-file (string-append "bennugd/" f)
(string-append "data/" f)))
'("libbgdrtm.so" "libcrypto.so.1.0.0" "libdraw.so"))
(with-directory-excursion "data"
;; Need to prefix with "lib" otherwise we get the error:
;; libmod_map.so: cannot open shared object file: No such file or directory
(for-each (lambda (f) (rename-file f
(string-append "lib" (basename f))))
(find-files "." "mod.*")))
(let* ((bash (assoc-ref %build-inputs "bash"))
(zlib (assoc-ref %build-inputs "zlib"))
(sdl (assoc-ref %build-inputs "sdl"))
(sdl-mixer (assoc-ref %build-inputs "sdl-mixer"))
(libpng (assoc-ref %build-inputs "libpng"))
(glibc (assoc-ref %build-inputs "glibc"))
(sorr (string-append out "/sorr"))
(sorr-real (string-append out "/bgdi"))
(sorr-data (string-append out "/share/streetsofrageremake/SorR.dat")))
;; Wrap program:
(call-with-output-file sorr
(lambda (p)
;; Expose /dev/snd for sound.
(format p "\
#!~a/bin/bash
guix environment --container \
--share=/tmp/.X11-unix/ \
--share=/dev/snd \
--expose=~a/lib=/lib \
--ad-hoc streets-of-rage-remake coreutils -- \
env DISPLAY=$DISPLAY LD_LIBRARY_PATH=\"~a/lib:~a/lib:~a/lib:~a/lib:~a/lib:~a${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH\" \
~a ~a \"$@\"~%"
bash
glibc ; Need to be exposed to /lib, or else it won't start.
glibc zlib sdl sdl-mixer libpng (string-append out "/data")
sorr-real sorr-data)))
(chmod sorr 493))
#t))))
(home-page "http://www.sorrcommunity.com/t148-sor-v5-for-linux-debian-download-links")
(synopsis "Remake of the classic Streets of Rage 1, 2 and 3")
(description "Remake of the classic Streets of Rage 1, 2 and 3")
(license ((@@ (guix licenses) license) "No license"
"No URL"
""))))
(define-public streets-of-rage-remake
(package
(name "streets-of-rage-remake")
(version "5.1")
(source (origin
(method url-fetch)
(uri (string-append "http://launchpad.net/~ubuntugames/"
"+archive/ubuntu/games/+files/sorr_"
version ".orig.tar.gz"))
(sha256
(base32
"1gld4i6ma265j7jw06c1drfp7pbg3n8dpm4lg9xgg28dkl5flwai"))))
(build-system trivial-build-system)
(inputs
`(("bash" ,bash-minimal)
("glibc" ,(to32 glibc))
("zlib" ,(to32 zlib))
("sdl" ,(to32 sdl))
("sdl-mixer" ,(to32 sdl-mixer))
("libcrypto" ,(to32 openssl))
("libpng" ,(to32 libpng-1.2))))
(native-inputs
`(("patchelf" ,(to32 patchelf))
("tar" ,tar)
("gzip" ,gzip)))
(arguments
`(#:modules ((guix build utils))
#:builder
(begin
(use-modules (guix build utils))
(let ((out (assoc-ref %outputs "out")))
(setenv "PATH" (string-append
(assoc-ref %build-inputs "gzip") "/bin:"
(assoc-ref %build-inputs "patchelf") "/bin:"
(assoc-ref %build-inputs "tar") "/bin"))
(invoke "tar" "xvf" (assoc-ref %build-inputs "source"))
(mkdir-p out)
(copy-recursively "." out)
(chdir out)
;; Remove the unneeded executable bit.
(for-each (lambda (file)
(chmod file #o644))
(find-files "." ".*"))
(mkdir-p "share/applications/")
(rename-file "sorr.desktop" "share/applications/sorr.desktop")
(mkdir-p "share/icons/hicolor/48x48/apps/")
(rename-file "sorr.png" "share/icons/hicolor/48x48/apps/sorr.png")
(rename-file "data" "lib")
(mkdir-p "share/sorr")
(for-each (lambda (f) (rename-file f (string-append "share/sorr/" f)))
'("SorMaker.dat" "SorR.dat" "manual" "manual.html"
"mod" "palettes" "Readme.txt"))
(delete-file "sorr")
(chmod "bgdi" #o755)
(mkdir-p "bin")
(rename-file "bgdi" "bin/bgdi")
;; Sort out libraries from bennugd:
(for-each (lambda (f) (rename-file (string-append "bennugd/" f)
(string-append "lib/" f)))
'("libbgdrtm.so" "libdraw.so"))
(delete-file-recursively "bennugd")
(with-directory-excursion "lib"
(for-each (lambda (f) (rename-file f
(string-append "lib" (basename f))))
(find-files "." "mod.*")))
;; Patch the executable to use the right RPATH to its dependent libraries:
(let* ((zlib (assoc-ref %build-inputs "zlib"))
(sdl (assoc-ref %build-inputs "sdl"))
(sdl-mixer (assoc-ref %build-inputs "sdl-mixer"))
(libpng (assoc-ref %build-inputs "libpng"))
(libcrypto (assoc-ref %build-inputs "libcrypto"))
(glibc (assoc-ref %build-inputs "glibc")))
(invoke "patchelf" "--set-interpreter" (string-append glibc "/lib/ld-linux.so.2")
(string-append out "/bin/bgdi"))
(for-each (lambda (f)
(invoke "patchelf" "--set-rpath"
(string-append
(string-append out "/lib") ":"
(string-append sdl "/lib") ":"
(string-append sdl-mixer "/lib") ":"
(string-append libpng "/lib") ":"
(string-append libcrypto "/lib") ":"
(string-append zlib "/lib"))
f))
(append (list (string-append out "/bin/bgdi"))
(find-files "lib" ".*"))))
;; Wrap program to start the game easily:
(let* ((bash (assoc-ref %build-inputs "bash"))
(sorr (string-append out "/bin/sorr"))
(sorr-real (string-append out "/bin/bgdi"))
(sorr-data (string-append out "/share/sorr/SorR.dat"))
(sorr-path (string-append out "/share/sorr/")))
(call-with-output-file sorr
(lambda (p)
;; Passing '-a "$0"' to exec breaks the game.
(format p "\
#!~a
SORR_PATH=\"${SORR_PATH:-$HOME/.config/sorr}\"
mkdir -p \"$SORR_PATH\"
cd \"$SORR_PATH\"
for i in \"~a\"/*; do
if [ \"$(basename \"$i\")\" != \"mod\" ]; then
ln -sf \"$i\"
fi
done
mkdir -p mod/games
for i in \"~a\"/mod/*; do
ln -sf \"$i\" mod/
done
exec ~a ~a \"$@\"~%"
(string-append bash "/bin/bash")
sorr-path sorr-path
sorr-real
sorr-data)))
(chmod sorr #o755))
#t))))
(home-page "http://www.sorrcommunity.com/t148-sor-v5-for-linux-debian-download-links")
(synopsis "Remake of the classic Streets of Rage 1, 2 and 3")
(description "This is a Bombergames remake of the classic Streets of Rage 1,
2 and 3 by Sega. The save games are stored in ~/.config/sorr (configurable via
the SORR_PATH environment variable). Mods can be installed in
$SORR_PATH/mod/games.
")
(license ((@@ (guix licenses) license) "No license"
"No URL"
""))))