nonguix/nongnu/packages/steam-client.scm
John Kehayias 6c51f01ad8
nongnu: steam: Work around propagated libx11 profile collision.
Fixes #281.

Use the same fix as when this happened before with expat and fontconfig, as in
commit 3df99d7769.

* nongnu/packages/steam-client.scm (libxdamage-fixed, mesa-fixed): New
variables.
(steam-client-libs): Replace mesa with mesa-fixed.
2023-09-03 22:34:47 -04:00

252 lines
11 KiB
Scheme

;;; 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>
;;; Copyright © 2021 Kozo <kozodev@runbox.com>
;;; Copyright © 2021, 2022 John Kehayias <john.kehayias@protonmail.com>
;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org>
;;; Copyright © 2023 Elijah Malaby
(define-module (nongnu packages steam-client)
#:use-module ((guix licenses) #:prefix license:)
#:use-module ((nonguix licenses) #:prefix license:)
#:use-module (guix git-download)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix build-system gnu)
#:use-module (guix build-system python)
#: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 (gnu packages lsof)
#: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 (gnu packages xorg)
#:use-module (nonguix multiarch-container)
#:use-module (nonguix utils))
(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"))))
;; After guix commit to add a replacement for libx11 (security fixes),
;; 5ff0c8997a2ddf71af477883584a5f9ccd9b757f, a profile collision happens with
;; the propagated libx11 (now grafted) from mesa and its propagated-input
;; libxdamage. See previous upstream report (when this occurred for expat and
;; fontconfig) at <https://issues.guix.gnu.org/53406>. So we define explicit
;; replacement packages to workaround this issue.
;; TODO: remove once upstream bug is fixed or libx11 is ungrafted.
(define libxdamage-fixed
(package
(inherit libxdamage)
(propagated-inputs
(modify-inputs (package-propagated-inputs libxdamage)
(replace "libx11" libx11-fixed)))))
(define mesa-fixed
(package
(inherit mesa)
(propagated-inputs
(modify-inputs (package-propagated-inputs mesa)
(replace "libx11" libx11-fixed)
(replace "libxdamage" libxdamage-fixed)))))
(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.
("fontconfig" ,fontconfig) ; 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-for-mesa) ; Required for mesa.
("lsof" ,lsof) ; Required for some friend's list actions.
;; TODO: Set back to mesa once libx11 is ungrafted upstream or once
;; <https://issues.guix.gnu.org/53406> is fixed.
("mesa" ,mesa-fixed) ; 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-user-dirs" ,xdg-user-dirs) ; Suppress warning of missing xdg-user-dir.
("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.
("spdlog" ,spdlog))) ; Required for MangoHud.
(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-public steam-container
(nonguix-container
(name "steam")
(wrap-package steam-client)
(run "/bin/steam")
(ld.so.conf steam-ld.so.conf)
(ld.so.cache steam-ld.so.cache)
(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-container
(nonguix-container
(inherit steam-container)
(name "steam-nvidia")
(union64 (replace-mesa (ngc-union64 steam-container)))
(union32 (replace-mesa (ngc-union32 steam-container)))))
(define-public steam (nonguix-container->package steam-container))
(define-public steam-nvidia (nonguix-container->package steam-nvidia-container))
(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)))