diff --git a/.gitignore b/.gitignore index 883db17..925aece 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .vscode/ docs/ .codex +build/ # --- Backend (Go) --- backend/hightube.db diff --git a/scripts/package_linux_appimage.sh b/scripts/package_linux_appimage.sh new file mode 100755 index 0000000..5500efa --- /dev/null +++ b/scripts/package_linux_appimage.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" +FRONTEND_DIR="${REPO_ROOT}/frontend" +DEFAULT_BUNDLE_DIR="${FRONTEND_DIR}/build/linux/x64/release/bundle" + +APP_NAME="hightube" +APP_DISPLAY_NAME="Hightube" +BUNDLE_DIR="${BUNDLE_DIR:-${DEFAULT_BUNDLE_DIR}}" +APPDIR="${APPDIR:-${REPO_ROOT}/build/appimage/${APP_NAME}.AppDir}" +OUTPUT="${OUTPUT:-${REPO_ROOT}/hightube-linux_amd64.AppImage}" +ICON_SOURCE="${ICON_SOURCE:-${FRONTEND_DIR}/assets/icon/app_icon.png}" +APPIMAGETOOL="${APPIMAGETOOL:-appimagetool}" +RUN_FLUTTER_BUILD=0 + +usage() { + cat <&2 + usage >&2 + exit 2 + ;; + esac +done + +if [[ "${RUN_FLUTTER_BUILD}" -eq 1 ]]; then + (cd "${FRONTEND_DIR}" && flutter build linux --release) +fi + +if [[ ! -x "${BUNDLE_DIR}/${APP_NAME}" ]]; then + echo "Linux release bundle not found at: ${BUNDLE_DIR}" >&2 + echo "Run: cd frontend && flutter build linux --release" >&2 + exit 1 +fi + +if [[ ! -f "${ICON_SOURCE}" ]]; then + echo "Icon file not found at: ${ICON_SOURCE}" >&2 + exit 1 +fi + +if ! command -v "${APPIMAGETOOL}" >/dev/null 2>&1; then + echo "appimagetool not found." >&2 + echo "Install appimagetool or set APPIMAGETOOL=/path/to/appimagetool" >&2 + exit 1 +fi + +rm -rf "${APPDIR}" +mkdir -p \ + "${APPDIR}/usr/bin" \ + "${APPDIR}/usr/share/applications" \ + "${APPDIR}/usr/share/icons/hicolor/512x512/apps" + +cp -a "${BUNDLE_DIR}/." "${APPDIR}/usr/bin/" +cp "${ICON_SOURCE}" "${APPDIR}/${APP_NAME}.png" +cp "${ICON_SOURCE}" "${APPDIR}/usr/share/icons/hicolor/512x512/apps/${APP_NAME}.png" + +cat > "${APPDIR}/${APP_NAME}.desktop" < "${APPDIR}/AppRun" <<'EOF' +#!/usr/bin/env bash +set -euo pipefail + +HERE="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +cd "${HERE}/usr/bin" +exec "./hightube" "$@" +EOF + +chmod +x "${APPDIR}/AppRun" "${APPDIR}/usr/bin/${APP_NAME}" +rm -f "${OUTPUT}" + +APPIMAGE_EXTRACT_AND_RUN=1 ARCH=x86_64 "${APPIMAGETOOL}" "${APPDIR}" "${OUTPUT}" +chmod +x "${OUTPUT}" + +echo "Created AppImage: ${OUTPUT}"