#!/usr/bin/env bash # Wrap dist/DataTools/ (PyInstaller folder mode) into a distributable # AppImage. # # Usage: # bash build/appimage/build.sh # # Requires ``appimagetool`` on PATH (CI installs it; locally grab the # latest release from https://github.com/AppImage/AppImageKit/releases). # # Output: dist/DataTools--linux-x86_64.AppImage set -euo pipefail VERSION="${1:-0.0.0-dev}" DIST="dist/DataTools" OUT="dist/DataTools-${VERSION}-linux-x86_64.AppImage" if [[ ! -d "$DIST" ]]; then echo "Error: $DIST not found. Run pyinstaller build/datatools.spec first." >&2 exit 1 fi if ! command -v appimagetool >/dev/null 2>&1; then echo "Error: appimagetool not on PATH. See build/appimage/build.sh header." >&2 exit 1 fi # Lay out the AppDir. APPDIR="$(mktemp -d)/DataTools.AppDir" trap 'rm -rf "$(dirname -- "$APPDIR")"' EXIT mkdir -p "$APPDIR/usr/bin" cp -R "$DIST" "$APPDIR/usr/bin/" cp build/appimage/AppRun "$APPDIR/AppRun" chmod +x "$APPDIR/AppRun" cp build/appimage/datatools.desktop "$APPDIR/datatools.desktop" # Icon. AppImage requires a top-level .png next to the # .desktop. Use the build/icon.png if present, otherwise generate a # blank placeholder so the build doesn't fail on a fresh checkout. if [[ -f build/icon.png ]]; then cp build/icon.png "$APPDIR/datatools.png" else # 256x256 single-colour PNG via printf — appimagetool needs *some* # icon present. Replace with a real 1024x1024 PNG before launch. python3 - <<'PY' import struct, zlib, os def chunk(t, d): return struct.pack(">I", len(d)) + t + d + struct.pack(">I", zlib.crc32(t + d) & 0xffffffff) W = H = 256 ihdr = struct.pack(">IIBBBBB", W, H, 8, 2, 0, 0, 0) # 8-bit RGB raw = b"".join(b"\x00" + b"\x16\x19\x22" * W for _ in range(H)) # filter byte + dark pixels idat = zlib.compress(raw, 9) png = b"\x89PNG\r\n\x1a\n" + chunk(b"IHDR", ihdr) + chunk(b"IDAT", idat) + chunk(b"IEND", b"") out = os.environ["APPDIR"] + "/datatools.png" open(out, "wb").write(png) PY fi export APPDIR ARCH=x86_64 appimagetool "$APPDIR" "$OUT" echo "Built $OUT"