diff options
Diffstat (limited to '.github/workflows/release-binaries.yml')
| -rw-r--r-- | .github/workflows/release-binaries.yml | 516 |
1 files changed, 49 insertions, 467 deletions
diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 9e5030c471..746e352c17 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -1,16 +1,17 @@ name: release-binaries +# Builds the Linux x86_64 PGO AppImage and publishes it as a GitHub pre-release. + on: workflow_dispatch: inputs: publish_release: - description: Publish the binaries as a GitHub release + description: Publish the AppImage as a GitHub release type: boolean default: true push: branches: - nx2 - - nx2-experimental # A binary only changes when build inputs change; docs-only pushes skip the build. paths: - "src/**" @@ -29,11 +30,12 @@ on: permissions: contents: read -# Clang major the Linux PGO build uses, from apt.llvm.org. Eden's profile is written by a current -# clang and an older reader refuses it, so this has to stay at or above whatever produced -# eden.profdata; bump it when a refreshed profile needs a newer LLVM. +# Clang major the PGO build uses, from apt.llvm.org. Eden's profile is written by a current clang +# and an older reader refuses it, so this has to stay at or above whatever produced eden.profdata; +# bump it when a refreshed profile needs a newer LLVM. env: - PGO_LLVM_VERSION: "23" + PGO_LLVM_VERSION: '23' + PLATFORM: linux-x86_64-pgo # A running build is never cancelled: it finishes and publishes. A push meanwhile queues one build; # a later push replaces it, so the newest commit builds as soon as the running one is done. @@ -43,45 +45,17 @@ concurrency: jobs: build: - name: ${{ matrix.platform }} binary - runs-on: ${{ matrix.runner }} + name: Linux x86_64 PGO AppImage + runs-on: ubuntu-24.04 env: CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_MAXSIZE: 3000M - SCCACHE_DIR: ${{ github.workspace }}/.sccache - SCCACHE_CACHE_SIZE: 3G - strategy: - fail-fast: false - matrix: - include: - - platform: linux-x86_64 - runner: ubuntu-24.04 - # The two -pgo builds are the same programs compiled by clang against Eden's periodically - # updated profile (https://github.com/Eden-CI/PGO). Windows uses MSYS2's MinGW clang like - # Eden does; MSVC cannot read an LLVM .profdata file. - - platform: linux-x86_64-pgo - runner: ubuntu-24.04 - pgo: true - - platform: windows-x86_64 - runner: windows-2022 - - platform: windows-x86_64-pgo - runner: windows-2022 - pgo: true - mingw: true - - platform: linux-aarch64 - runner: ubuntu-24.04-arm - - platform: linux-aarch64-pgo - runner: ubuntu-24.04-arm - pgo: true - - platform: macos-arm64 - runner: macos-15 steps: - name: Check out source uses: actions/checkout@v5 - - name: Install Linux dependencies - if: startsWith(matrix.platform, 'linux') + - name: Install dependencies shell: bash run: | sudo apt-get update @@ -97,45 +71,21 @@ jobs: libxcb-cursor0 libxcb-icccm4 libxcb-image0 \ libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 libxcb-xkb1 - # The packages docs/Deps.md lists for macOS, plus ccache. - - name: Install macOS dependencies - if: startsWith(matrix.platform, 'macos') - shell: bash - env: - HOMEBREW_NO_INSTALL_CLEANUP: 1 - run: | - brew install autoconf automake boost ffmpeg fmt glslang hidapi libtool libusb lz4 ninja \ - nlohmann-json openssl pkg-config qt@6 sdl3 speexdsp zlib zstd cmake catch2 molten-vk \ - vulkan-loader spirv-tools vulkan-utility-libraries ccache - - - name: Install Qt on Linux x86_64 - if: startsWith(matrix.platform, 'linux') && runner.arch != 'ARM64' + - name: Install Qt uses: jurplel/install-qt-action@v4 with: - version: "6.8.3" + version: '6.8.3' host: linux target: desktop arch: linux_gcc_64 modules: qtcharts cache: true - - name: Install Qt on Linux ARM64 - if: startsWith(matrix.platform, 'linux') && runner.arch == 'ARM64' - uses: jurplel/install-qt-action@v4 - with: - version: "6.8.3" - host: linux_arm64 - target: desktop - arch: linux_gcc_arm64 - modules: qtcharts - cache: true - # Ubuntu's own clang 18 cannot read a profile from a current LLVM, so take clang from the LLVM # apt repo. The versioned packages are named explicitly: that repo's unversioned clang/lld # metapackages can lag the binaries they depend on and then resolve to nothing. lld-23 only # ships ld.lld under /usr/lib/llvm-23/bin, so -B points the linker search there. - name: Install clang for PGO - if: startsWith(matrix.platform, 'linux') && matrix.pgo shell: bash run: | set -euo pipefail @@ -148,10 +98,8 @@ jobs: "clang-$PGO_LLVM_VERSION" "lld-$PGO_LLVM_VERSION" "clang-$PGO_LLVM_VERSION" --version - # Fetched into the source tree so both the Linux and MSYS2 configure steps can read it from a - # path their clang understands. + # Eden's periodically updated profile: https://github.com/Eden-CI/PGO - name: Download PGO profile - if: matrix.pgo shell: bash run: | set -euo pipefail @@ -159,62 +107,6 @@ jobs: https://github.com/Eden-CI/PGO/releases/latest/download/eden.profdata test -s eden.profdata - - name: Set up MSVC - if: matrix.platform == 'windows-x86_64' - uses: ilammy/msvc-dev-cmd@v1 - - - name: Install Qt on Windows - if: matrix.platform == 'windows-x86_64' - uses: jurplel/install-qt-action@v4 - with: - version: "6.8.3" - host: windows - target: desktop - arch: win64_msvc2022_64 - modules: qtcharts - cache: true - - # MSVC is not something ccache handles well, so that job uses sccache. The other jobs use - # ccache, which CMake enables through USE_CCACHE (externals/cmake-modules/UseCcache.cmake). - - name: Install sccache on Windows - if: matrix.platform == 'windows-x86_64' - shell: pwsh - run: | - $zip = Join-Path $env:RUNNER_TEMP 'sccache.zip' - Invoke-WebRequest -OutFile $zip https://github.com/mozilla/sccache/releases/download/v0.19.0/sccache-v0.19.0-x86_64-pc-windows-msvc.zip - Expand-Archive $zip -DestinationPath (Join-Path $env:RUNNER_TEMP 'sccache') - $bin = (Get-ChildItem -Recurse -Filter sccache.exe (Join-Path $env:RUNNER_TEMP 'sccache')).DirectoryName - $bin | Out-File -Append -Encoding utf8 $env:GITHUB_PATH - - - name: Install Vulkan SDK on Windows - if: matrix.platform == 'windows-x86_64' - shell: pwsh - run: ./tools/windows/install-vulkan-sdk.ps1 - - - name: Verify Vulkan tools on Windows - if: matrix.platform == 'windows-x86_64' - shell: pwsh - run: glslangValidator --version - - # Eden builds its Windows PGO binaries with MSYS2's clang toolchain, so we do the same. The - # package list is docs/Deps.md (MSYS2) plus what the bundled FFmpeg needs to compile. - - name: Set up MSYS2 - if: matrix.mingw - uses: msys2/setup-msys2@v2 - with: - msystem: UCRT64 - update: true - cache: true - install: >- - git make autoconf libtool automake-wrapper patch jq pactoys ninja - pacboy: >- - toolchain:p clang:p lld:p cmake:p python-pip:p - qt6-base:p qt6-charts:p qt6-tools:p qt6-translations:p qt6-svg:p - openssl:p boost:p fmt:p lz4:p nlohmann-json:p zlib:p zstd:p libiconv:p - vulkan-memory-allocator:p vulkan-devel:p glslang:p enet:p opus:p - libusb:p unordered_dense:p jbigkit:p xz:p libdeflate:p bzip2:p - lerc:p graphite2:p libwebp:p libtiff:p brotli:p ccache:p - - name: Cache CPM downloads uses: actions/cache@v5 with: @@ -224,99 +116,21 @@ jobs: cpm-${{ runner.os }}- # The sha in the key makes every run save a fresh cache (actions/cache never saves over an - # exact hit), and restore-keys seeds it from the newest one of the same platform. + # exact hit), and restore-keys seeds it from the newest one. - name: Cache compiler objects uses: actions/cache@v5 with: - path: | - .ccache - .sccache - key: objects-${{ matrix.platform }}-${{ github.sha }} + path: .ccache + key: objects-${{ env.PLATFORM }}-${{ github.sha }} restore-keys: | - objects-${{ matrix.platform }}- + objects-${{ env.PLATFORM }}- - - name: Configure Linux - if: startsWith(matrix.platform, 'linux') + # Same flags Eden's CI passes for its clang PGO build. + - name: Configure shell: bash run: | set -euo pipefail - flags=( - -DCMAKE_BUILD_TYPE=Release - -DBUILD_TESTING=OFF - -DYUZU_TESTS=OFF - -DYUZU_CMD=ON - -DYUZU_ROOM=OFF - -DYUZU_ROOM_STANDALONE=OFF - -DYUZU_USE_BUNDLED_QT=OFF - "-DCMAKE_PREFIX_PATH=$QT_ROOT_DIR" - -DYUZU_USE_BUNDLED_SDL3=ON - -DVulkanHeaders_FORCE_BUNDLED=ON - -DVulkanUtilityLibraries_FORCE_BUNDLED=ON - -DENABLE_UPDATE_CHECKER=OFF - -DUSE_DISCORD_PRESENCE=OFF - -DUSE_CCACHE=ON - ) - if [ '${{ matrix.pgo }}' = 'true' ]; then - # Same flags Eden's CI passes for its clang PGO build. - profile="-fprofile-use=$PWD/eden.profdata -Wno-backend-plugin \ - -Wno-profile-instr-unprofiled -Wno-profile-instr-out-of-date" - flags+=( - "-DCMAKE_C_COMPILER=clang-$PGO_LLVM_VERSION" - "-DCMAKE_CXX_COMPILER=clang++-$PGO_LLVM_VERSION" - "-DCMAKE_EXE_LINKER_FLAGS=-B/usr/lib/llvm-$PGO_LLVM_VERSION/bin -fuse-ld=lld" - "-DCMAKE_C_FLAGS=$profile" - "-DCMAKE_CXX_FLAGS=$profile" - ) - fi - cmake -S . -B build/release -G Ninja "${flags[@]}" - - - name: Configure Windows - if: matrix.platform == 'windows-x86_64' - shell: bash - run: >- - cmake -S . -B build/release -G Ninja - -DCMAKE_BUILD_TYPE=Release - -DBUILD_TESTING=OFF - -DYUZU_TESTS=OFF - -DYUZU_CMD=ON - -DYUZU_ROOM=OFF - -DYUZU_ROOM_STANDALONE=OFF - -DYUZU_USE_BUNDLED_QT=OFF - -DYUZU_USE_BUNDLED_SDL3=ON - -DENABLE_UPDATE_CHECKER=OFF - -DUSE_DISCORD_PRESENCE=OFF - -DCMAKE_C_COMPILER_LAUNCHER=sccache - -DCMAKE_CXX_COMPILER_LAUNCHER=sccache - - - name: Configure macOS - if: startsWith(matrix.platform, 'macos') - shell: bash - run: | - set -euo pipefail - cmake -S . -B build/release -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTING=OFF \ - -DYUZU_TESTS=OFF \ - -DYUZU_CMD=ON \ - -DYUZU_ROOM=OFF \ - -DYUZU_ROOM_STANDALONE=OFF \ - -DYUZU_USE_BUNDLED_QT=OFF \ - "-DCMAKE_PREFIX_PATH=$(brew --prefix qt@6);$(brew --prefix zlib)" \ - "-DOPENSSL_ROOT_DIR=$(brew --prefix openssl@3)" \ - -DVulkanHeaders_FORCE_BUNDLED=ON \ - -DVulkanUtilityLibraries_FORCE_BUNDLED=ON \ - -DENABLE_UPDATE_CHECKER=OFF \ - -DUSE_DISCORD_PRESENCE=OFF \ - -DUSE_CCACHE=ON - - # MinGW build: system Qt and libraries from MSYS2, clang plus Eden's PGO profile. The profile - # path is converted to its Windows form because clang runs with the MSYS mount underneath. - - name: Configure MinGW PGO - if: matrix.mingw - shell: msys2 {0} - run: | - set -euo pipefail - profile="-fprofile-use=$(cygpath -m "$PWD/eden.profdata") -Wno-backend-plugin \ + profile="-fprofile-use=$PWD/eden.profdata -Wno-backend-plugin \ -Wno-profile-instr-unprofiled -Wno-profile-instr-out-of-date" cmake -S . -B build/release -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ @@ -326,65 +140,41 @@ jobs: -DYUZU_ROOM=OFF \ -DYUZU_ROOM_STANDALONE=OFF \ -DYUZU_USE_BUNDLED_QT=OFF \ + "-DCMAKE_PREFIX_PATH=$QT_ROOT_DIR" \ -DYUZU_USE_BUNDLED_SDL3=ON \ - -DYUZU_USE_BUNDLED_FFMPEG=ON \ -DVulkanHeaders_FORCE_BUNDLED=ON \ -DVulkanUtilityLibraries_FORCE_BUNDLED=ON \ -DENABLE_UPDATE_CHECKER=OFF \ -DUSE_DISCORD_PRESENCE=OFF \ -DUSE_CCACHE=ON \ - -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ - -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld \ + "-DCMAKE_C_COMPILER=clang-$PGO_LLVM_VERSION" \ + "-DCMAKE_CXX_COMPILER=clang++-$PGO_LLVM_VERSION" \ + "-DCMAKE_EXE_LINKER_FLAGS=-B/usr/lib/llvm-$PGO_LLVM_VERSION/bin -fuse-ld=lld" \ "-DCMAKE_C_FLAGS=$profile" \ "-DCMAKE_CXX_FLAGS=$profile" - name: Build - if: ${{ ! matrix.mingw }} shell: bash run: | cmake --build build/release --target yuzu yuzu-cmd --parallel - if command -v ccache > /dev/null; then ccache --show-stats; else sccache --show-stats; fi - - - name: Build MinGW PGO - if: matrix.mingw - shell: msys2 {0} - run: | - cmake --build build/release --target yuzu yuzu-cmd --parallel ccache --show-stats - # Plain tar.gz with the two programs. GitHub artifacts drop the executable bit, so a tar is - # what keeps it. This one is not self-contained: it needs Qt 6 and the usual libraries - # installed on the system. - - name: Package Linux tar.gz - if: startsWith(matrix.platform, 'linux') - shell: bash - run: | - set -euo pipefail - test -x build/release/bin/eglantine - test -x build/release/bin/eden-cli - strip build/release/bin/eglantine build/release/bin/eden-cli - tar -czf "eglantine-${GITHUB_SHA}-${{ matrix.platform }}.tar.gz" \ - -C build/release/bin eglantine eden-cli - ls -la "eglantine-${GITHUB_SHA}-${{ matrix.platform }}.tar.gz" - # A self-contained AppImage: linuxdeploy bundles every library the two programs need except # the base system ones (glibc, X11/Wayland client libraries, the GPU driver and Vulkan loader), # and its Qt plugin adds the Qt libraries and platform plugins. Runs on glibc 2.39+ systems. - - name: Package Linux AppImage - if: startsWith(matrix.platform, 'linux') + - name: Package AppImage shell: bash run: | set -euo pipefail test -x build/release/bin/eglantine test -x build/release/bin/eden-cli + strip build/release/bin/eglantine build/release/bin/eden-cli tools="$RUNNER_TEMP/linuxdeploy" mkdir -p "$tools" - arch=$(uname -m) # aarch64 or x86_64 - curl -fsSL -o "$tools/linuxdeploy-$arch.AppImage" \ - https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$arch.AppImage - curl -fsSL -o "$tools/linuxdeploy-plugin-qt-$arch.AppImage" \ - https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-$arch.AppImage + curl -fsSL -o "$tools/linuxdeploy-x86_64.AppImage" \ + https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + curl -fsSL -o "$tools/linuxdeploy-plugin-qt-x86_64.AppImage" \ + https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage chmod +x "$tools"/*.AppImage # The desktop file names its icon dev.eglantine.eglantine. icon="$RUNNER_TEMP/dev.eglantine.eglantine.png" @@ -396,10 +186,10 @@ jobs: export EXTRA_PLATFORM_PLUGINS='libqwayland-egl.so;libqwayland-generic.so' # Embedded in the AppImage metadata; matches the release tag (build-N) plus the commit. export LDAI_VERSION="build-${GITHUB_RUN_NUMBER}-${GITHUB_SHA::7}" - export LDAI_OUTPUT="eglantine-${GITHUB_SHA}-${{ matrix.platform }}.AppImage" + export LDAI_OUTPUT="eglantine-${GITHUB_SHA}-${PLATFORM}.AppImage" export OUTPUT="$LDAI_OUTPUT" - export ARCH="$arch" - "$tools/linuxdeploy-$arch.AppImage" --appdir AppDir \ + export ARCH=x86_64 + "$tools/linuxdeploy-x86_64.AppImage" --appdir AppDir \ --executable build/release/bin/eglantine \ --executable build/release/bin/eden-cli \ --desktop-file dist/dev.eden_emu.eden.desktop \ @@ -407,163 +197,21 @@ jobs: --plugin qt \ --output appimage test -s "$LDAI_OUTPUT" - ls -la "$LDAI_OUTPUT" - - - name: Package Windows binary - if: matrix.platform == 'windows-x86_64' - shell: pwsh - run: | - foreach ($exe in 'eglantine.exe', 'eden-cli.exe') { - if (-not (Test-Path "build/release/bin/$exe")) { - throw "build/release/bin/$exe was not produced" - } - } - windeployqt --release --no-translations build/release/bin/eglantine.exe - - # A dynamic MinGW build is not portable on its own: windeployqt6 brings the Qt libraries and - # plugins, then every non-system DLL the binaries and those plugins pull in gets copied next to - # them (docs/Caveats.md#msys2). - - name: Package MinGW binary - if: matrix.mingw - shell: msys2 {0} - run: | - set -euo pipefail - export PATH="/ucrt64/bin:$PATH" - cd build/release/bin - test -f eglantine.exe - test -f eden-cli.exe - windeployqt6 --no-translations --no-compiler-runtime --no-opengl-sw \ - --no-system-dxc-compiler --no-system-d3d-compiler eglantine.exe - deps() { - objdump -p "$1" | awk '/DLL Name:/ {print $3}' | while read -r dll; do - [ -z "$dll" ] && continue - source=$(command -v "$dll" 2>/dev/null || true) - [ -z "$source" ] && continue - # The system DLLs ship with Windows, so they never need bundling. - case "$source" in - *System32* | *SysWOW64*) continue ;; - esac - if [ ! -f "$dll" ]; then - cp "$source" "$dll" - deps "$source" - fi - done - } - for exe in eglantine.exe eden-cli.exe; do - deps "$exe" - done - find . -name '*.dll' | while read -r dll; do - deps "$dll" - done + sha256sum "$LDAI_OUTPUT" | tee "$LDAI_OUTPUT.sha256" - # A self-contained app bundle: macdeployqt copies Qt and every other Homebrew library both - # programs load into the bundle, then the leftover Homebrew search paths are removed so a - # machine with Homebrew still uses the bundled copies. Ad-hoc signed, not notarized. - - name: Package macOS app - if: startsWith(matrix.platform, 'macos') - shell: bash - run: | - set -euo pipefail - app=build/release/bin/eglantine.app - test -x "$app/Contents/MacOS/eglantine" - test -x build/release/bin/eden-cli - cp build/release/bin/eden-cli "$app/Contents/MacOS/eden-cli" - "$(brew --prefix qt@6)/bin/macdeployqt" "$app" \ - -executable="$app/Contents/MacOS/eden-cli" -libpath="$(brew --prefix)/lib" \ - -always-overwrite -verbose=1 - # Qt's virtual keyboard input plugin pulls in the QML stack, which the emulator doesn't use. - rm -f "$app/Contents/PlugIns/platforminputcontexts/libqtvirtualkeyboardplugin.dylib" - binaries=$(find "$app/Contents" -type f \( -perm -u+x -o -name '*.dylib' \) \ - -exec sh -c 'file -b "$1" | grep -q Mach-O' _ {} \; -print) - for binary in $binaries; do - otool -l "$binary" | awk '/cmd LC_RPATH/ {getline; getline; print $2}' | - { grep -E '^/(opt/homebrew|usr/local)/' || true; } | while read -r rpath; do - install_name_tool -delete_rpath "$rpath" "$binary" 2> /dev/null - done - done - # Libraries that load their dependencies through @rpath find them in the bundle. - for program in eglantine eden-cli; do - install_name_tool -add_rpath @executable_path/../Frameworks \ - "$app/Contents/MacOS/$program" 2> /dev/null - done - leaks=$(for binary in $binaries; do - otool -L "$binary" | grep -E '^\s+/(opt/homebrew|usr/local)/' - otool -l "$binary" | awk '/cmd LC_RPATH/ {getline; getline; print $2}' | - grep -E '^/(opt/homebrew|usr/local)/' - done || true) - if [ -n "$leaks" ]; then - echo "References still pointing outside the bundle:" - echo "$leaks" | sort -u - exit 1 - fi - # macdeployqt invalidates the signatures. The programs get the entitlements when the - # tree has them (the Hypervisor CPU backend needs com.apple.security.hypervisor). - codesign --force --deep --sign - "$app" - if [ -f dist/eglantine.entitlements ]; then - codesign --force --sign - --entitlements dist/eglantine.entitlements \ - "$app/Contents/MacOS/eden-cli" - codesign --force --sign - --entitlements dist/eglantine.entitlements "$app" - fi - codesign --verify --deep --strict "$app" - ditto -c -k --keepParent "$app" "eglantine-${GITHUB_SHA}-${{ matrix.platform }}.zip" - ls -la "eglantine-${GITHUB_SHA}-${{ matrix.platform }}.zip" - # Also ship a .dmg (drag eglantine.app onto Applications). - dmgdir=$(mktemp -d) - ditto "$app" "$dmgdir/eglantine.app" - ln -s /Applications "$dmgdir/Applications" - hdiutil create -volname "Eglantine" -srcfolder "$dmgdir" -ov -format UDZO \ - "eglantine-${GITHUB_SHA}-${{ matrix.platform }}.dmg" - ls -la "eglantine-${GITHUB_SHA}-${{ matrix.platform }}.dmg" - - # The artifact is the bin folder itself: GitHub zips artifacts on download, and uploading a - # zip gave a zip inside a zip. The release job zips it once for the release. - - name: Upload Windows binary - if: matrix.platform == 'windows-x86_64' - uses: actions/upload-artifact@v7 - with: - name: eglantine-${{ matrix.platform }}-${{ github.sha }} - path: build/release/bin/ - if-no-files-found: error - retention-days: 7 - - - name: Upload MinGW binary - if: matrix.mingw + - name: Upload AppImage uses: actions/upload-artifact@v7 with: - name: eglantine-${{ matrix.platform }}-${{ github.sha }} - path: build/release/bin/ - if-no-files-found: error - retention-days: 7 - - # Both Linux files go in one artifact: the tar.gz and the AppImage. - - name: Upload Linux binary - if: startsWith(matrix.platform, 'linux') - uses: actions/upload-artifact@v7 - with: - name: eglantine-${{ matrix.platform }}-${{ github.sha }} + name: eglantine-${{ env.PLATFORM }}-${{ github.sha }} path: | - eglantine-${{ github.sha }}-${{ matrix.platform }}.tar.gz - eglantine-${{ github.sha }}-${{ matrix.platform }}.AppImage + eglantine-${{ github.sha }}-${{ env.PLATFORM }}.AppImage + eglantine-${{ github.sha }}-${{ env.PLATFORM }}.AppImage.sha256 if-no-files-found: error compression-level: 0 retention-days: 7 - # Zipped with ditto beforehand: the bundle's framework symlinks don't survive artifact zipping. - - name: Upload macOS app - if: startsWith(matrix.platform, 'macos') - uses: actions/upload-artifact@v7 - with: - name: eglantine-${{ matrix.platform }}-${{ github.sha }} - path: | - eglantine-${{ github.sha }}-${{ matrix.platform }}.zip - eglantine-${{ github.sha }}-${{ matrix.platform }}.dmg - if-no-files-found: error - compression-level: 0 - retention-days: 7 - - # Publishes every binary as a GitHub pre-release once every platform built: on pushes to nx2 - # and nx2-experimental, and on manual runs unless "Publish the binaries as a GitHub release" is - # unticked. + # Publishes the AppImage as a GitHub pre-release: on pushes to nx2, and on manual runs unless + # "Publish the AppImage as a GitHub release" is unticked. release: name: Publish release needs: build @@ -572,36 +220,11 @@ jobs: permissions: contents: write steps: - - name: Download binaries + - name: Download AppImage uses: actions/download-artifact@v7 with: - pattern: eglantine-*-${{ github.sha }} - path: artifacts - - - name: Package release files - shell: bash - run: | - set -euo pipefail - mkdir dist - # Asset names drop the commit sha: the release tag already identifies the build, and - # stable names let the notes table link to them. - strip_sha() { sed "s/-${GITHUB_SHA}//" <<< "$1"; } - for artifact in artifacts/*/; do - name=$(basename "$artifact") - if compgen -G "$artifact*.AppImage" > /dev/null; then - # Linux: ship the AppImage and the tar.gz as they are. - for file in "$artifact"*.AppImage "$artifact"*.tar.gz; do - cp "$file" "dist/$(strip_sha "$(basename "$file")")" - done - elif compgen -G "$artifact*.zip" > /dev/null; then - for file in "$artifact"*.zip "$artifact"*.dmg; do - [[ -e "$file" ]] && cp "$file" "dist/$(strip_sha "$(basename "$file")")" - done - else - (cd "$artifact" && zip -qr "${GITHUB_WORKSPACE}/dist/$(strip_sha "$name").zip" .) - fi - done - ls -la dist + name: eglantine-${{ env.PLATFORM }}-${{ github.sha }} + path: dist - name: Create release shell: bash @@ -609,54 +232,13 @@ jobs: GH_TOKEN: ${{ github.token }} run: | set -euo pipefail - tag="build-${GITHUB_RUN_NUMBER}" - base="https://github.com/${GITHUB_REPOSITORY}/releases/download/${tag}" - - cat > notes.md <<EOF - Automatic build of \`${GITHUB_REF_NAME}\` at ${GITHUB_SHA}. - - ## Linux - - Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed). - - | Build Type | Standard | PGO (Recommended) | Notes | - | --- | --- | --- | --- | - | amd64 | [AppImage](${base}/eglantine-linux-x86_64.AppImage) · [tar.gz](${base}/eglantine-linux-x86_64.tar.gz) | [AppImage](${base}/eglantine-linux-x86_64-pgo.AppImage) · [tar.gz](${base}/eglantine-linux-x86_64-pgo.tar.gz) | Make the AppImage executable (\`chmod +x\`) and run it | - | ARM (aarch64) | [AppImage](${base}/eglantine-linux-aarch64.AppImage) · [tar.gz](${base}/eglantine-linux-aarch64.tar.gz) | [AppImage](${base}/eglantine-linux-aarch64-pgo.AppImage) · [tar.gz](${base}/eglantine-linux-aarch64-pgo.tar.gz) | | - - ## Windows - - Windows packages are in-place zip files: extract and run \`eglantine.exe\`, or \`eden-cli.exe\` from a terminal. - - | Build Type | Standard | PGO (Recommended) | Notes | - | --- | --- | --- | --- | - | amd64 / x86_64 (MSVC) | [MSVC zip](${base}/eglantine-windows-x86_64.zip) | | Use if you run into graphical issues on other builds | - | amd64 / x86_64 (MinGW) | | [PGO zip](${base}/eglantine-windows-x86_64-pgo.zip) | Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed | - - ## macOS - - | Build Type | Standard | PGO (Recommended) | Notes | - | --- | --- | --- | --- | - | arm64 (Apple Silicon) | [zip](${base}/eglantine-macos-arm64.zip) | | macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run \`xattr -dr com.apple.quarantine eglantine.app\`. \`eden-cli\` is inside the app, in \`Contents/MacOS\` | - - The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eden's profile); prefer them when your CPU supports it. - EOF - - gh release create "${tag}" dist/* \ + ls -la dist + gh release create "build-${GITHUB_RUN_NUMBER}" dist/* \ --repo "${GITHUB_REPOSITORY}" \ --target "${GITHUB_SHA}" \ --prerelease \ --title "Eglantine ${GITHUB_REF_NAME} build ${GITHUB_RUN_NUMBER} (${GITHUB_SHA::7})" \ - --notes-file notes.md + --notes "Automatic Linux x86_64 PGO build of ${GITHUB_REF_NAME} at ${GITHUB_SHA}. - - name: Ping Discord - shell: bash - env: - WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL }} - run: | - URL="https://github.com/${GITHUB_REPOSITORY}/releases/tag/build-${GITHUB_RUN_NUMBER}" - MSG=$(printf '## <@&1566184315178713190> Eglantine %s build %s (%s)\n%s' \ - "$GITHUB_REF_NAME" "$GITHUB_RUN_NUMBER" "${GITHUB_SHA::7}" "$URL") - jq -n --arg content "$MSG" \ - '{content: $content, allowed_mentions: {roles: ["1566184315178713190"]}}' \ - | curl -fsS -H "Content-Type: application/json" -d @- "$WEBHOOK" + Make the AppImage executable (chmod +x) and run it. It bundles its libraries and needs glibc 2.39 or newer (Ubuntu 24.04, Fedora 40, Debian 13, Arch). + It is compiled with profile-guided optimization (clang plus Eden's profile). The .sha256 file holds its checksum." |
