diff options
Diffstat (limited to 'nongnu/packages/steam-client.scm')
-rw-r--r-- | nongnu/packages/steam-client.scm | 324 |
1 files changed, 244 insertions, 80 deletions
diff --git a/nongnu/packages/steam-client.scm b/nongnu/packages/steam-client.scm index 7e91af8..08baba8 100644 --- a/nongnu/packages/steam-client.scm +++ b/nongnu/packages/steam-client.scm @@ -1,23 +1,10 @@ -;;; GNU Guix --- Functional package management for GNU +;;; SPDX-License-Identifier: GPL-3.0-or-later ;;; Copyright © 2020 pkill-9 ;;; Copyright © 2020, 2021 ison <ison@airmail.cc> ;;; Copyright © 2021 pineapples ;;; Copyright © 2021 Jean-Baptiste Volatier <jbv@pm.me> -;;; -;;; 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/>. +;;; Copyright © 2021 Kozo <kozodev@runbox.com> +;;; Copyright © 2021, 2022 John Kehayias <john.kehayias@protonmail.com> ;;; The steam script provided by this package may optionally be started as ;;; a shell instead of automatically launching Steam by setting the @@ -31,7 +18,7 @@ ;;; 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 environment") +;;; - Wrapper script [make-container-wrapper] (runs "guix shell") ;;; References: ;;; -> manifest.scm [make-container-manifest] (used by wrapper to guarantee ;;; exact store items) @@ -49,30 +36,48 @@ ;;; 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> @@ -102,7 +107,7 @@ (define steam-client (package (name "steam-client") - (version "1.0.0.61") + (version "1.0.0.75") (source (origin (method url-fetch) @@ -110,32 +115,27 @@ version ".tar.gz")) (sha256 (base32 - "0c5xy57gwr14vp3wy3jpqi5dl6y7n01p2dy4jlgl9bf9x7616r6n")) + "19rn29slsxv7b5fisr1jzn79bskzifbj5hmxqn2436ivwfjna9g5")) (file-name (string-append name "-" version ".tar.gz")))) (build-system gnu-build-system) (arguments - `(#:tests? #f + `(#: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 - (replace 'configure + (delete 'configure) + ;; Patch Makefile so it creates links to the store rather than /lib. + (add-after 'unpack 'patch-makefile (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"))) + (substitute* "Makefile" + (("-fns ") + "-fns $(DESTDIR)")))) + (delete 'patch-dot-desktop-files) (add-after 'unpack 'patch-startscript (lambda _ - (substitute* "steam" + (substitute* "bin_steam.sh" (("/usr") (assoc-ref %outputs "out"))))) (add-after 'patch-dot-desktop-files 'patch-desktop-file (lambda _ @@ -152,34 +152,40 @@ (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" - "/lib64/vdpau"))) - ;; .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")))))))) + (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) + `(("glibc" ,glibc-for-fhs) ("glibc-locales" ,glibc-locales))) (define steam-client-libs @@ -187,27 +193,47 @@ ("coreutils" ,coreutils) ("diffutils" ,diffutils) ("dbus-glib" ,dbus-glib) ; Required for steam browser. - ("fontconfig" ,fontconfig) ; Required for steam client. + ("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. - ("xz" ,xz))) + ("wayland" ,wayland) ; Required for mesa vulkan (e.g. libvulkan_radeon). + ("flatpak-xdg-utils" ,flatpak-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. + ("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." @@ -234,6 +260,65 @@ (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." @@ -323,26 +408,50 @@ in a sandboxed FHS environment." (preserved-env '("^DBUS_" "^DISPLAY$" "^DRI_PRIME$" + "^GDK_SCALE$" ; For Steam UI scaling. + "^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$")) - (expose `("/dev/dri" + "^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. - ,@(exists-> "/etc/machine-id") - "/sys/class/input" ; Needed for controller input. - "/sys/dev" + "/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"))) - (share `("/dev/shm" + ;; /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")) @@ -352,6 +461,15 @@ in a sandboxed FHS environment." (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 @@ -362,8 +480,8 @@ in a sandboxed FHS environment." "--start" "--exit-idle-time=60") (apply invoke - `("guix" "environment" - "--ad-hoc" "--container" "--no-cwd" "--network" + `("guix" "shell" + "--container" "--no-cwd" "--network" ,@(map preserve-var preserved-env) ,@(map add-path expose) ,@(map (lambda (item) @@ -439,13 +557,18 @@ environment.") "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." - (let* ((pkg (ngc-wrap-package container)) + ;; 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) - (ice-9 getopt-long)) + `((guix build utils)) #~(begin (use-modules (guix build utils) (ice-9 getopt-long)) @@ -466,6 +589,8 @@ application." (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 @@ -478,32 +603,47 @@ application." '("/run/current-system/profile/etc" "/run/current-system/profile/share" "/sbin" - "/usr/bin" - "/usr/share/vulkan/icd.d")) + "/usr/share/vulkan/icd.d" + "/usr/share/vulkan/implicit_layer.d")) ; Implicit layers like MangoHud (for-each new-symlink - `(((,guix-env "etc/ssl") . "/etc/ssl") + `((,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/env") . "/usr/bin/env") + ((,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"))) + "/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) + #:directories? #t #:stat stat) ,@(find-files (string-append union64 "/share/vulkan/icd.d") - #:directories? #t))) + #: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 + ;; 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"))) @@ -543,7 +683,7 @@ ctl.!default { (nonguix-container (name "steam") (wrap-package steam-client) - (run "/bin/steam-wrapper") + (run "/bin/steam") (union64 (fhs-union `(,@steam-client-libs ,@steam-gameruntime-libs @@ -567,7 +707,7 @@ all games will be installed.")))) (nonguix-container (name "steam-nvidia") (wrap-package steam-client) - (run "/bin/steam-wrapper") + (run "/bin/steam") (union64 (replace-mesa (fhs-union `(,@steam-client-libs @@ -587,3 +727,27 @@ all games will be installed.")))) 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))) |