From 45aefb63e84fd3c75be7b24264885a53f3fb44b8 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 1 Apr 2026 15:31:43 -0500 Subject: Fix SLR download failures and CMake rebuild detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace SHA256SUMS verification with Content-Length check for SLR downloads. Valve's CDN frequently serves stale SHA256SUMS that don't match the current archive, causing persistent checksum mismatches. Fix CMake DEPENDS for nak_ffi to glob all .rs sources instead of hardcoding a few files — previously changes to slr.rs (and most other Rust files) were silently ignored by ninja. Also wrap prefix init and runtime commands through SLR pressure-vessel container, and expose Proton install directories to the container. Co-Authored-By: Claude Opus 4.6 (1M context) --- libs/nak/src/runtime_wrap.rs | 47 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) (limited to 'libs/nak/src/runtime_wrap.rs') diff --git a/libs/nak/src/runtime_wrap.rs b/libs/nak/src/runtime_wrap.rs index 37980d3..943a329 100644 --- a/libs/nak/src/runtime_wrap.rs +++ b/libs/nak/src/runtime_wrap.rs @@ -2,15 +2,54 @@ use std::ffi::OsStr; use std::process::Command; /// Build a command to run `exe` with the given environment variables. +/// +/// If SLR (Steam Linux Runtime) is installed, the command is wrapped inside +/// the pressure-vessel container via the SLR `run` script. Environment +/// variables are set on the process and inherited by pressure-vessel into the +/// container (matching how game launches work via QProcess). This ensures +/// Wine/Proton commands use the container's libraries instead of potentially +/// broken host libraries. pub fn build_command>( exe: impl AsRef, envs: &[(&str, S)], ) -> Command { - let mut cmd = Command::new(exe); - for (key, value) in envs { - cmd.env(key, value.as_ref()); + if let Some(slr_script) = crate::slr::get_slr_run_script() { + let mut cmd = Command::new(&slr_script); + // Set env vars on the process — pressure-vessel inherits them + for (key, value) in envs { + cmd.env(key, value.as_ref()); + } + // Expose the executable's parent directory to the container — + // needed for system-installed Protons (e.g. /usr/share/steam/...) + // whose files may not be visible inside the container by default. + if let Some(parent) = std::path::Path::new(exe.as_ref()).parent() { + if parent.exists() { + let mut flag = std::ffi::OsString::from("--filesystem="); + flag.push(parent.as_os_str()); + cmd.arg(flag); + } + } + // Also expose WINEPREFIX if set in env vars + for (key, value) in envs { + if *key == "WINEPREFIX" || *key == "STEAM_COMPAT_DATA_PATH" { + let path = std::path::Path::new(value.as_ref()); + if path.exists() || path.parent().map_or(false, |p| p.exists()) { + let mut flag = std::ffi::OsString::from("--filesystem="); + flag.push(value.as_ref()); + cmd.arg(flag); + } + } + } + cmd.arg("--"); + cmd.arg(exe); + cmd + } else { + let mut cmd = Command::new(exe); + for (key, value) in envs { + cmd.env(key, value.as_ref()); + } + cmd } - cmd } /// Build a command with no extra environment variables. -- cgit v1.3.1