summaryrefslogtreecommitdiffstats
path: root/pkgs/tools/package-management
diff options
context:
space:
mode:
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>2020-12-30 06:22:20 +0000
committerGitHub <noreply@github.com>2020-12-30 06:22:20 +0000
commit056304189c3fce8a784511afdb36c8db8caf44ff (patch)
tree4be0942f0eaf063f741bc840812f68ae8714f85b /pkgs/tools/package-management
parent31fc47581244ce947c2e91f817bc823c000c4c35 (diff)
parent5dbf5f90d97c0af9efd36ecfdb8648e74ce39532 (diff)
Merge master into staging-next
Diffstat (limited to 'pkgs/tools/package-management')
-rw-r--r--pkgs/tools/package-management/protontricks/default.nix52
-rw-r--r--pkgs/tools/package-management/protontricks/steam-run.patch254
2 files changed, 283 insertions, 23 deletions
diff --git a/pkgs/tools/package-management/protontricks/default.nix b/pkgs/tools/package-management/protontricks/default.nix
index 02bc599f47dc..e4e60442c8fb 100644
--- a/pkgs/tools/package-management/protontricks/default.nix
+++ b/pkgs/tools/package-management/protontricks/default.nix
@@ -1,31 +1,29 @@
-{ stdenv
-, lib
+{ lib
, buildPythonApplication
, fetchFromGitHub
, setuptools_scm
, vdf
-, wine
+, steam-run
, winetricks
, zenity
-, pytest
+, pytestCheckHook
}:
buildPythonApplication rec {
pname = "protontricks";
- version = "1.4.2";
+ version = "1.4.3";
src = fetchFromGitHub {
owner = "Matoking";
repo = pname;
rev = version;
- sha256 = "0ri4phi1rna9snrxa6gl23walyack09mgax7zpjqfpxivwls3ach";
+ sha256 = "0a5727igwafwvj8rr5lv0lx8rlfji3qkzmrbp0d15w5dc4fhknp0";
};
- # Fix interpreter in mock run.sh for tests
- postPatch = ''
- substituteInPlace tests/conftest.py \
- --replace '#!/bin/bash' '#!${stdenv.shell}' \
- '';
+ patches = [
+ # Use steam-run to run Proton binaries
+ ./steam-run.patch
+ ];
preBuild = ''
export SETUPTOOLS_SCM_PRETEND_VERSION="${version}"
@@ -34,22 +32,30 @@ buildPythonApplication rec {
nativeBuildInputs = [ setuptools_scm ];
propagatedBuildInputs = [ vdf ];
- # The wine install shipped with Proton must run under steam's
- # chrootenv, but winetricks and zenity break when running under
- # it. See https://github.com/NixOS/nix/issues/902.
- #
- # The current workaround is to use wine from nixpkgs
makeWrapperArgs = [
- "--set STEAM_RUNTIME 0"
- "--set-default WINE ${wine}/bin/wine"
- "--set-default WINESERVER ${wine}/bin/wineserver"
- "--prefix PATH : ${lib.makeBinPath [ winetricks zenity ]}"
+ "--prefix PATH : ${lib.makeBinPath [
+ steam-run
+ (winetricks.override {
+ # Remove default build of wine to reduce closure size.
+ # Falls back to wine in PATH when --no-runtime is passed.
+ wine = null;
+ })
+ zenity
+ ]}"
];
- checkInputs = [ pytest ];
- checkPhase = "pytest";
+ checkInputs = [ pytestCheckHook ];
+ disabledTests = [
+ # Steam runtime is hard-coded with steam-run.patch and can't be configured
+ "test_run_steam_runtime_not_found"
+ "test_unknown_steam_runtime_detected"
+
+ # Steam runtime 2 currently isn't supported
+ # See https://github.com/NixOS/nixpkgs/issues/100655
+ "test_run_winetricks_steam_runtime_v2"
+ ];
- meta = with stdenv.lib; {
+ meta = with lib; {
description = "A simple wrapper for running Winetricks commands for Proton-enabled games";
homepage = "https://github.com/Matoking/protontricks";
license = licenses.gpl3;
diff --git a/pkgs/tools/package-management/protontricks/steam-run.patch b/pkgs/tools/package-management/protontricks/steam-run.patch
new file mode 100644
index 000000000000..536072cafc48
--- /dev/null
+++ b/pkgs/tools/package-management/protontricks/steam-run.patch
@@ -0,0 +1,254 @@
+diff --git a/src/protontricks/cli.py b/src/protontricks/cli.py
+index 6506dae..2f762c9 100755
+--- a/src/protontricks/cli.py
++++ b/src/protontricks/cli.py
+@@ -14,7 +14,7 @@ import os
+ import logging
+
+ from . import __version__
+-from .steam import (find_proton_app, find_steam_path, find_steam_runtime_path,
++from .steam import (find_proton_app, find_steam_path,
+ get_steam_apps, get_steam_lib_paths)
+ from .winetricks import get_winetricks_path
+ from .gui import select_steam_app_with_gui
+@@ -75,8 +75,7 @@ def main(args=None):
+ "WINE: path to a custom 'wine' executable\n"
+ "WINESERVER: path to a custom 'wineserver' executable\n"
+ "STEAM_RUNTIME: 1 = enable Steam Runtime, 0 = disable Steam "
+- "Runtime, valid path = custom Steam Runtime path, "
+- "empty = enable automatically (default)"
++ "Runtime, empty = enable automatically (default)"
+ ),
+ formatter_class=argparse.RawTextHelpFormatter
+ )
+@@ -133,14 +132,10 @@ def main(args=None):
+ sys.exit(-1)
+
+ # 2. Find Steam Runtime if enabled
+- steam_runtime_path = None
++ steam_runtime = False
+
+ if os.environ.get("STEAM_RUNTIME", "") != "0" and not args.no_runtime:
+- steam_runtime_path = find_steam_runtime_path(steam_root=steam_root)
+-
+- if not steam_runtime_path:
+- print("Steam Runtime was enabled but couldn't be found!")
+- sys.exit(-1)
++ steam_runtime = True
+ else:
+ logger.info("Steam Runtime disabled.")
+
+@@ -194,7 +189,7 @@ def main(args=None):
+ winetricks_path=winetricks_path,
+ proton_app=proton_app,
+ steam_app=steam_app,
+- steam_runtime_path=steam_runtime_path,
++ steam_runtime=steam_runtime,
+ command=[winetricks_path, "--gui"]
+ )
+ return
+@@ -261,7 +256,7 @@ def main(args=None):
+ winetricks_path=winetricks_path,
+ proton_app=proton_app,
+ steam_app=steam_app,
+- steam_runtime_path=steam_runtime_path,
++ steam_runtime=steam_runtime,
+ command=[winetricks_path] + args.winetricks_command)
+ elif args.command:
+ run_command(
+@@ -269,7 +264,7 @@ def main(args=None):
+ proton_app=proton_app,
+ steam_app=steam_app,
+ command=args.command,
+- steam_runtime_path=steam_runtime_path,
++ steam_runtime=steam_runtime,
+ # Pass the command directly into the shell *without*
+ # escaping it
+ cwd=steam_app.install_path,
+diff --git a/src/protontricks/steam.py b/src/protontricks/steam.py
+index 215b31d..aa545b8 100644
+--- a/src/protontricks/steam.py
++++ b/src/protontricks/steam.py
+@@ -11,7 +11,7 @@ from .util import lower_dict
+
+ __all__ = (
+ "COMMON_STEAM_DIRS", "SteamApp", "find_steam_path",
+- "find_steam_proton_app", "find_proton_app", "find_steam_runtime_path",
++ "find_steam_proton_app", "find_proton_app",
+ "find_appid_proton_prefix", "get_steam_lib_paths", "get_steam_apps",
+ "get_custom_proton_installations"
+ )
+@@ -245,37 +245,6 @@ def find_steam_path():
+ return None, None
+
+
+-def find_steam_runtime_path(steam_root):
+- """
+- Find the Steam Runtime either using the STEAM_RUNTIME env or
+- steam_root
+- """
+- env_steam_runtime = os.environ.get("STEAM_RUNTIME", "")
+-
+- if env_steam_runtime == "0":
+- # User has disabled Steam Runtime
+- logger.info("STEAM_RUNTIME is 0. Disabling Steam Runtime.")
+- return None
+- elif env_steam_runtime and Path(env_steam_runtime).is_dir():
+- # User has a custom Steam Runtime
+- logger.info(
+- "Using custom Steam Runtime at %s", env_steam_runtime)
+- return Path(env_steam_runtime)
+- elif env_steam_runtime in ["1", ""]:
+- # User has enabled Steam Runtime or doesn't have STEAM_RUNTIME set;
+- # default to enabled Steam Runtime in either case
+- steam_runtime_path = steam_root / "ubuntu12_32" / "steam-runtime"
+-
+- logger.info(
+- "Using default Steam Runtime at %s", str(steam_runtime_path))
+- return steam_runtime_path
+-
+- logger.error(
+- "Path in STEAM_RUNTIME doesn't point to a valid Steam Runtime!")
+-
+- return None
+-
+-
+ APPINFO_STRUCT_HEADER = "<4sL"
+ APPINFO_STRUCT_SECTION = "<LLLLQ20sL"
+
+diff --git a/src/protontricks/util.py b/src/protontricks/util.py
+index a850427..390fc01 100644
+--- a/src/protontricks/util.py
++++ b/src/protontricks/util.py
+@@ -6,7 +6,7 @@ import stat
+ from pathlib import Path
+ from subprocess import check_output, run, PIPE
+
+-__all__ = ("get_runtime_library_paths", "create_wine_bin_dir", "run_command")
++__all__ = ("create_wine_bin_dir", "run_command")
+
+ logger = logging.getLogger("protontricks")
+
+@@ -25,70 +25,10 @@ def lower_dict(d):
+ return {k.lower(): v for k, v in d.items()}
+
+
+-def get_host_library_paths():
+- """
+- Get host library paths to use when creating the LD_LIBRARY_PATH environment
+- variable for use with newer Steam Runtime installations
+- """
+- # The traditional Steam Runtime does the following when running the
+- # `run.sh --print-steam-runtime-library-paths` command.
+- # Since that command is unavailable with newer Steam Runtime releases,
+- # do it ourselves here.
+- result = run(
+- ["/sbin/ldconfig", "-XNv"],
+- check=True, stdout=PIPE, stderr=PIPE
+- )
+- lines = result.stdout.decode("utf-8").split("\n")
+- paths = [
+- line.split(":")[0] for line in lines
+- if line.startswith("/") and ":" in line
+- ]
+-
+- return ":".join(paths)
+-
+-
+-def get_runtime_library_paths(steam_runtime_path, proton_app):
+- """
+- Get LD_LIBRARY_PATH value to run a command using Steam Runtime
+- """
+- if proton_app.required_tool_app:
+- # bwrap based Steam Runtime is used for Proton installations that
+- # use separate Steam runtimes
+- # TODO: Try to run the Wine binaries inside an user namespace somehow.
+- # Newer Steam Runtime environments may rely on a newer glibc than what
+- # is available on the host system, which may cause potential problems
+- # otherwise.
+- runtime_root = next(
+- proton_app.required_tool_app.install_path.glob("*/files/")
+- )
+- return "".join([
+- str(proton_app.install_path / "dist" / "lib"), os.pathsep,
+- str(proton_app.install_path / "dist" / "lib64"), os.pathsep,
+- get_host_library_paths(), os.pathsep,
+- str(runtime_root / "i686-pc-linux-gnu" / "lib"), os.pathsep,
+- str(runtime_root / "x86_64-pc-linux-gnu" / "lib")
+- ])
+-
+- # Traditional LD_LIBRARY_PATH based Steam Runtime is used otherwise
+- steam_runtime_paths = check_output([
+- str(steam_runtime_path / "run.sh"),
+- "--print-steam-runtime-library-paths"
+- ])
+- steam_runtime_paths = str(steam_runtime_paths, "utf-8")
+- # Add Proton installation directory first into LD_LIBRARY_PATH
+- # so that libwine.so.1 is picked up correctly (see issue #3)
+- return "".join([
+- str(proton_app.install_path / "dist" / "lib"), os.pathsep,
+- str(proton_app.install_path / "dist" / "lib64"), os.pathsep,
+- steam_runtime_paths
+- ])
+-
+-
+ WINE_SCRIPT_TEMPLATE = (
+- "#!/bin/bash\n"
++ "#!/bin/sh\n"
+ "# Helper script created by Protontricks to run Wine binaries using Steam Runtime\n"
+- "export LD_LIBRARY_PATH=\"$PROTON_LD_LIBRARY_PATH\"\n"
+- "exec \"$PROTON_PATH\"/dist/bin/{name} \"$@\""
++ "exec steam-run \"$PROTON_PATH\"/dist/bin/{name} \"$@\""
+ )
+
+
+@@ -149,7 +89,7 @@ def create_wine_bin_dir(proton_app):
+
+ def run_command(
+ winetricks_path, proton_app, steam_app, command,
+- steam_runtime_path=None,
++ steam_runtime=False,
+ **kwargs):
+ """Run an arbitrary command with the correct environment variables
+ for the given Proton app
+@@ -157,7 +97,7 @@ def run_command(
+ The environment variables are set for the duration of the call
+ and restored afterwards
+
+- If 'steam_runtime_path' is provided, run the command using Steam Runtime
++ If 'steam_runtime' is provided, run the command using Steam Runtime
+ """
+ # Make a copy of the environment variables to restore later
+ environ_copy = os.environ.copy()
+@@ -200,7 +140,7 @@ def run_command(
+ os.environ.pop("WINEARCH", "")
+
+ wine_bin_dir = None
+- if steam_runtime_path:
++ if steam_runtime:
+ if proton_app.required_tool_app:
+ runtime_name = proton_app.required_tool_app.name
+ logger.info(
+@@ -217,8 +157,6 @@ def run_command(
+ # that load the underlying Proton Wine executables with Steam Runtime
+ # and Proton libraries instead of system libraries
+ wine_bin_dir = create_wine_bin_dir(proton_app=proton_app)
+- os.environ["PROTON_LD_LIBRARY_PATH"] = \
+- get_runtime_library_paths(steam_runtime_path, proton_app)
+ os.environ["PATH"] = "".join([
+ str(wine_bin_dir), os.pathsep, os.environ["PATH"]
+ ])
+diff --git a/tests/test_cli.py b/tests/test_cli.py
+index 19e1137..2ef56d6 100644
+--- a/tests/test_cli.py
++++ b/tests/test_cli.py
+@@ -114,9 +114,6 @@ class TestCLIRun:
+ assert str(command.args[0]).endswith(".local/bin/winetricks")
+ assert command.args[1] == "winecfg"
+ assert command.env["PATH"].startswith(str(wine_bin_dir))
+- assert (
+- "fake_steam_runtime/lib64" in command.env["PROTON_LD_LIBRARY_PATH"]
+- )
+ assert command.env["WINE"] == str(wine_bin_dir / "wine")
+ assert command.env["WINELOADER"] == str(wine_bin_dir / "wine")
+ assert command.env["WINESERVER"] == str(wine_bin_dir / "wineserver")