From 68df3476cfa35f5677a66fc5eff8dd21e748a913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vasconcellos?= Date: Fri, 17 Nov 2023 05:10:39 -0300 Subject: [PATCH] Initial port to appimage-builder --- scripts/AppImageBuilder.yml | 149 ++++++++++++++++++++++++++++++++++++ scripts/build_appimage.sh | 89 +++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 scripts/AppImageBuilder.yml create mode 100755 scripts/build_appimage.sh diff --git a/scripts/AppImageBuilder.yml b/scripts/AppImageBuilder.yml new file mode 100644 index 000000000000..4b71d4ff526c --- /dev/null +++ b/scripts/AppImageBuilder.yml @@ -0,0 +1,149 @@ +# Reference: +# https://appimage-builder.readthedocs.io/en/latest/reference/version_1.html + +version: 1 + +script: | + set -eu + command -v mksquashfs >/dev/null 2>&1 || { apt-get update && apt-get install -yq squashfs-tools; } + # Clean up directories created by the recipe + rm "$TARGET_APPDIR" -rf || true + rm "$REPO_DIR" -rf || true + # Create a temporary Debian repository folder to put the generated Debian + # packages on, so we can install it like any other packages + mkdir -p "$REPO_DIR" + _deb="$(find "${TARGET_APPIMAGE_DIR}/../deb" -type f -name '*.deb' | sort -t '_' -k '2,2' -V | tail -n 1)" + cp -f "$_deb" "$REPO_DIR" + command -v apt-ftparchive >/dev/null 2>&1 || { apt-get update && apt-get install -yq apt-utils; } + CWD="$PWD" && cd "$REPO_DIR" && apt-ftparchive packages . > Packages && cd "$CWD" + # The following two commands are a workaround for the local APT package not + # being saved to the archives directory, as expected by appimage-builder + mkdir -p appimage-build/apt/archives + cp -f "$_deb" appimage-build/apt/archives + +AppDir: + path: !ENV "${TARGET_APPDIR}" + + app_info: + id: com.spacedrive + name: Spacedrive + icon: spacedrive + version: !ENV "${VERSION}" + exec: usr/bin/spacedrive + exec_args: $@ + + apt: + arch: !ENV ${TARGET_APPIMAGE_APT_ARCH} + sources: + - sourceline: !ENV 'deb [arch=${TARGET_APPIMAGE_APT_ARCH}] http://deb.debian.org/debian bookworm main' + key_url: 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x1f89983e0081fde018f3cc9673a4f27b8dd47936' + - sourceline: !ENV 'deb [arch=${TARGET_APPIMAGE_APT_ARCH}] http://security.debian.org/debian-security bookworm-security main' + key_url: 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x1f89983e0081fde018f3cc9673a4f27b8dd47936' + - sourceline: !ENV 'deb [arch=${TARGET_APPIMAGE_APT_ARCH}] http://deb.debian.org/debian bookworm-updates main' + key_url: 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xac530d520f2f3269f5e98313a48449044aad5c5d' + - sourceline: !ENV 'deb [trusted=yes] file:${REPO_DIR}/ ./' + + include: + - spacedrive + - gstreamer1.0-plugins-good + - gstreamer1.0-plugins-ugly + - gstreamer1.0-pipewire + # This package is necessary to avoid this: https://github.com/AppImageCrafters/appimage-builder/pull/191 + - shared-mime-info + + exclude: + - systemd + - systemd-sysv + - util-linux + - util-linux-extra + - xkb-data + - fdisk + - dmsetup + - mount + - dbus-daemon + - perl-base + - readline-common + - libpam-modules + - avahi-daemon + - bubblewrap + - adwaita-icon-theme + - humanity-icon-theme + - sensible-utils + - dconf-service + - ubuntu-mono + - fonts-*-core + - gstreamer1.0-plugins-bad + + files: + exclude: + # Development, localization, documentation and configuration files + - usr/include + - usr/share/bug + - usr/share/man + - usr/share/doc + - usr/share/doc-base + - usr/share/lintian + - usr/share/sounds + - usr/share/bash-completion + - usr/share/zsh + - usr/share/applications + - usr/share/pkgconfig + - usr/share/pam + - usr/share/pam-configs + - usr/share/polkit-1 + - usr/share/util-linux + - usr/share/initramfs-tools + - usr/share/locale + - usr/share/systemd + - usr/lib/systemd + - usr/lib/*-linux-gnu/systemd + - usr/lib/udev + - usr/lib/*.d + - usr/lib/kernel + - usr/lib/tmpfiles.d + # using our own ALSA can cause issues, and the API is pretty stable anyway + - usr/lib/*/libasound.so.* + # produced by library compilation + - usr/lib/*.a + # produced by library compilation + - usr/lib/cmake + # produced by library compilation + - usr/lib/pkgconfig + - etc + - var + # systemd, pam, lsb, modprobe.d, udev and misc daemon files + - lib/systemd + - lib/*-linux-gnu/security + - lib/udev + - lib/lsb + - lib/modprobe.d + # Unneeded utility programs and libraries + - usr/sbin + # Remove any binary but spacedrive + - usr/bin/[!s]* + - usr/bin/s[!p]* + - usr/bin/sp[!a]* + - sbin + - bin + + # Incorporate Tauri patch to relocate hardcoded system WebKitGTK binary paths to the AppDir: + # https://github.com/tauri-apps/linuxdeploy-plugin-gtk/blob/c017fa2962008635d201889a721373077dd299e4/linuxdeploy-plugin-gtk.sh#L325-L326 + # /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess + # .././lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess + # ../../usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess + after_runtime: | + set -eu + ln -sf ../usr/lib "${TARGET_APPDIR}/runtime/lib" + find "$TARGET_APPDIR"/usr/lib* -name 'libwebkit*' -exec sed -i -e "s|/usr/lib|.././lib|g" '{}' \; + + # Tests don't work due to Tauri security checks we can't work around: + # https://github.com/tauri-apps/tauri/blob/35264b4c1801b381e0b867c1c35540f0fbb43365/core/tauri-utils/src/lib.rs#L202 + #test: + # debian-stretch: + # image: debian:stretch-slim + # command: ./AppRun + +AppImage: + arch: !ENV "${TARGET_APPIMAGE_ARCH}" + sign-key: None + update-information: None diff --git a/scripts/build_appimage.sh b/scripts/build_appimage.sh new file mode 100755 index 000000000000..b37bcb84dc21 --- /dev/null +++ b/scripts/build_appimage.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +# Creates an AppImage with the specified Rust package binary and its dependencies. +# AppImage is an universal Linux application distribution format, similar +# to macOS bundles, which packs an application and its dependencies to +# allow running it across a wide variety of distros with no system changes +# and little user hassle. +# +# Relevant documentation: +# https://docs.appimage.org/packaging-guide/index.html +# https://appimage-builder.readthedocs.io/en/latest/index.html + +set -xeEuo pipefail + +if [ "${CI:-}" = "true" ]; then + set -x +fi + +_root="$(CDPATH='' cd "$(dirname -- "$0")" && pwd -P)" +readonly _root + +# The appimage-builder recipe to use to generate the AppImage. +readonly RECIPE="${_root}/AppImageBuilder.yml" + +# The directory where the generated AppImage bundles will be stored. +readonly TARGET_APPIMAGE_DIR="${_root}/../target/${TARGET:-.}/release/bundle/appimage" +export TARGET_APPIMAGE_DIR + +alias wget='wget -nc -nv --show-progress -P "$APPIMAGE_WORKDIR"' + +# Create a temporary working directory for this AppImage script +APPIMAGE_WORKDIR=$(mktemp -d -t spacedrive-appimagebuild.XXX) +readonly APPIMAGE_WORKDIR +trap '{ rm -rf "$APPIMAGE_WORKDIR" || true; } && { rm -rf appimage-build AppDir || true; }' EXIT INT TERM + +if ! command -v appimage-builder >/dev/null 2>&1; then + if ! command -v python3 >/dev/null 2>&1; then + echo "! Python 3 was not found. Please make sure it is installed and in the PATH variable." >&2 + false + fi + + # Set up a virtual environment so that we do not pollute the global Python + # packages list with the packages we need to install + echo '> Setting up temporary Python virtual environment' + python3 -m venv "$APPIMAGE_WORKDIR/.venv" + . "$APPIMAGE_WORKDIR/.venv/bin/activate" + + echo '> Install appimage-build in temporary Python virtual environment' + pip3 install -r /proc/self/fd/0 <<'REQUIREMENTS' +appimage-builder==1.1.0 +certifi==2022.6.15 +charset-normalizer==2.1.0 +contextlib2==21.6.0 +decorator==5.1.1 +docker==5.0.3 +emrichen==0.2.3 +idna==3.3 +jsonpath-rw==1.4.0 +lief==0.12.1 +packaging==21.3 +ply==3.11 +prompt-toolkit==3.0.30 +pyaml==21.10.1 +pyparsing==3.0.9 +python-gnupg==0.4.9> +ruamel.yaml==0.17.21 +ruamel.yaml.clib==0.2.6 +schema==0.7.5 +six==1.16.0 +urllib3==1.26.11 +wcwidth==0.2.5 +websocket-client==1.3.3 +REQUIREMENTS + + echo '> Running appimage-builder' +fi + +export TARGET_APPIMAGE_ARCH="${TARGET_APPIMAGE_ARCH:-$(uname -m)}" +export TARGET_APPIMAGE_APT_ARCH="${TARGET_APPIMAGE_APT_ARCH:-$(dpkg-architecture -q DEB_HOST_ARCH)}" +export TARGET_APPDIR="${APPIMAGE_WORKDIR}/AppDir" +export REPO_DIR="$APPIMAGE_WORKDIR/pkgs" +VERSION="$(git describe --tags --dirty=-custom --always)" +export VERSION + +appimage-builder --recipe "$RECIPE" --skip-test + +echo "> Moving generated AppImage to $TARGET_APPIMAGE_DIR" +mkdir -p "$TARGET_APPIMAGE_DIR" +mv -f ./*.AppImage* "$TARGET_APPIMAGE_DIR"