cordial
LOW
maintainer taxin
0 votes
scanned 2026-09-13 03:13:35.623360
Why flagged
Uploaded within the last 14 days with 2 or fewer community votes — little peer review so far.
Triggered rules
Low
Few votes, recently uploaded
zero_votes_recent
Uploaded within the last 14 days with 2 or fewer community votes — little peer review so far.
PKGBUILD
1
# Maintainer: luohoa97 <luohoa97@users.noreply.github.com>
2
#
3
# Cordial vendors no Roblox code. The engine is Roblox's official Android
4
# x86-64 build; Cordial fetches it on first run from a third-party mirror and
5
# installs it only if Roblox's own signing certificate signed it, or reads a
6
# copy Sober unpacked, or one the user points it at. It has been able to fetch
7
# since v0.9.0, and this comment said it could not until 2026-08-28. The
8
# .install note was corrected then.
9
#
10
# **The pkgdesc was not, and the sentence that used to be here claimed it had
11
# been.** It went on saying "none is shipped or downloadable" for two more days,
12
# and `git log -S` puts that string's entire life between 08847fb and 7eb1091
13
# with nothing in between -- so the claim of a fix was written in the same
14
# breath as the fix was skipped, and then protected it from being noticed. That
15
# string is what the AUR and Chaotic-AUR display as the package description, so
16
# it was on course to be the first sentence about Cordial an Arch user read.
17
# A comment asserting a correction is not a correction. See README section 1.
18
#
19
# The release counterpart to packaging/aur/cordial-git/PKGBUILD, which builds
20
# whatever commit is at the tip of main. This one tracks tagged releases
21
# instead, which is what the pkgname (no -git suffix) means on the AUR --
22
# see packaging/aur/PUBLISHING.md for the account-and-key steps neither
23
# package has been through yet. Everything that is not about which commit
24
# gets built is identical between the two on purpose: they should drift only
25
# where the reason to is "release" vs "git", never by accident.
26
#
27
# Doubles as a release artifact: .github/workflows/release.yml runs `makepkg`
28
# against this file, unmodified, on every tagged build and attaches the
29
# resulting .pkg.tar.zst to the GitHub release. That is deliberate --
30
# building it exactly the way an AUR user's own machine would is the best
31
# test this file gets, and a CI failure here is a real failure of the
32
# submittable package, not a simulation of one.
33
34
pkgname=cordial
35
pkgver=0.13.2
36
pkgrel=1
37
pkgdesc="Roblox's official Android build, run natively on Linux -- Cordial ships no Roblox code and fetches a signature-verified one"
38
arch=('x86_64')
39
url="https://github.com/luohoa97/cordial"
40
license=('GPL-3.0-or-later')
41
depends=(
42
# Linked, via the -sys crates' pkg-config probes.
43
'gtk4'
44
'libadwaita'
45
# The in-experience web window. Built in below with the same feature pair the
46
# Flatpak manifest uses; without both crates' `webview` the binary links no
47
# WebKit at all and account settings silently do nothing.
48
'webkitgtk-6.0'
49
'zlib'
50
# Named because namcap named them, for cordial-git: these are the libraries
51
# the two binaries actually record in DT_NEEDED, and every one of them is
52
# reachable today only through gtk4 or webkitgtk-6.0. Listing them means a
53
# transitive dependency dropped upstream turns into a resolvable version
54
# bump rather than a package that installs and then cannot start.
55
'glib2'
56
'pango'
57
'graphene'
58
'libsoup3'
59
# `libgcc` and `libstdc++` rather than `gcc-libs`: Arch has split that package
60
# and /usr/lib/libstdc++.so.6 is owned by `libstdc++` on a current install.
61
# `gcc-libs` still resolves, so this is right rather than merely working.
62
'libgcc'
63
'libstdc++'
64
'glibc'
65
# dlopen'd at run time rather than linked, so namcap will not see them and
66
# dropping one produces a missing feature rather than a link error. That is
67
# exactly why they are listed by hand: `libvulkan.so.1` in the presenter,
68
# `libwayland-client.so.0`/`libwayland-egl.so.1` in the hand-rolled Wayland
69
# code, `libxkbcommon.so.0` in the keyboard path, `libEGL`/`libGLESv2` for
70
# the engine's GLES2 renderer.
71
'vulkan-icd-loader'
72
'wayland'
73
'libxkbcommon'
74
'libglvnd'
75
# `native/pipewire_backend.cpp` dlopens libpipewire-0.3.so.0. Without it
76
# there is no sound and nothing says so.
77
'pipewire'
78
'hicolor-icon-theme'
79
# Plugins are Deno programs (ADR-008) and Cordial bundles no runtime -- it
80
# execs `deno` off PATH. Without it every plugin fails to spawn: the system
81
# installs, lists in Settings, grants permissions and cannot run a line,
82
# which is what an Arch user reported on 2026-09-02.
83
#
84
# A hard dependency because a plugin that cannot start is not a degraded
85
# feature, and three first-party plugins ship enabled. **Arch is the only
86
# format where this line is possible**: `deno` is in `extra` here, and
87
# `dnf5 list deno` on Fedora 44 returns nothing, so the rpm and the deb
88
# cannot name a package that exists and say so in their own comments.
89
'deno'
90
)
91
makedepends=(
92
'git'
93
'cargo'
94
'cmake'
95
# Not a preference. AOSP bionic uses C11 _Atomic inside C++ headers, which
96
# GCC rejects with 144 errors; native/CMakeLists.txt refuses a non-Clang
97
# compiler outright rather than letting it fail deep in a *-sys build script
98
# naming neither the tool nor the cause.
99
'clang'
100
'pkgconf'
101
# Headers only, for the three audio backends. Both libraries are dlopen'd and
102
# neither is linked, so these add nothing to `depends` -- but leaving either
103
# out silently compiles the "unavailable" arm of that backend instead of
104
# failing the build, which is a loss of audio nobody would attribute to
105
# packaging. ADR-023 has the reasoning.
106
'libpipewire'
107
'libpulse'
108
'alsa-lib'
109
)
110
optdepends=(
111
# `bwrap` is genuinely optional: sandbox.rs only ever *subtracts* from what
112
# Cordial already holds, so without it a plugin still runs with zero Deno
113
# permissions and the broker still mediates every effect. Recommended, not
114
# required.
115
'bubblewrap: kernel sandbox under the plugin runtime'
116
# ADR-011 makes Wayland the backend Cordial targets. The X11 path still
117
# starts and window.rs dlopens these for it; CORDIAL_MONITOR needs Xinerama.
118
'libx11: X11 session fallback'
119
'libxinerama: CORDIAL_MONITOR monitor selection under X11'
120
# Roblox's own Android build, unpacked by Sober, is the copy Cordial looks
121
# for first. It is a suggestion and not a dependency because a user-supplied
122
# APK works just as well and neither one comes from this package.
123
'sober: a Roblox build for Cordial to run (Cordial ships none)'
124
)
125
conflicts=('cordial-git')
126
install="$pkgname.install"
127
options=('!lto')
128
source=(
129
# #tag=v$pkgver, not a bare clone: this is what makes the package a release
130
# rather than a second copy of cordial-git. The maintainer bumps $pkgver by
131
# hand at each release, the same hand-maintenance PUBLISHING.md already
132
# documents for .SRCINFO, and for the same stated reason -- there is no
133
# `makepkg`/`namcap` on the machine Cordial is developed on, so this is kept
134
# in step deliberately rather than generated.
135
#
136
# CORDIAL_PKGBUILD_TAG overrides the tag without editing this file, and
137
# exists for exactly one caller: .github/workflows/release.yml sets it to
138
# the tag actually being released, so the CI-built package is always
139
# correct even on the day of a release, before anyone has gotten round to
140
# bumping $pkgver here by hand. Unset -- the ordinary case, on an AUR
141
# user's own machine -- it falls back to v$pkgver, which is what a plain
142
# `makepkg` or `makepkg -si` against this committed file builds.
143
"$pkgname::git+https://github.com/luohoa97/cordial.git#tag=${CORDIAL_PKGBUILD_TAG:-v$pkgver}"
144
# The two submodules, and mcpelauncher-linker's own two, declared here
145
# rather than fetched by `git submodule update --init --recursive` in
146
# prepare(). A release tag's tarball from GitHub's own archive endpoint
147
# would not carry them at all -- codeload does not descend into
148
# submodules -- which is why this is a git source with pinned submodules
149
# rather than the `archive/refs/tags/...tar.gz` shortcut an AUR package
150
# without any submodules would use instead.
151
"mcpelauncher-linker::git+https://github.com/minecraft-linux/mcpelauncher-linker.git"
152
"android_bionic::git+https://github.com/minecraft-linux/android_bionic.git"
153
"android_core::git+https://github.com/minecraft-linux/android_core.git"
154
"libjnivm::git+https://github.com/ChristopherHX/libjnivm.git"
155
)
156
sha256sums=('SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP')
157
158
prepare() {
159
cd "$srcdir/$pkgname"
160
161
# Point each submodule at the clone makepkg already made, so nothing in
162
# prepare() or build() touches the network. `protocol.file.allow=always` is
163
# required from git 2.38 on: the fix for CVE-2022-39253 blocks the `file`
164
# transport for submodules, and without it `submodule update` refuses a local
165
# path with "transport 'file' not allowed" -- which reads like a bad URL.
166
git submodule init
167
git config submodule."third_party/mcpelauncher-linker".url "$srcdir/mcpelauncher-linker"
168
git config submodule."third_party/libjnivm".url "$srcdir/libjnivm"
169
git -c protocol.file.allow=always submodule update
170
171
cd third_party/mcpelauncher-linker
172
git submodule init
173
git config submodule.bionic.url "$srcdir/android_bionic"
174
git config submodule.core.url "$srcdir/android_core"
175
git -c protocol.file.allow=always submodule update
176
177
cd "$srcdir/$pkgname"
178
export RUSTUP_TOOLCHAIN=stable
179
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
180
}
181
182
pkgver() {
183
cd "$srcdir/$pkgname"
184
# `git describe --tags` and nothing else, because the window title is
185
# `git describe --tags --always --dirty` stamped by
186
# crates/cordial-shell/build.rs -- so a package whose version came from
187
# anywhere else would disagree with the string the running client prints.
188
# At an exact release tag, which is what the pinned source above checks
189
# out, this reduces to the tag itself and reproduces $pkgver above; it is
190
# written the same way as cordial-git's rather than as a bare literal so
191
# the two stay comparable and so a source pinned to the wrong ref (a
192
# branch, a moved tag) is visible as a version that does not match rather
193
# than silently accepted.
194
git describe --long --tags --abbrev=7 | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g'
195
}
196
197
build() {
198
cd "$srcdir/$pkgname"
199
export RUSTUP_TOOLCHAIN=stable
200
export CARGO_TARGET_DIR=target
201
# See makedepends. cmake-rs passes these through to the native subtree.
202
export CC=clang CXX=clang++
203
# Both crates' `webview` features, and that is not optional: the shell holds
204
# the WebKit window and cordial-runtime holds the presenter that calls it, so
205
# one without the other leaves the caller cfg'd out and the feature silently
206
# absent. The Flatpak shipped that way once and it was reported as "webview
207
# doesnt work in cordial flatpak".
208
cargo build --frozen --release \
209
--features cordial-shell/webview,cordial-runtime/webview
210
}
211
212
check() {
213
cd "$srcdir/$pkgname"
214
export RUSTUP_TOOLCHAIN=stable
215
export CARGO_TARGET_DIR=target
216
export CC=clang CXX=clang++
217
# The same --features as build(), the same three skips, for the same
218
# reasons packaging/aur/cordial-git/PKGBUILD's check() already documents at
219
# length: two talk to whatever org.freedesktop.secrets is on the session
220
# bus and are flaky under load rather than broken, the third is a tripwire
221
# on gvfs rather than GLib and needs a session bus a clean build has none
222
# of. Kept identical between the two packages on purpose -- see this
223
# file's header.
224
cargo test --frozen --release --workspace \
225
--features cordial-shell/webview,cordial-runtime/webview -- \
226
--skip secrets::tests::a_session_survives_the_round_trip_through_the_service \
227
--skip secrets::tests::a_plaintext_store_is_adopted_and_destroyed \
228
--skip deep_link::tests::gio_reshapes_a_roblox_link_and_is_therefore_not_where_the_string_comes_from
229
}
230
231
package() {
232
cd "$srcdir/$pkgname"
233
234
# A tripwire, because this has already shipped wrong once in the Flatpak and
235
# the symptom is silence: with the `webview` feature missing from either
236
# crate the linker collects `webview::open`, the binary links no WebKit, and
237
# account settings simply do nothing. Cheaper to fail the package here than
238
# to have a user report it.
239
readelf -d target/release/cordial-run | grep -qi webkit || {
240
echo "cordial-run linked no WebKitGTK; the webview features did not take" >&2
241
return 1
242
}
243
244
# Both binaries, side by side. launch.rs looks for the loader as the sibling
245
# of current_exe and nowhere else -- there is no baked-in path and nothing to
246
# configure -- so a shell installed without cordial-run beside it is a
247
# launcher whose Launch button cannot find anything to launch.
248
install -Dm755 target/release/cordial-shell "$pkgdir/usr/bin/cordial-shell"
249
# **`cordial` is the command; `cordial-shell` is the file.** Asked for on
250
# 2026-08-28: nobody wants to type the second word, and every other launcher
251
# on a desktop answers to its own name. A symlink rather than a rename so
252
# anything already invoking `cordial-shell` keeps working, and `cordial-run`
253
# deliberately gets no alias -- it is the loader the shell launches and is not
254
# what anyone should run by hand.
255
ln -sf cordial-shell "$pkgdir/usr/bin/cordial"
256
# First-party plugins, read-only beside the binary.
257
# Until the native packages existed nothing installed these anywhere, so the settings window listed no built-in plugins for anybody -- including Flatpak users, whose /app/share/cordial/plugins the code has looked in from the start and which has never existed.
258
for plugin in plugins/*/; do
259
id=$(basename "$plugin")
260
[ -f "$plugin/plugin.json" ] || continue
261
install -Dm644 "$plugin/plugin.json" "$pkgdir/usr/share/cordial/plugins/$id/plugin.json"
262
install -Dm644 "$plugin/main.ts" "$pkgdir/usr/share/cordial/plugins/$id/main.ts"
263
done
264
265
install -Dm755 target/release/cordial-run "$pkgdir/usr/bin/cordial-run"
266
267
# The square icons under packaging/icons/hicolor/. Both of them: Frostbite is
268
# the twice-a-year name in crates/cordial-shell/src/branding.rs, and a
269
# missing one is a blank icon in the task switcher on the one day nobody is
270
# watching for it. A test in that file asserts both exist and are square.
271
local _icons="usr/share/icons/hicolor/scalable/apps"
272
install -Dm644 "packaging/icons/hicolor/scalable/apps/io.github.luohoa97.Cordial.svg" \
273
"$pkgdir/$_icons/io.github.luohoa97.Cordial.svg"
274
install -Dm644 "packaging/icons/hicolor/scalable/apps/io.github.luohoa97.Cordial.Frostbite.svg" \
275
"$pkgdir/$_icons/io.github.luohoa97.Cordial.Frostbite.svg"
276
277
# Exec=cordial-shell %u, and the %u is not decorative: the entry registers
278
# x-scheme-handler/roblox-player, which is how a Play button on the website
279
# reaches a client at all.
280
install -Dm644 "packaging/io.github.luohoa97.Cordial.desktop" \
281
"$pkgdir/usr/share/applications/io.github.luohoa97.Cordial.desktop"
282
install -Dm644 "packaging/io.github.luohoa97.Cordial.metainfo.xml" \
283
"$pkgdir/usr/share/metainfo/io.github.luohoa97.Cordial.metainfo.xml"
284
285
# MIT requires its notice in "all copies or substantial portions",
286
# Apache-2.0 section 4(d) requires NOTICE to travel with derivative works,
287
# and both apply to a binary package, not only to a source tree.
288
# mocktail-webview's licence and the root NOTICE are Apache-2.0 material --
289
# mocktail's implementation of Roblox's in-experience web window, taken as
290
# the basis for Cordial's own -- installed here from the day this package
291
# was added rather than found missing later, the way cordial-git's was.
292
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
293
install -Dm644 NOTICE "$pkgdir/usr/share/licenses/$pkgname/NOTICE"
294
install -Dm644 THIRD-PARTY-NOTICES.md \
295
"$pkgdir/usr/share/licenses/$pkgname/THIRD-PARTY-NOTICES.md"
296
install -Dm644 third_party/libbadcpu/LICENSE.upstream \
297
"$pkgdir/usr/share/licenses/$pkgname/libbadcpu-MIT.txt"
298
install -Dm644 third_party/mcpelauncher-linker/LICENSE \
299
"$pkgdir/usr/share/licenses/$pkgname/mcpelauncher-linker-MIT.txt"
300
install -Dm644 third_party/mcpelauncher-linker/core/NOTICE \
301
"$pkgdir/usr/share/licenses/$pkgname/aosp-NOTICE.txt"
302
install -Dm644 third_party/libjnivm/LICENSE \
303
"$pkgdir/usr/share/licenses/$pkgname/libjnivm-MIT.txt"
304
install -Dm644 third_party/mocktail-webview/LICENSE \
305
"$pkgdir/usr/share/licenses/$pkgname/mocktail-webview-Apache-2.0.txt"
306
}
307
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-13 03:13:35 | Low | 1 |