Files
devLucasEmiliano 321dd02bec Build(Linux): package the Rust launcher for Arch
The PKGBUILD shipped the frozen Python launcher. It now builds launcher-rust with cargo, installs the exe with the AppImage layout and reads pkgver from Cargo.toml.
2026-10-24 23:58:37 -03:00

173 lines
6.1 KiB
Bash

pkgname=spartanport-git
pkgver=2.6.0.r460.gca7a0cf
pkgrel=1
pkgdesc='SpartanPort launcher and native runtime for God of War III Remastered (PlayStation 4)'
arch=('x86_64')
url='https://github.com/FelipePrado0/SpartanPort'
license=('GPL-2.0-or-later')
depends=(
'ffmpeg'
'fmt'
'fontconfig'
'gcc-libs'
'glibc'
'libx11'
'libxkbcommon'
'sdl3'
'vulkan-driver'
'vulkan-icd-loader'
'xxhash'
'xorg-xrandr'
'zydis'
)
makedepends=(
'boost'
'cargo'
'cmake'
'git'
'glslang'
'ninja'
'pkgconf'
'robin-map'
'vulkan-headers'
'vulkan-memory-allocator'
)
optdepends=(
'gamemode: optional GameMode integration'
'mangohud: optional performance overlay'
)
provides=("spartanport=${pkgver}")
conflicts=('spartanport' 'gow3-pc' 'gow3-pc-git')
options=('!lto' '!debug')
source=(
'spartanport::git+https://github.com/FelipePrado0/SpartanPort.git'
'fsr-vulkan::git+https://github.com/FireBurn/FSR-Vulkan.git'
'imgui::git+https://github.com/ocornut/imgui.git'
'LibAtrac9::git+https://github.com/Thealexbarney/LibAtrac9.git'
'magic_enum::git+https://github.com/Neargye/magic_enum.git'
'miniz::git+https://github.com/richgel999/miniz.git'
'xbyak::git+https://github.com/herumi/xbyak.git'
)
sha256sums=('SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP')
# Accept an upstream fix or a repeated prepare(), but reject unexpected layouts.
_replace_once() {
local path=$1 old=$2 new=$3 text kept stripped old_count new_count
text=$(cat -- "$path"; printf x)
text=${text%x}
kept=${text//"$old"/}
# The replacement may be contained in the original, as with the retained relative RUNPATH.
stripped=${kept//"$new"/}
old_count=$(( (${#text} - ${#kept}) / ${#old} ))
new_count=$(( (${#kept} - ${#stripped}) / ${#new} ))
if (( old_count == 1 && new_count == 0 )); then
printf '%s' "${text/"$old"/"$new"}" > "$path"
elif (( old_count == 0 && new_count == 1 )); then
printf '%s: already contains the expected replacement\n' "$path"
else
printf '%s: expected one original or one replacement for %q; found %s original and %s replacement matches\n' \
"$path" "$old" "$old_count" "$new_count" >&2
return 1
fi
}
pkgver() {
cd "${srcdir}/spartanport"
local version
version=$(sed -n 's/^version = "\([^"]*\)".*/\1/p' launcher-rust/Cargo.toml | head -n 1)
if [[ -z $version ]]; then
printf 'Unable to read the SpartanPort launcher version\n' >&2
return 1
fi
printf '%s.r%s.g%s' "$version" "$(git rev-list --count HEAD)" "$(git rev-parse --short=7 HEAD)"
}
prepare() {
cd "${srcdir}/spartanport"
# Download through makepkg's source array, then use the revisions pinned by upstream.
local module
git submodule init
for module in fsr-vulkan imgui magic_enum miniz xbyak; do
git config "submodule.gpu/third_party/${module}.url" "${srcdir}/${module}"
done
git config submodule.third_party/LibAtrac9.url "${srcdir}/LibAtrac9"
git -c protocol.file.allow=always submodule update --init --recursive
# Use these bundled revisions consistently, even when system copies are installed.
_replace_once gpu/CMakeLists.txt \
'find_package(magic_enum QUIET)' 'set(magic_enum_FOUND FALSE)' || return 1
_replace_once gpu/CMakeLists.txt \
'find_package(miniz QUIET)' 'set(miniz_FOUND FALSE)' || return 1
# Older sources need the GCC -Werror fix; newer sources already have this buffer size.
_replace_once src/runtime_thread.c \
'char path[64], line[1024];' \
'char path[sizeof(d->d_name)+sizeof("/proc/self/task//stat")], line[1024];' || return 1
# Keep the relative library path; remove the temporary build directory from RUNPATH.
# CMake's build command also honors CMAKE_BUILD_PARALLEL_LEVEL.
local rpath="-Wl,-rpath,'\$ORIGIN/gpu'"
_replace_once build.sh \
"$rpath -Wl,-rpath,\"\$PWD/out/gpu\"" "$rpath" || return 1
_replace_once build.sh \
'ninja -C out/gpu spartanportgpu' \
'cmake --build out/gpu --target spartanportgpu' || return 1
}
build() {
cd "${srcdir}/spartanport"
SPARTAN_PGO=off SPARTAN_LTO=OFF bash build.sh
(cd launcher-rust && cargo build --release --locked)
}
package() {
cd "${srcdir}/spartanport"
local sharedir="${pkgdir}/usr/share/spartanport"
local libdir="${pkgdir}/usr/lib/spartanport"
install -d "${sharedir}"/{launcher,scripts} "${libdir}/gpu"
install -m755 out/spartanport-probe out/spartanport-gpu-capabilities "${libdir}/"
install -m755 out/gpu/libspartanportgpu.so "${libdir}/gpu/"
ln -s ../../lib/spartanport "${sharedir}/bin"
# The same layout as the AppImage: the Rust launcher runs from the share directory.
install -m755 launcher-rust/target/release/spartanport-launcher "${sharedir}/"
cp -r patches "${sharedir}/"
cp -r scripts/controller_diagrams "${sharedir}/scripts/"
install -m644 launcher/spartanport.png launcher/logo.png launcher/*.ttf launcher/OFL-*.txt \
"${sharedir}/launcher/"
install -d "${pkgdir}/usr/bin"
cat > "${pkgdir}/usr/bin/spartanport" <<'EOF'
#!/bin/sh
set -eu
export SPARTAN_DATA_DIR="${SPARTAN_DATA_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/spartanport}"
mkdir -p -- "$SPARTAN_DATA_DIR"
cd /usr/share/spartanport
exec ./spartanport-launcher "$@"
EOF
chmod 755 "${pkgdir}/usr/bin/spartanport"
install -Dm644 launcher/spartanport.png "${pkgdir}/usr/share/pixmaps/spartanport.png"
install -Dm644 packaging/linux/spartanport.desktop \
"${pkgdir}/usr/share/applications/spartanport.desktop"
# Upstream's AppImage launcher is AppRun; the native package has its own wrapper.
_replace_once "${pkgdir}/usr/share/applications/spartanport.desktop" \
'Exec=AppRun' 'Exec=spartanport' || return 1
install -Dm644 README.md "${pkgdir}/usr/share/doc/${pkgname}/README.md"
install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
# Notices for the launcher fonts and bundled libraries, including AMD's SDK.
local file
for file in launcher/OFL-*.txt; do
install -Dm644 "$file" "${pkgdir}/usr/share/licenses/${pkgname}/${file##*/}"
done
while IFS= read -r -d '' file; do
install -Dm644 "$file" "${pkgdir}/usr/share/licenses/${pkgname}/${file}"
done < <(find gpu/third_party third_party -type f \
\( -iname '*license*' -o -iname '*copying*' -o -iname 'notice*' \) -print0)
}