94 lines
3.1 KiB
Bash
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"
|