diff options
author | MetaDark <kira.bruneau@gmail.com> | 2019-11-07 09:38:33 -0500 |
---|---|---|
committer | Kira Bruneau <kira.bruneau@gmail.com> | 2020-12-12 20:52:00 -0500 |
commit | 56b35d8859cf62ad4402e75b3e3e3215b868eb9a (patch) | |
tree | 7dd0e8c55411115ea8ec2414a5da56ccc87eadbb /pkgs/tools/package-management | |
parent | 58cb5383869ced196b0b198a78daca08b63e958e (diff) | |
download | nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.tar nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.tar.gz nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.tar.bz2 nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.tar.lz nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.tar.xz nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.tar.zst nixpkgs-56b35d8859cf62ad4402e75b3e3e3215b868eb9a.zip |
protontricks: support proton wine with steam-run
Diffstat (limited to 'pkgs/tools/package-management')
-rw-r--r-- | pkgs/tools/package-management/protontricks/default.nix | 39 | ||||
-rw-r--r-- | pkgs/tools/package-management/protontricks/steam-run.patch | 211 |
2 files changed, 229 insertions, 21 deletions
diff --git a/pkgs/tools/package-management/protontricks/default.nix b/pkgs/tools/package-management/protontricks/default.nix index 02bc599f47d..17bf1ba2f11 100644 --- a/pkgs/tools/package-management/protontricks/default.nix +++ b/pkgs/tools/package-management/protontricks/default.nix @@ -1,13 +1,12 @@ -{ stdenv -, lib +{ lib , buildPythonApplication , fetchFromGitHub , setuptools_scm , vdf -, wine +, steam-run , winetricks , zenity -, pytest +, pytestCheckHook }: buildPythonApplication rec { @@ -21,11 +20,10 @@ buildPythonApplication rec { sha256 = "0ri4phi1rna9snrxa6gl23walyack09mgax7zpjqfpxivwls3ach"; }; - # 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,21 @@ 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 + 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" + ]; - 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 00000000000..0728213dc7d --- /dev/null +++ b/pkgs/tools/package-management/protontricks/steam-run.patch @@ -0,0 +1,211 @@ +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 0d3670e..d01cabe 100644 +--- a/src/protontricks/steam.py ++++ b/src/protontricks/steam.py +@@ -12,7 +12,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" + ) +@@ -207,38 +207,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 os.path.isdir(env_steam_runtime): +- # User has a custom Steam Runtime +- logger.info( +- "Using custom Steam Runtime at %s", env_steam_runtime) +- return 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 = os.path.join( +- steam_root, "ubuntu12_32", "steam-runtime") +- +- logger.info( +- "Using default Steam Runtime at %s", 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 bd77b01..6f39389 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 + +-__all__ = ("get_runtime_library_path", "create_wine_bin_dir", "run_command") ++__all__ = ("create_wine_bin_dir", "run_command") + + logger = logging.getLogger("protontricks") + +@@ -21,29 +21,10 @@ def lower_dict(d): + return {k.lower(): v for k, v in d.items()} + + +-def get_runtime_library_path(steam_runtime_path, proton_app): +- """ +- Get LD_LIBRARY_PATH value to run a command using Steam Runtime +- """ +- steam_runtime_paths = check_output([ +- os.path.join(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([ +- os.path.join(proton_app.install_path, "dist", "lib"), os.pathsep, +- os.path.join(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} \"$@\"" + ) + + +@@ -106,7 +87,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 +@@ -114,7 +95,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() +@@ -157,13 +138,11 @@ def run_command( + os.environ.pop("WINEARCH", "") + + wine_bin_dir = None +- if steam_runtime_path: ++ if steam_runtime: + # When Steam Runtime is enabled, create a set of helper scripts + # 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_path(steam_runtime_path, proton_app) + os.environ["PATH"] = \ + str(wine_bin_dir) + os.pathsep + os.environ["PATH"] + os.environ["WINE"] = str(wine_bin_dir / "wine") +diff --git a/tests/test_cli.py b/tests/test_cli.py +index 0e0425f..d471c7d 100644 +--- a/tests/test_cli.py ++++ b/tests/test_cli.py +@@ -113,9 +113,6 @@ class TestCLIRun: + assert 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") |