cordial

LOW
maintainer taxin 0 votes scanned 2026-09-13 03:13:35.623360
View on AUR
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
34pkgname=cordial
35pkgver=0.13.2
36pkgrel=1
37pkgdesc="Roblox's official Android build, run natively on Linux -- Cordial ships no Roblox code and fetches a signature-verified one"
38arch=('x86_64')
39url="https://github.com/luohoa97/cordial"
40license=('GPL-3.0-or-later')
41depends=(
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)
91makedepends=(
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)
110optdepends=(
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)
125conflicts=('cordial-git')
126install="$pkgname.install"
127options=('!lto')
128source=(
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)
156sha256sums=('SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP')
157
158prepare() {
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
182pkgver() {
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
197build() {
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
212check() {
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
231package() {
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)SeverityRules
2026-09-13 03:13:35 Low 1

Report a package

Reports go to the AURWatch maintainer (one person) and are read by hand. No login required.

0 / 4000
Your suggestion