skate3recomp-multiplayer/docs/releases.md
MiTHRAL 7173d7e88d releases: local build+upload script, optional Forgejo Actions workflow, docs
Clarifies that releases ship ONLY the recompiled binaries (skate3 +
librexruntime + ghost_relay + README) - never the game files; the game dump
(default.xex + EAWebkit.xex) is required at BUILD TIME for codegen only.

- tools/release/release.sh: builds + packages a per-platform release zip
  (configure -> codegen -> build -> zip), prints a sha256sum, and with
  --upload creates/updates a Forgejo Release and attaches the zip via the
  API (GITEA_TOKEN). Supports linux/windows/macos presets on their native
  hosts.
- .forgejo/workflows/release.yml: optional automation - builds on a
  self-hosted Docker runner (ubuntu-24.04 label), self-heals the broken
  nested submodule pins via tools/ci/init-submodules.sh, and publishes a
  Linux release on v* tags. Needs the game dump mounted on the runner
  (codegen only, never uploaded), SUBMODULE_KEY + RELEASE_TOKEN secrets.
- tools/ci/init-submodules.sh: recursive submodule init that self-heals
  upstream pins a fresh clone can no longer fetch (the rexglue fork pins
  thirdparty/imgui to a commit ocornut/imgui dropped; the script checks out
  the upstream default tip for any nested submodule left empty).
- docs/releases.md: what's in a release, the local path, and the optional
  CI path.
- .gitignore: keep tools/ci + tools/release, ignore local release zips.
2026-08-26 23:32:13 -04:00

4.9 KiB

Releases

Releases are prebuilt binaries that players download so they only need their own Skate 3 ISO — no building from scratch. This project does not and cannot ship game content; the release zip is just the recompiled binaries.

What's in a release (and what isn't)

A release zip (Skate3Recomp-Linux-<ver>.zip) contains only:

  • skate3 — the recompiled game binary (also the in-app ISO installer)
  • librexruntime.so (Linux) / librexruntime.dll (Windows) / librexruntime.dylib (macOS)
  • ghost_relay — the multiplayer relay server binary
  • README.md
  • game/default.xexp + game/data/webkit/EAWebkit.xexp — only when the build used the Title Update package (these are the recompiled update patches, not retail content)

No game files. Players download the zip, run skate3, click "Select ISO", and the built-in installer extracts their own legally-owned copy. The game dump (default.xex + data/webkit/EAWebkit.xex) is required only at build time — codegen mechanically translates the actual Xbox 360 binary into C++ source, which is what gets compiled. It is never included in, or uploaded with, a release.

You already build successfully on your machine, so this is the simple path:

# on your build machine, from the repo root
./tools/release/release.sh                          # build + package this platform
./tools/release/release.sh --tag v1.0.0 --upload    # build + publish to Forgejo

The script builds (configure → codegen → build), packages the zip (binaries

  • librexruntime.so + ghost_relay + README + TU patches if used), prints a sha256sum, and with --upload creates/updates a Forgejo Release and attaches the zip.

--upload needs:

  • GITEA_TOKEN — a Forgejo token with write:repository scope (Settings → Applications → Generate New Token), covering the release APIs.
  • Optional FORGEJO_REPO (default ad3laid3/skate3recomp-multiplayer) and FORGEJO_INSTANCE (default https://git.mithraic.cloud).

Per-platform notes:

Platform Build machine Command
Linux any Linux with the toolchain (README: Ubuntu 24.04 + Clang 20) ./tools/release/release.sh
Windows a Windows machine (MSVC/clang-cl + Windows SDK, D3D12) run the same script on Windows (--os windows)
macOS an Apple Silicon/Intel Mac (Homebrew LLVM + MoltenVK, per README) run the same script on macOS

Cross-compiling Windows/macOS from a Linux box is not practical for this stack (D3D12 on Windows, Cocoa/MoltenVK on macOS need their native SDKs), so each platform's release is built on that platform.

Option B — automated via Forgejo Actions (optional)

.forgejo/workflows/release.yml builds and publishes Linux releases on push of a v* tag (or a manual run), on a self-hosted runner.

Requirements for the automation path:

  1. A runner with the game dump. Codegen needs the .xex files at build time. On the runner, put the extracted dump at /opt/skate3-game (default.xex + data/webkit/EAWebkit.xex, optionally the TU_12K2276_* package). If your runner is a Docker container, mount that directory into it (-v /opt/skate3-game:/opt/skate3-game). The game files stay on the runner — they are never uploaded to the repo.
  2. Secrets on the repo:
    • SUBMODULE_KEY — an SSH deploy key with read access to ad3laid3/rexglue-skate3 (the self-hosted rexglue fork submodule).
    • RELEASE_TOKEN — a Forgejo token with write:repository scope.
  3. Runner label — the workflow uses runs-on: ubuntu-24.04; match it to your runner's label (Docker runners commonly use ubuntu-latest/ubuntu-22.04/ubuntu-24.04 — change the runs-on line to match).
  4. Broken submodule pins. A fresh recursive clone currently fails because the rexglue fork pins thirdparty/imgui to a commit ocornut/imgui no longer carries. tools/ci/init-submodules.sh self-heals this (checks out the upstream default tip for any nested submodule left empty) and the workflow calls it after git submodule update --init.

Windows/macOS jobs can be added to the same workflow when native Windows/macOS runners are available (each job uses its platform preset and artifact names; the package step is per-OS).

Doing it by hand

If you'd rather not use the script, the equivalent steps are:

cmake --preset linux-relwithdebinfo -DSKATE3_GAME_DATA_ROOT="$PWD/game"   # add -DSKATE3_TITLE_UPDATE_PACKAGE=... if used
cmake --build --preset linux-relwithdebinfo --target generate-all --parallel
cmake --preset linux-relwithdebinfo -DSKATE3_GAME_DATA_ROOT="$PWD/game"
cmake --build --preset linux-relwithdebinfo --parallel
# zip out/build/linux-relwithdebinfo/{skate3,librexruntime.so,ghost_relay} + README

Then create a Release in the Forgejo web UI (<repo> → Releases → New Release) and attach the zip.