From 8ef8e668e8bfe02f00e8747fcf3c02253927acf5 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Tue, 16 Dec 2025 21:37:14 +0500 Subject: [PATCH] feat(appimage): use AnyLinux AppImages to support musl-libc and non-FHS systems Signed-off-by: Boris Yumankulov --- .gitea/workflows/build-nightlly.yml | 37 ++++------ .gitea/workflows/build.yml | 36 ++++------ .gitea/workflows/code-build.yml | 28 ++++---- build-aux/AppImage/get-dependencies.sh | 78 ++++++++++++++++++++ build-aux/AppImage/portprotonqt-appimage.sh | 37 ++++++++++ build-aux/AppImageBuilder.yml | 80 --------------------- 6 files changed, 161 insertions(+), 135 deletions(-) create mode 100755 build-aux/AppImage/get-dependencies.sh create mode 100755 build-aux/AppImage/portprotonqt-appimage.sh delete mode 100644 build-aux/AppImageBuilder.yml diff --git a/.gitea/workflows/build-nightlly.yml b/.gitea/workflows/build-nightlly.yml index cef2b8c..bc70573 100644 --- a/.gitea/workflows/build-nightlly.yml +++ b/.gitea/workflows/build-nightlly.yml @@ -11,40 +11,33 @@ jobs: build-appimage: name: Build AppImage runs-on: ubuntu-22.04 + container: + image: archlinux:base-devel steps: + - name: Prepare container + run: | + pacman-key --init + pacman -Sy --noconfirm archlinux-keyring + pacman -Syu --noconfirm --disable-download-timeout --needed git wget gnupg nodejs npm xorg-server-xvfb zsync + - uses: https://gitea.com/actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - name: Install required dependencies + - name: Install appimage dependencies run: | - sudo apt update - sudo apt install -y binutils coreutils desktop-file-utils gtk-update-icon-cache fakeroot fuse libgdk-pixbuf2.0-dev patchelf python3-pip python3-dev python3-setuptools python3-build python3-venv squashfs-tools strace util-linux zsync git zstd adwaita-icon-theme - - - name: Upgrade pip toolchain - run: | - python3 -m pip install --upgrade \ - pip setuptools setuptools-scm wheel packaging build - - - name: Install appimage-builder - run: | - git clone https://github.com/Boria138/appimage-builder - cd appimage-builder - pip install . - - - name: Install uv - run: | - pip install uv + cd build-aux/AppImage + chmod +x get-dependencies.sh portprotonqt-appimage.sh + ./get-dependencies.sh --git - name: Build AppImage run: | - cd build-aux - sed -i '/app_info:/,/- exec:/ s/^\(\s*version:\s*\).*/\1"0"/' AppImageBuilder.yml - appimage-builder + cd build-aux/AppImage + ./portprotonqt-appimage.sh - name: Upload AppImage uses: https://gitea.com/actions/gitea-upload-artifact@v4 with: name: PortProtonQt-AppImage - path: build-aux/PortProtonQt*.AppImage + path: build-aux/AppImage/dist/*.AppImage* build-fedora: name: Build Fedora RPM diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 0bbaaa4..b509dae 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -17,39 +17,33 @@ jobs: build-appimage: name: Build AppImage runs-on: ubuntu-22.04 + container: + image: archlinux:base-devel steps: + - name: Prepare container + run: | + pacman-key --init + pacman -Sy --noconfirm archlinux-keyring + pacman -Syu --noconfirm --disable-download-timeout --needed git wget gnupg nodejs npm xorg-server-xvfb zsync + - uses: https://gitea.com/actions/checkout@v4 - - name: Install required dependencies + - name: Install appimage dependencies run: | - sudo apt update - sudo apt install -y binutils coreutils desktop-file-utils gtk-update-icon-cache fakeroot fuse libgdk-pixbuf2.0-dev patchelf python3-pip python3-dev python3-setuptools python3-build python3-venv squashfs-tools strace util-linux zsync git zstd adwaita-icon-theme - - - name: Upgrade pip toolchain - run: | - python3 -m pip install --upgrade \ - pip setuptools setuptools-scm wheel packaging build - - - name: Install appimage-builder - run: | - git clone https://github.com/Boria138/appimage-builder - cd appimage-builder - pip install . - - - name: Install uv - run: | - pip install uv + cd build-aux/AppImage + chmod +x get-dependencies.sh portprotonqt-appimage.sh + ./get-dependencies.sh - name: Build AppImage run: | - cd build-aux - appimage-builder + cd build-aux/AppImage + ./portprotonqt-appimage.sh - name: Upload AppImage uses: https://gitea.com/actions/gitea-upload-artifact@v4 with: name: PortProtonQt-AppImage - path: build-aux/PortProtonQt*.AppImage* + path: build-aux/AppImage/dist/*.AppImage* build-arch: name: Build Arch Package diff --git a/.gitea/workflows/code-build.yml b/.gitea/workflows/code-build.yml index b3d94e1..1fb6ce5 100644 --- a/.gitea/workflows/code-build.yml +++ b/.gitea/workflows/code-build.yml @@ -37,7 +37,7 @@ jobs: cat changed_files.txt # Check AppImage files - if grep -q "build-aux/AppImageBuilder.yml" changed_files.txt; then + if grep -q "build-aux/AppImage/" changed_files.txt; then echo "appimage=true" >> $GITHUB_OUTPUT else echo "appimage=false" >> $GITHUB_OUTPUT @@ -62,29 +62,33 @@ jobs: runs-on: ubuntu-22.04 needs: changes if: needs.changes.outputs.appimage == 'true' || github.event_name == 'workflow_dispatch' + container: + image: archlinux:base-devel steps: + - name: Prepare container + run: | + pacman-key --init + pacman -S --noconfirm archlinux-keyring + pacman -Syu --noconfirm --disable-download-timeout --needed git wget gnupg nodejs npm xorg-server-xvfb zsync + - uses: https://gitea.com/actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - name: Install required dependencies + - name: Install appimage dependencies run: | - sudo apt update - sudo apt install -y binutils coreutils desktop-file-utils gtk-update-icon-cache fakeroot fuse libgdk-pixbuf2.0-dev patchelf python3-pip python3-dev python3-setuptools squashfs-tools strace util-linux zsync zstd git - - - name: Install tools - run: | - pip3 install git+https://github.com/Boria138/appimage-builder.git - pip3 install uv + cd build-aux/AppImage + chmod +x get-dependencies.sh portprotonqt-appimage.sh + ./get-dependencies.sh - name: Build AppImage run: | - cd build-aux - appimage-builder + cd build-aux/AppImage + ./portprotonqt-appimage.sh - name: Upload AppImage uses: https://gitea.com/actions/gitea-upload-artifact@v4 with: name: PortProtonQt-AppImage - path: build-aux/PortProtonQt*.AppImage + path: build-aux/AppImage/dist/*.AppImage* build-fedora: name: Build Fedora RPM diff --git a/build-aux/AppImage/get-dependencies.sh b/build-aux/AppImage/get-dependencies.sh new file mode 100755 index 0000000..b7c905e --- /dev/null +++ b/build-aux/AppImage/get-dependencies.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +set -eu + +# Determine if git mode is enabled based on the first argument +if [ "${1:-}" = "--git" ] || [ "${1:-}" = "-g" ]; then + GIT_MODE=true +else + GIT_MODE=false +fi + +ARCH="$(uname -m)" +PACKAGE_BUILDER="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/make-aur-package.sh" +EXTRA_PACKAGES="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/get-debloated-pkgs.sh" + +if [ "$GIT_MODE" = true ]; then + echo "Using git version of PortProtonQt..." + PPQT_PKGBUILD="https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/build-aux/PKGBUILD-git" +else + echo "Using stable version of PortProtonQt..." + PPQT_PKGBUILD="https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/build-aux/PKGBUILD" +fi + +echo "Installing dependencies..." +echo "---------------------------------------------------------------" +pacman-key --init +pacman -Syy --noconfirm archlinux-keyring +echo "Installing dependencies..." +echo "---------------------------------------------------------------" +pacman-key --init +pacman -Syy --noconfirm archlinux-keyring +pacman -Syu --noconfirm \ + cabextract \ + curl \ + perl-image-exiftool \ + pyside6 \ + python-babel \ + python-beautifulsoup4 \ + python-evdev \ + python-numpy \ + python-orjson \ + python-pillow \ + python-psutil \ + python-pyudev \ + python-rapidfuzz \ + python-requests \ + python-tqdm \ + python-websocket-client \ + unrar \ + unzip \ + xdg-utils + +echo "Installing debloated packages..." +echo "---------------------------------------------------------------" +wget --retry-connrefused --tries=30 "$EXTRA_PACKAGES" -O ./get-debloated-pkgs.sh +chmod +x ./get-debloated-pkgs.sh +./get-debloated-pkgs.sh --add-common --prefer-nano + +echo "Installing AUR packages..." +echo "---------------------------------------------------------------" +wget --retry-connrefused --tries=30 "$PACKAGE_BUILDER" -O ./make-aur-package.sh +chmod +x ./make-aur-package.sh + +./make-aur-package.sh --chaotic-aur icoextract +./make-aur-package.sh --chaotic-aur python-vdf + +echo "Building PortProtonQt from PKGBUILD..." +echo "---------------------------------------------------------------" +wget --retry-connrefused --tries=30 "$PPQT_PKGBUILD" -O ./PKGBUILD +makepkg -si --noconfirm + +if [ "$GIT_MODE" = true ]; then + # For git version, we use portprotonqt-git + pacman -Q portprotonqt-git | awk '{print $2; exit}' > ~/version +else + # For stable version, we use portprotonqt + pacman -Q portprotonqt | awk '{print $2; exit}' > ~/version +fi diff --git a/build-aux/AppImage/portprotonqt-appimage.sh b/build-aux/AppImage/portprotonqt-appimage.sh new file mode 100755 index 0000000..db774fe --- /dev/null +++ b/build-aux/AppImage/portprotonqt-appimage.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +set -eu + +ARCH="$(uname -m)" +VERSION="$(cat ~/version)" +URUNTIME="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/uruntime2appimage.sh" +SHARUN="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/quick-sharun.sh" + +export DESKTOP=/usr/share/applications/ru.linux_gaming.PortProtonQt.desktop +export ICON=/usr/share/icons/hicolor/scalable/apps/ru.linux_gaming.PortProtonQt.svg +export OUTNAME=portprotonqt-"$VERSION"-anylinux-"$ARCH".AppImage +export DEPLOY_OPENGL=1 +export DEPLOY_PIPEWIRE=1 +export DEPLOY_SYS_PYTHON=1 +export DEPLOY_VULKAN=1 +export ANYLINUX_LIB=1 +export OPTIMIZE_LAUNCH=1 + +# DEPLOY ALL LIBS +wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun +chmod +x ./quick-sharun +./quick-sharun /usr/bin/portprotonqt /usr/lib/libudev.so* + +# Add udev rules +mkdir -p ./AppDir/etc/udev/rules.d +cp /usr/lib/udev/rules.d/60-portprotonqt.rules ./AppDir/etc/udev/rules.d + +# MAKE APPIMAGE WITH URUNTIME +wget --retry-connrefused --tries=30 "$URUNTIME" -O ./uruntime2appimage +chmod +x ./uruntime2appimage +./uruntime2appimage + +mkdir -p ./dist +mv -v ./*.AppImage* ./dist +mv -v ~/version ./dist +echo "All Done!" diff --git a/build-aux/AppImageBuilder.yml b/build-aux/AppImageBuilder.yml deleted file mode 100644 index a9954cc..0000000 --- a/build-aux/AppImageBuilder.yml +++ /dev/null @@ -1,80 +0,0 @@ -version: 1 -script: - - rm -rf AppDir || true - - mkdir -p AppDir/usr/local/lib/python3.10/dist-packages - - uv venv - - uv pip install --no-cache-dir ../ - - cp -r .venv/lib/python3.10/site-packages/* AppDir/usr/local/lib/python3.10/dist-packages - - cp -r share AppDir/usr - - cp -r lib AppDir/usr - - rm -rf AppDir/usr/local/lib/python3.10/dist-packages/PySide6/Qt/qml/ - - rm -f AppDir/usr/local/lib/python3.10/dist-packages/PySide6/{assistant,designer,linguist,lrelease,lupdate} - - rm -f AppDir/usr/local/lib/python3.10/dist-packages/PySide6/{Qt3DAnimation*,Qt3DCore*,Qt3DExtras*,Qt3DInput*,Qt3DLogic*,Qt3DRender*,QtBluetooth*,QtCharts*,QtConcurrent*,QtDataVisualization*,QtDesigner*,QtExampleIcons*,QtGraphs*,QtGraphsWidgets*,QtHelp*,QtHttpServer*,QtLocation*,QtMultimedia*,QtMultimediaWidgets*,QtNetworkAuth*,QtNfc*,QtOpenGL*,QtOpenGLWidgets*,QtPdf*,QtPdfWidgets*,QtPositioning*,QtPrintSupport*,QtQml*,QtQuick*,QtQuick3D*,QtQuickControls2*,QtQuickTest*,QtQuickWidgets*,QtRemoteObjects*,QtScxml*,QtSensors*,QtSerialBus*,QtSerialPort*,QtSpatialAudio*,QtSql*,QtStateMachine*,QtSvgWidgets*,QtTest*,QtTextToSpeech*,QtUiTools*,QtWebChannel*,QtWebEngineCore*,QtWebEngineQuick*,QtWebEngineWidgets*,QtWebSockets*,QtWebView*,QtXml*} - - shopt -s extglob - - rm -rf AppDir/usr/local/lib/python3.10/dist-packages/PySide6/Qt/lib/!(libQt6Core*|libQt6DBus*|libQt6Egl*|libQt6Gui*|libQt6Network*|libQt6Svg*|libQt6Wayland*|libQt6Widgets*|libQt6XcbQpa*|libicudata*|libicui18n*|libicuuc*) -AppDir: - path: ./AppDir - after_bundle: - - rm -rf $TARGET_APPDIR/usr/share/man || true - - rm -rf $TARGET_APPDIR/usr/share/doc || true - - rm -rf $TARGET_APPDIR/usr/share/doc-base || true - - rm -rf $TARGET_APPDIR/usr/share/info || true - - rm -rf $TARGET_APPDIR/usr/share/help || true - - rm -rf $TARGET_APPDIR/usr/share/gtk-doc || true - - rm -rf $TARGET_APPDIR/usr/share/devhelp || true - - rm -rf $TARGET_APPDIR/usr/share/examples || true - - rm -rf $TARGET_APPDIR/usr/share/pkgconfig || true - - rm -rf $TARGET_APPDIR/usr/share/bash-completion || true - - rm -rf $TARGET_APPDIR/usr/share/pixmaps || true - - rm -rf $TARGET_APPDIR/usr/share/mime || true - - rm -rf $TARGET_APPDIR/usr/share/metainfo || true - - rm -rf $TARGET_APPDIR/usr/include || true - - rm -rf $TARGET_APPDIR/usr/lib/pkgconfig || true - - find $TARGET_APPDIR -type f \( -name '*.a' -o -name '*.la' -o -name '*.h' -o -name '*.cmake' -o -name '*.pdb' \) -delete || true - - "find $TARGET_APPDIR -type f -executable -exec file {} \\; | grep ELF | grep -v '/dist-packages/' | grep -v '/site-packages/' | cut -d: -f1 | xargs strip --strip-unneeded || true" - - find $TARGET_APPDIR -type d -empty -delete || true - app_info: - id: ru.linux_gaming.PortProtonQt - name: PortProtonQt - icon: ru.linux_gaming.PortProtonQt - version: 0.1.9 - exec: usr/bin/python3 - exec_args: "-m portprotonqt.app $@" - apt: - arch: amd64 - sources: - - sourceline: 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse' - key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920d1991bc93c' - include: - - python3-minimal - - python3-pkg-resources - - libopengl0 - - libk5crypto3 - - libkrb5-3 - - libgssapi-krb5-2 - - libxcb-cursor0 - - libimage-exiftool-perl - - xdg-utils - - cabextract - - curl - - 7zip - - unzip - - unrar - exclude: - - "*-doc" - - "*-man" - - manpages - - mandb - - "*-dev" - - "*-static" - - "*-dbg" - - "*-dbgsym" - runtime: - env: - PYTHONHOME: '${APPDIR}/usr' - PYTHONPATH: '${APPDIR}/usr/local/lib/python3.10/dist-packages' - PERLLIB: '${APPDIR}/usr/share/perl5:${APPDIR}/usr/lib/x86_64-linux-gnu/perl/5.34:${APPDIR}/usr/share/perl/5.34' -AppImage: - sign-key: None - arch: x86_64 - comp: zstd