From eb07d698cdf654c19d04f96f36e9d94d2172abaf Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 5 Sep 2023 22:03:02 +1000 Subject: [PATCH] CI: Update AppImage to 22.04 + use LinuxDeploy --- .github/workflows/rolling-release.yml | 14 +- scripts/clang-toolchain.cmake | 6 +- scripts/{flatpak => }/duckstation-qt.desktop | 0 scripts/duckstation-qt.png | Bin 0 -> 48277 bytes .../flatpak/org.duckstation.duckstation.json | 4 +- scripts/{flatpak => }/generate-metainfo.sh | 0 scripts/make-appimage.sh | 348 ++++++------------ ...rg.duckstation.duckstation.metainfo.xml.in | 0 8 files changed, 121 insertions(+), 251 deletions(-) rename scripts/{flatpak => }/duckstation-qt.desktop (100%) create mode 100644 scripts/duckstation-qt.png rename scripts/{flatpak => }/generate-metainfo.sh (100%) rename scripts/{flatpak => }/org.duckstation.duckstation.metainfo.xml.in (100%) diff --git a/.github/workflows/rolling-release.yml b/.github/workflows/rolling-release.yml index b9f2a3151..e63962c85 100644 --- a/.github/workflows/rolling-release.yml +++ b/.github/workflows/rolling-release.yml @@ -202,7 +202,7 @@ jobs: linux-build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2.3.1 with: @@ -212,14 +212,16 @@ jobs: shell: bash run: | # Workaround for https://github.com/actions/runner-images/issues/675 - # TODO: Update to LLVM 18 + scripts/retry.sh wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo scripts/retry.sh apt-add-repository -n 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main' + sudo scripts/retry.sh apt-get update && sudo scripts/retry.sh apt-get -y install \ cmake ninja-build ccache libegl1-mesa-dev libevdev-dev libwayland-dev libwayland-egl-backend-dev libxrandr-dev libdbus-1-dev \ extra-cmake-modules libcurl4-openssl-dev libssl-dev libasound2-dev libpulse-dev libx11-xcb-dev build-essential git libclang-dev \ libclang-11-dev libclang-12-dev patchelf libglib2.0-dev libfontconfig1-dev libharfbuzz-dev libjpeg-dev libpng-dev libfreetype-dev \ libinput-dev libxcb-*-dev libxkbcommon-dev libxkbcommon-x11-dev libxrender-dev libwayland-dev libgl1-mesa-dev libegl-dev \ - libegl1-mesa-dev libgl1-mesa-dev libssl-dev libx11-dev libx11-xcb-dev llvm-12 lld-12 clang-12 + libegl1-mesa-dev libgl1-mesa-dev libssl-dev libx11-dev libx11-xcb-dev libfuse2 llvm-16 lld-16 clang-16 - name: Cache Dependencies id: cache-deps @@ -237,10 +239,10 @@ jobs: run: | mkdir build cd build - cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_NOGUI_FRONTEND=OFF -DBUILD_QT_FRONTEND=ON -DBUILD_TESTS=OFF -DUSE_EGL=ON -DUSE_SDL2=ON -DUSE_WAYLAND=ON -DUSE_X11=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_PREFIX_PATH=$HOME/deps -DCMAKE_TOOLCHAIN_FILE=../scripts/clang-toolchain.cmake .. + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_NOGUI_FRONTEND=OFF -DBUILD_QT_FRONTEND=ON -DBUILD_TESTS=OFF -DUSE_WAYLAND=ON -DUSE_X11=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_PREFIX_PATH=$HOME/deps -DCMAKE_TOOLCHAIN_FILE=../scripts/clang-toolchain.cmake .. cmake --build . --parallel cd .. - scripts/make-appimage.sh $(realpath ./build) $(realpath .) $HOME/deps DuckStation-x64 + scripts/make-appimage.sh $(realpath .) $(realpath ./build) $HOME/deps DuckStation-x64 - name: Upload Qt AppImage uses: actions/upload-artifact@v1 @@ -262,7 +264,7 @@ jobs: - name: Generate AppStream XML run: | - scripts/flatpak/generate-metainfo.sh scripts/flatpak/org.duckstation.duckstation.metainfo.xml + scripts/generate-metainfo.sh scripts/flatpak/org.duckstation.duckstation.metainfo.xml cat scripts/flatpak/org.duckstation.duckstation.metainfo.xml flatpak run org.freedesktop.appstream-glib validate scripts/flatpak/org.duckstation.duckstation.metainfo.xml diff --git a/scripts/clang-toolchain.cmake b/scripts/clang-toolchain.cmake index 856772e7b..7a601d668 100644 --- a/scripts/clang-toolchain.cmake +++ b/scripts/clang-toolchain.cmake @@ -1,5 +1,5 @@ -set(CMAKE_C_COMPILER /usr/bin/clang-12) -set(CMAKE_CXX_COMPILER /usr/bin/clang++-12) +set(CMAKE_C_COMPILER /usr/bin/clang-16) +set(CMAKE_CXX_COMPILER /usr/bin/clang++-16) set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld") set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld") -set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld") \ No newline at end of file +set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld") diff --git a/scripts/flatpak/duckstation-qt.desktop b/scripts/duckstation-qt.desktop similarity index 100% rename from scripts/flatpak/duckstation-qt.desktop rename to scripts/duckstation-qt.desktop diff --git a/scripts/duckstation-qt.png b/scripts/duckstation-qt.png new file mode 100644 index 0000000000000000000000000000000000000000..cf342223a710ba162be350f62da0929e29c5262d GIT binary patch literal 48277 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 +SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") + +function retry_command { + # Package servers tend to be unreliable at times.. + # Retry a bunch of times. + local RETRIES=10 + + for i in $(seq 1 "$RETRIES"); do + "$@" && break + if [ "$i" == "$RETRIES" ]; then + echo "Command \"$@\" failed after ${RETRIES} retries." + exit 1 + fi + done +} + if [ "$#" -ne 4 ]; then - echo "Syntax: $0 " + echo "Syntax: $0 " exit 1 fi -BUILDDIR=$1 -ROOTDIR=$2 +ROOTDIR=$1 +BUILDDIR=$2 DEPSDIR=$3 NAME=$4 -BINDIR="$DSDIR/bin" - BINARY=duckstation-qt APPDIRNAME=DuckStation.AppDir -STRIP=llvm-strip-12 +STRIP=strip -declare -a SYSLIBS=( - "libz.so.1" - "libuuid.so.1" - "libapparmor.so.1" - "libblkid.so.1" - "libbsd.so.0" - "libdbus-1.so.3" - "libgcrypt.so.20" - "liblzma.so.5" - "libmount.so.1" - "libnsl.so.1" - "libpcre.so.3" - "libselinux.so.1" - "libsystemd.so.0" - "libudev.so.1" - "libwrap.so.0" - "libharfbuzz.so.0" - "libX11.so.6" - "libX11-xcb.so.1" - "libXau.so.6" - "libXcomposite.so.1" - "libXcursor.so.1" - "libXdamage.so.1" - "libXdmcp.so.6" - "libXext.so.6" - "libXfixes.so.3" - "libXi.so.6" - "libXinerama.so.1" - "libXrandr.so.2" - "libXrender.so.1" - "libXxf86vm.so.1" - "libasyncns.so.0" - "libcrypto.so.1.1" - "liblz4.so.1" - "libpulse.so.0" - "libxcb.so.1" - "libxcb-render.so.0" - "libxcb-shm.so.0" - "libxkbcommon.so.0" - "libxkbcommon-x11.so.0" - "pulseaudio/libpulsecommon-13.99.so" - "libfreetype.so.6" - "libpcre2-16.so.0" - "libexpat.so.1" - "libffi.so.7" - "libgraphite2.so.3" - "libresolv.so.2" - "libgpg-error.so.0" - "libpcre2-16.so.0" - "libxcb-icccm.so.4" - "libxcb-image.so.0" - "libxcb-keysyms.so.1" - "libxcb-randr.so.0" - "libxcb-render.so.0" - "libxcb-render-util.so.0" - "libxcb-shape.so.0" - "libxcb-sync.so.1" - "libxcb-cursor.so.0" - "libxcb-util.so.1" - "libxcb-xfixes.so.0" - "libxcb-xkb.so.1" - "libevdev.so.2" - "libgudev-1.0.so.0" - "libinput.so.10" - "libjpeg.so.8" - "libmtdev.so.1" - "libpng16.so.16" - "libuuid.so.1" - "libSM.so.6" - "libICE.so.6" - "libfontconfig.so.1" - "libglib-2.0.so.0" - "libcurl-gnutls.so.4" - "libnghttp2.so.14" - "libidn2.so.0" - "librtmp.so.1" - "libssh.so.4" - "libpsl.so.5" - "libnettle.so.7" - "libgnutls.so.30" - "libgssapi_krb5.so.2" - "libldap_r-2.4.so.2" - "liblber-2.4.so.2" - "libbrotlidec.so.1" - "libunistring.so.2" - "libhogweed.so.5" - "libgmp.so.10" - "libp11-kit.so.0" - "libtasn1.so.6" - "libkrb5.so.3" - "libk5crypto.so.3" - "libcom_err.so.2" - "libkrb5support.so.0" - "libsasl2.so.2" - "libgssapi.so.3" - "libbrotlicommon.so.1" - "libkeyutils.so.1" - "libheimntlm.so.0" - "libkrb5.so.26" - "libasn1.so.8" - "libhcrypto.so.4" - "libroken.so.18" - "libwind.so.0" - "libheimbase.so.1" - "libhx509.so.5" - "libsqlite3.so.0" - "libcrypt.so.1" - "libdbus-1.so.3" -) - -declare -a DEPLIBS=( - "libSDL2-2.0.so.0" -) - -declare -a QTLIBS=( - "libQt6Core.so.6" - "libQt6Gui.so.6" - "libQt6Network.so.6" - "libQt6OpenGL.so.6" - "libQt6Svg.so.6" - "libQt6WaylandClient.so.6" - "libQt6WaylandCompositor.so.6" +declare -a MANUAL_QT_LIBS=( "libQt6WaylandEglClientHwIntegration.so.6" - "libQt6WaylandEglCompositorHwIntegration.so.6" - "libQt6Widgets.so.6" - "libQt6XcbQpa.so.6" ) -declare -a QTPLUGINS=( - "plugins/iconengines" - "plugins/imageformats" - "plugins/platforms" - #"plugins/platformthemes" # Enable this if we want to ship GTK+ themes at any point. - "plugins/wayland-decoration-client" - "plugins/wayland-graphics-integration-client" - "plugins/wayland-graphics-integration-server" - "plugins/wayland-shell-integration" - "plugins/xcbglintegrations" +declare -a MANUAL_QT_PLUGINS=( + "wayland-decoration-client" + "wayland-graphics-integration-client" + "wayland-shell-integration" ) set -e -if [ ! -f appimagetool-x86_64.AppImage ]; then - wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage - chmod +x appimagetool-x86_64.AppImage +LINUXDEPLOY=./linuxdeploy-x86_64.AppImage +LINUXDEPLOY_PLUGIN_QT=./linuxdeploy-plugin-qt-x86_64.AppImage +APPIMAGETOOL=./appimagetool-x86_64.AppImage +PATCHELF=patchelf + +if [ ! -f "$LINUXDEPLOY" ]; then + retry_command wget -O "$LINUXDEPLOY" https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + chmod +x "$LINUXDEPLOY" +fi + +if [ ! -f "$LINUXDEPLOY_PLUGIN_QT" ]; then + retry_command wget -O "$LINUXDEPLOY_PLUGIN_QT" https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage + chmod +x "$LINUXDEPLOY_PLUGIN_QT" +fi + +if [ ! -f "$APPIMAGETOOL" ]; then + retry_command wget -O "$APPIMAGETOOL" https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage + chmod +x "$APPIMAGETOOL" fi OUTDIR=$(realpath "./$APPDIRNAME") SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") rm -fr "$OUTDIR" -mkdir "$OUTDIR" -mkdir -p "$OUTDIR/usr/bin" "$OUTDIR/usr/lib" "$OUTDIR/usr/lib/pulseaudio" +# Why the nastyness? linuxdeploy strips our main binary, and there's no option to turn it off. +# It also doesn't strip the Qt libs. We can't strip them after running linuxdeploy, because +# patchelf corrupts the libraries (but they still work), but patchelf+strip makes them crash +# on load. So, make a backup copy, strip the original (since that's where linuxdeploy finds +# the libs to copy), then swap them back after we're done. +# Isn't Linux packaging amazing? -echo "Copying binary and resources..." -cp -a "$BUILDDIR/bin"/* "$OUTDIR/usr/bin" - -# We don't need tests -rm -f "$OUTDIR"/usr/bin/*-tests - -# Patch RPATH so the binary goes hunting for shared libraries in the AppDir instead of system. -echo "Patching RPATH in ${BINARY}..." -patchelf --set-rpath '$ORIGIN/../lib' "$OUTDIR/usr/bin/$BINARY" - -# Currently we leave the main binary unstripped, uncomment if this is not desired. -#$STRIP "$OUTDIR/usr/bin/$BINARY" - -# Libraries we pull in from the system. -echo "Copying system libraries..." -for lib in "${SYSLIBS[@]}"; do - blib=$(basename "$lib") - if [ -f "/lib/x86_64-linux-gnu/$lib" ]; then - cp "/lib/x86_64-linux-gnu/$lib" "$OUTDIR/usr/lib/$blib" - elif [ -f "$CHROOT/usr/lib/x86_64-linux-gnu/$lib" ]; then - cp "$CHROOT/usr/lib/x86_64-linux-gnu/$lib" "$OUTDIR/usr/lib/$blib" - elif [ -f "$CHROOT/lib/$lib" ]; then - cp "$CHROOT/lib/$lib" "$OUTDIR/usr/lib/$blib" - elif [ -f "$CHROOT/usr/lib/$lib" ]; then - cp "$CHROOT/usr/lib/$lib" "$OUTDIR/usr/lib/$blib" - else - echo "*** Failed to find '$blib'" - exit 1 - fi - - $STRIP "$OUTDIR/usr/lib/$blib" +rm -fr "$DEPSDIR.bak" +cp -a "$DEPSDIR" "$DEPSDIR.bak" +IFS=" +" +for i in $(find "$DEPSDIR" -iname '*.so'); do + echo "Stripping deps library ${i}" + strip "$i" done -# Dependencies we built, at this point it's just SDL. -echo "Copying dependency libraries..." -for lib in "${DEPLIBS[@]}"; do - blib=$(basename "$lib") - if [ -f "$DEPSDIR/lib/$lib" ]; then - cp "$DEPSDIR/lib/$lib" "$OUTDIR/usr/lib/$blib" - else - echo "*** Failed to find '$blib'" - exit 1 - fi +echo "Copying desktop file..." +cp "$ROOTDIR/scripts/duckstation-qt.desktop" "org.duckstation.duckstation.desktop" +cp "$ROOTDIR/scripts/duckstation-qt.png" "duckstation-qt.png" - $STRIP "$OUTDIR/usr/lib/$blib" +echo "Running linuxdeploy to create AppDir..." +EXTRA_QT_PLUGINS="core;gui;network;svg;waylandclient;widgets;xcbqpa" \ +EXTRA_PLATFORM_PLUGINS="libqwayland-egl.so;libqwayland-generic.so" \ +QMAKE="$DEPSDIR/bin/qmake" \ +NO_STRIP="1" \ +$LINUXDEPLOY --plugin qt --appdir="$OUTDIR" --executable="$BUILDDIR/bin/duckstation-qt" \ +--desktop-file="org.duckstation.duckstation.desktop" --icon-file="duckstation-qt.png" + +echo "Copying resources into AppDir..." +cp -a "$BUILDDIR/bin/resources" "$OUTDIR/usr/bin" + +# LinuxDeploy's Qt plugin doesn't include Wayland support. So manually copy in the additional Wayland libraries. +echo "Copying Qt Wayland libraries..." +for lib in "${MANUAL_QT_LIBS[@]}"; do + srcpath="$DEPSDIR/lib/$lib" + dstpath="$OUTDIR/usr/lib/$lib" + echo " $srcpath -> $dstpath" + cp "$srcpath" "$dstpath" + $PATCHELF --set-rpath '$ORIGIN' "$dstpath" done -echo "Copying Qt libraries..." -for lib in "${QTLIBS[@]}"; do - cp -aL "$DEPSDIR/lib/$lib" "$OUTDIR/usr/lib" - $STRIP "$OUTDIR/usr/lib/$lib" +# .. and plugins. +echo "Copying Qt Wayland plugins..." +for GROUP in "${MANUAL_QT_PLUGINS[@]}"; do + srcpath="$DEPSDIR/plugins/$GROUP" + dstpath="$OUTDIR/usr/plugins/$GROUP" + echo " $srcpath -> $dstpath" + mkdir -p "$dstpath" + + for srcsopath in $(find "$DEPSDIR/plugins/$GROUP" -iname '*.so'); do + # This is ../../ because it's usually plugins/group/name.so + soname=$(basename "$srcsopath") + dstsopath="$dstpath/$soname" + echo " $srcsopath -> $dstsopath" + cp "$srcsopath" "$dstsopath" + $PATCHELF --set-rpath '$ORIGIN/../../lib:$ORIGIN' "$dstsopath" + done done -echo "Copying Qt plugins..." -mkdir -p "$OUTDIR/usr/lib/plugins" -for plugin in "${QTPLUGINS[@]}"; do - mkdir -p "$OUTDIR/usr/lib/$plugin" - cp -aL "$DEPSDIR/$plugin"/*.so "$OUTDIR/usr/lib/$plugin/" -done +# Restore unstripped deps (for cache). +rm -fr "$DEPSDIR" +mv "$DEPSDIR.bak" "$DEPSDIR" -for so in $(find "$OUTDIR/usr/lib/plugins" -iname '*.so'); do - # This is ../../ because it's usually plugins/group/name.so - echo "Patching RPATH in ${so}..." - patchelf --set-rpath '$ORIGIN/../..' "$so" - $STRIP "$so" -done +# Fix up translations. +rm -fr "$OUTDIR/usr/bin/translations" +mv "$OUTDIR/usr/translations" "$OUTDIR/usr/bin" +cp -a "$BUILDDIR/bin/translations" "$OUTDIR/usr/bin" -for so in $(find "$OUTDIR/usr/lib" -maxdepth 1); do - if [ -f "$so" ]; then - echo "Patching RPATH in ${so}" - patchelf --set-rpath '$ORIGIN' "$so" - fi -done +# Generate AppStream meta-info. +echo "Generating AppStream metainfo..." +mkdir -p "$OUTDIR/usr/share/metainfo" +"$SCRIPTDIR/generate-metainfo.sh" "$OUTDIR/usr/share/metainfo/org.duckstation.duckstation.appdata.xml" -echo "Creating qt.conf..." -cat > "$OUTDIR/usr/bin/qt.conf" << EOF -[Paths] -Plugins = ../lib/plugins -EOF +echo "Generating AppImage..." +rm -f "$NAME.AppImage" +$APPIMAGETOOL -v "$OUTDIR" "$NAME.AppImage" -echo "Creating desktop..." -cat > "$OUTDIR/duckstation-qt.desktop" << EOF -[Desktop Entry] -Type=Application -Name=DuckStation -GenericName=PlayStation 1 Emulator -Comment=Fast PlayStation 1 emulator -Icon=duckstation-qt -TryExec=duckstation-qt -Exec=duckstation-qt %f -Categories=Game;Emulator;Qt; -EOF -cp "$ROOTDIR/data/resources/images/duck.png" "$OUTDIR/duckstation-qt.png" - -echo "Creating AppRun..." -cat > "$OUTDIR/AppRun" << EOF -#!/bin/sh - -APPDIR=\$(dirname "\$0") -exec "\$APPDIR/usr/bin/$BINARY" "\$@" -EOF -chmod +x "$OUTDIR/AppRun" - -echo "Generate AppImage" -./appimagetool-x86_64.AppImage -v "$OUTDIR" "$NAME.AppImage" diff --git a/scripts/flatpak/org.duckstation.duckstation.metainfo.xml.in b/scripts/org.duckstation.duckstation.metainfo.xml.in similarity index 100% rename from scripts/flatpak/org.duckstation.duckstation.metainfo.xml.in rename to scripts/org.duckstation.duckstation.metainfo.xml.in