nongnu: steam: Use guile instead of bash for scripts.

* nongnu/packages/steam-client.scm: Use module guix records.
  (<nonguix-container>): New record type.
  (glibc-for-fhs-32, steam-libs-32, steam-libs-64): Removed.
  (packages->ld.so.conf): Rename to fhs-ld.so.conf and use static paths.
  (steam): Rename to steam-client, remove wrappers and inputs, and
  replace with new definition for steam.
  (fhs-min-libs): New alist.
  (steam-client-libs): Add bash and coreutils, remove glibc and glibc-32.
  (steam-gameruntime-libs): Add font-dejavu and font-liberation.
  (fhs-union, nonguix-container->package, make-container-wrapper)
  (make-container-manifest, make-container-internal)
  (make-internal-script): New functions.
This commit is contained in:
ison 2020-09-12 20:44:54 -06:00 committed by Pierre Neidhardt
parent 0c4b325642
commit 93c656566b
No known key found for this signature in database
GPG key ID: 9BDCF497A4BBCC7F

View file

@ -19,7 +19,7 @@
;;; The steam script provided by this package may optionally be started as ;;; The steam script provided by this package may optionally be started as
;;; a shell instead of automatically launching Steam by setting the ;;; a shell instead of automatically launching Steam by setting the
;;; environment variable DEBUG=1. If the sandbox is started this way then ;;; environment variable DEBUG=1. If the sandbox is started this way then
;;; Steam should subsequently be launched via the .sandbox-helper script. ;;; Steam should subsequently be launched via fhs-internal-script.
;;; The sandbox shell aids in debugging missing container elements. For ;;; The sandbox shell aids in debugging missing container elements. For
;;; example a missing symlink may be created manually before launching Steam ;;; example a missing symlink may be created manually before launching Steam
@ -30,6 +30,7 @@
#:use-module (gnu packages) #:use-module (gnu packages)
#:use-module (guix gexp) #:use-module (guix gexp)
#:use-module (guix packages) #:use-module (guix packages)
#:use-module (guix records)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module (guix download) #:use-module (guix download)
#:use-module (guix build utils) #:use-module (guix build utils)
@ -37,6 +38,7 @@
#:use-module (guix build-system trivial) #:use-module (guix build-system trivial)
#:use-module (gnu packages audio) #:use-module (gnu packages audio)
#:use-module (gnu packages base) #:use-module (gnu packages base)
#:use-module (gnu packages bash)
#:use-module (gnu packages compression) #:use-module (gnu packages compression)
#:use-module (gnu packages cups) #:use-module (gnu packages cups)
#:use-module (gnu packages curl) #:use-module (gnu packages curl)
@ -73,79 +75,38 @@
#:use-module (gnu packages xorg) #:use-module (gnu packages xorg)
#:use-module (srfi srfi-1)) #:use-module (srfi srfi-1))
(define-record-type* <nonguix-container>
nonguix-container make-nonguix-container
nonguix-container? this-nonguix-container
(name ngc-name)
(version ngc-version (default #f))
(wrap-package ngc-wrap-package)
(run ngc-run)
(wrapper-name ngc-wrapper-name (default "nonguix-container-wrapper"))
(manifest-name ngc-manifest-name (default "nonguix-container-manifest.scm"))
(internal-name ngc-internal-name (default "fhs-internal"))
(sandbox-home ngc-sandbox-home (default ".local/share/guix-sandbox-home"))
(union64 ngc-union64 (default '()))
(union32 ngc-union32 (default '()))
(preserved-env ngc-preserved-env (default '()))
(exposed ngc-exposed (default '()))
(shared ngc-shared (default '()))
(modules ngc-modules (default '()))
(packages ngc-packages (default '()))
(home-page ngc-home-page (default #f))
(synopsis ngc-synopsis (default #f))
(description ngc-description (default #f))
(license ngc-license (default #f)))
(define glibc-for-fhs (define glibc-for-fhs
(package (package
(inherit glibc) (inherit glibc)
(name "glibc-for-fhs") ;; Maybe rename this to "glibc-with-ldconfig-for-fhs" (name "glibc-for-fhs")
(source (origin (source (origin
(inherit (package-source glibc)) (inherit (package-source glibc))
(snippet #f))))) ;; Re-enable ldconfig (snippet #f))))) ; Re-enable ldconfig.
(define glibc-for-fhs-32 (define libgcrypt-1.5.4 ; Half-Life needs libgcrypt.so.11.
(package
(inherit glibc-for-fhs)
(arguments (append (package-arguments glibc)
`(#:system "i686-linux")))))
(define (packages->ld.so.conf packages)
"Takes a list of package objects and returns a file-like object for ld.so.conf
in the Guix store"
(computed-file
"ld.so.conf"
(with-imported-modules
`((guix build union)
(guix build utils))
#~(begin
(use-modules (guix build union)
(guix build utils))
(let* ((packages '#$packages) ;; Need to quote "#$packages" as #$packages tries to "apply" the first item to the rest, like a procedure.
(find-lib-directories-in-single-package
(lambda (package)
(find-files (string-append package "/lib")
(lambda (file stat)
;; Setting keyword "stat" to "stat" means it will follow
;; symlinks, unlike what it's set to by default ("lstat").
(eq? 'directory (stat:type stat)))
#:stat stat
#:directories? #t)))
(find-lib-directories-in-all-packages
(lambda (packages)
(apply append ;; Concatenate the directory lists from "map" into one list
(map (lambda (package)
(find-lib-directories-in-single-package package))
packages))))
(fhs-lib-dirs
(find-lib-directories-in-all-packages packages)))
(with-output-to-file
#$output
(lambda _
(display (string-join '("/lib"
"/lib/dri"
"/lib/vdpau"
"/lib/nss"
"/lib/alsa-lib"
"/lib64"
"/lib64/dri"
"/lib64/vdpau"
"/lib64/nss"
"/lib64/alsa-lib")
"\n"))
#$output)))))))
(define (ld.so.conf->ld.so.cache ld-conf)
(computed-file
"ld.so.cache"
(with-imported-modules
`((guix build utils))
#~(begin
(use-modules (guix build utils))
(let* ((ldconfig (string-append #$glibc-for-fhs "/sbin/ldconfig")))
(invoke ldconfig
"-X" ;; Don't update symbolic links
"-f" #$ld-conf ;; Use #$configuration as configuration file
"-C" #$output)))))) ;; Use #$output as cache file
(define libgcrypt-1.5.4 ; Half-Life needs libgcrypt.so.11.
(package (package
(inherit libgcrypt) (inherit libgcrypt)
(version "1.5.4") (version "1.5.4")
@ -170,14 +131,62 @@ in the Guix store"
(base32 (base32
"1vylvsrbzrpqk298i4g1p82jxqkxhl2qf941sf0j775fyvxq09kb")))))) "1vylvsrbzrpqk298i4g1p82jxqkxhl2qf941sf0j775fyvxq09kb"))))))
(define steam-client
(package
(name "steam-client")
(version "1.0.0.61")
(source
(origin
(method url-fetch)
(uri (string-append "http://repo.steampowered.com/steam/archive/precise/steam_"
version ".tar.gz"))
(sha256
(base32
"0c5xy57gwr14vp3wy3jpqi5dl6y7n01p2dy4jlgl9bf9x7616r6n"))
(file-name (string-append name "-" version ".tar.gz"))))
(build-system gnu-build-system)
(arguments
`(#:tests? #f
#:make-flags
(list "PREFIX=" (string-append "DESTDIR=" (assoc-ref %outputs "out")))
#:phases
(modify-phases %standard-phases
(delete 'configure)
(add-after 'unpack 'patch-startscript
(lambda _
(substitute* "steam"
(("/usr") (assoc-ref %outputs "out")))
#t))
(add-after 'unpack 'patch-desktop-file
(lambda _
(substitute* "steam.desktop"
(("Exec=/usr/bin/steam") "Exec=steam"))
#t))
;; Steamdeps installs missing packages, which doesn't work with Guix.
(add-after 'install-binaries 'remove-unneccessary-file
(lambda _
(delete-file (string-append (assoc-ref %outputs "out")
"/bin/steamdeps"))
#t)))))
(home-page "https://store.steampowered.com")
(synopsis "Digital distribution platform for managing and playing games")
(description "Steam is a digital software distribution platform created by Valve.")
(license (license:nonfree "file:///share/doc/steam/steam_subscriber_agreement.txt"))))
(define fhs-min-libs
`(("glibc-for-fhs" ,glibc-for-fhs)
("glibc-locales" ,glibc-locales)))
(define steam-client-libs (define steam-client-libs
`(("alsa-lib" ,alsa-lib) `(("alsa-lib" ,alsa-lib)
("alsa-plugins:pulseaudio" ,alsa-plugins "pulseaudio") ("alsa-plugins:pulseaudio" ,alsa-plugins "pulseaudio")
("at-spi2-atk" ,at-spi2-atk) ; Required by steam client beta. ("at-spi2-atk" ,at-spi2-atk) ; Required by steam client beta.
("at-spi2-core" ,at-spi2-core) ; Required by steam client beta. ("at-spi2-core" ,at-spi2-core) ; Required by steam client beta.
("atk" ,atk) ("atk" ,atk)
("bash" ,bash)
("bzip2" ,bzip2) ("bzip2" ,bzip2)
("cairo" ,cairo) ("cairo" ,cairo)
("coreutils" ,coreutils)
("cups" ,cups) ("cups" ,cups)
("curl" ,curl) ("curl" ,curl)
("dbus" ,dbus) ("dbus" ,dbus)
@ -190,8 +199,6 @@ in the Guix store"
("gconf" ,gconf) ("gconf" ,gconf)
("gdk-pixbuf" ,gdk-pixbuf) ("gdk-pixbuf" ,gdk-pixbuf)
("glib" ,glib) ("glib" ,glib)
("glibc" ,glibc-for-fhs)
("glibc-32" ,glibc-for-fhs-32)
("gtk+" ,gtk+-2) ("gtk+" ,gtk+-2)
("libappindicator" ,libappindicator) ("libappindicator" ,libappindicator)
("libcap" ,libcap) ("libcap" ,libcap)
@ -228,6 +235,8 @@ in the Guix store"
(define steam-gameruntime-libs (define steam-gameruntime-libs
`(("ffmpeg" ,ffmpeg) `(("ffmpeg" ,ffmpeg)
("flac" ,flac) ("flac" ,flac)
("font-dejavu" ,font-dejavu)
("font-liberation" ,font-liberation)
("freeglut" ,freeglut) ("freeglut" ,freeglut)
("glew" ,glew) ("glew" ,glew)
("glu" ,glu) ("glu" ,glu)
@ -272,14 +281,47 @@ in the Guix store"
("util-linux" ,util-linux) ("util-linux" ,util-linux)
("xkeyboard-config" ,xkeyboard-config))) ("xkeyboard-config" ,xkeyboard-config)))
(define steam-libs-32 ;;; Building ld.so.conf using find-files from package union results in error
;;; "Argument list too long" when launching Steam.
(define (fhs-ld.so.conf)
"Return a file-like object for ld.so.conf"
(plain-file
"ld.so.conf"
(let ((dirs '("/lib"
"/lib/alsa-lib"
"/lib/dri"
"/lib/nss"
"/lib/vdpau"
"/lib64"
"/lib64/alsa-lib"
"/lib64/dri"
"/lib64/nss"
"/lib64/vdpau")))
(string-join dirs "\n"))))
(define (ld.so.conf->ld.so.cache ld-conf)
(computed-file
"ld.so.cache"
(with-imported-modules
`((guix build utils))
#~(begin
(use-modules (guix build utils))
(let ((ldconfig (string-append #$glibc-for-fhs "/sbin/ldconfig")))
(invoke ldconfig
"-X" ; Don't update symbolic links.
"-f" #$ld-conf ; Use #$configuration as configuration file.
"-C" #$output)))))) ; Use #$output as cache file.
(define* (fhs-union inputs #:key (name "fhs-union") (version "0.0") (system "x86_64-linux"))
"Create a package housing the union of inputs."
(package (package
(name "steam-libs-32") (name name)
(version "0.0") (version version)
(source #f) (source #f)
(inputs inputs)
(build-system trivial-build-system) (build-system trivial-build-system)
(arguments (arguments
'(#:system "i686-linux" `(#:system ,system
#:modules ((guix build union)) #:modules ((guix build union))
#:builder #:builder
(begin (begin
@ -290,226 +332,251 @@ in the Guix store"
(union-build (assoc-ref %outputs "out") (union-build (assoc-ref %outputs "out")
directories) directories)
#t))))) #t)))))
(inputs (append steam-client-libs steam-gameruntime-libs))
(home-page #f) (home-page #f)
(synopsis "32-bit libraries used for Steam") (synopsis "Libraries used for FHS")
(description "32-bit libraries needed to build the Steam sandbox FHS.") (description "Libraries needed to build a guix container FHS.")
(license #f))) (license #f)))
(define steam-libs-64 (define (nonguix-container->package container)
"Returns a package housing the script launcher-name which executes file at
relative path pkg-run from pkg inside a guix container with an FHS environment."
(let* ((fhs-internal (make-container-internal container))
(fhs-manifest (make-container-manifest container fhs-internal))
(fhs-wrapper (make-container-wrapper container fhs-manifest fhs-internal))
(container-name (ngc-name container))
(union64 (ngc-union64 container))
(union32 (ngc-union32 container))
(pkg (ngc-wrap-package container)))
(package
(name container-name)
(version (or (ngc-version container)
(package-version pkg)))
(source #f)
(inputs `(,@(if (null? union64)
'() `(("fhs-union-64" ,union64)))
,@(if (null? union32)
'() `(("fhs-union-32" ,union32)))
("fhs-wrapper" ,fhs-wrapper)))
(build-system trivial-build-system)
(arguments
`(#:modules ((guix build utils))
#:builder
(begin
(use-modules (guix build utils))
(let* ((bin (string-append (assoc-ref %outputs "out") "/bin"))
(wrapper-target (assoc-ref %build-inputs "fhs-wrapper"))
(wrapper-dest (string-append bin "/" ,container-name)))
(mkdir-p bin)
(symlink wrapper-target wrapper-dest)))))
(home-page (or (ngc-home-page container)
(package-home-page pkg)))
(synopsis (or (ngc-synopsis container)
(package-synopsis pkg)))
(description (or (ngc-description container)
(package-description pkg)))
(license (or (ngc-license container)
(package-license pkg))))))
(define (make-container-wrapper container fhs-manifest fhs-internal)
"Return a script file-like object that launches a guix container for pkg."
(program-file
(ngc-wrapper-name container)
(with-imported-modules
`((guix build utils))
#~(begin
(use-modules (guix build utils))
(define (preserve-var var)
(string-append "--preserve=" var))
(define* (add-path path #:key writable?)
(let ((opt (if writable?
"--share="
"--expose=")))
(if (pair? path)
(string-append opt (car path) "=" (cdr path))
(string-append opt path))))
(define (exists-> file)
(if (and file (file-exists? file))
`(,file) '()))
(let* ((UID (number->string (passwd:uid (getpwnam (getenv "USER")))))
(run #$(file-append fhs-internal "/bin/" (ngc-internal-name container)))
(manifest-file #$(file-append fhs-manifest))
(home (getenv "HOME"))
(sandbox-home (string-append home "/" #$(ngc-sandbox-home container)))
(preserved-env '("DISPLAY"
"SDL_AUDIODRIVER"
"XAUTHORITY"
"XDG_DATA_HOME"
"XDG_RUNTIME_DIR"))
(expose `("/dev/dri"
"/dev/input" ; Needed for controller input.
,@(exists-> "/etc/machine-id")
"/sys/class/input" ; Needed for controller input.
"/sys/dev"
"/sys/devices"
"/var/run/dbus"))
(share `("/dev/shm"
,(string-append sandbox-home "=" home)
,@(exists-> (string-append home "/.config/pulse"))
,@(exists-> (string-append "/run/user/" UID "/pulse"))
,@(exists-> (string-append "/run/user/" UID "/bus"))
,@(exists-> (getenv "XAUTHORITY"))))
(DEBUG (equal? (getenv "DEBUG") "1"))
(command (if DEBUG '()
`("--" ,run "\"$@\""))))
(format #t "\n* Launching ~a in sandbox: ~a.\n\n"
#$(package-name (ngc-wrap-package container)) sandbox-home)
(when DEBUG
(format #t "* DEBUG set to 1: Starting shell. Launch application manually with: ~a.\n\n"
#$(ngc-internal-name container)))
(mkdir-p sandbox-home)
(system "pulseaudio -D > /dev/null 2>&1")
(apply system*
`("guix" "environment"
"--ad-hoc" "--container" "--no-cwd" "--network"
,@(map preserve-var preserved-env)
,@(map add-path expose)
,@(map (lambda (item)
(add-path item #:writable? #t))
share)
"-m" ,manifest-file
,@command)))))))
(define (make-container-manifest container fhs-internal)
"Return a scheme file-like object containing a container manifest."
(scheme-file
(ngc-manifest-name container)
#~(begin
(use-package-modules
#$@(ngc-modules container))
(use-modules (guix gexp)
(guix utils)
(guix profiles)
(guix store)
(guix scripts package)
(srfi srfi-11))
;; Copied from guix/scripts/package.scm.
(define (store-item->manifest-entry item)
"Return a manifest entry for ITEM, a \"/gnu/store/...\" file name."
(let-values (((name version)
(package-name->name+version (store-path-package-name item)
#\-)))
(manifest-entry
(name name)
(version version)
(output "out") ;XXX: wild guess
(item item))))
(manifest-add
(packages->manifest (list #$@(ngc-packages container)))
(map store-item->manifest-entry
'(#$(file-append (ngc-wrap-package container))
#$(file-append (ngc-union64 container))
#$(file-append (ngc-union32 container))
#$(file-append fhs-internal)))))))
(define (make-container-internal container)
"Return a package housing the fhs-internal-script."
(package (package
(inherit steam-libs-32) (name (ngc-internal-name container))
(name "steam-libs-64") (version (ngc-version container))
(source #f)
(inputs `(("fhs-internal-script" ,(make-internal-script container))))
(build-system trivial-build-system)
(arguments (arguments
(substitute-keyword-arguments (package-arguments steam-libs-32) `(#:modules ((guix build utils))
((#:system _) #:builder
"x86_64-linux"))) (begin
(synopsis "64-bit libraries used for Steam") (use-modules (guix build utils))
(description "64-bit libraries needed to build the Steam sandbox FHS."))) (let* ((bin (string-append (assoc-ref %outputs "out") "/bin"))
(internal-target (assoc-ref %build-inputs "fhs-internal-script"))
(internal-dest (string-append bin "/" ,(ngc-internal-name container))))
(mkdir-p bin)
(symlink internal-target internal-dest)))))
(home-page #f)
(synopsis "Script used ot set up sandbox")
(description "Script used inside the FHS guix container to setup the
environment.")
(license #f)))
(define steam-ld.so.conf (define (make-internal-script container)
(packages->ld.so.conf `(,steam-libs-64 ,steam-libs-32))) "Return a script file-like object that performas additional setup in the FHS
container before launching pkg-run."
(define steam-ld.so.cache (let* ((ld.so.conf (fhs-ld.so.conf))
(ld.so.conf->ld.so.cache steam-ld.so.conf)) (ld.so.cache (ld.so.conf->ld.so.cache ld.so.conf))
(pkg (ngc-wrap-package container))
(run (ngc-run container)))
(program-file
(ngc-internal-name container)
(with-imported-modules
`((guix build utils))
#~(begin
(use-modules (guix build utils))
(define (new-symlink target dest)
(unless (file-exists? dest)
(symlink target dest)))
(for-each mkdir-p '("/sbin" "/usr/bin" "/usr/share"
"/run/current-system/profile/etc"
"/run/current-system/profile/share"))
(let ((guix-env (getenv "GUIX_ENVIRONMENT"))
(union64 #$(file-append (ngc-union64 container)))
(union32 #$(file-append (ngc-union32 container)))
(ld.so.conf #$(file-append ld.so.conf))
(ld.so.cache #$(file-append ld.so.cache))
(args (cdr (command-line))))
(new-symlink (string-append union64 "/lib/locale") "/run/current-system/locale")
(new-symlink (string-append union64 "/share/fonts") "/run/current-system/profile/share/fonts")
(new-symlink (string-append guix-env "/etc/ssl") "/run/current-system/profile/etc/ssl")
(new-symlink (string-append guix-env "/etc/ssl") "/etc/ssl")
(new-symlink (string-append union64 "/bin/env") "/usr/bin/env")
(new-symlink (string-append union64 "/bin/bash") "/bin/bash")
(new-symlink (string-append union64 "/bin/pulseaudio") "/bin/pulseaudio")
(new-symlink (string-append union32 "/lib") "/run/current-system/profile/lib")
(new-symlink (string-append union64 "/lib") "/run/current-system/profile/lib64")
(new-symlink (string-append union32 "/lib") "/lib")
(new-symlink (string-append union64 "/lib") "/lib64")
(new-symlink ld.so.conf "/etc/ld.so.conf")
(new-symlink ld.so.cache "/etc/ld.so.cache")
(new-symlink (string-append union64 "/sbin/ldconfig") "/sbin/ldconfig")
(new-symlink (string-append union64 "/share/vulkan") "/usr/share/vulkan")
(apply system* `(#$(file-append pkg run) ,@args))))))))
(define-public steam (define-public steam
(package (nonguix-container->package
(nonguix-container
(name "steam") (name "steam")
(version "1.0.0.61") (wrap-package steam-client)
(source (run "/bin/steam")
(origin (union64
(method url-fetch) (fhs-union `(,@steam-client-libs
(uri (string-append ,@steam-gameruntime-libs
"http://repo.steampowered.com/steam/archive/precise/steam_" ,@fhs-min-libs)
version ".tar.gz")) #:name "fhs-union-64"))
(sha256 (union32
(base32 (fhs-union `(,@steam-client-libs
"0c5xy57gwr14vp3wy3jpqi5dl6y7n01p2dy4jlgl9bf9x7616r6n")) ,@steam-gameruntime-libs
(file-name (string-append name "-" version ".tar.gz")))) ,@fhs-min-libs)
(inputs `(("coreutils" ,coreutils) #:name "fhs-union-32"
("pulseaudio" ,pulseaudio) #:system "i686-linux"))
("python" ,python-3) (modules `(base certs compression file gawk gnome linux python))
("steam-libs-32" ,steam-libs-32) (packages
("steam-libs-64" ,steam-libs-64) `(coreutils
("steam-ld.so.conf" ,steam-ld.so.conf) diffutils
("steam-ld.so.cache" ,steam-ld.so.cache))) file
(build-system gnu-build-system) findutils
(arguments gawk
`(#:tests? #f grep
#:make-flags (list "PREFIX=" (string-append "DESTDIR=" (assoc-ref %outputs "out"))) gzip
#:phases nss-certs
(modify-phases %standard-phases python
(delete 'configure) sed
(add-after 'unpack 'patch-startscript strace
;; The script uses its own name to determine the package, wrap-program interferes with this however. tar
(lambda _ util-linux+udev
(substitute* "steam" which
(("STEAMPACKAGE=.*") "STEAMPACKAGE=steam\n")) xz
;; Change references of /usr to the store path. zenity))
(substitute* "steam"
(("/usr") (assoc-ref %outputs "out")))
#t))
(add-after 'unpack 'patch-desktop-file
(lambda _
(substitute* "steam.desktop"
(("Exec=/usr/bin/steam") "Exec=steam"))
#t))
;; /bin/steamdeps allows Steam to install missing packages, which doesn't play well with Guix, so remove it.
(add-after 'install-binaries 'remove-unneccessary-file
(lambda _
(delete-file (string-append (assoc-ref %outputs "out") "/bin/steamdeps"))
#t))
(add-after 'install-binaries 'wrap-startscript
(lambda* (#:key outputs inputs #:allow-other-keys)
(define (move-file old new)
(rename-file old new)
new)
(define (write-file path data)
(let ((str (if (list? data)
(format #f "~{~y~}" data)
data)))
(with-output-to-file path
(lambda ()
(let loop ((ls1 (string->list str)))
(unless (null? ls1)
(begin
(write-char (car ls1))
(loop (cdr ls1)))))))))
(let* ((out (assoc-ref outputs "out"))
(shebang (string-append "#!" (which "bash")))
(steam-real (move-file (string-append out "/bin/steam")
(string-append out "/bin/.steam-real")))
(manifest-dir (string-append out "/etc"))
(manifest-path (string-append manifest-dir "/manifest.scm"))
(sandbox (string-append out "/bin/steam"))
(sandbox-helper (string-append out "/bin/.sandbox-helper"))
(steam-libs-32 (assoc-ref inputs "steam-libs-32"))
(steam-libs-64 (assoc-ref inputs "steam-libs-64"))
(steam-ld.so.conf (assoc-ref inputs "steam-ld.so.conf"))
(steam-ld.so.cache (assoc-ref inputs "steam-ld.so.cache"))
(bash (assoc-ref inputs "bash"))
(coreutils (assoc-ref inputs "coreutils"))
(pulseaudio (assoc-ref inputs "pulseaudio"))
(python (assoc-ref inputs "python")))
(mkdir-p manifest-dir)
(write-file
manifest-path
`((use-package-modules
base certs compression file fonts gawk gnome linux)
(use-modules (guix utils)
(guix profiles)
(guix store)
(srfi srfi-11))
;; Copied from guix/scripts/package.scm.
(define (store-item->manifest-entry item)
"Return a manifest entry for ITEM, a \"/gnu/store/...\" file name."
(let-values (((name version)
(package-name->name+version (store-path-package-name item)
#\-)))
(manifest-entry
(name name)
(version version)
(output "out") ;XXX: wild guess
(item item))))
(manifest-add
(packages->manifest
(list coreutils
diffutils
file
findutils
font-dejavu
font-liberation
gawk
glibc-locales
grep
gzip
nss-certs
sed
strace
tar
util-linux+udev
which
xz
zenity))
`(,(store-item->manifest-entry ,out)))))
(write-file sandbox
(string-append shebang "
echo -e \"\\n* Starting Steam in sandbox: $HOME/.local/share/guix-sandbox-home\\n\"
mkdir -p $HOME/.local/share/guix-sandbox-home
if [ \"$DEBUG\" == \"1\" ]; then
shell_command=()
else
shell_command=(\"--\" \"" sandbox-helper "\" \"$@\")
fi
if [ -z ${XAUTHORITY+x} ]; then
xauth=()
else
xauth=(\"--preserve=XAUTHORITY\" \"--share=$XAUTHORITY\")
fi
# Make sure pulseaudio is running, if it starts first time inside the sandbox it will be broken
pulseaudio -D > /dev/null 2>&1
# Start sandbox
# /dev/input and /sys/class/input added for controller support.
guix environment --ad-hoc --container --no-cwd --network \\
--preserve=DISPLAY \\
--preserve=SDL_AUDIODRIVER \\
--preserve=XDG_DATA_HOME \\
--preserve=XDG_RUNTIME_DIR \\
\"${xauth[@]}\" \\
--share=$HOME/.local/share/guix-sandbox-home=$HOME \\
$(if [ -e \"/run/user/$UID/pulse\" ]; then echo -n \"--share=/run/user/$UID/pulse\"; else echo -n \"\"; fi) \\
$(if [ -e \"/etc/machine-id\" ]; then echo -n \"--expose=/etc/machine-id\"; else echo -n ; fi) \\
$(if [ -e \"/run/user/$UID/bus\" ]; then echo -n \"--share=/run/user/$UID/bus\"; else echo -n ; fi) \\
$(if [ -e \"$HOME/.config/pulse\" ]; then echo -n \"--share=$HOME/.config/pulse\"; else echo -n ""; fi) \\
--expose=/dev/dri \\
--expose=/dev/input \\
--expose=/sys/class/input \\
--expose=/sys/dev \\
--expose=/sys/devices \\
--expose=/var/run/dbus \\
--share=/dev/shm \\
-m \"" manifest-path "\" \\
\"${shell_command[@]}\"\n"))
(chmod sandbox #o555)
;; Script sandbox-helper is needed to set-up the environment inside the container.
(write-file sandbox-helper
(string-append "#!" (which "bash") "
mkdir -p /sbin
mkdir -p /usr/{bin,share}
mkdir -p /run/current-system/profile/{etc,share}
#FIXME: Setting up the below symlink should not require find.
find /gnu/store/ -maxdepth 1 -name '*glibc-locales*' -exec ln -s \"{}\"/lib/locale /run/current-system/locale \\;
ln -s \"$GUIX_ENVIRONMENT\"/share/fonts /run/current-system/profile/share/fonts
ln -s \"$GUIX_ENVIRONMENT\"/etc/ssl /run/current-system/profile/etc/ssl
ln -s \"$GUIX_ENVIRONMENT\"/etc/ssl /etc/ssl
ln -s " coreutils "/bin/env /usr/bin/env
ln -s " bash "/bin/bash /bin/bash
ln -s " pulseaudio "/bin/pulseaudio /bin/pulseaudio
ln -s " steam-libs-32 "/lib /run/current-system/profile/lib
ln -s " steam-libs-64 "/lib /run/current-system/profile/lib64
ln -s " steam-libs-32 "/lib /lib
ln -s " steam-libs-64 "/lib /lib64
ln -s " steam-ld.so.conf " /etc/ld.so.conf
ln -s " steam-ld.so.cache " /etc/ld.so.cache
ln -s " steam-libs-32 "/sbin/ldconfig /sbin/ldconfig
ln -s " steam-libs-64 "/share/vulkan /usr/share/vulkan
export PATH=" steam-libs-32 "/bin:" python "/bin:/bin:/sbin:/usr/bin${PATH:+:}$PATH
export STEAM_RUNTIME=1
export STEAM_RUNTIME_PREFER_HOST_LIBRARIES=1
" steam-real " \"$@\"\n"))
(chmod sandbox-helper #o555)
#t))))))
(home-page "https://store.steampowered.com")
(synopsis "Digital distribution platform for managing and playing games")
(description "Steam is a digital software distribution platform created by (description "Steam is a digital software distribution platform created by
Valve. This package provides the script steam-sandbox for launching Steam in Valve. This package provides a script for launching Steam in a Guix container
a Guix container which will use the directory which will use the directory @file{$HOME/.local/share/guix-sandbox-home} where
@file{$HOME/.local/share/guix-sandbox-home} where all games will be installed.") all games will be installed."))))
(license (license:nonfree "file:///share/doc/steam/steam_subscriber_agreement.txt"))))