1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
name: release-binaries
on:
workflow_dispatch:
inputs:
publish_release:
description: Publish the binaries as a GitHub release
type: boolean
default: true
push:
branches:
- nx2
permissions:
contents: read
concurrency:
group: release-binaries-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: ${{ matrix.platform }} binary
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- platform: linux-x86_64
runner: ubuntu-24.04
- platform: windows-x86_64
runner: windows-2022
steps:
- name: Check out source
uses: actions/checkout@v4
- name: Install Linux dependencies
if: matrix.platform == 'linux-x86_64'
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev \
libpulse-dev libtool libudev-dev libxkbcommon-x11-0 \
mesa-common-dev nasm ninja-build qt6-base-private-dev \
qt6-charts-dev qt6-tools-dev libavfilter-dev libavcodec-dev \
libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev \
spirv-tools spirv-headers libusb-1.0-0-dev \
libboost-dev libboost-fiber-dev libboost-context-dev \
libopus-dev libasound2-dev
- name: Install Qt on Linux
if: matrix.platform == 'linux-x86_64'
uses: jurplel/install-qt-action@v4
with:
version: '6.8.3'
host: linux
target: desktop
arch: linux_gcc_64
modules: qtcharts
cache: true
- 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
- 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
- name: Cache CPM downloads
uses: actions/cache@v4
with:
path: .cache/cpm
key: cpm-${{ runner.os }}-${{ hashFiles('cpmfile.json', 'CMakeLists.txt', 'src/**/CMakeLists.txt') }}
restore-keys: |
cpm-${{ runner.os }}-
- name: Configure Linux
if: matrix.platform == 'linux-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
-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
- 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
- name: Build
shell: bash
run: cmake --build build/release --target yuzu yuzu-cmd --parallel
# 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: matrix.platform == 'linux-x86_64'
shell: bash
run: |
set -euo pipefail
test -x build/release/bin/eglantine
test -x build/release/bin/eden-cli
# Libraries Qt's xcb platform plugin needs, so linuxdeploy can resolve and bundle them.
sudo apt-get install -y --no-install-recommends libxcb-cursor0 libxcb-icccm4 libxcb-image0 \
libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 libxcb-xkb1
tools="$RUNNER_TEMP/linuxdeploy"
mkdir -p "$tools"
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"
cp dist/Eglantine.png "$icon"
export APPIMAGE_EXTRACT_AND_RUN=1
export QMAKE="$QT_ROOT_DIR/bin/qmake"
export LDAI_OUTPUT="eglantine-${GITHUB_SHA}-linux-x86_64.AppImage"
export OUTPUT="$LDAI_OUTPUT"
"$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 \
--icon-file "$icon" \
--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
# 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@v4
with:
name: eglantine-${{ matrix.platform }}-${{ github.sha }}
path: build/release/bin/
if-no-files-found: error
retention-days: 7
- name: Upload Linux binary
if: matrix.platform == 'linux-x86_64'
uses: actions/upload-artifact@v4
with:
name: eglantine-${{ matrix.platform }}-${{ github.sha }}
path: eglantine-${{ github.sha }}-${{ matrix.platform }}.AppImage
if-no-files-found: error
compression-level: 0
retention-days: 7
# Publishes both binaries as a GitHub pre-release once every platform built: on pushes to nx2,
# and on manual runs unless "Publish the binaries as a GitHub release" is unticked.
release:
name: Publish release
needs: build
if: github.event_name == 'push' || inputs.publish_release
runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- name: Download binaries
uses: actions/download-artifact@v4
with:
pattern: eglantine-*-${{ github.sha }}
path: artifacts
- name: Package release files
shell: bash
run: |
mkdir dist
(cd "artifacts/eglantine-windows-x86_64-${GITHUB_SHA}" &&
zip -qr "${GITHUB_WORKSPACE}/dist/eglantine-${GITHUB_SHA}-windows-x86_64.zip" .)
cp "artifacts/eglantine-linux-x86_64-${GITHUB_SHA}/eglantine-${GITHUB_SHA}-linux-x86_64.AppImage" dist/
- name: Create release
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
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 "Automatic build of ${GITHUB_REF_NAME} at ${GITHUB_SHA}.
Windows: extract the zip and run eglantine.exe, or eden-cli.exe from a terminal.
Linux: 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)."
|