concat, concat-bin, concat-git: follow the 0.2.1 rewrite; fluxer-bin: stay on stable

This commit is contained in:
Felitendo committed 2026-09-06 13:43:34 +02:00
1 parent 97de80f1c2
commit 0dd9d17cf4
12 files changed
+326 -310

No files matched your search

+2 -2
View File
@@ -43,8 +43,8 @@ source in the `PKGBUILD` (and drop the `-bin` suffix), or don't package it.
| `cachy-auto-update` | [Felitendo/cachy-auto-update](https://github.com/Felitendo/cachy-auto-update) — unattended background updates for CachyOS (pacman, AUR, Flatpak, AppImages) | *built from source* | [cachy-auto-update](https://aur.archlinux.org/packages/cachy-auto-update) | | `cachy-auto-update` | [Felitendo/cachy-auto-update](https://github.com/Felitendo/cachy-auto-update) — unattended background updates for CachyOS (pacman, AUR, Flatpak, AppImages) | *built from source* | [cachy-auto-update](https://aur.archlinux.org/packages/cachy-auto-update) |
| `chiaki-ng-bin` | [streetpea/chiaki-ng](https://github.com/streetpea/chiaki-ng) — PlayStation Remote Play client (Qt6) | AppImage | [chiaki-ng-bin](https://aur.archlinux.org/packages/chiaki-ng-bin) | | `chiaki-ng-bin` | [streetpea/chiaki-ng](https://github.com/streetpea/chiaki-ng) — PlayStation Remote Play client (Qt6) | AppImage | [chiaki-ng-bin](https://aur.archlinux.org/packages/chiaki-ng-bin) |
| `chromium-widevine-helper` | [GloriousEggroll/chromium-widevine-helper](https://github.com/GloriousEggroll/chromium-widevine-helper) — extension + native helper installing Google's Widevine CDM into Chromium-based browser profiles | *no build step* | [chromium-widevine-helper](https://aur.archlinux.org/packages/chromium-widevine-helper) | | `chromium-widevine-helper` | [GloriousEggroll/chromium-widevine-helper](https://github.com/GloriousEggroll/chromium-widevine-helper) — extension + native helper installing Google's Widevine CDM into Chromium-based browser profiles | *no build step* | [chromium-widevine-helper](https://aur.archlinux.org/packages/chromium-widevine-helper) |
| `concat` | [jub0t/Concat](https://github.com/jub0t/Concat) — free and open-source CapCut replacement (Tauri 2 shell around a Rust video engine) | *built from source* | *not published yet* | | `concat` | [jub0t/Concat](https://github.com/jub0t/Concat) — free and open-source CapCut replacement (a Slint window over a Rust video engine) | *built from source* | *not published yet* |
| `concat-bin` | [jub0t/Concat](https://github.com/jub0t/Concat) — prebuilt release of `concat` | `.deb` | *not published yet* | | `concat-bin` | [jub0t/Concat](https://github.com/jub0t/Concat) — prebuilt release of `concat` | self-contained tarball | *not published yet* |
| `concat-git` | [jub0t/Concat](https://github.com/jub0t/Concat) — `main` branch of `concat` | *built from source* | [concat-git](https://aur.archlinux.org/packages/concat-git) | | `concat-git` | [jub0t/Concat](https://github.com/jub0t/Concat) — `main` branch of `concat` | *built from source* | [concat-git](https://aur.archlinux.org/packages/concat-git) |
| `faugus-launcher-bin` | [Faugus/faugus-launcher](https://github.com/Faugus/faugus-launcher) — launcher for Windows games via UMU-Launcher | `.deb` (`all`) | [faugus-launcher-bin](https://aur.archlinux.org/packages/faugus-launcher-bin) | | `faugus-launcher-bin` | [Faugus/faugus-launcher](https://github.com/Faugus/faugus-launcher) — launcher for Windows games via UMU-Launcher | `.deb` (`all`) | [faugus-launcher-bin](https://aur.archlinux.org/packages/faugus-launcher-bin) |
| `fluxer-bin` | [fluxer.app](https://fluxer.app) — Fluxer desktop client (Electron) | tarball | [fluxer-bin](https://aur.archlinux.org/packages/fluxer-bin) | | `fluxer-bin` | [fluxer.app](https://fluxer.app) — Fluxer desktop client (Electron) | tarball | [fluxer-bin](https://aur.archlinux.org/packages/fluxer-bin) |
+17 -20
View File
@@ -1,34 +1,31 @@
pkgbase = concat-bin pkgbase = concat-bin
pkgdesc = Free and open-source CapCut replacement, a Tauri video editor with a Rust engine (upstream binary) pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine (upstream binary)
pkgver = 0.2.0alpha.21 pkgver = 0.2.1
pkgrel = 1 pkgrel = 1
url = https://github.com/jub0t/Concat url = https://github.com/jub0t/Concat
arch = x86_64 arch = x86_64
license = MPL-2.0 license = AGPL-3.0-or-later
depends = webkit2gtk-4.1 license = GPL-3.0-or-later
depends = gtk3
depends = glib2
depends = libsoup3
depends = gdk-pixbuf2
depends = cairo
depends = dbus
depends = glib-networking
depends = alsa-lib depends = alsa-lib
depends = ffmpeg depends = fontconfig
depends = freetype2
depends = libglvnd
depends = libxkbcommon
depends = libxkbcommon-x11
depends = libx11
depends = libxcursor
depends = libxi
depends = libxrender
depends = wayland
depends = dbus
depends = gcc-libs depends = gcc-libs
depends = glibc depends = glibc
depends = hicolor-icon-theme depends = hicolor-icon-theme
optdepends = whisper-cpp: on-device auto-captions and transcription
optdepends = vulkan-icd-loader: Vulkan compositor backend
optdepends = libglvnd: OpenGL compositor backend
provides = concat provides = concat
conflicts = concat conflicts = concat
noextract = concat-bin-0.2.0alpha.21.deb
options = !strip options = !strip
options = !debug options = !debug
source = concat-bin-0.2.0alpha.21.deb::https://github.com/jub0t/Concat/releases/download/v0.2.0-alpha.21/WolfCut_0.2.0_amd64.deb source = concat-bin-0.2.1.tar.gz::https://github.com/jub0t/Concat/releases/download/v0.2.1/Concat-0.2.1-linux-x86_64.tar.gz
source = LICENSE-0.2.0alpha.21::https://raw.githubusercontent.com/jub0t/Concat/v0.2.0-alpha.21/LICENSE sha256sums = 949c30dee52ba779d5d91777510cfd57580b67467d841bd2957956219886df6f
sha256sums = 1cc6855a2936f7c56898aa58bce69141f7349ee6728cca0f1f8c26063b5f3d3e
sha256sums = 0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0
pkgname = concat-bin pkgname = concat-bin
+46 -55
View File
@@ -3,72 +3,63 @@
# https://github.com/Felitendo/PKGBUILDS # https://github.com/Felitendo/PKGBUILDS
pkgname=concat-bin pkgname=concat-bin
pkgver=0.2.0alpha.21 pkgver=0.2.1
pkgrel=1 pkgrel=1
pkgdesc="Free and open-source CapCut replacement, a Tauri video editor with a Rust engine (upstream binary)" pkgdesc="Free and open-source CapCut replacement, a video editor with a Rust engine (upstream binary)"
arch=('x86_64') arch=('x86_64')
url="https://github.com/jub0t/Concat" url="https://github.com/jub0t/Concat"
license=('MPL-2.0') # The binary is Concat under the AGPL; the FFmpeg libraries it ships beside
# What the binary links against, plus what it reaches for at run time: # itself are a BtbN GPL build. Both licence texts land in the package: the
# glib-networking is the webview's TLS backend, and the ffmpeg pair is # repository's LICENSE, and upstream's notices file, which is what names the
# spawned by every media operation - see the resources note in package(). # terms of everything linked in - FFmpeg, Slint under its GPL option,
# The model downloads carry their own TLS (rustls), so openssl is not needed. # whisper.cpp, sherpa-onnx.
depends=('webkit2gtk-4.1' 'gtk3' 'glib2' 'libsoup3' 'gdk-pixbuf2' 'cairo' license=('AGPL-3.0-or-later' 'GPL-3.0-or-later')
'dbus' 'glib-networking' 'alsa-lib' 'ffmpeg' 'gcc-libs' 'glibc' # Nothing is spawned at run time any more: FFmpeg is linked, whisper.cpp and
'hicolor-icon-theme') # sherpa-onnx are compiled in. What is left is what the binary loads - the
# wgpu picks its backend at run time: Vulkan first, GL as the fallback. Both # ALSA backend of cpal, fontconfig and freetype for text, and the windowing
# loaders come from the driver stack every desktop already has, so neither is # libraries winit and the renderer open by name: EGL, Wayland, X11 and
# a hard dependency of the editor. # xkbcommon. dbus is the XDG portal, which is how the file dialogs and
optdepends=('whisper-cpp: on-device auto-captions and transcription' # "reveal in file manager" work without a toolkit.
'vulkan-icd-loader: Vulkan compositor backend' depends=('alsa-lib' 'fontconfig' 'freetype2' 'libglvnd' 'libxkbcommon'
'libglvnd: OpenGL compositor backend') 'libxkbcommon-x11' 'libx11' 'libxcursor' 'libxi' 'libxrender'
'wayland' 'dbus' 'gcc-libs' 'glibc' 'hicolor-icon-theme')
provides=('concat') provides=('concat')
conflicts=('concat') conflicts=('concat')
# !strip: upstream's binary is already stripped, and the FFmpeg libraries
# beside it are theirs to ship as they are.
options=('!strip' '!debug') options=('!strip' '!debug')
# Upstream has no stable release yet. The build workflow publishes a # Upstream's Linux release is one self-contained folder: the binary, the
# v<version>-alpha.<n> prerelease for every green push to main, so /latest is # FFmpeg 8.1 runtime libraries it was linked against, a desktop entry and an
# empty and the newest versioned release is picked by publication date; see # icon. The libraries have to come along - the binary needs libavcodec.so.62
# pkg.sh. The asset name carries tauri.conf.json's version rather than the # and Arch is on FFmpeg 9 (libavcodec.so.63) - so the whole folder is
# tag (every alpha of 0.2.0 ships WolfCut_0.2.0_amd64.deb), so it is resolved # installed under /usr/lib/$pkgname, where the binary's own rpath
# through the GitHub API and synced here along with the checksums. # ($ORIGIN/lib) finds them.
# #
# pkgver drops the hyphens from the tag (v0.2.0-alpha.15 -> 0.2.0alpha.15). # The asset name carries the workspace's version rather than the tag (a
# pacman sorts that older than a later plain 0.2.0 (`vercmp 0.2.0alpha.15 # prerelease of 0.2.2 ships Concat-0.2.2-linux-x86_64.tar.gz whatever its tag
# 0.2.0` is -1, the trailing alphabetic segment loses), so the prereleases # says), so it is resolved through the GitHub API and synced here along with
# upgrade to the eventual stable release on their own and no epoch is needed. # the checksum; see pkg.sh.
_tag="v0.2.0-alpha.21" _tag="v0.2.1"
_asset="WolfCut_0.2.0_amd64.deb" _asset="Concat-0.2.1-linux-x86_64.tar.gz"
source=("${pkgname}-${pkgver}.deb::https://github.com/jub0t/Concat/releases/download/${_tag}/${_asset}" source=("${pkgname}-${pkgver}.tar.gz::https://github.com/jub0t/Concat/releases/download/${_tag}/${_asset}")
"LICENSE-${pkgver}::https://raw.githubusercontent.com/jub0t/Concat/${_tag}/LICENSE") sha256sums=('949c30dee52ba779d5d91777510cfd57580b67467d841bd2957956219886df6f')
noextract=("${pkgname}-${pkgver}.deb")
sha256sums=('1cc6855a2936f7c56898aa58bce69141f7349ee6728cca0f1f8c26063b5f3d3e' '0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0')
package() { package() {
# /usr/bin/wolfcut-desktop, the desktop entry, the icons and the staged cd "${_asset%.tar.gz}"
# resources in /usr/lib/WolfCut - the project is mid-rename, the binary and
# every path it installs still carry the old name.
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
| bsdtar -xpf - -C "$pkgdir" ./usr
# Upstream stages a static ffmpeg/ffprobe pair (180 MB) and whisper-cli install -Dm755 concat "$pkgdir/usr/lib/$pkgname/concat"
# inside the bundle so the app runs on a machine with nothing installed. # cp, not install: lib/ is the usual set of FFmpeg soname symlinks beside
# Both lookups fall back to PATH when the staged copy is missing (desktop # the real files, and only a copy that preserves them keeps it working.
# `use_bundled_ffmpeg`, `transcribe::find_binary`), so the packaged Arch cp -a lib "$pkgdir/usr/lib/$pkgname/lib"
# copies are used instead of shipping a second ffmpeg. Named explicitly
# rather than dropping the whole resource directory: anything else upstream
# stages there is a resource the app needs, and a rename fails here loudly.
rm -r "$pkgdir/usr/lib/WolfCut/ffmpeg" "$pkgdir/usr/lib/WolfCut/whisper"
rmdir --ignore-fail-on-non-empty "$pkgdir/usr/lib/WolfCut" "$pkgdir/usr/lib"
# Tauri emits the entry with an empty Categories=, which keeps the editor install -d "$pkgdir/usr/bin"
# out of the application menu. Same categories upstream's Nix build sets. ln -s "/usr/lib/$pkgname/concat" "$pkgdir/usr/bin/concat"
sed -i 's|^Categories=.*|Categories=AudioVideo;AudioVideoEditing;|' \
"$pkgdir/usr/share/applications/WolfCut.desktop"
# the AUR package is named after the project, the executable after what the install -Dm644 concat.desktop "$pkgdir/usr/share/applications/concat.desktop"
# project used to be called - keep it reachable under both install -Dm644 concat.png \
ln -s wolfcut-desktop "$pkgdir/usr/bin/concat" "$pkgdir/usr/share/icons/hicolor/256x256/apps/concat.png"
install -Dm644 "$srcdir/LICENSE-${pkgver}" \ install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
"$pkgdir/usr/share/licenses/$pkgname/LICENSE" install -Dm644 THIRD_PARTY_NOTICES.md \
"$pkgdir/usr/share/licenses/$pkgname/THIRD_PARTY_NOTICES.md"
} }
+37 -32
View File
@@ -1,35 +1,37 @@
# concat-bin - Concat (https://github.com/jub0t/Concat), a free and # concat-bin - Concat (https://github.com/jub0t/Concat), a free and
# open-source CapCut replacement: a Tauri 2 shell around a Rust video engine. # open-source CapCut replacement.
# #
# Upstream publishes a Linux .deb per release, so there is no build step # Upstream publishes a self-contained Linux tarball per release, so there is
# here: on a new version only pkgver, the asset name and the checksums are # no build step here: on a new version only pkgver, the asset name and the
# refreshed and the PKGBUILD repackages the .deb. # checksum are refreshed and the PKGBUILD repackages the tarball.
# #
# The project has no stable release yet. Its build workflow publishes a # 0.2.1 is the first release of the rewrite: the Tauri shell and its .deb are
# "v<version>-alpha.<n>" prerelease for every green push to main, so /latest # gone, and the app is now one Rust binary (Slint over the engine crates)
# is empty and every tag is a prerelease - the alphas are what there is to # shipped as Concat-<version>-linux-<arch>.tar.gz. The tag is what changed
# package. They arrive several times a day, which is also how often this # least - see below.
# package can move.
# #
# The release list is not ordered by version: GitHub sorts it by creation # The release list is not ordered by version: GitHub sorts it by creation
# time, and upstream's alpha numbering has already run out of step with it # time, and upstream's alpha numbering has run out of step with it before
# (v0.2.0-alpha.10 sits between alpha.2 and alpha.1). The newest release is # (v0.2.0-alpha.10 sat between alpha.2 and alpha.1). The newest release is
# therefore picked by publication date rather than by list position. # therefore picked by publication date rather than by list position. Only
# tags that start with a version are considered, which is also what keeps the
# rolling "nightly" prerelease out.
# #
# The asset name carries tauri.conf.json's version, not the tag - every alpha # The asset name carries the workspace's version, not the tag - a prerelease
# of 0.2.0 ships WolfCut_0.2.0_amd64.deb - so it cannot be derived from # of 0.2.2 ships Concat-0.2.2-linux-x86_64.tar.gz whatever its tag says - so
# pkgver and is resolved through the API into the _asset variable. # it cannot be derived from pkgver and is resolved through the API into the
# _asset variable.
# #
# pkgver drops the hyphens from the tag (v0.2.0-alpha.15 -> 0.2.0alpha.15). # pkgver drops the hyphens from the tag (v0.2.2-alpha.1 -> 0.2.2alpha.1).
# pacman sorts that older than a later plain 0.2.0 (`vercmp 0.2.0alpha.15 # pacman sorts that older than a later plain 0.2.2 (`vercmp 0.2.2alpha.1
# 0.2.0` is -1), so the prereleases upgrade to the eventual stable release on # 0.2.2` is -1), so prereleases upgrade to the eventual release on their own
# their own and no epoch is needed. # and no epoch is needed.
# Not on the AUR yet. concat-git goes up first; these two follow once the # Not on the AUR yet. concat-git goes up first; these two follow once the
# alpha-per-push release cadence has been lived with for a while - upstream # release cadence has been lived with for a while - upstream published
# publishes several a day, and each one is an AUR push (and, for concat, a # several alphas a day before 0.2.1, and each one is an AUR push (and, for
# full Rust build in CI). Flip this to true to publish; until then the # concat, a full Rust build in CI). Flip this to true to publish; until then
# PKGBUILD is still kept current and test-built here. # the PKGBUILD is still kept current and test-built here.
AUR_PUBLISH=false AUR_PUBLISH=false
UPSTREAM_REPO="jub0t/Concat" UPSTREAM_REPO="jub0t/Concat"
@@ -52,7 +54,7 @@ latest_version() {
# refresh_checksums <version> <pkgbuild-path> # refresh_checksums <version> <pkgbuild-path>
refresh_checksums() { refresh_checksums() {
local ver="$1" pkgbuild="$2" local ver="$1" pkgbuild="$2"
local tag asset sha_deb sha_license local tag asset sha
tag="$(latest_tag)" tag="$(latest_tag)"
if [[ "$(tag_to_pkgver <<< "$tag")" != "$ver" ]]; then if [[ "$(tag_to_pkgver <<< "$tag")" != "$ver" ]]; then
@@ -60,20 +62,23 @@ refresh_checksums() {
return 1 return 1
fi fi
# e.g. WolfCut_0.2.0_amd64.deb - the version is tauri.conf.json's, not the tag's # e.g. Concat-0.2.1-linux-x86_64.tar.gz - the version is the workspace's,
# not the tag's
# `|| true`, so that a release that stops carrying the asset says so here
# instead of ending the run on grep's exit status with nothing printed.
asset="$(gh api "repos/$UPSTREAM_REPO/releases/tags/$tag" --jq '.assets[].name' \ asset="$(gh api "repos/$UPSTREAM_REPO/releases/tags/$tag" --jq '.assets[].name' \
| grep -E '_amd64\.deb$')" | grep -E '^Concat-.*-linux-x86_64\.tar\.gz$' || true)"
[[ "$(wc -l <<< "$asset")" -eq 1 ]] || { echo "expected exactly one amd64 .deb, got: $asset" >&2; return 1; } if [[ -z "$asset" || "$(wc -l <<< "$asset")" -ne 1 ]]; then
echo "expected exactly one linux-x86_64 tarball in $tag, got: ${asset:-none}" >&2
return 1
fi
sha_deb="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/$tag/$asset" \ sha="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/$tag/$asset" \
| sha256sum | cut -d' ' -f1)"
# the .deb ships no copyright file, so the license comes from the tag
sha_license="$(curl -sfL "https://raw.githubusercontent.com/$UPSTREAM_REPO/$tag/LICENSE" \
| sha256sum | cut -d' ' -f1)" | sha256sum | cut -d' ' -f1)"
sed -i \ sed -i \
-e "s|^_tag=.*|_tag=\"$tag\"|" \ -e "s|^_tag=.*|_tag=\"$tag\"|" \
-e "s|^_asset=.*|_asset=\"$asset\"|" \ -e "s|^_asset=.*|_asset=\"$asset\"|" \
-e "s|^sha256sums=.*|sha256sums=('$sha_deb' '$sha_license')|" \ -e "s|^sha256sums=.*|sha256sums=('$sha')|" \
"$pkgbuild" "$pkgbuild"
} }
+18 -16
View File
@@ -1,30 +1,32 @@
pkgbase = concat-git pkgbase = concat-git
pkgdesc = Free and open-source CapCut replacement, a Tauri video editor with a Rust engine (git) pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine (git)
pkgver = 0.2.0.alpha.16.r0.g8938ec3 pkgver = 0.2.1.r12.geef4579
pkgrel = 1 pkgrel = 1
url = https://github.com/jub0t/Concat url = https://github.com/jub0t/Concat
arch = x86_64 arch = x86_64
license = MPL-2.0 license = AGPL-3.0-or-later
makedepends = rust makedepends = rust
makedepends = npm makedepends = cmake
makedepends = clang
makedepends = pkgconf makedepends = pkgconf
makedepends = git makedepends = git
depends = webkit2gtk-4.1
depends = gtk3
depends = glib2
depends = libsoup3
depends = gdk-pixbuf2
depends = cairo
depends = dbus
depends = glib-networking
depends = alsa-lib
depends = ffmpeg depends = ffmpeg
depends = alsa-lib
depends = fontconfig
depends = freetype2
depends = libglvnd
depends = vulkan-icd-loader
depends = libxkbcommon
depends = libxkbcommon-x11
depends = libx11
depends = libxcursor
depends = libxi
depends = libxrender
depends = wayland
depends = dbus
depends = gcc-libs depends = gcc-libs
depends = glibc depends = glibc
depends = hicolor-icon-theme depends = hicolor-icon-theme
optdepends = whisper-cpp: on-device auto-captions and transcription
optdepends = vulkan-icd-loader: Vulkan compositor backend
optdepends = libglvnd: OpenGL compositor backend
provides = concat provides = concat
conflicts = concat conflicts = concat
options = !debug options = !debug
+55 -62
View File
@@ -3,34 +3,34 @@
# https://github.com/Felitendo/PKGBUILDS # https://github.com/Felitendo/PKGBUILDS
pkgname=concat-git pkgname=concat-git
pkgver=0.2.0.alpha.16.r0.g8938ec3 pkgver=0.2.1.r12.geef4579
pkgrel=1 pkgrel=1
pkgdesc="Free and open-source CapCut replacement, a Tauri video editor with a Rust engine (git)" pkgdesc="Free and open-source CapCut replacement, a video editor with a Rust engine (git)"
arch=('x86_64') arch=('x86_64')
url="https://github.com/jub0t/Concat" url="https://github.com/jub0t/Concat"
license=('MPL-2.0') license=('AGPL-3.0-or-later')
# glib-networking is what gives the webview a TLS backend; alsa-lib is the # Nothing is spawned at run time: FFmpeg is linked, whisper.cpp and
# engine's cpal playback backend; every media operation spawns the ffmpeg # sherpa-onnx are compiled in. alsa-lib is cpal's playback backend;
# pair - see the WOLFCUT_SYSTEM_TOOLS note below. The model downloads carry # fontconfig and freetype are the font side of the renderer; libglvnd and
# their own TLS (rustls), so nothing here links openssl. # vulkan-icd-loader are the two backends wgpu picks between, and the rest is
depends=('webkit2gtk-4.1' 'gtk3' 'glib2' 'libsoup3' 'gdk-pixbuf2' 'cairo' # what winit opens by name for whichever session the user is in. dbus is the
'dbus' 'glib-networking' 'alsa-lib' 'ffmpeg' 'gcc-libs' 'glibc' # XDG portal, which is how the file dialogs and "reveal in file manager"
'hicolor-icon-theme') # work without a toolkit.
makedepends=('rust' 'npm' 'pkgconf' 'git') depends=('ffmpeg' 'alsa-lib' 'fontconfig' 'freetype2' 'libglvnd'
# wgpu picks its backend at run time: Vulkan first, GL as the fallback. Both 'vulkan-icd-loader' 'libxkbcommon' 'libxkbcommon-x11' 'libx11'
# loaders come from the driver stack every desktop already has, so neither is 'libxcursor' 'libxi' 'libxrender' 'wayland' 'dbus' 'gcc-libs'
# a hard dependency of the editor. 'glibc' 'hicolor-icon-theme')
optdepends=('whisper-cpp: on-device auto-captions and transcription' # clang: bindgen (FFmpeg headers, whisper.cpp) needs libclang.
'vulkan-icd-loader: Vulkan compositor backend' # cmake: whisper.cpp is compiled in, by its own CMake build.
'libglvnd: OpenGL compositor backend') makedepends=('rust' 'cmake' 'clang' 'pkgconf' 'git')
provides=('concat') provides=('concat')
conflicts=('concat') conflicts=('concat')
# !debug: the release profile already sets strip = true, so there is nothing # !debug: the app profile strips symbols itself, so there is nothing left to
# left to split into a debug package. # split into a debug package.
# !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto # !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto
# behind the model downloads' TLS - compiles hand-written assembly through # behind the model downloads' TLS - compiles hand-written assembly through
# cc, which comes out as bitcode and links to nothing. Rust's own LTO is set # cc, which comes out as bitcode and links to nothing. Rust's own LTO is set
# in the release profile and is unaffected. # in the app profile and is unaffected.
options=('!debug' '!lto') options=('!debug' '!lto')
source=("${pkgname}::git+https://github.com/jub0t/Concat.git") source=("${pkgname}::git+https://github.com/jub0t/Concat.git")
sha256sums=('SKIP') sha256sums=('SKIP')
@@ -42,73 +42,66 @@ pkgver() {
} }
prepare() { prepare() {
cd "$pkgname/desktop" cd "$pkgname/engine"
# the frontend toolchain (vite, tsc, tailwind) and the crate registry
npm ci --cache "$srcdir/npm-cache"
export RUSTUP_TOOLCHAIN=stable export RUSTUP_TOOLCHAIN=stable
cd src-tauri
cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')" cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')"
} }
build() { build() {
cd "$pkgname/desktop" cd "$pkgname/engine"
export RUSTUP_TOOLCHAIN=stable export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target export CARGO_TARGET_DIR=target
# ggml (whisper.cpp's kernels) tunes itself to the machine it is compiled
# on unless told otherwise. A package is not always built on the machine it
# runs on, and a binary that faults on a CPU without AVX-512 is a bad trade
# for kernels nobody measured. Off, it compiles to the portable baseline.
export GGML_NATIVE=OFF
# build.rs refuses a release build without a staged ffmpeg/whisper-cli, # --features wgpu: FemtoVG over wgpu instead of the default Skia renderer.
# because a bundle that ships without them is broken when launched from a # skia-bindings downloads prebuilt binaries from its build script, which a
# desktop file with no PATH to fall back on. A distribution package is the # package cannot do; the wgpu renderer is pure Rust. This is the same
# documented exception: the lookups fall back to PATH, and ffmpeg and # choice, for the same reason, that upstream's flake.nix makes.
# whisper-cpp are packaged for Arch already. #
export WOLFCUT_SYSTEM_TOOLS=1 # --profile app: upstream's shipping profile - fat LTO, panic=abort,
# stripped. See engine/Cargo.toml for what each knob is for.
# vite build -> desktop/dist, which tauri-build embeds into the binary #
npm run build
cd src-tauri
# sherpa-onnx-sys, the text-to-speech backend, ships no C++ build: its build # sherpa-onnx-sys, the text-to-speech backend, ships no C++ build: its build
# script downloads a prebuilt static-lib archive from its own release page. # script downloads a prebuilt static-lib archive from its own release page.
# concat pins that archive as a checksummed source; here the version moves # concat pins that archive as a checksummed source; here the version moves
# with main, so the build script fetches it - build() needs the network. # with main, so the build script fetches it - build() needs the network.
cargo build --release --frozen cargo build --profile app -p concat --frozen \
--no-default-features --features wgpu
} }
package() { package() {
cd "$pkgname" cd "$pkgname"
# same paths the upstream .deb installs: the project is mid-rename and its install -Dm755 "engine/target/app/concat" "$pkgdir/usr/bin/concat"
# executable, desktop entry and icons all still carry the old name
install -Dm755 "desktop/src-tauri/target/release/wolfcut-desktop" \
"$pkgdir/usr/bin/wolfcut-desktop"
# the AUR package is named after the project, the executable after what the # The desktop entry upstream's release workflow writes into the Linux
# project used to be called - keep it reachable under both # tarball; there is none in the tree, because the Nix build generates its
ln -s wolfcut-desktop "$pkgdir/usr/bin/concat" # own. Reproduced here so this package and concat-bin install the same one.
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/concat.desktop" <<'EOF'
# tauri only writes a desktop entry when it bundles, and the one it puts in
# the .deb has an empty Categories=. This is that entry with the categories
# upstream's Nix build sets.
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/WolfCut.desktop" <<'EOF'
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Name=WolfCut Name=Concat
Comment=Free and open source video editor Comment=Video editor
Exec=wolfcut-desktop Exec=concat
Icon=wolfcut-desktop Icon=concat
Categories=AudioVideo;Video;
Terminal=false Terminal=false
Categories=AudioVideo;AudioVideoEditing;
StartupWMClass=wolfcut-desktop
EOF EOF
install -Dm644 "desktop/src-tauri/icons/32x32.png" \ install -Dm644 "assets/icons/concat_logo_256.png" \
"$pkgdir/usr/share/icons/hicolor/32x32/apps/wolfcut-desktop.png" "$pkgdir/usr/share/icons/hicolor/256x256/apps/concat.png"
install -Dm644 "desktop/src-tauri/icons/128x128.png" \ install -Dm644 "assets/concat_logo_512.png" \
"$pkgdir/usr/share/icons/hicolor/128x128/apps/wolfcut-desktop.png" "$pkgdir/usr/share/icons/hicolor/512x512/apps/concat.png"
install -Dm644 "desktop/src-tauri/icons/128x128@2x.png" \
"$pkgdir/usr/share/icons/hicolor/256x256@2/apps/wolfcut-desktop.png"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
install -Dm644 LICENSE-EXCEPTIONS.md \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE-EXCEPTIONS.md"
install -Dm644 THIRD_PARTY_NOTICES.md \
"$pkgdir/usr/share/licenses/$pkgname/THIRD_PARTY_NOTICES.md"
} }
+9 -10
View File
@@ -1,7 +1,7 @@
# concat-git - Concat (https://github.com/jub0t/Concat) built from the main # concat-git - Concat (https://github.com/jub0t/Concat) built from the main
# branch. Same build as concat, see that package for why the Tauri binary # branch. Same build as concat, see that package for why the editor needs
# needs nothing but a JS toolchain and cargo, and why WOLFCUT_SYSTEM_TOOLS=1 # cargo, cmake and clang and nothing else, and why the FemtoVG-over-wgpu
# is the right switch for a distribution package. # renderer is the one a distribution package can build.
# #
# The one difference: concat pins the prebuilt sherpa-onnx static-lib archive # The one difference: concat pins the prebuilt sherpa-onnx static-lib archive
# as a checksummed source, which it can because the version comes from a # as a checksummed source, which it can because the version comes from a
@@ -10,18 +10,17 @@
# #
# VCS packages are not version-tracked here on purpose. The AUR copy of a -git # VCS packages are not version-tracked here on purpose. The AUR copy of a -git
# PKGBUILD carries only a snapshot of pkgver; the real version comes from # PKGBUILD carries only a snapshot of pkgver; the real version comes from
# pkgver() when the user builds it. Upstream publishes an alpha release for # pkgver() when the user builds it. Following main here would mean AUR pushes
# every green push to main, several times a day, so following main here would # that change nothing for anyone. latest_version() therefore reports the
# mean several AUR pushes a day that change nothing for anyone. # pkgver that is already in the PKGBUILD, which makes the update run a no-op:
# latest_version() therefore reports the pkgver that is already in the # the package is rebuilt, re-checked and pushed only when the packaging
# PKGBUILD, which makes the update run a no-op: the package is rebuilt, # itself changes.
# re-checked and pushed only when the packaging itself changes.
# #
# When that happens, makepkg refreshes the pkgver snapshot in the PKGBUILD as # When that happens, makepkg refreshes the pkgver snapshot in the PKGBUILD as
# part of the test build, so the committed snapshot follows along by itself. # part of the test build, so the committed snapshot follows along by itself.
# Installed in CI (pacman) before the makepkg test build. # Installed in CI (pacman) before the makepkg test build.
BUILD_DEPS=(rust npm git webkit2gtk-4.1 gtk3 libsoup3 alsa-lib) BUILD_DEPS=(rust cmake clang pkgconf git ffmpeg alsa-lib fontconfig freetype2)
latest_version() { latest_version() {
grep -Po '^pkgver=\K.*' "$(dirname "${BASH_SOURCE[0]}")/PKGBUILD" grep -Po '^pkgver=\K.*' "$(dirname "${BASH_SOURCE[0]}")/PKGBUILD"
+23 -21
View File
@@ -1,35 +1,37 @@
pkgbase = concat pkgbase = concat
pkgdesc = Free and open-source CapCut replacement, a Tauri video editor with a Rust engine pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine
pkgver = 0.2.0alpha.21 pkgver = 0.2.1
pkgrel = 1 pkgrel = 1
url = https://github.com/jub0t/Concat url = https://github.com/jub0t/Concat
arch = x86_64 arch = x86_64
license = MPL-2.0 license = AGPL-3.0-or-later
makedepends = rust makedepends = rust
makedepends = npm makedepends = cmake
makedepends = clang
makedepends = pkgconf makedepends = pkgconf
depends = webkit2gtk-4.1
depends = gtk3
depends = glib2
depends = libsoup3
depends = gdk-pixbuf2
depends = cairo
depends = dbus
depends = glib-networking
depends = alsa-lib
depends = ffmpeg depends = ffmpeg
depends = alsa-lib
depends = fontconfig
depends = freetype2
depends = libglvnd
depends = vulkan-icd-loader
depends = libxkbcommon
depends = libxkbcommon-x11
depends = libx11
depends = libxcursor
depends = libxi
depends = libxrender
depends = wayland
depends = dbus
depends = gcc-libs depends = gcc-libs
depends = glibc depends = glibc
depends = hicolor-icon-theme depends = hicolor-icon-theme
optdepends = whisper-cpp: on-device auto-captions and transcription noextract = sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2
optdepends = vulkan-icd-loader: Vulkan compositor backend
optdepends = libglvnd: OpenGL compositor backend
noextract = sherpa-onnx-v1.13.6-linux-x64-static-lib.tar.bz2
options = !debug options = !debug
options = !lto options = !lto
source = concat-0.2.0alpha.21.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/v0.2.0-alpha.21.tar.gz source = concat-0.2.1.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/v0.2.1.tar.gz
source = https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.13.6/sherpa-onnx-v1.13.6-linux-x64-static-lib.tar.bz2 source = https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.13.7/sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2
sha256sums = d90957c50750926c590dd5e26711b47f42cbac6c34246007d1cc8ca7210db3dd sha256sums = 3dfe1c7854b543c0bf86e239b1f02c65b14ba9b77c78ad8aa94026eeee6ebb9e
sha256sums = fe4968c3cd2ad3dfd1ea925500e5542aef70dd7119847257ffde95d6260cd629 sha256sums = d1be7a69ac2b30120058d8302e624239a3064085383cfa47994a14fdc44c32d6
pkgname = concat pkgname = concat
+60 -71
View File
@@ -3,119 +3,108 @@
# https://github.com/Felitendo/PKGBUILDS # https://github.com/Felitendo/PKGBUILDS
pkgname=concat pkgname=concat
pkgver=0.2.0alpha.21 pkgver=0.2.1
pkgrel=1 pkgrel=1
pkgdesc="Free and open-source CapCut replacement, a Tauri video editor with a Rust engine" pkgdesc="Free and open-source CapCut replacement, a video editor with a Rust engine"
arch=('x86_64') arch=('x86_64')
url="https://github.com/jub0t/Concat" url="https://github.com/jub0t/Concat"
license=('MPL-2.0') license=('AGPL-3.0-or-later')
# glib-networking is what gives the webview a TLS backend; alsa-lib is the # Nothing is spawned at run time: FFmpeg is linked, whisper.cpp and
# engine's cpal playback backend; every media operation spawns the ffmpeg # sherpa-onnx are compiled in. alsa-lib is cpal's playback backend;
# pair - see the WOLFCUT_SYSTEM_TOOLS note below. The model downloads carry # fontconfig and freetype are the font side of the renderer; libglvnd and
# their own TLS (rustls), so nothing here links openssl. # vulkan-icd-loader are the two backends wgpu picks between, and the rest is
depends=('webkit2gtk-4.1' 'gtk3' 'glib2' 'libsoup3' 'gdk-pixbuf2' 'cairo' # what winit opens by name for whichever session the user is in. dbus is the
'dbus' 'glib-networking' 'alsa-lib' 'ffmpeg' 'gcc-libs' 'glibc' # XDG portal, which is how the file dialogs and "reveal in file manager"
'hicolor-icon-theme') # work without a toolkit.
makedepends=('rust' 'npm' 'pkgconf') depends=('ffmpeg' 'alsa-lib' 'fontconfig' 'freetype2' 'libglvnd'
# wgpu picks its backend at run time: Vulkan first, GL as the fallback. Both 'vulkan-icd-loader' 'libxkbcommon' 'libxkbcommon-x11' 'libx11'
# loaders come from the driver stack every desktop already has, so neither is 'libxcursor' 'libxi' 'libxrender' 'wayland' 'dbus' 'gcc-libs'
# a hard dependency of the editor. 'glibc' 'hicolor-icon-theme')
optdepends=('whisper-cpp: on-device auto-captions and transcription' # clang: bindgen (FFmpeg headers, whisper.cpp) needs libclang.
'vulkan-icd-loader: Vulkan compositor backend' # cmake: whisper.cpp is compiled in, by its own CMake build.
'libglvnd: OpenGL compositor backend') makedepends=('rust' 'cmake' 'clang' 'pkgconf')
# !debug: the release profile already sets strip = true, so there is nothing # !debug: the app profile strips symbols itself, so there is nothing left to
# left to split into a debug package. # split into a debug package.
# !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto # !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto
# behind the model downloads' TLS - compiles hand-written assembly through # behind the model downloads' TLS - compiles hand-written assembly through
# cc, which comes out as bitcode and links to nothing. Rust's own LTO is set # cc, which comes out as bitcode and links to nothing. Rust's own LTO is set
# in the release profile and is unaffected. # in the app profile and is unaffected.
options=('!debug' '!lto') options=('!debug' '!lto')
# Upstream has no stable release yet: the build workflow publishes a # Only tags that start with a version are packaged, and pkgver drops their
# v<version>-alpha.<n> prerelease for every green push to main. Only the # hyphens (v0.2.2-alpha.1 -> 0.2.2alpha.1), which pacman sorts older than a
# versioned tags are packaged, and pkgver drops their hyphens # later plain 0.2.2, so no epoch is needed. See pkg.sh.
# (v0.2.0-alpha.15 -> 0.2.0alpha.15), which pacman sorts older than a later _tag="v0.2.1"
# plain 0.2.0, so no epoch is needed. See pkg.sh.
_tag="v0.2.0-alpha.21"
# sherpa-onnx-sys (the text-to-speech backend) does not build its C++ side: # sherpa-onnx-sys (the text-to-speech backend) does not build its C++ side:
# it downloads a prebuilt static-lib archive from its own release page unless # it downloads a prebuilt static-lib archive from its own release page unless
# it is handed one. Handing it one keeps that binary under makepkg's # it is handed one. Handing it one keeps that binary under makepkg's
# checksums instead of arriving unverified from a build script. The version # checksums instead of arriving unverified from a build script. The version
# follows upstream's Cargo.lock and is synced by pkg.sh. # follows upstream's Cargo.lock and is synced by pkg.sh.
_sherpa="1.13.6" _sherpa="1.13.7"
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/${_tag}.tar.gz" source=("${pkgname}-${pkgver}.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/${_tag}.tar.gz"
"https://github.com/k2-fsa/sherpa-onnx/releases/download/v${_sherpa}/sherpa-onnx-v${_sherpa}-linux-x64-static-lib.tar.bz2") "https://github.com/k2-fsa/sherpa-onnx/releases/download/v${_sherpa}/sherpa-onnx-v${_sherpa}-linux-x64-static-lib.tar.bz2")
noextract=("sherpa-onnx-v${_sherpa}-linux-x64-static-lib.tar.bz2") noextract=("sherpa-onnx-v${_sherpa}-linux-x64-static-lib.tar.bz2")
sha256sums=('d90957c50750926c590dd5e26711b47f42cbac6c34246007d1cc8ca7210db3dd' 'fe4968c3cd2ad3dfd1ea925500e5542aef70dd7119847257ffde95d6260cd629') sha256sums=('3dfe1c7854b543c0bf86e239b1f02c65b14ba9b77c78ad8aa94026eeee6ebb9e' 'd1be7a69ac2b30120058d8302e624239a3064085383cfa47994a14fdc44c32d6')
_srcname="Concat-${_tag#v}" _srcname="Concat-${_tag#v}"
prepare() { prepare() {
cd "$_srcname/desktop" cd "$_srcname/engine"
# the frontend toolchain (vite, tsc, tailwind) and the crate registry, both
# fetched here so build() runs without the network
npm ci --cache "$srcdir/npm-cache"
export RUSTUP_TOOLCHAIN=stable export RUSTUP_TOOLCHAIN=stable
cd src-tauri
cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')" cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')"
} }
build() { build() {
cd "$_srcname/desktop" cd "$_srcname/engine"
export RUSTUP_TOOLCHAIN=stable export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target export CARGO_TARGET_DIR=target
# build.rs refuses a release build without a staged ffmpeg/whisper-cli,
# because a bundle that ships without them is broken when launched from a
# desktop file with no PATH to fall back on. A distribution package is the
# documented exception: the lookups fall back to PATH, and ffmpeg and
# whisper-cpp are packaged for Arch already.
export WOLFCUT_SYSTEM_TOOLS=1
# the checksummed archive from source[1], instead of a download in build() # the checksummed archive from source[1], instead of a download in build()
export SHERPA_ONNX_ARCHIVE_DIR="$srcdir" export SHERPA_ONNX_ARCHIVE_DIR="$srcdir"
# ggml (whisper.cpp's kernels) tunes itself to the machine it is compiled
# on unless told otherwise. A package is not always built on the machine it
# runs on, and a binary that faults on a CPU without AVX-512 is a bad trade
# for kernels nobody measured. Off, it compiles to the portable baseline.
export GGML_NATIVE=OFF
# vite build -> desktop/dist, which tauri-build embeds into the binary # --features wgpu: FemtoVG over wgpu instead of the default Skia renderer.
npm run build # skia-bindings downloads prebuilt binaries from its build script, which a
# package cannot do; the wgpu renderer is pure Rust. This is the same
cd src-tauri # choice, for the same reason, that upstream's flake.nix makes.
cargo build --release --frozen #
# --profile app: upstream's shipping profile - fat LTO, panic=abort,
# stripped. See engine/Cargo.toml for what each knob is for.
cargo build --profile app -p concat --frozen \
--no-default-features --features wgpu
} }
package() { package() {
cd "$_srcname" cd "$_srcname"
# same paths the upstream .deb installs: the project is mid-rename and its install -Dm755 "engine/target/app/concat" "$pkgdir/usr/bin/concat"
# executable, desktop entry and icons all still carry the old name
install -Dm755 "desktop/src-tauri/target/release/wolfcut-desktop" \
"$pkgdir/usr/bin/wolfcut-desktop"
# the AUR package is named after the project, the executable after what the # The desktop entry upstream's release workflow writes into the Linux
# project used to be called - keep it reachable under both # tarball; there is none in the tree, because the Nix build generates its
ln -s wolfcut-desktop "$pkgdir/usr/bin/concat" # own. Reproduced here so this package and concat-bin install the same one.
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/concat.desktop" <<'EOF'
# tauri only writes a desktop entry when it bundles, and the one it puts in
# the .deb has an empty Categories=. This is that entry with the categories
# upstream's Nix build sets.
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/WolfCut.desktop" <<'EOF'
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Name=WolfCut Name=Concat
Comment=Free and open source video editor Comment=Video editor
Exec=wolfcut-desktop Exec=concat
Icon=wolfcut-desktop Icon=concat
Categories=AudioVideo;Video;
Terminal=false Terminal=false
Categories=AudioVideo;AudioVideoEditing;
StartupWMClass=wolfcut-desktop
EOF EOF
install -Dm644 "desktop/src-tauri/icons/32x32.png" \ install -Dm644 "assets/icons/concat_logo_256.png" \
"$pkgdir/usr/share/icons/hicolor/32x32/apps/wolfcut-desktop.png" "$pkgdir/usr/share/icons/hicolor/256x256/apps/concat.png"
install -Dm644 "desktop/src-tauri/icons/128x128.png" \ install -Dm644 "assets/concat_logo_512.png" \
"$pkgdir/usr/share/icons/hicolor/128x128/apps/wolfcut-desktop.png" "$pkgdir/usr/share/icons/hicolor/512x512/apps/concat.png"
install -Dm644 "desktop/src-tauri/icons/128x128@2x.png" \
"$pkgdir/usr/share/icons/hicolor/256x256@2/apps/wolfcut-desktop.png"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
install -Dm644 LICENSE-EXCEPTIONS.md \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE-EXCEPTIONS.md"
install -Dm644 THIRD_PARTY_NOTICES.md \
"$pkgdir/usr/share/licenses/$pkgname/THIRD_PARTY_NOTICES.md"
} }
+21 -18
View File
@@ -1,12 +1,12 @@
# concat - Concat (https://github.com/jub0t/Concat), a free and open-source # concat - Concat (https://github.com/jub0t/Concat), a free and open-source
# CapCut replacement: a Tauri 2 shell around a Rust video engine. # CapCut replacement.
# #
# Source package: the PKGBUILD builds the Tauri binary from the release # Source package: the PKGBUILD builds the editor from the release tarball -
# tarball - the same executable upstream wraps into the .deb that concat-bin # the same binary upstream ships in the Linux tarball that concat-bin
# repackages. Upstream's flake.nix is the reference for what that needs, and # repackages. Upstream's flake.nix is the reference for what that needs, and
# this follows it: JS toolchain plus cargo, and WOLFCUT_SYSTEM_TOOLS=1 to opt # this follows it: cargo, cmake and clang, the system FFmpeg, and Slint's
# out of staging a private ffmpeg/whisper-cli into the bundle, because Arch # FemtoVG-over-wgpu renderer instead of the default Skia one, because
# packages both and the app falls back to PATH. # skia-bindings downloads its binaries from the build script.
# #
# sherpa-onnx-sys, the text-to-speech backend, ships no C++ build: its build # sherpa-onnx-sys, the text-to-speech backend, ships no C++ build: its build
# script downloads a prebuilt static-lib archive from the sherpa-onnx release # script downloads a prebuilt static-lib archive from the sherpa-onnx release
@@ -16,23 +16,22 @@
# upstream's Cargo.lock, so refresh_checksums() reads it from the tarball and # upstream's Cargo.lock, so refresh_checksums() reads it from the tarball and
# syncs the _sherpa variable in the PKGBUILD. # syncs the _sherpa variable in the PKGBUILD.
# #
# Release/version handling is identical to concat-bin: every upstream release # Release/version handling is identical to concat-bin: the release list is
# is a "v<version>-alpha.<n>" prerelease published on a push to main, the # ordered by creation rather than by version, so the newest is picked by
# release list is ordered by creation rather than by version (v0.2.0-alpha.10 # publication date, only tags that start with a version count, and pkgver
# sits between alpha.2 and alpha.1), so the newest is picked by publication # drops the hyphens - see concat-bin/pkg.sh.
# date, and pkgver drops the hyphens - see concat-bin/pkg.sh.
# Not on the AUR yet. concat-git goes up first; these two follow once the # Not on the AUR yet. concat-git goes up first; these two follow once the
# alpha-per-push release cadence has been lived with for a while - upstream # release cadence has been lived with for a while - upstream published
# publishes several a day, and each one is an AUR push (and, for concat, a # several alphas a day before 0.2.1, and each one is an AUR push (and, for
# full Rust build in CI). Flip this to true to publish; until then the # concat, a full Rust build in CI). Flip this to true to publish; until then
# PKGBUILD is still kept current and test-built here. # the PKGBUILD is still kept current and test-built here.
AUR_PUBLISH=false AUR_PUBLISH=false
UPSTREAM_REPO="jub0t/Concat" UPSTREAM_REPO="jub0t/Concat"
# Installed in CI (pacman) before the makepkg test build. # Installed in CI (pacman) before the makepkg test build.
BUILD_DEPS=(rust npm webkit2gtk-4.1 gtk3 libsoup3 alsa-lib) BUILD_DEPS=(rust cmake clang pkgconf ffmpeg alsa-lib fontconfig freetype2)
latest_tag() { latest_tag() {
gh api "repos/$UPSTREAM_REPO/releases?per_page=100" \ gh api "repos/$UPSTREAM_REPO/releases?per_page=100" \
@@ -70,8 +69,12 @@ refresh_checksums() {
fi fi
sha_src="$(sha256sum "$tarball" | cut -d' ' -f1)" sha_src="$(sha256sum "$tarball" | cut -d' ' -f1)"
sherpa="$(tar -xOzf "$tarball" --wildcards '*/desktop/src-tauri/Cargo.lock' \ # `|| true`, so that a tree that has moved the lockfile or dropped the crate
| grep -A2 '^name = "sherpa-onnx-sys"' | sed -n 's/^version = "\(.*\)"/\1/p')" # is reported below instead of ending the run on grep's exit status with
# nothing printed.
sherpa="$(tar -xOzf "$tarball" --wildcards '*/engine/Cargo.lock' \
| grep -A2 '^name = "sherpa-onnx-sys"' | sed -n 's/^version = "\(.*\)"/\1/p' \
|| true)"
rm -f "$tarball" rm -f "$tarball"
if [[ -z "$sherpa" ]]; then if [[ -z "$sherpa" ]]; then
+26 -2
View File
@@ -3,14 +3,38 @@
# Upstream hosts versioned prebuilt binaries itself, so there is no # Upstream hosts versioned prebuilt binaries itself, so there is no
# build_artifact() here: on a new version only pkgver and the checksums # build_artifact() here: on a new version only pkgver and the checksums
# are refreshed and the result is pushed to the AUR. # are refreshed and the result is pushed to the AUR.
#
# The download API has one URL shape per channel, and this package follows
# "stable". Its /latest currently 302s into the canary channel - upstream has
# published nothing to stable since 0.0.8, and the pointer falls through to
# the channel that is moving. A canary build is a nightly, not what a package
# called fluxer-bin ships, so latest_version() recognises the fall-through
# and reports EX_TEMPFAIL instead of a version; see below.
DL_BASE="https://api.fluxer.app/dl/desktop/stable/linux" DL_BASE="https://api.fluxer.app/dl/desktop/stable/linux"
latest_version() { latest_version() {
local name ver
# the download API exposes the current version in the attachment filename, # the download API exposes the current version in the attachment filename,
# e.g. content-disposition: attachment; filename="fluxer-stable-0.0.8-x64.tar.gz" # e.g. content-disposition: attachment; filename="fluxer-stable-0.0.8-x64.tar.gz"
curl -sfI "$DL_BASE/x64/latest/tar_gz" \ #
| grep -oiP 'filename="fluxer-(stable-)?\K[0-9][^"]*(?=-x64\.tar\.gz)' # -L, and the last filename of the chain: when the stable channel has no
# current build the request is redirected to another channel, and the
# filename it answers with is how that becomes visible here.
name="$(curl -sfIL "$DL_BASE/x64/latest/tar_gz" \
| grep -oiP 'filename="\K[^"]+' | tail -n1)"
ver="$(grep -oiP '^fluxer-(stable-)?\K[0-9][^"]*(?=-x64\.tar\.gz$)' <<< "$name" \
|| true)"
if [[ -z "$ver" ]]; then
# e.g. Fluxer-Canary-2026.904.135113-linux-x64.tar.gz - the canary channel
echo "the stable channel's latest download is \"$name\", which is not a" \
"stable build - nothing to update to" >&2
return 75
fi
printf '%s\n' "$ver"
} }
# refresh_checksums <version> <pkgbuild-path> # refresh_checksums <version> <pkgbuild-path>
+12 -1
View File
@@ -34,7 +34,18 @@ BUILD_DEPS=()
AUR_PUBLISH=true AUR_PUBLISH=true
source "$pkg/pkg.sh" source "$pkg/pkg.sh"
ver="$(latest_version || true)" # A package whose upstream release channel is temporarily out of order - a
# "latest" pointer that has stopped pointing at a release - can return 75
# (EX_TEMPFAIL) from latest_version instead of printing one. There is nothing
# to update while that lasts and nothing wrong with the package, so the run
# warns and stops rather than going red, and the next one picks it up.
rc=0
ver="$(latest_version)" || rc=$?
if [[ "$rc" -eq 75 ]]; then
echo "::warning::$pkg: upstream has no current release to track right now -" \
"leaving the package as it is, the next run tries again."
exit 0
fi
if [[ -z "$ver" || "$ver" == "null" ]]; then if [[ -z "$ver" || "$ver" == "null" ]]; then
echo "::error::$pkg: could not determine the latest upstream version" echo "::error::$pkg: could not determine the latest upstream version"
exit 1 exit 1