sideband-appimage/build-sideband-appimage.sh

94 lines
3.1 KiB
Bash

#!/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" <<EOF
#!/bin/sh
set -eu
HERE="\$(dirname "\$(readlink -f "\$0")")"
export PYTHONNOUSERSITE=1
exec "\$HERE/usr/venv/bin/python" -c "import sbapp.main; sbapp.main.run()" "\$@"
EOF
chmod +x "$APPDIR/AppRun"
echo "[5/7] Setting up Desktop Entry and Icons..."
mkdir -p "$APPDIR/usr/share/applications"
mkdir -p "$APPDIR/usr/share/icons/hicolor/256x256/apps"
cat > "$APPDIR/usr/share/applications/sideband.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=${APP_NAME}
Exec=${APP_NAME}
Icon=sideband
Categories=Network;Chat;
Terminal=false
EOF
curl -L "$ICON_URL" -o "$APPDIR/usr/share/icons/hicolor/256x256/apps/sideband.png"
ln -sf usr/share/applications/sideband.desktop "$APPDIR/${APP_NAME}.desktop"
ln -sf usr/share/icons/hicolor/256x256/apps/sideband.png "$APPDIR/sideband.png"
echo "[6/7] Downloading appimagetool..."
if [ ! -f "appimagetool.AppImage" ]; then
curl -L "$APPIMAGETOOL_URL" -o appimagetool.AppImage
chmod +x appimagetool.AppImage
fi
echo "[7/7] Building AppImage..."
export APPIMAGE_EXTRACT_AND_RUN=1
OUTPUT_FILENAME="${APP_NAME}-${APP_VERSION}-py${PY_VER}-${ARCH}.AppImage"
./appimagetool.AppImage "$APPDIR" "$OUTPUT_FILENAME"
echo "Success: $WORKDIR/$OUTPUT_FILENAME"