From edc5fa1dd36940ba87aa7676c2eb8d673292e084 Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Tue, 25 Aug 2026 23:52:20 -0400 Subject: [PATCH] also bundle dotnet in translator for linux appimage --- .../WiiCompiled.Setup.Linux/BuildRunner.cs | 6 +++- Launcher/WiiCompiled.Setup.Linux/Program.cs | 3 +- Launcher/build-appimage.sh | 35 +++++++++++++------ Launcher/local-build.sh | 29 ++++++++++----- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/Launcher/WiiCompiled.Setup.Linux/BuildRunner.cs b/Launcher/WiiCompiled.Setup.Linux/BuildRunner.cs index 11516f3..c0c8124 100644 --- a/Launcher/WiiCompiled.Setup.Linux/BuildRunner.cs +++ b/Launcher/WiiCompiled.Setup.Linux/BuildRunner.cs @@ -12,7 +12,7 @@ internal static class BuildRunner public static async Task RunAsync( string workspace, string profile, string outputDir, string? baseOutputDir, string? retroRewindPackageDir, string? retroWfcOfflineDir, bool skipRetroWfcPayload, - bool forceCleanBuild, IInstallReporter reporter, CancellationToken cancellationToken) + bool forceCleanBuild, string? translatorBin, IInstallReporter reporter, CancellationToken cancellationToken) { var script = Path.Combine(workspace, "Launcher", "local-build.sh"); if (!File.Exists(script)) throw new FileNotFoundException("local-build.sh is missing", script); @@ -41,6 +41,10 @@ internal static class BuildRunner } if (skipRetroWfcPayload) startInfo.ArgumentList.Add("--skip-retro-wfc-payload"); if (forceCleanBuild) startInfo.ArgumentList.Add("--force-clean-build"); + if (!string.IsNullOrEmpty(translatorBin)) + { + startInfo.ArgumentList.Add("--translator-bin"); startInfo.ArgumentList.Add(translatorBin); + } using var process = new Process { StartInfo = startInfo }; var window = new BuildProgressWindow(reporter, InstallStages.Build, start: 6, end: 96); diff --git a/Launcher/WiiCompiled.Setup.Linux/Program.cs b/Launcher/WiiCompiled.Setup.Linux/Program.cs index 7ab7391..a626a97 100644 --- a/Launcher/WiiCompiled.Setup.Linux/Program.cs +++ b/Launcher/WiiCompiled.Setup.Linux/Program.cs @@ -111,6 +111,7 @@ internal static class Program flags.GetValueOrDefault("retro-wfc-offline-dir"), flags.ContainsKey("skip-retro-wfc-payload"), flags.ContainsKey("force-clean-build"), + flags.GetValueOrDefault("translator-bin"), reporter, token); reporter.Progress(InstallStages.Shortcuts, "Creating shortcuts", 98); @@ -260,7 +261,7 @@ internal static class Program install --profile {base|retro-rewind|both} [--game ISO_PATH] [--install-dir DIR] [--retro-rewind-package-dir DIR] [--retro-wfc-offline-dir DIR | --skip-retro-wfc-payload] - [--force-clean-build] [--progress-json] [--workspace DIR] + [--force-clean-build] [--translator-bin PATH] [--progress-json] [--workspace DIR] uninstall [--profile {base|retro-rewind|both|all}] launch-base launch-retro diff --git a/Launcher/build-appimage.sh b/Launcher/build-appimage.sh index 9f6ac4c..cf02a1c 100644 --- a/Launcher/build-appimage.sh +++ b/Launcher/build-appimage.sh @@ -1,16 +1,19 @@ #!/usr/bin/env bash # Packages Launcher/WiiCompiled.Setup.Linux as a self-contained AppImage: a single file Wheel -# Wizard (or anyone else) can fetch and execute with no git clone and no `dotnet` install required -# just to run the installer itself. It still shells out to system clang/cmake/ninja/dolphin-tool - -# no toolchain is bundled, matching Launcher/local-build.sh's own prerequisites. +# Wizard (or anyone else) can fetch and execute with no git clone and no `dotnet` install at all - +# both the installer and the translator are published as self-contained binaries and bundled, so +# AppRun passes --translator-bin to skip local-build.sh's own dotnet-build-from-source step. It +# still shells out to system clang/cmake/ninja/dolphin-tool - no C/C++ toolchain is bundled, +# matching Launcher/local-build.sh's own remaining prerequisites. # # An AppImage mounts read-only, but local-build.sh writes generated/, native-build/, Assets/, etc. # into the workspace it's given. So AppRun (written below) copies the bundled workspace snapshot # out to a writable cache directory on first run, and only ever re-syncs the bundled directories -# (runtime/, aurora-main/, translator/, projects/, local-build.sh) on a later run whose bundled -# version changed - generated/native-build/Assets/PulsarPacks live only in that writable cache and -# are never touched by the sync, so local-build.sh's own incremental caching survives across runs -# and across AppImage updates. +# (runtime/, aurora-main/, projects/, local-build.sh) on a later run whose bundled version changed +# - generated/native-build/Assets/PulsarPacks live only in that writable cache and are never +# touched by the sync, so local-build.sh's own incremental caching survives across runs and across +# AppImage updates. translator/ isn't part of this snapshot at all: it's published as its own +# self-contained binary (usr/bin/translator-cli) below and never needs a writable copy. set -euo pipefail script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) @@ -44,8 +47,20 @@ dotnet publish "$workspace/Launcher/WiiCompiled.Setup.Linux" -c Release -r linux cp "$publish_tmp/WiiCompiled.Setup.Linux" "$appdir/usr/bin/wiicompiled-setup" chmod +x "$appdir/usr/bin/wiicompiled-setup" +# Published as a self-contained binary too, so an AppImage user never needs a `dotnet` SDK on +# PATH at all - local-build.sh is told about it via --translator-bin and skips its own +# dotnet-build-from-source step entirely (see local-build.sh's translator resolution branch). +echo "Publishing the translator (self-contained linux-x64)..." +translator_publish_tmp="$workspace/Launcher/artifacts/appimage-build/publish-translator" +rm -rf "$translator_publish_tmp" +dotnet publish "$workspace/translator/src/Translator.Cli" -c Release -r linux-x64 \ + --self-contained -p:PublishSingleFile=true -p:EnableCompressionInSingleFile=true \ + -o "$translator_publish_tmp" +cp "$translator_publish_tmp/Translator.Cli" "$appdir/usr/bin/translator-cli" +chmod +x "$appdir/usr/bin/translator-cli" + echo "Staging the bundled workspace snapshot..." -for dir in runtime aurora-main translator projects; do +for dir in runtime aurora-main projects; do cp -r "$workspace/$dir" "$appdir/workspace/$dir" done # Mirrors Build-Installer.ps1's own staging exclusions exactly: aurora-main/extern/CMakeLists.txt @@ -72,14 +87,14 @@ CACHE="${XDG_DATA_HOME:-$HOME/.local/share}/WiiCompiled/workspace" if [ ! -f "$CACHE/.bundle-version" ] || \ [ "$(cat "$HERE/workspace/.bundle-version")" != "$(cat "$CACHE/.bundle-version")" ]; then mkdir -p "$CACHE/Launcher" - for dir in runtime aurora-main translator projects; do + for dir in runtime aurora-main projects; do rm -rf "$CACHE/$dir" cp -r "$HERE/workspace/$dir" "$CACHE/$dir" done cp "$HERE/workspace/Launcher/local-build.sh" "$CACHE/Launcher/local-build.sh" cp "$HERE/workspace/.bundle-version" "$CACHE/.bundle-version" fi -exec "$HERE/usr/bin/wiicompiled-setup" --workspace "$CACHE" "$@" +exec "$HERE/usr/bin/wiicompiled-setup" --workspace "$CACHE" --translator-bin "$HERE/usr/bin/translator-cli" "$@" APPRUN chmod +x "$appdir/AppRun" diff --git a/Launcher/local-build.sh b/Launcher/local-build.sh index ed592a1..eb7cc06 100755 --- a/Launcher/local-build.sh +++ b/Launcher/local-build.sh @@ -62,6 +62,7 @@ cmake_override="" ninja_override="" dotnet_override="" translator_dll_override="" +translator_bin_override="" usage() { cat <<'EOF' @@ -79,7 +80,8 @@ Usage: local-build.sh --output-dir DIR [options] --cc PATH / --cxx PATH C/C++ compiler (default: cc/c++ on PATH) --cmake PATH / --ninja PATH Build tools (default: on PATH) --dotnet PATH dotnet executable (default: on PATH) - --translator-dll PATH Pre-built Translator.Cli.dll (skips building the translator) + --translator-dll PATH Pre-built Translator.Cli.dll (skips building the translator; still needs --dotnet to run it) + --translator-bin PATH Self-contained Translator.Cli executable (skips building AND needs no dotnet at all) EOF } @@ -101,6 +103,7 @@ while [[ $# -gt 0 ]]; do --ninja) ninja_override=$2; shift 2 ;; --dotnet) dotnet_override=$2; shift 2 ;; --translator-dll) translator_dll_override=$2; shift 2 ;; + --translator-bin) translator_bin_override=$2; shift 2 ;; -h|--help) usage; exit 0 ;; *) fail "unknown argument: $1" ;; esac @@ -146,7 +149,11 @@ ninja_bin=${ninja_override:-ninja} cc_bin=${cc_override:-clang} cxx_bin=${cxx_override:-clang++} -require_command "$dotnet_bin" dotnet +# A self-contained --translator-bin needs no dotnet at all (it bundles its own runtime); dotnet is +# only required when the translator has to be built from source or run as a plain .dll. +if [[ -z "$translator_bin_override" ]]; then + require_command "$dotnet_bin" dotnet +fi require_command "$cmake_bin" cmake require_command "$ninja_bin" ninja require_command "$cc_bin" cc @@ -180,14 +187,20 @@ entry_point=$(awk ' ' "$project") [[ -n "$entry_point" ]] || fail "Could not find a translation entry point in $project" +translator_bin=$translator_bin_override translator_dll=$translator_dll_override -if [[ -z "$translator_dll" ]]; then - translator_dll=$workspace/translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll - log_step build-translator "Building the translator" - "$dotnet_bin" build "$workspace/translator/src/Translator.Cli/Translator.Cli.csproj" -c Release +if [[ -n "$translator_bin" ]]; then + assert_file "$translator_bin" "Translator.Cli executable" + translator() { "$translator_bin" "$@"; } +else + if [[ -z "$translator_dll" ]]; then + translator_dll=$workspace/translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll + log_step build-translator "Building the translator" + "$dotnet_bin" build "$workspace/translator/src/Translator.Cli/Translator.Cli.csproj" -c Release + fi + assert_file "$translator_dll" "Translator.Cli.dll" + translator() { "$dotnet_bin" "$translator_dll" "$@"; } fi -assert_file "$translator_dll" "Translator.Cli.dll" -translator() { "$dotnet_bin" "$translator_dll" "$@"; } # --------------------------------------------------------------------------- # Parallelism: three independent knobs, same reasoning as LocalBuild.ps1 -