2020-05-06 20:53:49 +02:00
|
|
|
;;; GNU Guix --- Functional package management for GNU
|
2021-01-08 02:05:19 +01:00
|
|
|
;;; Copyright © 2020 pkill-9
|
|
|
|
;;; Copyright © 2020, 2021 ison <ison@airmail.cc>
|
2021-03-05 19:40:43 +01:00
|
|
|
;;; Copyright © 2021 pineapples
|
2021-02-06 18:09:37 +01:00
|
|
|
;;; Copyright © 2021 Jean-Baptiste Volatier <jbv@pm.me>
|
2020-05-06 20:53:49 +02:00
|
|
|
;;;
|
|
|
|
;;; This file is not part of GNU Guix.
|
|
|
|
;;;
|
|
|
|
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
|
|
|
;;; under the terms of the GNU General Public License as published by
|
|
|
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
|
|
|
;;; your option) any later version.
|
|
|
|
;;;
|
|
|
|
;;; GNU Guix is distributed in the hope that it will be useful, but
|
|
|
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;;; GNU General Public License for more details.
|
|
|
|
;;;
|
|
|
|
;;; You should have received a copy of the GNU General Public License
|
|
|
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
;;; The steam script provided by this package may optionally be started as
|
|
|
|
;;; a shell instead of automatically launching Steam by setting the
|
|
|
|
;;; environment variable DEBUG=1. If the sandbox is started this way then
|
2020-09-14 23:59:05 +02:00
|
|
|
;;; Steam should subsequently be launched via fhs-internal.
|
2020-05-06 20:53:49 +02:00
|
|
|
|
|
|
|
;;; The sandbox shell aids in debugging missing container elements. For
|
|
|
|
;;; example a missing symlink may be created manually before launching Steam
|
|
|
|
;;; to verify that the fix works before filing a bug report.
|
|
|
|
|
2020-09-14 23:59:05 +02:00
|
|
|
;;; A container wrapper creates the following store items:
|
|
|
|
;;; * Main container package [nonguix-container->package] (basically a dummy
|
|
|
|
;;; package with symlink to wrapper script)
|
2021-10-28 20:38:51 +02:00
|
|
|
;;; - Wrapper script [make-container-wrapper] (runs "guix shell")
|
2020-09-14 23:59:05 +02:00
|
|
|
;;; References:
|
|
|
|
;;; -> manifest.scm [make-container-manifest] (used by wrapper to guarantee
|
|
|
|
;;; exact store items)
|
|
|
|
;;; -> container-internal [make-container-internal] {inside container}
|
|
|
|
;;; (dummy package added to container with symlink to internal-script)
|
|
|
|
;;; - internal-script [make-internal-script] {inside container}
|
|
|
|
;;; (script run in-container which performs additional setup before
|
|
|
|
;;; launching the desired application)
|
|
|
|
;;; References:
|
|
|
|
;;; -> Wrapped package {inside container} (in this case Steam).
|
|
|
|
|
|
|
|
;;; Note: The extra container-internal package is necessary because there is no
|
|
|
|
;;; way to add the container package's own store path to its own manifest unless
|
|
|
|
;;; the manifest is printed inside the build phases. However, the (guix gexp)
|
|
|
|
;;; module is apparently disallowed inside build phases.
|
|
|
|
|
2020-05-06 20:53:49 +02:00
|
|
|
(define-module (nongnu packages steam-client)
|
|
|
|
#:use-module ((nonguix licenses) #:prefix license:)
|
|
|
|
#:use-module (guix gexp)
|
|
|
|
#:use-module (guix packages)
|
2020-09-13 04:44:54 +02:00
|
|
|
#:use-module (guix records)
|
2020-05-06 20:53:49 +02:00
|
|
|
#:use-module (guix download)
|
|
|
|
#:use-module (guix build-system gnu)
|
|
|
|
#:use-module (guix build-system trivial)
|
2021-04-12 15:38:52 +02:00
|
|
|
#:use-module (guix transformations)
|
2020-05-06 20:53:49 +02:00
|
|
|
#:use-module (gnu packages audio)
|
|
|
|
#:use-module (gnu packages base)
|
2020-09-13 04:44:54 +02:00
|
|
|
#:use-module (gnu packages bash)
|
2020-09-16 21:21:42 +02:00
|
|
|
#:use-module (gnu packages certs)
|
|
|
|
#:use-module (gnu packages compression)
|
|
|
|
#:use-module (gnu packages file)
|
2020-05-06 20:53:49 +02:00
|
|
|
#:use-module (gnu packages fonts)
|
|
|
|
#:use-module (gnu packages fontutils)
|
2020-09-16 21:21:42 +02:00
|
|
|
#:use-module (gnu packages gawk)
|
2020-05-06 20:53:49 +02:00
|
|
|
#:use-module (gnu packages gcc)
|
|
|
|
#:use-module (gnu packages gl)
|
|
|
|
#:use-module (gnu packages glib)
|
2020-09-16 21:21:42 +02:00
|
|
|
#:use-module (gnu packages linux)
|
2021-04-12 15:38:52 +02:00
|
|
|
#:use-module (nongnu packages nvidia)
|
2020-09-19 09:57:43 +02:00
|
|
|
#:use-module (gnu packages pulseaudio)
|
|
|
|
#:use-module (gnu packages python)
|
|
|
|
#:use-module (nonguix utils))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(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 '()))
|
2020-09-16 21:21:42 +02:00
|
|
|
(link-files ngc-link-files (default '()))
|
2020-09-13 04:44:54 +02:00
|
|
|
(home-page ngc-home-page (default #f))
|
|
|
|
(synopsis ngc-synopsis (default #f))
|
|
|
|
(description ngc-description (default #f))
|
|
|
|
(license ngc-license (default #f)))
|
|
|
|
|
|
|
|
(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
|
2021-03-04 20:59:09 +01:00
|
|
|
(replace 'configure
|
|
|
|
(lambda _
|
|
|
|
(mkdir-p "bootstrap-temp")
|
|
|
|
(invoke "tar" "xfa" "bootstraplinux_ubuntu12_32.tar.xz"
|
|
|
|
"-C" "bootstrap-temp")
|
|
|
|
(substitute* "bootstrap-temp/steam.sh"
|
|
|
|
(("export LD_LIBRARY_PATH=\"")
|
|
|
|
"export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH-}:"))
|
|
|
|
(substitute* "bootstrap-temp/ubuntu12_32/steam-runtime/run.sh"
|
|
|
|
(("^export LD_LIBRARY_PATH=.*")
|
|
|
|
"export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH-}:$steam_runtime_library_paths\""))
|
|
|
|
(invoke "tar" "cfJ" "bootstraplinux_ubuntu12_32.tar.xz" "-C" "bootstrap-temp"
|
|
|
|
"linux32" "ubuntu12_32" "steam.sh" "steamdeps.txt")
|
|
|
|
(delete-file-recursively "bootstrap-temp")))
|
2020-09-13 04:44:54 +02:00
|
|
|
(add-after 'unpack 'patch-startscript
|
|
|
|
(lambda _
|
|
|
|
(substitute* "steam"
|
2021-01-08 02:05:19 +01:00
|
|
|
(("/usr") (assoc-ref %outputs "out")))))
|
2020-11-24 17:52:37 +01:00
|
|
|
(add-after 'patch-dot-desktop-files 'patch-desktop-file
|
2020-09-13 04:44:54 +02:00
|
|
|
(lambda _
|
2021-05-26 13:16:41 +02:00
|
|
|
(let ((path (string-append (assoc-ref %outputs "out")
|
|
|
|
"/share/applications/")))
|
|
|
|
(substitute* (string-append path "steam.desktop")
|
|
|
|
(("Exec=.*/steam") "Exec=steam"))
|
|
|
|
(copy-file (string-append path "steam.desktop")
|
|
|
|
(string-append path "steam-asound32.desktop"))
|
|
|
|
(substitute* (string-append path "steam-asound32.desktop")
|
|
|
|
(("Exec=steam %U") "Exec=steam %U -- --asound32")
|
|
|
|
(("Name=Steam") "Name=Steam (32-bit ALSA)")))))
|
2020-09-13 04:44:54 +02:00
|
|
|
;; Steamdeps installs missing packages, which doesn't work with Guix.
|
2021-01-08 02:05:19 +01:00
|
|
|
(add-after 'install-binaries 'post-install
|
|
|
|
(lambda* (#:key inputs outputs #:allow-other-keys)
|
|
|
|
(let ((out (assoc-ref %outputs "out")))
|
|
|
|
;; Steamdeps installs missing packages, which doesn't work with Guix.
|
|
|
|
(delete-file (string-append out "/bin/steamdeps"))
|
|
|
|
(wrap-program (string-append out "/bin/steam")
|
|
|
|
'("LD_LIBRARY_PATH" prefix
|
|
|
|
("/lib"
|
|
|
|
"/lib/alsa-lib"
|
|
|
|
"/lib/dri"
|
|
|
|
"/lib/nss"
|
|
|
|
"/lib/vdpau"
|
|
|
|
"/lib64"
|
|
|
|
"/lib64/alsa-lib"
|
|
|
|
"/lib64/dri"
|
|
|
|
"/lib64/nss"
|
2021-11-09 19:45:51 +01:00
|
|
|
"/lib64/vdpau"
|
|
|
|
"$HOME/.local/share/Steam/ubuntu12_32/steam-runtime/lib/x86_64-linux-gnu")))
|
2021-01-08 02:05:19 +01:00
|
|
|
;; .steam-real will fail unless it is renamed to exactly "steam".
|
|
|
|
(rename-file (string-append out "/bin/steam")
|
|
|
|
(string-append out "/bin/steam-wrapper"))
|
|
|
|
(rename-file (string-append out "/bin/.steam-real")
|
|
|
|
(string-append out "/bin/steam"))
|
|
|
|
(substitute* (string-append out "/bin/steam-wrapper")
|
|
|
|
(("\\.steam-real") "steam"))))))))
|
2020-09-13 04:44:54 +02:00
|
|
|
(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
|
2021-01-08 02:05:19 +01:00
|
|
|
`(("glibc" ,glibc)
|
2020-09-13 04:44:54 +02:00
|
|
|
("glibc-locales" ,glibc-locales)))
|
|
|
|
|
2020-05-06 20:53:49 +02:00
|
|
|
(define steam-client-libs
|
2020-09-16 02:37:12 +02:00
|
|
|
`(("bash" ,bash) ; Required for steam startup.
|
2020-09-16 21:21:42 +02:00
|
|
|
("coreutils" ,coreutils)
|
|
|
|
("diffutils" ,diffutils)
|
2020-09-16 02:37:12 +02:00
|
|
|
("dbus-glib" ,dbus-glib) ; Required for steam browser.
|
|
|
|
("fontconfig" ,fontconfig) ; Required for steam client.
|
2020-09-16 21:21:42 +02:00
|
|
|
("file" ,file) ; Used for steam installation.
|
2020-09-16 02:37:12 +02:00
|
|
|
("freetype" ,freetype) ; Required for steam login.
|
2020-09-16 21:21:42 +02:00
|
|
|
("gawk" ,gawk)
|
2020-09-16 02:37:12 +02:00
|
|
|
("gcc:lib" ,gcc "lib") ; Required for steam startup.
|
2020-09-16 21:21:42 +02:00
|
|
|
("grep" ,grep)
|
2020-09-16 02:37:12 +02:00
|
|
|
("mesa" ,mesa) ; Required for steam startup.
|
2020-09-16 21:21:42 +02:00
|
|
|
("nss-certs" ,nss-certs) ; Required for steam login.
|
|
|
|
("sed" ,sed)
|
|
|
|
("tar" ,tar)
|
|
|
|
("util-linux" ,util-linux) ; Required for steam login.
|
|
|
|
("xz" ,xz)))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
|
|
|
(define steam-gameruntime-libs
|
2020-09-16 02:37:12 +02:00
|
|
|
`(("alsa-lib" ,alsa-lib) ; Required for audio in most games.
|
|
|
|
("alsa-plugins:pulseaudio" ,alsa-plugins "pulseaudio") ; Required for audio in most games.
|
2020-09-13 04:44:54 +02:00
|
|
|
("font-dejavu" ,font-dejavu)
|
|
|
|
("font-liberation" ,font-liberation)
|
2020-09-19 09:57:43 +02:00
|
|
|
("openal" ,openal) ; Prevents corrupt audio in Crypt of the Necrodancer.
|
|
|
|
("pulseaudio" ,pulseaudio) ; Prevents corrupt audio in Sven Coop.
|
2020-09-16 21:21:42 +02:00
|
|
|
("python" ,python))) ; Required for KillingFloor2 and Wreckfest.
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(define* (fhs-union inputs #:key (name "fhs-union") (version "0.0") (system "x86_64-linux"))
|
|
|
|
"Create a package housing the union of inputs."
|
2020-09-05 19:23:47 +02:00
|
|
|
(package
|
2020-09-13 04:44:54 +02:00
|
|
|
(name name)
|
|
|
|
(version version)
|
2020-09-05 19:23:47 +02:00
|
|
|
(source #f)
|
2020-09-13 04:44:54 +02:00
|
|
|
(inputs inputs)
|
2020-09-05 19:23:47 +02:00
|
|
|
(build-system trivial-build-system)
|
|
|
|
(arguments
|
2020-09-13 04:44:54 +02:00
|
|
|
`(#:system ,system
|
2020-09-05 19:23:47 +02:00
|
|
|
#:modules ((guix build union))
|
|
|
|
#:builder
|
|
|
|
(begin
|
|
|
|
(use-modules (ice-9 match)
|
|
|
|
(guix build union))
|
|
|
|
(match %build-inputs
|
2020-09-14 23:59:05 +02:00
|
|
|
(((_ . directories) ...)
|
2020-09-05 19:23:47 +02:00
|
|
|
(union-build (assoc-ref %outputs "out")
|
|
|
|
directories)
|
|
|
|
#t)))))
|
|
|
|
(home-page #f)
|
2020-09-13 04:44:54 +02:00
|
|
|
(synopsis "Libraries used for FHS")
|
|
|
|
(description "Libraries needed to build a guix container FHS.")
|
2020-09-05 19:23:47 +02:00
|
|
|
(license #f)))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(define (nonguix-container->package container)
|
2020-09-14 00:29:18 +02:00
|
|
|
"Return a package with wrapper script to launch the supplied container object
|
|
|
|
in a sandboxed FHS environment."
|
2021-05-26 13:16:41 +02:00
|
|
|
(let* ((fhs-internal (make-container-internal container))
|
2020-09-13 04:44:54 +02:00
|
|
|
(fhs-manifest (make-container-manifest container fhs-internal))
|
|
|
|
(fhs-wrapper (make-container-wrapper container fhs-manifest fhs-internal))
|
|
|
|
(pkg (ngc-wrap-package container)))
|
|
|
|
(package
|
2020-09-14 23:59:05 +02:00
|
|
|
(name (ngc-name container))
|
2020-09-13 04:44:54 +02:00
|
|
|
(version (or (ngc-version container)
|
|
|
|
(package-version pkg)))
|
|
|
|
(source #f)
|
2021-05-26 13:16:41 +02:00
|
|
|
(inputs `(("wrap-package" ,(ngc-wrap-package container))
|
2020-09-16 21:21:42 +02:00
|
|
|
,@(if (null? (ngc-union64 container))
|
2020-09-14 23:59:05 +02:00
|
|
|
'()
|
|
|
|
`(("fhs-union-64" ,(ngc-union64 container))))
|
|
|
|
,@(if (null? (ngc-union32 container))
|
|
|
|
'()
|
|
|
|
`(("fhs-union-32" ,(ngc-union32 container))))
|
|
|
|
("fhs-internal" ,fhs-internal)
|
|
|
|
("fhs-wrapper" ,fhs-wrapper)
|
|
|
|
("fhs-manifest" ,fhs-manifest)))
|
2020-09-13 04:44:54 +02:00
|
|
|
(build-system trivial-build-system)
|
|
|
|
(arguments
|
|
|
|
`(#:modules ((guix build utils))
|
|
|
|
#:builder
|
|
|
|
(begin
|
|
|
|
(use-modules (guix build utils))
|
2020-09-14 23:59:05 +02:00
|
|
|
(let* ((out (assoc-ref %outputs "out"))
|
|
|
|
(internal-target (string-append (assoc-ref %build-inputs "fhs-internal")
|
|
|
|
"/bin/" ,(ngc-internal-name container)))
|
|
|
|
(internal-dest (string-append out "/sbin/" ,(ngc-internal-name container)))
|
|
|
|
(manifest-target (assoc-ref %build-inputs "fhs-manifest"))
|
|
|
|
(manifest-dest (string-append out "/etc/" ,(ngc-manifest-name container)))
|
2020-09-13 04:44:54 +02:00
|
|
|
(wrapper-target (assoc-ref %build-inputs "fhs-wrapper"))
|
2020-09-16 21:21:42 +02:00
|
|
|
(wrapper-dest (string-append out "/bin/" ,(ngc-name container)))
|
|
|
|
(link-files ',(ngc-link-files container)))
|
2020-09-14 23:59:05 +02:00
|
|
|
(mkdir-p (string-append out "/sbin"))
|
|
|
|
(mkdir-p (string-append out "/etc"))
|
|
|
|
(mkdir-p (string-append out "/bin"))
|
|
|
|
(symlink internal-target internal-dest)
|
|
|
|
(symlink wrapper-target wrapper-dest)
|
2020-09-16 21:21:42 +02:00
|
|
|
(symlink manifest-target manifest-dest)
|
|
|
|
(for-each
|
|
|
|
(lambda (link)
|
|
|
|
(mkdir-p (dirname (string-append out "/" link)))
|
|
|
|
(symlink (string-append (assoc-ref %build-inputs "wrap-package")
|
|
|
|
"/" link)
|
|
|
|
(string-append out "/" link)))
|
|
|
|
link-files)))))
|
2020-09-13 04:44:54 +02:00
|
|
|
(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))))))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(define (make-container-wrapper container fhs-manifest fhs-internal)
|
2020-09-14 00:29:18 +02:00
|
|
|
"Return a script file-like object that launches the supplied container object
|
|
|
|
in a sandboxed FHS environment."
|
2020-09-13 04:44:54 +02:00
|
|
|
(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) '()))
|
2021-03-05 19:40:43 +01:00
|
|
|
(let* ((run #$(file-append fhs-internal "/bin/" (ngc-internal-name container)))
|
2020-09-13 04:44:54 +02:00
|
|
|
(manifest-file #$(file-append fhs-manifest))
|
2021-03-05 19:40:43 +01:00
|
|
|
(xdg-runtime (getenv "XDG_RUNTIME_DIR"))
|
2020-09-13 04:44:54 +02:00
|
|
|
(home (getenv "HOME"))
|
2021-10-17 21:16:38 +02:00
|
|
|
(sandbox-home (or (getenv "GUIX_SANDBOX_HOME")
|
|
|
|
(string-append home "/" #$(ngc-sandbox-home container))))
|
2021-03-10 04:41:30 +01:00
|
|
|
(preserved-env '("^DBUS_"
|
|
|
|
"^DISPLAY$"
|
|
|
|
"^DRI_PRIME$"
|
|
|
|
"_PROXY$"
|
|
|
|
"_proxy$"
|
|
|
|
"^SDL_"
|
|
|
|
"^STEAM_"
|
|
|
|
"^XAUTHORITY$"
|
2021-03-10 23:02:09 +01:00
|
|
|
;; Matching all ^XDG_ vars causes issues
|
|
|
|
;; discussed in 80decf05.
|
|
|
|
"^XDG_DATA_HOME$"
|
|
|
|
"^XDG_RUNTIME_DIR$"))
|
2020-09-13 04:44:54 +02:00
|
|
|
(expose `("/dev/dri"
|
|
|
|
"/dev/input" ; Needed for controller input.
|
|
|
|
,@(exists-> "/etc/machine-id")
|
|
|
|
"/sys/class/input" ; Needed for controller input.
|
|
|
|
"/sys/dev"
|
2021-02-06 18:09:37 +01:00
|
|
|
,@(exists-> "/dev/nvidia0") ; needed for nvidia proprietary driver
|
|
|
|
,@(exists-> "/dev/nvidiactl")
|
|
|
|
,@(exists-> "/dev/nvidia-modeset")
|
2020-09-13 04:44:54 +02:00
|
|
|
"/sys/devices"
|
2021-07-01 20:33:59 +02:00
|
|
|
,@(exists-> "/var/run/dbus")))
|
2020-09-13 04:44:54 +02:00
|
|
|
(share `("/dev/shm"
|
|
|
|
,(string-append sandbox-home "=" home)
|
|
|
|
,@(exists-> (string-append home "/.config/pulse"))
|
2021-03-05 19:40:43 +01:00
|
|
|
,@(exists-> (string-append xdg-runtime "/pulse"))
|
|
|
|
,@(exists-> (string-append xdg-runtime "/bus"))
|
2020-09-13 04:44:54 +02:00
|
|
|
,@(exists-> (getenv "XAUTHORITY"))))
|
|
|
|
(DEBUG (equal? (getenv "DEBUG") "1"))
|
2020-09-14 23:59:05 +02:00
|
|
|
(args (cdr (command-line)))
|
2020-09-13 04:44:54 +02:00
|
|
|
(command (if DEBUG '()
|
2020-09-14 23:59:05 +02:00
|
|
|
`("--" ,run ,@args))))
|
2020-09-13 04:44:54 +02:00
|
|
|
(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)
|
2021-03-08 23:50:29 +01:00
|
|
|
(invoke #$(file-append pulseaudio "/bin/pulseaudio")
|
|
|
|
"--start"
|
|
|
|
"--exit-idle-time=60")
|
|
|
|
(apply invoke
|
2021-10-28 20:38:51 +02:00
|
|
|
`("guix" "shell"
|
|
|
|
"--container" "--no-cwd" "--network"
|
2020-09-13 04:44:54 +02:00
|
|
|
,@(map preserve-var preserved-env)
|
|
|
|
,@(map add-path expose)
|
|
|
|
,@(map (lambda (item)
|
|
|
|
(add-path item #:writable? #t))
|
|
|
|
share)
|
|
|
|
"-m" ,manifest-file
|
|
|
|
,@command)))))))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(define (make-container-manifest container fhs-internal)
|
2020-09-14 00:29:18 +02:00
|
|
|
"Return a scheme file-like object to be used as package manifest for FHS
|
2020-09-14 23:59:05 +02:00
|
|
|
containers. This manifest will use the 'modules' and 'packages' fields
|
|
|
|
specified in the container object, and will also include the exact store paths
|
|
|
|
of the containers 'wrap-package', 'union32', and 'union64' fields, as well as
|
|
|
|
the exact path for the fhs-internal package."
|
2020-09-13 04:44:54 +02:00
|
|
|
(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))
|
2020-09-04 04:22:43 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
;; 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))))
|
2020-09-04 04:22:43 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(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)))))))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2021-05-26 13:16:41 +02:00
|
|
|
(define (make-container-internal container)
|
2020-09-14 00:29:18 +02:00
|
|
|
"Return a dummy package housing the fhs-internal script."
|
2020-09-13 04:44:54 +02:00
|
|
|
(package
|
|
|
|
(name (ngc-internal-name container))
|
2020-09-13 05:55:26 +02:00
|
|
|
(version (or (ngc-version container)
|
|
|
|
(package-version (ngc-wrap-package container))))
|
2020-09-13 04:44:54 +02:00
|
|
|
(source #f)
|
2021-05-26 13:16:41 +02:00
|
|
|
(inputs `(("fhs-internal-script" ,(make-internal-script container))))
|
2020-09-13 04:44:54 +02:00
|
|
|
(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"))
|
|
|
|
(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)
|
2020-09-14 23:59:05 +02:00
|
|
|
(synopsis "Script used to set up sandbox")
|
|
|
|
(description "Script used inside the FHS Guix container to set up the
|
2020-09-13 04:44:54 +02:00
|
|
|
environment.")
|
|
|
|
(license #f)))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2021-05-26 13:16:41 +02:00
|
|
|
(define (make-internal-script container)
|
2020-09-14 00:29:18 +02:00
|
|
|
"Return an fhs-internal script which is used to perform additional steps to
|
|
|
|
set up the environment inside an FHS container before launching the desired
|
|
|
|
application."
|
2021-01-08 02:05:19 +01:00
|
|
|
(let* ((pkg (ngc-wrap-package container))
|
2020-09-13 04:44:54 +02:00
|
|
|
(run (ngc-run container)))
|
|
|
|
(program-file
|
|
|
|
(ngc-internal-name container)
|
|
|
|
(with-imported-modules
|
2021-05-26 13:16:41 +02:00
|
|
|
`((guix build utils)
|
|
|
|
(ice-9 getopt-long))
|
2020-09-13 04:44:54 +02:00
|
|
|
#~(begin
|
2021-05-26 13:16:41 +02:00
|
|
|
(use-modules (guix build utils)
|
|
|
|
(ice-9 getopt-long))
|
2020-09-19 09:57:43 +02:00
|
|
|
(define (path->str path)
|
|
|
|
(if (list? path)
|
|
|
|
(string-join path "/")
|
|
|
|
path))
|
|
|
|
(define (new-symlink pair)
|
|
|
|
(let ((target (path->str (car pair)))
|
|
|
|
(dest (path->str (cdr pair))))
|
|
|
|
(unless (file-exists? dest)
|
|
|
|
(symlink target dest))))
|
|
|
|
(define (icd-symlink file)
|
|
|
|
(new-symlink
|
|
|
|
`(,file . ("/usr/share/vulkan/icd.d" ,(basename file)))))
|
2021-05-26 13:16:41 +02:00
|
|
|
(define fhs-option-spec
|
|
|
|
'((asound32 (value #f))))
|
|
|
|
(let* ((guix-env (getenv "GUIX_ENVIRONMENT"))
|
|
|
|
(union64 #$(file-append (ngc-union64 container)))
|
|
|
|
(union32 #$(file-append (ngc-union32 container)))
|
|
|
|
(all-args (cdr (command-line)))
|
|
|
|
(fhs-args (member "--" all-args))
|
|
|
|
(steam-args (if fhs-args
|
|
|
|
(reverse (cdr (member "--" (reverse all-args))))
|
|
|
|
all-args)))
|
2020-09-19 09:57:43 +02:00
|
|
|
(delete-file "/bin/sh")
|
|
|
|
(rmdir "/bin")
|
|
|
|
(for-each
|
|
|
|
mkdir-p
|
|
|
|
'("/run/current-system/profile/etc"
|
|
|
|
"/run/current-system/profile/share"
|
|
|
|
"/sbin"
|
|
|
|
"/usr/bin"
|
|
|
|
"/usr/share/vulkan/icd.d"))
|
|
|
|
(for-each
|
|
|
|
new-symlink
|
2021-05-26 13:16:41 +02:00
|
|
|
`(((,guix-env "etc/ssl") . "/etc/ssl")
|
2020-09-19 09:57:43 +02:00
|
|
|
((,guix-env "etc/ssl") . "/run/current-system/profile/etc/ssl")
|
|
|
|
((,union32 "lib") . "/lib")
|
|
|
|
((,union32 "lib") . "/run/current-system/profile/lib")
|
|
|
|
((,union64 "bin") . "/bin")
|
|
|
|
((,union64 "bin/env") . "/usr/bin/env")
|
|
|
|
((,union64 "lib") . "/lib64")
|
|
|
|
((,union64 "lib") . "/run/current-system/profile/lib64")
|
|
|
|
((,union64 "lib/locale") . "/run/current-system/locale")
|
|
|
|
((,union64 "sbin/ldconfig") . "/sbin/ldconfig")
|
|
|
|
((,union64 "share/drirc.d") . "/usr/share/drirc.d")
|
|
|
|
((,union64 "share/fonts") . "/run/current-system/profile/share/fonts")
|
|
|
|
((,union64 "share/vulkan/explicit_layer.d") .
|
|
|
|
"/usr/share/vulkan/explicit_layer.d")))
|
|
|
|
(for-each
|
|
|
|
icd-symlink
|
|
|
|
`(,@(find-files (string-append union32 "/share/vulkan/icd.d")
|
|
|
|
#:directories? #t)
|
|
|
|
,@(find-files (string-append union64 "/share/vulkan/icd.d")
|
|
|
|
#:directories? #t)))
|
2021-05-26 13:16:41 +02:00
|
|
|
|
|
|
|
;; Process FHS-specific command line options
|
|
|
|
(let* ((options (getopt-long (or fhs-args '("")) fhs-option-spec))
|
|
|
|
(asound32-opt (option-ref options 'asound32 #f))
|
|
|
|
(asound-lib (if asound32-opt "lib" "lib64")))
|
|
|
|
(if asound32-opt
|
|
|
|
(display "\n\n/etc/asound.conf configured for 32-bit.\n\n\n")
|
|
|
|
(display "\n\n/etc/asound.conf configured for 64-bit.\nLaunch steam with \"steam -- --asound32\" to use 32-bit instead.\n\n\n"))
|
|
|
|
(with-output-to-file "/etc/asound.conf"
|
|
|
|
(lambda _ (format (current-output-port) "# Generated by steam-client
|
|
|
|
|
|
|
|
# Use PulseAudio by default
|
|
|
|
pcm_type.pulse {
|
|
|
|
lib \"/~a/alsa-lib/libasound_module_pcm_pulse.so\"
|
|
|
|
}
|
|
|
|
|
|
|
|
ctl_type.pulse {
|
|
|
|
lib \"/~a/alsa-lib/libasound_module_ctl_pulse.so\"
|
|
|
|
}
|
|
|
|
|
|
|
|
pcm.!default {
|
|
|
|
type pulse
|
|
|
|
fallback \"sysdefault\"
|
|
|
|
hint {
|
|
|
|
show on
|
|
|
|
description \"Default ALSA Output (currently PulseAudio Sound Server)\"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ctl.!default {
|
|
|
|
type pulse
|
|
|
|
fallback \"sysdefault\"
|
|
|
|
}\n\n" asound-lib asound-lib))))
|
|
|
|
|
|
|
|
(apply system* `(#$(file-append pkg run) ,@steam-args))))))))
|
2020-05-06 20:53:49 +02:00
|
|
|
|
2020-09-13 04:44:54 +02:00
|
|
|
(define-public steam
|
|
|
|
(nonguix-container->package
|
|
|
|
(nonguix-container
|
|
|
|
(name "steam")
|
|
|
|
(wrap-package steam-client)
|
2021-01-08 02:05:19 +01:00
|
|
|
(run "/bin/steam-wrapper")
|
2020-09-13 04:44:54 +02:00
|
|
|
(union64
|
|
|
|
(fhs-union `(,@steam-client-libs
|
|
|
|
,@steam-gameruntime-libs
|
|
|
|
,@fhs-min-libs)
|
|
|
|
#:name "fhs-union-64"))
|
|
|
|
(union32
|
|
|
|
(fhs-union `(,@steam-client-libs
|
|
|
|
,@steam-gameruntime-libs
|
|
|
|
,@fhs-min-libs)
|
|
|
|
#:name "fhs-union-32"
|
|
|
|
#:system "i686-linux"))
|
2021-05-26 13:16:41 +02:00
|
|
|
(link-files '("share/applications/steam.desktop"
|
|
|
|
"share/applications/steam-asound32.desktop"))
|
2020-05-06 20:53:49 +02:00
|
|
|
(description "Steam is a digital software distribution platform created by
|
2020-09-13 04:44:54 +02:00
|
|
|
Valve. This package provides a script for launching Steam in a Guix container
|
|
|
|
which will use the directory @file{$HOME/.local/share/guix-sandbox-home} where
|
|
|
|
all games will be installed."))))
|
2021-04-12 15:38:52 +02:00
|
|
|
|
|
|
|
(define-public steam-nvidia
|
|
|
|
(nonguix-container->package
|
|
|
|
(nonguix-container
|
|
|
|
(name "steam-nvidia")
|
|
|
|
(wrap-package steam-client)
|
|
|
|
(run "/bin/steam-wrapper")
|
|
|
|
(union64
|
|
|
|
(replace-mesa
|
|
|
|
(fhs-union `(,@steam-client-libs
|
|
|
|
,@steam-gameruntime-libs
|
|
|
|
,@fhs-min-libs)
|
|
|
|
#:name "fhs-union-64")))
|
|
|
|
(union32
|
|
|
|
(replace-mesa
|
|
|
|
(fhs-union `(,@steam-client-libs
|
|
|
|
,@steam-gameruntime-libs
|
|
|
|
,@fhs-min-libs)
|
|
|
|
#:name "fhs-union-32"
|
|
|
|
#:system "i686-linux")))
|
2021-05-28 07:48:03 +02:00
|
|
|
(link-files '("share/applications/steam.desktop"
|
|
|
|
"share/applications/steam-asound32.desktop"))
|
2021-04-12 15:38:52 +02:00
|
|
|
(description "Steam is a digital software distribution platform created by
|
|
|
|
Valve. This package provides a script for launching Steam in a Guix container
|
|
|
|
which will use the directory @file{$HOME/.local/share/guix-sandbox-home} where
|
|
|
|
all games will be installed."))))
|