Skip to content

PFX: fix heap-floor/capture regressions, add Williams operator menu; … #90

PFX: fix heap-floor/capture regressions, add Williams operator menu; …

PFX: fix heap-floor/capture regressions, add Williams operator menu; … #90

Workflow file for this run

name: Build
on:
push:
branches: [ main, develop ]
tags: [ 'v*' ]
pull_request:
branches: [ main ]
env:
NDK_VERSION: 'r23c'
jobs:
# ════════════════════════════════════════════════════════════════════
# Job 1: Build libmodloader.so (ARM64 Android)
# ════════════════════════════════════════════════════════════════════
build-modloader:
name: Build libmodloader.so
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Android NDK
uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: ${{ env.NDK_VERSION }}
add-to-path: false
- name: Install Ninja
run: sudo apt-get update && sudo apt-get install -y ninja-build
- name: Configure CMake
working-directory: modloader
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
run: |
mkdir -p build && cd build
cmake -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-24 \
-DANDROID_STL=c++_static \
-DCMAKE_BUILD_TYPE=Release \
..
- name: Build
working-directory: modloader/build
run: ninja -j$(nproc)
- name: Verify output
run: |
ls -la modloader/build/libmodloader.so
file modloader/build/libmodloader.so
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: libmodloader-arm64
path: modloader/build/libmodloader.so
retention-days: 30
# ════════════════════════════════════════════════════════════════════
# Job 2: Build Installer (Windows GUI + CLI)
# ════════════════════════════════════════════════════════════════════
build-installer:
name: Build Installer (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact: ue-modloader-installer.exe
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact: ue-modloader-installer
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
workspaces: installer
# Linux: install egui/eframe deps (X11, OpenGL)
- name: Install Linux deps
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y \
pkg-config \
libx11-dev libxrandr-dev libxi-dev libxkbcommon-x11-dev \
libgl1-mesa-dev \
libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \
libxcb-randr0-dev libxcb-cursor-dev \
libxkbcommon-dev libssl-dev libgtk-3-dev \
libglib2.0-dev libatk1.0-dev libcairo2-dev libpango1.0-dev \
libgdk-pixbuf2.0-dev
- name: Build installer (Release)
working-directory: installer
run: cargo build --release --target ${{ matrix.target }}
- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: installer-${{ matrix.target }}
path: installer/target/${{ matrix.target }}/release/${{ matrix.artifact }}
retention-days: 30
# ════════════════════════════════════════════════════════════════════
# Job 3: Package Release
# • On tag push (v*): creates a full versioned GitHub Release
# • On push to main: creates/updates a "dev-latest" pre-release
# ════════════════════════════════════════════════════════════════════
package:
name: Package Release
needs: [build-modloader, build-installer]
if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download libmodloader.so
uses: actions/download-artifact@v4
with:
name: libmodloader-arm64
path: release/
- name: Download Windows installer
uses: actions/download-artifact@v4
with:
name: installer-x86_64-pc-windows-msvc
path: release/
- name: Download Linux installer
uses: actions/download-artifact@v4
with:
name: installer-x86_64-unknown-linux-gnu
path: release/linux/
- name: Set release tag
id: tag
run: |
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
echo "tag=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
echo "prerelease=false" >> "$GITHUB_OUTPUT"
echo "name=Release ${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
else
echo "tag=dev-latest" >> "$GITHUB_OUTPUT"
echo "prerelease=true" >> "$GITHUB_OUTPUT"
echo "name=Development Build (latest main)" >> "$GITHUB_OUTPUT"
fi
- name: Package mods & tools
run: |
# ── Game mods ──
for game_dir in mods/*/; do
game=$(basename "$game_dir")
for mod in "$game_dir"*/; do
[ -d "$mod" ] || continue
mod_name=$(basename "$mod")
mkdir -p "release/mods/$game/$mod_name"
cp "$mod"*.lua "release/mods/$game/$mod_name/" 2>/dev/null || true
cp "$mod"*.pak "release/mods/$game/$mod_name/" 2>/dev/null || true
done
done
# ── PAK files ──
if [ -d "PAKS" ]; then
mkdir -p release/PAKS
cp PAKS/*.pak release/PAKS/ 2>/dev/null || true
fi
# ── Tools ──
mkdir -p release/tools
cp tools/deploy.py release/tools/ 2>/dev/null || true
cp tools/uncook.py release/tools/ 2>/dev/null || true
cp tools/extract_paks.py release/tools/ 2>/dev/null || true
cp tools/dump_uasset.py release/tools/ 2>/dev/null || true
cp tools/kismet_decompiler.py release/tools/ 2>/dev/null || true
cp tools/build_debug_pak.py release/tools/ 2>/dev/null || true
# ── Examples ──
cp -r examples/ release/examples/ 2>/dev/null || true
# ── Docs ──
cp README.md release/
cp LICENSE release/
cp CHANGELOG.md release/ 2>/dev/null || true
cp docs/LUA_API.md release/ 2>/dev/null || true
# ── Linux installer is separate ──
chmod +x release/linux/ue-modloader-installer 2>/dev/null || true
- name: Create Windows release archive
run: |
cd release
# Remove linux subdir from main zip
zip -r ../quest-ue-modloader-${{ steps.tag.outputs.tag }}-windows.zip . -x "linux/*"
- name: Create Linux release archive
run: |
# Copy shared files into linux release
cp release/libmodloader.so release/linux/
cp -r release/mods release/linux/mods 2>/dev/null || true
cp -r release/tools release/linux/tools 2>/dev/null || true
cp -r release/examples release/linux/examples 2>/dev/null || true
cp -r release/PAKS release/linux/PAKS 2>/dev/null || true
cp release/README.md release/linux/ 2>/dev/null || true
cp release/LICENSE release/linux/ 2>/dev/null || true
cd release/linux
tar czf ../../quest-ue-modloader-${{ steps.tag.outputs.tag }}-linux.tar.gz .
# For dev-latest: delete old release first so we can recreate it
- name: Delete existing dev-latest release
if: steps.tag.outputs.tag == 'dev-latest'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release delete dev-latest --yes --cleanup-tag 2>/dev/null || true
- name: Create Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.tag.outputs.tag }}
name: ${{ steps.tag.outputs.name }}
files: |
quest-ue-modloader-${{ steps.tag.outputs.tag }}-windows.zip
quest-ue-modloader-${{ steps.tag.outputs.tag }}-linux.tar.gz
generate_release_notes: true
draft: false
prerelease: ${{ steps.tag.outputs.prerelease }}