Files
reforgermods-launcher/packaging/arch/PKGBUILD
T
SowinskiBraedenandClaude Opus 5 377f3a31b3 initial commit: reforgermods.net launcher 0.1.0
A desktop server browser for Arma Reforger, built on the reforgermods.net v2
API. Live server list with search, sort and filters; a detail inspector with
population history and mod readiness; measured ICMP latency; favorites, recents
and settings; and direct joining through Steam.

Tauri 2 and Rust, with a Preact frontend that builds to 80 KB of JavaScript in
one chunk. Logic lives in rfm-core, which has no Tauri dependency and is tested
directly; src-tauri is the window, the command surface and the wiring.

Packaged for the public beta: a per-user NSIS installer, a portable .exe and an
Arch package, with signature-verified background updates on Windows and a
release pipeline that builds from a tag. The artifacts are not yet
Authenticode-signed — that is wired and waiting on an Azure Trusted Signing
identity, and docs/distribution.md says so plainly rather than letting anyone
discover it at the SmartScreen dialog.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-24 20:29:00 -07:00

95 lines
3.9 KiB
Bash

# Maintainer: reforgermods.net
#
# Builds the launcher from a source tarball produced by scripts/build-arch.sh.
# The tarball is the working tree minus node_modules/target/dist, so this
# packages exactly what is checked out — not a tagged release.
pkgname=reforgermods-launcher
pkgver=0.1.0
pkgrel=1
pkgdesc="Server browser and direct launcher for Arma Reforger (reforgermods.net)"
arch=('x86_64')
url="https://reforgermods.net"
license=('LicenseRef-Proprietary')
# webkit2gtk-4.1 pulls gtk3, libsoup3, glib2 and the rest of the WebKit stack.
# The binary links rustls rather than OpenSSL, so there is no openssl dependency.
depends=('webkit2gtk-4.1' 'gtk3' 'libsoup3' 'glibc' 'gcc-libs')
# cmake builds aws-lc-sys, the C crypto library behind rustls' default
# provider. Without it the crate's build script produces no library and the
# link fails late with a wall of undefined aws_lc_* symbols.
makedepends=('rust' 'nodejs' 'npm' 'cmake')
# !lto: makepkg's default OPTIONS put -flto=auto into CFLAGS/LDFLAGS. That
# makes aws-lc-sys compile its C crypto into GCC LTO bitcode, which the
# linker rustc drives cannot resolve — the build dies at the very last step
# with a page of undefined aws_lc_* symbols. Rust-level LTO is unaffected:
# that comes from [profile.release] in the workspace manifest.
# !debug: the release profile already strips, so a -debug split package would
# be empty. One artifact to hand over is the point.
options=('!lto' '!debug')
source=("$pkgname-$pkgver.tar.gz")
sha256sums=('SKIP')
build() {
cd "$srcdir/$pkgname-$pkgver"
# The frontend is embedded into the binary by tauri-build, so it has to exist
# before cargo runs.
npm ci
npm run build
# --features custom-protocol is what makes this a production build: without
# it tauri-build sets cfg(dev) and the app loads its UI from the Vite dev
# server on localhost:1420 instead of the embedded assets. See the comment on
# that feature in src-tauri/Cargo.toml.
cargo build --release --locked -p reforgermods-launcher --features custom-protocol
# Assert the result is not a dev build. You cannot tell by inspecting the
# binary — tauri embeds the whole config, devUrl included, either way, and
# brotli-compresses the assets. The signal is the cargo:rustc-cfg=dev that
# tauri-build emits, recorded in the build script's output file. A dev build
# packages and installs perfectly and then shows ERR_CONNECTION_REFUSED on
# the tester's machine, which is exactly the report you cannot debug
# remotely.
local build_out
build_out=$(ls -t target/release/build/reforgermods-launcher-*/output | head -1)
if [[ -z "$build_out" ]]; then
echo "ERROR: could not find the build script output to verify the build mode." >&2
return 1
fi
if grep -q "rustc-cfg=dev" "$build_out"; then
echo "ERROR: this is a DEV build; --features custom-protocol did not take effect." >&2
return 1
fi
echo "build mode: production (frontend embedded, no dev-server dependency)"
}
check() {
cd "$srcdir/$pkgname-$pkgver"
# The launcher crate is included for the Linux-only startup workarounds in
# main.rs, which are exactly the code a Windows-first project is least likely
# to notice breaking.
cargo test --release --locked -p rfm-core -p reforgermods-launcher
}
package() {
cd "$srcdir/$pkgname-$pkgver"
install -Dm755 target/release/reforgermods-launcher \
"$pkgdir/usr/bin/reforgermods-launcher"
install -Dm644 packaging/arch/reforgermods-launcher.desktop \
"$pkgdir/usr/share/applications/reforgermods-launcher.desktop"
for size in 32 128; do
install -Dm644 "src-tauri/icons/${size}x${size}.png" \
"$pkgdir/usr/share/icons/hicolor/${size}x${size}/apps/reforgermods-launcher.png"
done
install -Dm644 src-tauri/icons/128x128@2x.png \
"$pkgdir/usr/share/icons/hicolor/256x256/apps/reforgermods-launcher.png"
install -Dm644 src-tauri/icons/icon.png \
"$pkgdir/usr/share/icons/hicolor/512x512/apps/reforgermods-launcher.png"
}