#!/bin/bash set -euo pipefail # Application settings APP_NAME="Sideband" PKG_NAME="sbapp" PY_VER="${PY_VER:-3.11}" ARCH="${ARCH:-$(uname -m)}" export ARCH # Directory structure WORKDIR="${WORKDIR:-$PWD/_build_sideband_appimage}" APPDIR="$WORKDIR/AppDir" PY_DIR="$APPDIR/opt/python" VENV_DIR="$APPDIR/usr/venv" # Tools and URLs UV_BIN="${UV_BIN:-uv}" APPIMAGETOOL_URL="${APPIMAGETOOL_URL:-https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-${ARCH}.AppImage}" ICON_URL="https://raw.githubusercontent.com/markqvist/Sideband/main/sbapp/assets/icon.iconset/icon_256x256.png" # Cleanup and directory preparation rm -rf "$WORKDIR" mkdir -p "$APPDIR" cd "$WORKDIR" echo "[1/7] Installing CPython ${PY_VER} into AppDir..." "$UV_BIN" python install "$PY_VER" --install-dir "$PY_DIR" BASE_PYTHON_ABS="$(find "$PY_DIR" -type f -name "python${PY_VER}" | head -n1)" echo "[2/7] Creating venv and installing ${PKG_NAME}..." "$UV_BIN" venv "$VENV_DIR" --python "$BASE_PYTHON_ABS" "$UV_BIN" pip install "$PKG_NAME" --python "$VENV_DIR/bin/python" # Extract application version from the installed package APP_VERSION=$("$VENV_DIR/bin/python" -c "import importlib.metadata; print(importlib.metadata.version('$PKG_NAME'))") echo "Detected ${PKG_NAME} version: ${APP_VERSION}" echo "[3/7] Making venv relative for AppImage..." pushd "$VENV_DIR/bin" > /dev/null RELATIVE_PY_PATH=$(realpath --relative-to="." "$BASE_PYTHON_ABS") ln -sf "$RELATIVE_PY_PATH" python ln -sf "$RELATIVE_PY_PATH" python3 ln -sf "$RELATIVE_PY_PATH" "python${PY_VER}" popd > /dev/null # pyvenv.cfg correction for path INTERNAL_PY_BIN_DIR="/opt/$(realpath --relative-to="$PY_DIR/.." "$(dirname "$BASE_PYTHON_ABS")")" sed -i "s|^home = .*|home = $INTERNAL_PY_BIN_DIR|" "$VENV_DIR/pyvenv.cfg" sed -i "s|^executable = .*|executable = /usr/venv/bin/python|" "$VENV_DIR/pyvenv.cfg" echo "[4/7] Creating AppRun script..." cat > "$APPDIR/AppRun" < "$APPDIR/usr/share/applications/sideband.desktop" <