Files
SaraView/Client/Packaging/BuildAppImage.sh
T
2026-10-13 18:47:25 +02:00

58 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# Builds dist/SaraView-x86_64.AppImage: a PyInstaller one-file build (with
# the font and icon bundled) wrapped by appimagetool, the same way SaraSort's,
# SaraSuite's and SaraFem's AppImages are made. Needs podman and
# appimagetool on PATH.
set -euo pipefail
cd "$(dirname "$(readlink -f "$0")")/.."
# PyInstaller runs in a manylinux_2_28 container (glibc 2.28) with uv's
# portable Python, not with Fedora's: PyInstaller bundles libpython, and
# Fedora's needs a newer glibc than many distros have ("GLIBC_ABI_GNU2_TLS
# not found"). The whole repository goes in, for ../Backend/VarEngine.py.
# The Python, venv and downloads are cached in build/Container.
# --collect-data flet: without it ft.Icons crashes when frozen.
mkdir -p build/Container
podman run --rm --security-opt label=disable -v "$PWD/..:/src" -w /src/Client \
-e UV_CACHE_DIR=/src/Client/build/Container/cache -e UV_PYTHON_INSTALL_DIR=/src/Client/build/Container/python \
quay.io/pypa/manylinux_2_28_x86_64 bash -euo pipefail -c '
uv venv --quiet --allow-existing --managed-python --python 3.14 build/Container/venv
uv pip install --quiet --python build/Container/venv -r requirements.txt pyinstaller
# The Flet window needs libsecret, which some systems lack: bundled as a
# fallback (RestoreLibraryPath.py uses only what the system lacks).
dnf -y -q install libsecret >/dev/null
mkdir -p build/FallbackLibs
for Library in libsecret-1.so.0 libgcrypt.so.20 libgpg-error.so.0; do cp -L /usr/lib64/$Library build/FallbackLibs/; done
# Each finds the others beside it, wherever they are put (a client lib folder).
patchelf --set-rpath "\$ORIGIN" build/FallbackLibs/libsecret-1.so.0 build/FallbackLibs/libgcrypt.so.20
build/Container/venv/bin/pyinstaller --noconfirm --clean --log-level WARN \
--onefile --windowed --name SaraView --collect-data flet \
--runtime-hook "$PWD/Packaging/RestoreLibraryPath.py" \
--add-data "$PWD/build/FallbackLibs:FallbackLibs" \
--add-data "$PWD/assets:assets" \
--paths "$PWD/../Backend" --hidden-import VarEngine \
--distpath build/PyInstaller/dist --workpath build/PyInstaller/work --specpath build/PyInstaller \
"$PWD/Main.py"'
AppDir=build/AppDir
rm -rf "$AppDir"
mkdir -p "$AppDir/usr/bin"
cp build/PyInstaller/dist/SaraView "$AppDir/usr/bin/SaraView"
ln -s usr/bin/SaraView "$AppDir/AppRun"
cp assets/Icon.png "$AppDir/SaraView.png"
ln -s SaraView.png "$AppDir/.DirIcon"
cat > "$AppDir/SaraView.desktop" << DESKTOP
[Desktop Entry]
Type=Application
Name=SaraView
Comment=View and edit files, locally or on a SaraView server
Exec=SaraView
Icon=SaraView
Terminal=false
Categories=Utility;
DESKTOP
mkdir -p dist
ARCH=x86_64 appimagetool --no-appstream "$AppDir" dist/SaraView-x86_64.AppImage
echo "Built dist/SaraView-x86_64.AppImage"