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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 JYosCX{s)nr-TMFl literal 0 HcmV?d00001 diff --git a/scripts/flatpak/org.duckstation.duckstation.json b/scripts/flatpak/org.duckstation.duckstation.json index b95a29821..67067e395 100644 --- a/scripts/flatpak/org.duckstation.duckstation.json +++ b/scripts/flatpak/org.duckstation.duckstation.json @@ -47,8 +47,8 @@ ], "post-install": [ "cp -a \"${FLATPAK_BUILDER_BUILDDIR}/bin\" ${FLATPAK_DEST}", - "install -Dm644 data/resources/images/duck.png ${FLATPAK_DEST}/share/icons/hicolor/512x512/apps/org.duckstation.duckstation.png", - "install -Dm644 scripts/flatpak/duckstation-qt.desktop ${FLATPAK_DEST}/share/applications/org.duckstation.duckstation.desktop", + "install -Dm644 scripts/duckstation-qt.png ${FLATPAK_DEST}/share/icons/hicolor/512x512/apps/org.duckstation.duckstation.png", + "install -Dm644 scripts/duckstation-qt.desktop ${FLATPAK_DEST}/share/applications/org.duckstation.duckstation.desktop", "desktop-file-edit --set-key=Icon --set-value=org.duckstation.duckstation ${FLATPAK_DEST}/share/applications/org.duckstation.duckstation.desktop", "install -Dm644 scripts/flatpak/org.duckstation.duckstation.metainfo.xml ${FLATPAK_DEST}/share/metainfo/org.duckstation.duckstation.metainfo.xml" ] diff --git a/scripts/flatpak/generate-metainfo.sh b/scripts/generate-metainfo.sh similarity index 100% rename from scripts/flatpak/generate-metainfo.sh rename to scripts/generate-metainfo.sh diff --git a/scripts/make-appimage.sh b/scripts/make-appimage.sh index 7b9f6e996..ca029b480 100755 --- a/scripts/make-appimage.sh +++ b/scripts/make-appimage.sh @@ -25,278 +25,146 @@ # # For more information, please refer to +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