diff options
Diffstat (limited to 'nongnu/packages/steam-client.scm')
-rw-r--r-- | nongnu/packages/steam-client.scm | 767 |
1 files changed, 0 insertions, 767 deletions
diff --git a/nongnu/packages/steam-client.scm b/nongnu/packages/steam-client.scm deleted file mode 100644 index 9a9ae5e..0000000 --- a/nongnu/packages/steam-client.scm +++ /dev/null @@ -1,767 +0,0 @@ -;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2020 pkill-9 -;;; Copyright © 2020, 2021 ison <ison@airmail.cc> -;;; Copyright © 2021 pineapples -;;; Copyright © 2021 Jean-Baptiste Volatier <jbv@pm.me> -;;; Copyright © 2021 Kozo <kozodev@runbox.com> -;;; Copyright © 2021, 2022 John Kehayias <john.kehayias@protonmail.com> -;;; -;;; 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 -;;; Steam should subsequently be launched via fhs-internal. - -;;; 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. - -;;; A container wrapper creates the following store items: -;;; * Main container package [nonguix-container->package] (basically a dummy -;;; package with symlink to wrapper script) -;;; - Wrapper script [make-container-wrapper] (runs "guix shell") -;;; 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. - -(define-module (nongnu packages steam-client) - #:use-module ((guix licenses) #:prefix license:) - #:use-module ((nonguix licenses) #:prefix license:) - #:use-module (guix gexp) - #:use-module (guix git-download) - #:use-module (guix utils) - #:use-module (guix packages) - #:use-module (guix records) - #:use-module (guix download) - #:use-module (guix build-system gnu) - #:use-module (guix build-system python) - #:use-module (guix build-system trivial) - #:use-module (guix transformations) - #:use-module (gnu packages) - #:use-module (gnu packages audio) - #:use-module (gnu packages base) - #:use-module (gnu packages bash) - #:use-module (gnu packages certs) - #:use-module (gnu packages compression) - #:use-module (gnu packages elf) - #:use-module (gnu packages file) - #:use-module (gnu packages fonts) - #:use-module (gnu packages fontutils) - #:use-module (gnu packages freedesktop) - #:use-module (gnu packages gawk) - #:use-module (gnu packages gcc) - #:use-module (gnu packages gl) - #:use-module (gnu packages glib) - #:use-module (gnu packages gnome) - #:use-module (gnu packages graphics) - #:use-module (gnu packages libbsd) - #:use-module (gnu packages libusb) - #:use-module (gnu packages linux) - #:use-module (gnu packages llvm) - #:use-module (gnu packages logging) - #:use-module (nongnu packages nvidia) - #:use-module (gnu packages pciutils) - #:use-module (gnu packages pulseaudio) - #:use-module (gnu packages python) - #:use-module (gnu packages python-web) - #:use-module (gnu packages python-xyz) - #:use-module (gnu packages toolkits) - #:use-module (gnu packages video) - #:use-module (nonguix utils)) - -(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 '())) - (link-files ngc-link-files (default '())) - (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.75") - (source - (origin - (method url-fetch) - (uri (string-append "http://repo.steampowered.com/steam/archive/precise/steam_" - version ".tar.gz")) - (sha256 - (base32 - "19rn29slsxv7b5fisr1jzn79bskzifbj5hmxqn2436ivwfjna9g5")) - (file-name (string-append name "-" version ".tar.gz")))) - (build-system gnu-build-system) - (arguments - `(#:tests? #f ; There are no tests. - #:validate-runpath? #f ; Looks for bin/steam which doesn't exist. - #:make-flags - (list "PREFIX=" (string-append "DESTDIR=" (assoc-ref %outputs "out"))) - #:phases - (modify-phases %standard-phases - (delete 'configure) - ;; Patch Makefile so it creates links to the store rather than /lib. - (add-after 'unpack 'patch-makefile - (lambda _ - (substitute* "Makefile" - (("-fns ") - "-fns $(DESTDIR)")))) - (delete 'patch-dot-desktop-files) - (add-after 'unpack 'patch-startscript - (lambda _ - (substitute* "bin_steam.sh" - (("/usr") (assoc-ref %outputs "out"))))) - (add-after 'patch-dot-desktop-files 'patch-desktop-file - (lambda _ - (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)"))))) - ;; Steamdeps installs missing packages, which doesn't work with Guix. - (add-after 'install-binaries 'post-install - (lambda* (#:key inputs outputs #:allow-other-keys) - (let ((out (assoc-ref %outputs "out"))) - (delete-file (string-append out "/lib/steam/bin_steamdeps.py")) - (delete-file (string-append out "/bin/steamdeps")))))))) - (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 glibc-for-fhs - (package - (inherit glibc) - (name "glibc-for-fhs") - (source (origin (inherit (package-source glibc)) - ;; Remove Guix's patch to read ld.so.cache from /gnu/store - ;; directories, re-enabling the default /etc/ld.so.cache - ;; behavior. - (patches (delete (car (search-patches "glibc-dl-cache.patch")) - (origin-patches (package-source glibc)))))))) - -;; After guix commit to add a replacement for expat (security fixes), -;; https://git.savannah.gnu.org/cgit/guix.git/commit/?id=2045852b096131a714409aa0cc4fe17938f60b15 -;; a profile collision happens with the propagated expat (now grafted) from -;; fontconfig. See upstream report https://issues.guix.gnu.org/53406 -;; So we define a fontconfig variation that explicitly does the expat replacement -;; which works around this bug for now, at the cost of building fontconfig. -;; TODO: remove once upstream bug is fixed -(define fontconfig-fixed - (package - (inherit fontconfig) - (propagated-inputs - (modify-inputs (package-propagated-inputs fontconfig) - (replace "expat" (@@ (gnu packages xml) expat/fixed)))))) - -(define fhs-min-libs - `(("glibc" ,glibc-for-fhs) - ("glibc-locales" ,glibc-locales))) - -(define steam-client-libs - `(("bash" ,bash) ; Required for steam startup. - ("coreutils" ,coreutils) - ("diffutils" ,diffutils) - ("dbus-glib" ,dbus-glib) ; Required for steam browser. - ("elfutils" ,elfutils) ; Required for capturing library dependencies in pv. - ("eudev" ,eudev) ; Required for steamwebhelper/heavy runtime. - ;; TODO: set back to ,fontconfig once https://issues.guix.gnu.org/53406 is fixed - ("fontconfig" ,fontconfig-fixed) ; Required for steam client. - ("file" ,file) ; Used for steam installation. - ("find" ,findutils) ; Required at least for some logging. - ("freetype" ,freetype) ; Required for steam login. - ("gawk" ,gawk) - ("gcc:lib" ,gcc "lib") ; Required for steam startup. - ("grep" ,grep) - ("libbsd" ,libbsd) - ("libcap" ,libcap) ; Required for SteamVR, but needs pkexec too. - ("libusb" ,libusb) ; Required for SteamVR. - ("libva" ,libva) ; Required for hardware video encoding/decoding. - ("libvdpau" ,libvdpau) ; Required for hardware video encoding/decoding. - ("libvdpau-va-gl" ,libvdpau-va-gl) ; Additional VDPAU support. - ("llvm" ,llvm-11) ; Required for mesa. - ("mesa" ,mesa) ; Required for steam startup. - ("nss-certs" ,nss-certs) ; Required for steam login. - ("pciutils" ,pciutils) ; Tries to run lspci at steam startup. - ("procps" ,procps) - ("sed" ,sed) - ("tar" ,tar) - ("usbutils" ,usbutils) ; Required for SteamVR. - ("util-linux" ,util-linux) ; Required for steam login. - ("wayland" ,wayland) ; Required for mesa vulkan (e.g. libvulkan_radeon). - ("xdg-utils" ,xdg-utils) - ("xz" ,xz) - ("zenity" ,zenity))) ; Required for progress dialogs. - -(define steam-gameruntime-libs - `(("alsa-lib" ,alsa-lib) ; Required for audio in most games. - ("alsa-plugins:pulseaudio" ,alsa-plugins "pulseaudio") ; Required for audio in most games. - ("font-dejavu" ,font-dejavu) - ("font-liberation" ,font-liberation) - ("imgui" ,imgui-1.86) ; Required for MangoHud. - ("mangohud" ,mangohud) - ("openal" ,openal) ; Prevents corrupt audio in Crypt of the Necrodancer. - ("pulseaudio" ,pulseaudio) ; Prevents corrupt audio in Sven Coop. - ("python" ,python) ; Required for KillingFloor2 and Wreckfest. - ("spdlog" ,spdlog))) ; Required for MangoHud. - -(define* (fhs-union inputs #:key (name "fhs-union") (version "0.0") (system "x86_64-linux")) - "Create a package housing the union of inputs." - (package - (name name) - (version version) - (source #f) - (inputs inputs) - (build-system trivial-build-system) - (arguments - `(#:system ,system - #:modules ((guix build union)) - #:builder - (begin - (use-modules (ice-9 match) - (guix build union)) - (match %build-inputs - (((_ . directories) ...) - (union-build (assoc-ref %outputs "out") - directories) - #t))))) - (home-page #f) - (synopsis "Libraries used for FHS") - (description "Libraries needed to build a guix container FHS.") - (license #f))) - -(define (ld.so.conf->ld.so.cache ld-conf) - "Create a ld.so.cache file-like object from an ld.so.conf file." - (computed-file - "ld.so.cache" - (with-imported-modules - `((guix build utils)) - #~(begin - (use-modules (guix build utils)) - (let ((ldconfig (string-append #$glibc "/sbin/ldconfig"))) - (invoke ldconfig - "-X" ; Don't update symbolic links. - "-f" #$ld-conf ; Use #$ld-conf as configuration file. - "-C" #$output)))))) ; Use #$output as cache file. - -(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)) - ;; Need to quote "#$packages" as #$packages tries to "apply" the first item to the rest, like a procedure. - (let* ((packages '#$packages) - ;; Add "/lib" to each package. - ;; TODO Make this more general for other needed directories. - (dirs-lib - (lambda (packages) - (map (lambda (package) - (string-append package "/lib")) - packages))) - (fhs-lib-dirs - (dirs-lib packages))) - (call-with-output-file #$output - (lambda (port) - (for-each (lambda (directory) - (display directory port) - (newline port)) - fhs-lib-dirs))) - #$output))))) - -(define steam-ld.so.conf - (packages->ld.so.conf - (list (fhs-union `(,@steam-client-libs - ,@steam-gameruntime-libs - ,@fhs-min-libs) - #:name "fhs-union-64") - (fhs-union `(,@steam-client-libs - ,@steam-gameruntime-libs - ,@fhs-min-libs) - #:name "fhs-union-32" - #:system "i686-linux")))) - -(define steam-ld.so.cache - (ld.so.conf->ld.so.cache steam-ld.so.conf)) - -(define (nonguix-container->package container) - "Return a package with wrapper script to launch the supplied container object -in a sandboxed 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)) - (pkg (ngc-wrap-package container))) - (package - (name (ngc-name container)) - (version (or (ngc-version container) - (package-version pkg))) - (source #f) - (inputs `(("wrap-package" ,(ngc-wrap-package container)) - ,@(if (null? (ngc-union64 container)) - '() - `(("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))) - (build-system trivial-build-system) - (arguments - `(#:modules ((guix build utils)) - #:builder - (begin - (use-modules (guix build utils)) - (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))) - (wrapper-target (assoc-ref %build-inputs "fhs-wrapper")) - (wrapper-dest (string-append out "/bin/" ,(ngc-name container))) - (link-files ',(ngc-link-files container))) - (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) - (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))))) - (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 the supplied container object -in a sandboxed FHS environment." - (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* ((run #$(file-append fhs-internal "/bin/" (ngc-internal-name container))) - (manifest-file #$(file-append fhs-manifest)) - (xdg-runtime (getenv "XDG_RUNTIME_DIR")) - (home (getenv "HOME")) - (sandbox-home (or (getenv "GUIX_SANDBOX_HOME") - (string-append home "/" #$(ngc-sandbox-home container)))) - (preserved-env '("^DBUS_" - "^DISPLAY$" - "^DRI_PRIME$" - "^PRESSURE_VESSEL_" ; For pressure vessel options. - "_PROXY$" - "_proxy$" - "^SDL_" - "^STEAM_" - "^VDPAU_DRIVER_PATH$" ; For VDPAU drivers. - "^XAUTHORITY$" - ;; Matching all ^XDG_ vars causes issues - ;; discussed in 80decf05. - "^XDG_DATA_HOME$" - "^XDG_RUNTIME_DIR$" - ;; The following are useful for debugging. - "^CAPSULE_DEBUG$" - "^G_MESSAGES_DEBUG$" - "^LD_DEBUG$" - "^LIBGL_DEBUG$")) - (expose `("/dev/bus/usb" ; Needed for libusb. - "/dev/dri" - "/dev/input" ; Needed for controller input. - "/dev/uinput" ; Needed for Steam Input. - ,@(exists-> "/dev/nvidia0") ; needed for nvidia proprietary driver - ,@(exists-> "/dev/nvidiactl") - ,@(exists-> "/dev/nvidia-modeset") - ,@(exists-> "/etc/machine-id") - "/etc/localtime" ; Needed for correct time zone. - "/sys/class/drm" ; Needed for hw monitoring like MangoHud. - "/sys/class/hwmon" ; Needed for hw monitoring like MangoHud. - "/sys/class/hidraw" ; Needed for devices like the Valve Index. - "/sys/class/input" ; Needed for controller input. - ,@(exists-> "/sys/class/power_supply") ; Needed for power monitoring like MangoHud. - ,@(exists-> "/sys/class/powercap") ; Needed for power monitoring like MangoHud. - "/sys/dev" - "/sys/devices" - ,@(exists-> "/var/run/dbus"))) - ;; /dev/hidraw is needed for SteamVR to access the HMD, although here we - ;; share all hidraw devices. Instead we could filter to only share specific - ;; device. See, for example, this script: - ;; https://arvchristos.github.io/post/matching-dev-hidraw-devices-with-physical-devices/ - (share `(,@(find-files "/dev" "hidraw") - "/dev/shm" - ;; "/tmp/.X11-unix" is needed for bwrap, and "/tmp" more generally - ;; for writing things like crash dumps and "steam_chrome_shm". - "/tmp" - ,(string-append sandbox-home "=" home) - ,@(exists-> (string-append home "/.config/pulse")) - ,@(exists-> (string-append xdg-runtime "/pulse")) - ,@(exists-> (string-append xdg-runtime "/bus")) - ,@(exists-> (getenv "XAUTHORITY")))) - (DEBUG (equal? (getenv "DEBUG") "1")) - (args (cdr (command-line))) - (command (if DEBUG '() - `("--" ,run ,@args)))) - ;; TODO: Remove once upstream change is merged and in stable pressure-vessel - ;; (although may want to hold off for anyone using older pressure-vessel versions - ;; for whatever reason), see: - ;; https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/merge_requests/406 - (setenv "PRESSURE_VESSEL_FILESYSTEMS_RO" "/gnu/store") - ;; By default VDPAU drivers are searched for in libvdpau's store - ;; path, so set this path to where the drivers will actually be - ;; located in the container. - (setenv "VDPAU_DRIVER_PATH" "/lib64/vdpau") - (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) - (invoke #$(file-append pulseaudio "/bin/pulseaudio") - "--start" - "--exit-idle-time=60") - (apply invoke - `("guix" "shell" - "--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 to be used as package manifest for FHS -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." - (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 dummy package housing the fhs-internal script." - (package - (name (ngc-internal-name container)) - (version (or (ngc-version container) - (package-version (ngc-wrap-package container)))) - (source #f) - (inputs `(("fhs-internal-script" ,(make-internal-script container)))) - (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) - (synopsis "Script used to set up sandbox") - (description "Script used inside the FHS Guix container to set up the -environment.") - (license #f))) - -(define (make-internal-script container) - "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." - ;; The ld cache is not created inside the container, meaning the paths it - ;; contains are directly to /gnu/store/. Instead, it could be generated with - ;; a generic ld.so.conf and result in paths more typical in an FHS distro, - ;; like /lib within the container. This may be useful for future compatibility. - (let* ((ld.so.conf steam-ld.so.conf) - (ld.so.cache steam-ld.so.cache) - (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) - (ice-9 getopt-long)) - (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))))) - (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))) - (ld.so.conf #$(file-append ld.so.conf)) - (ld.so.cache #$(file-append ld.so.cache)) - (all-args (cdr (command-line))) - (fhs-args (member "--" all-args)) - (steam-args (if fhs-args - (reverse (cdr (member "--" (reverse all-args)))) - all-args))) - (delete-file "/bin/sh") - (rmdir "/bin") - (for-each - mkdir-p - '("/run/current-system/profile/etc" - "/run/current-system/profile/share" - "/sbin" - "/usr/share/vulkan/icd.d" - "/usr/share/vulkan/implicit_layer.d")) ; Implicit layers like MangoHud - (for-each - new-symlink - `((,ld.so.cache . "/etc/ld.so.cache") - (,ld.so.conf . "/etc/ld.so.conf") ;; needed? - ((,guix-env "etc/ssl") . "/etc/ssl") - ((,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") . "/usr/bin") ; Steam hardcodes some paths like xdg-open. - ((,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 "etc/fonts") . "/etc/fonts") - ((,union64 "share/vulkan/explicit_layer.d") . - "/usr/share/vulkan/explicit_layer.d") - ;; The MangoHud layer has the same file name for 64- and 32-bit, - ;; so create links with different names. - ((,union64 "share/vulkan/implicit_layer.d/MangoHud.json") . - "/usr/share/vulkan/implicit_layer.d/MangoHud.json") - ((,union32 "share/vulkan/implicit_layer.d/MangoHud.json") . - "/usr/share/vulkan/implicit_layer.d/MangoHud.x86.json"))) - (for-each - icd-symlink - ;; Use stat to follow links from packages like MangoHud. - `(,@(find-files (string-append union32 "/share/vulkan/icd.d") - #:directories? #t #:stat stat) - ,@(find-files (string-append union64 "/share/vulkan/icd.d") - #:directories? #t #:stat stat))) - ;; TODO: Is this the right place for this? - ;; Newer versions of Steam won't startup if they can't copy to here - ;; (previous would output this error but continue). - (if (file-exists? ".steam/root/bootstrap.tar.xz") - (chmod ".steam/root/bootstrap.tar.xz" #o644)) - - ;; 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)))))))) - -(define-public steam - (nonguix-container->package - (nonguix-container - (name "steam") - (wrap-package steam-client) - (run "/bin/steam") - (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")) - (link-files '("share/applications/steam.desktop" - "share/applications/steam-asound32.desktop")) - (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.")))) - -(define-public steam-nvidia - (nonguix-container->package - (nonguix-container - (name "steam-nvidia") - (wrap-package steam-client) - (run "/bin/steam") - (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"))) - (link-files '("share/applications/steam.desktop" - "share/applications/steam-asound32.desktop")) - (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.")))) - -(define-public protonup-ng - (package - (name "protonup-ng") - (version "0.2.1") - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/cloudishBenne/protonup-ng") - (commit version))) - (file-name (git-file-name name version)) - (sha256 - (base32 "0yd2mhhqxzarqxk85zf42s931jzc94f1cssn1hblsqghr79laa45")))) - (build-system python-build-system) - (arguments - (list #:tests? #f)) ; there are no tests - (inputs - (list python-configparser python-requests)) - (home-page "https://github.com/cloudishBenne/protonup-ng") - (synopsis "Manage Proton-GE Installations") - (description "ProtonUp-ng is a CLI program and API to automate the installation -and update of GloriousEggroll's Proton-GE.") - (license license:gpl3))) |