mirror of
https://github.com/FelipePrado0/SpartanPort.git
synced 2026-11-07 02:36:06 -10:00
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.
173 lines
6.1 KiB
Bash
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)
|
|
}
|