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

+23 -21
View File
@@ -1,35 +1,37 @@
pkgbase = concat
pkgdesc = Free and open-source CapCut replacement, a Tauri video editor with a Rust engine
pkgver = 0.2.0alpha.21
pkgdesc = Free and open-source CapCut replacement, a video editor with a Rust engine
pkgver = 0.2.1
pkgrel = 1
url = https://github.com/jub0t/Concat
arch = x86_64
license = MPL-2.0
license = AGPL-3.0-or-later
makedepends = rust
makedepends = npm
makedepends = cmake
makedepends = clang
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 = 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 = glibc
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
noextract = sherpa-onnx-v1.13.6-linux-x64-static-lib.tar.bz2
noextract = sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2
options = !debug
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 = https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.13.6/sherpa-onnx-v1.13.6-linux-x64-static-lib.tar.bz2
sha256sums = d90957c50750926c590dd5e26711b47f42cbac6c34246007d1cc8ca7210db3dd
sha256sums = fe4968c3cd2ad3dfd1ea925500e5542aef70dd7119847257ffde95d6260cd629
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.7/sherpa-onnx-v1.13.7-linux-x64-static-lib.tar.bz2
sha256sums = 3dfe1c7854b543c0bf86e239b1f02c65b14ba9b77c78ad8aa94026eeee6ebb9e
sha256sums = d1be7a69ac2b30120058d8302e624239a3064085383cfa47994a14fdc44c32d6
pkgname = concat
+60 -71
View File
@@ -3,119 +3,108 @@
# https://github.com/Felitendo/PKGBUILDS
pkgname=concat
pkgver=0.2.0alpha.21
pkgver=0.2.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')
url="https://github.com/jub0t/Concat"
license=('MPL-2.0')
# glib-networking is what gives the webview a TLS backend; alsa-lib is the
# engine's cpal playback backend; every media operation spawns the ffmpeg
# pair - see the WOLFCUT_SYSTEM_TOOLS note below. The model downloads carry
# their own TLS (rustls), so nothing here links openssl.
depends=('webkit2gtk-4.1' 'gtk3' 'glib2' 'libsoup3' 'gdk-pixbuf2' 'cairo'
'dbus' 'glib-networking' 'alsa-lib' 'ffmpeg' 'gcc-libs' 'glibc'
'hicolor-icon-theme')
makedepends=('rust' 'npm' 'pkgconf')
# wgpu picks its backend at run time: Vulkan first, GL as the fallback. Both
# loaders come from the driver stack every desktop already has, so neither is
# a hard dependency of the editor.
optdepends=('whisper-cpp: on-device auto-captions and transcription'
'vulkan-icd-loader: Vulkan compositor backend'
'libglvnd: OpenGL compositor backend')
# !debug: the release profile already sets strip = true, so there is nothing
# left to split into a debug package.
license=('AGPL-3.0-or-later')
# Nothing is spawned at run time: FFmpeg is linked, whisper.cpp and
# sherpa-onnx are compiled in. alsa-lib is cpal's playback backend;
# fontconfig and freetype are the font side of the renderer; libglvnd and
# vulkan-icd-loader are the two backends wgpu picks between, and the rest is
# what winit opens by name for whichever session the user is in. dbus is the
# XDG portal, which is how the file dialogs and "reveal in file manager"
# work without a toolkit.
depends=('ffmpeg' 'alsa-lib' 'fontconfig' 'freetype2' 'libglvnd'
'vulkan-icd-loader' 'libxkbcommon' 'libxkbcommon-x11' 'libx11'
'libxcursor' 'libxi' 'libxrender' 'wayland' 'dbus' 'gcc-libs'
'glibc' 'hicolor-icon-theme')
# clang: bindgen (FFmpeg headers, whisper.cpp) needs libclang.
# cmake: whisper.cpp is compiled in, by its own CMake build.
makedepends=('rust' 'cmake' 'clang' 'pkgconf')
# !debug: the app profile strips symbols itself, so there is nothing left to
# split into a debug package.
# !lto: makepkg's lto puts -flto=auto into CFLAGS, and ring - the crypto
# 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
# in the release profile and is unaffected.
# in the app profile and is unaffected.
options=('!debug' '!lto')
# Upstream has no stable release yet: the build workflow publishes a
# v<version>-alpha.<n> prerelease for every green push to main. Only the
# versioned tags are packaged, and pkgver drops their hyphens
# (v0.2.0-alpha.15 -> 0.2.0alpha.15), which pacman sorts older than a later
# plain 0.2.0, so no epoch is needed. See pkg.sh.
_tag="v0.2.0-alpha.21"
# Only tags that start with a version are packaged, and pkgver drops their
# hyphens (v0.2.2-alpha.1 -> 0.2.2alpha.1), which pacman sorts older than a
# later plain 0.2.2, so no epoch is needed. See pkg.sh.
_tag="v0.2.1"
# 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 is handed one. Handing it one keeps that binary under makepkg's
# checksums instead of arriving unverified from a build script. The version
# 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"
"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")
sha256sums=('d90957c50750926c590dd5e26711b47f42cbac6c34246007d1cc8ca7210db3dd' 'fe4968c3cd2ad3dfd1ea925500e5542aef70dd7119847257ffde95d6260cd629')
sha256sums=('3dfe1c7854b543c0bf86e239b1f02c65b14ba9b77c78ad8aa94026eeee6ebb9e' 'd1be7a69ac2b30120058d8302e624239a3064085383cfa47994a14fdc44c32d6')
_srcname="Concat-${_tag#v}"
prepare() {
cd "$_srcname/desktop"
# 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"
cd "$_srcname/engine"
export RUSTUP_TOOLCHAIN=stable
cd src-tauri
cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')"
}
build() {
cd "$_srcname/desktop"
cd "$_srcname/engine"
export RUSTUP_TOOLCHAIN=stable
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()
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
npm run build
cd src-tauri
cargo build --release --frozen
# --features wgpu: FemtoVG over wgpu instead of the default Skia renderer.
# skia-bindings downloads prebuilt binaries from its build script, which a
# package cannot do; the wgpu renderer is pure Rust. This is the same
# choice, for the same reason, that upstream's flake.nix makes.
#
# --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() {
cd "$_srcname"
# same paths the upstream .deb installs: the project is mid-rename and its
# 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"
install -Dm755 "engine/target/app/concat" "$pkgdir/usr/bin/concat"
# the AUR package is named after the project, the executable after what the
# project used to be called - keep it reachable under both
ln -s wolfcut-desktop "$pkgdir/usr/bin/concat"
# 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'
# The desktop entry upstream's release workflow writes into the Linux
# tarball; there is none in the tree, because the Nix build generates its
# own. Reproduced here so this package and concat-bin install the same one.
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/concat.desktop" <<'EOF'
[Desktop Entry]
Type=Application
Name=WolfCut
Comment=Free and open source video editor
Exec=wolfcut-desktop
Icon=wolfcut-desktop
Name=Concat
Comment=Video editor
Exec=concat
Icon=concat
Categories=AudioVideo;Video;
Terminal=false
Categories=AudioVideo;AudioVideoEditing;
StartupWMClass=wolfcut-desktop
EOF
install -Dm644 "desktop/src-tauri/icons/32x32.png" \
"$pkgdir/usr/share/icons/hicolor/32x32/apps/wolfcut-desktop.png"
install -Dm644 "desktop/src-tauri/icons/128x128.png" \
"$pkgdir/usr/share/icons/hicolor/128x128/apps/wolfcut-desktop.png"
install -Dm644 "desktop/src-tauri/icons/128x128@2x.png" \
"$pkgdir/usr/share/icons/hicolor/256x256@2/apps/wolfcut-desktop.png"
install -Dm644 "assets/icons/concat_logo_256.png" \
"$pkgdir/usr/share/icons/hicolor/256x256/apps/concat.png"
install -Dm644 "assets/concat_logo_512.png" \
"$pkgdir/usr/share/icons/hicolor/512x512/apps/concat.png"
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
# CapCut replacement: a Tauri 2 shell around a Rust video engine.
# CapCut replacement.
#
# Source package: the PKGBUILD builds the Tauri binary from the release
# tarball - the same executable upstream wraps into the .deb that concat-bin
# Source package: the PKGBUILD builds the editor from the release tarball -
# 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
# this follows it: JS toolchain plus cargo, and WOLFCUT_SYSTEM_TOOLS=1 to opt
# out of staging a private ffmpeg/whisper-cli into the bundle, because Arch
# packages both and the app falls back to PATH.
# this follows it: cargo, cmake and clang, the system FFmpeg, and Slint's
# FemtoVG-over-wgpu renderer instead of the default Skia one, because
# skia-bindings downloads its binaries from the build script.
#
# 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
@@ -16,23 +16,22 @@
# upstream's Cargo.lock, so refresh_checksums() reads it from the tarball and
# syncs the _sherpa variable in the PKGBUILD.
#
# Release/version handling is identical to concat-bin: every upstream release
# is a "v<version>-alpha.<n>" prerelease published on a push to main, the
# release list is ordered by creation rather than by version (v0.2.0-alpha.10
# sits between alpha.2 and alpha.1), so the newest is picked by publication
# date, and pkgver drops the hyphens - see concat-bin/pkg.sh.
# Release/version handling is identical to concat-bin: the release list is
# ordered by creation rather than by version, so the newest is picked by
# publication date, only tags that start with a version count, 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
# alpha-per-push release cadence has been lived with for a while - upstream
# publishes several a day, and each one is an AUR push (and, for concat, a
# full Rust build in CI). Flip this to true to publish; until then the
# PKGBUILD is still kept current and test-built here.
# release cadence has been lived with for a while - upstream published
# several alphas a day before 0.2.1, and each one is an AUR push (and, for
# concat, a full Rust build in CI). Flip this to true to publish; until then
# the PKGBUILD is still kept current and test-built here.
AUR_PUBLISH=false
UPSTREAM_REPO="jub0t/Concat"
# 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() {
gh api "repos/$UPSTREAM_REPO/releases?per_page=100" \
@@ -70,8 +69,12 @@ refresh_checksums() {
fi
sha_src="$(sha256sum "$tarball" | cut -d' ' -f1)"
sherpa="$(tar -xOzf "$tarball" --wildcards '*/desktop/src-tauri/Cargo.lock' \
| grep -A2 '^name = "sherpa-onnx-sys"' | sed -n 's/^version = "\(.*\)"/\1/p')"
# `|| true`, so that a tree that has moved the lockfile or dropped the crate
# 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"
if [[ -z "$sherpa" ]]; then