concat, concat-bin, concat-git: new packages
Concat (https://github.com/jub0t/Concat) is a Tauri 2 shell around a Rust video engine, sold as a CapCut replacement. The project is mid-rename: the binary, the desktop entry, the icons and the .deb asset all still say WolfCut, so the packages install upstream's paths unchanged and add a /usr/bin/concat symlink. Upstream stages a static ffmpeg/ffprobe pair (180 MB) and whisper-cli inside its bundle so the app runs on a machine with nothing installed. Both lookups fall back to PATH, so concat-bin drops those two directories and the source packages set WOLFCUT_SYSTEM_TOOLS=1 - the switch upstream put in build.rs for exactly this case - leaving ffmpeg and whisper-cpp to Arch. That is 17 MB installed instead of 225 MB. !lto is not optional: makepkg's lto puts -flto=auto into CFLAGS, and ring compiles hand-written assembly through cc, which then comes out as bitcode and links to nothing. sherpa-onnx-sys ships no C++ build; its build script downloads a prebuilt static-lib archive. concat lists that archive as a checksummed source and points the build script at it, with the version read out of upstream's Cargo.lock by pkg.sh. concat-git cannot pin it - the version moves with main - so there the build script fetches it. Every upstream release is a v<version>-alpha.<n> prerelease published on a push to main, several a day, and the release list is ordered by creation rather than by version, so the newest is picked by publication date. Only concat-git is published for now; concat and concat-bin are held back with AUR_PUBLISH=false until that cadence has been lived with.
This commit is contained in:
1 parent
9b97159b72
commit
a9c122584a
10 files changed
+624
No files matched your search
@@ -0,0 +1,35 @@
|
||||
pkgbase = concat
|
||||
pkgdesc = Free and open-source CapCut replacement, a Tauri video editor with a Rust engine
|
||||
pkgver = 0.2.0alpha.15
|
||||
pkgrel = 1
|
||||
url = https://github.com/jub0t/Concat
|
||||
arch = x86_64
|
||||
license = MPL-2.0
|
||||
makedepends = rust
|
||||
makedepends = npm
|
||||
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 = 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
|
||||
options = !debug
|
||||
options = !lto
|
||||
source = concat-0.2.0alpha.15.tar.gz::https://github.com/jub0t/Concat/archive/refs/tags/v0.2.0-alpha.15.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 = 2b77c892fdd10f1cc93842bd8f0c30504ef17c797ddf386bc100308d175c4c8c
|
||||
sha256sums = fe4968c3cd2ad3dfd1ea925500e5542aef70dd7119847257ffde95d6260cd629
|
||||
|
||||
pkgname = concat
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
# Maintainer: Felitendo
|
||||
# This PKGBUILD is updated automatically:
|
||||
# https://github.com/Felitendo/PKGBUILDS
|
||||
|
||||
pkgname=concat
|
||||
pkgver=0.2.0alpha.15
|
||||
pkgrel=1
|
||||
pkgdesc="Free and open-source CapCut replacement, a Tauri 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.
|
||||
# !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.
|
||||
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.15"
|
||||
# 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"
|
||||
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=('2b77c892fdd10f1cc93842bd8f0c30504ef17c797ddf386bc100308d175c4c8c' 'fe4968c3cd2ad3dfd1ea925500e5542aef70dd7119847257ffde95d6260cd629')
|
||||
|
||||
_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"
|
||||
|
||||
export RUSTUP_TOOLCHAIN=stable
|
||||
cd src-tauri
|
||||
cargo fetch --locked --target "$(rustc -vV | sed -n 's/^host: //p')"
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$_srcname/desktop"
|
||||
|
||||
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"
|
||||
|
||||
# vite build -> desktop/dist, which tauri-build embeds into the binary
|
||||
npm run build
|
||||
|
||||
cd src-tauri
|
||||
cargo build --release --frozen
|
||||
}
|
||||
|
||||
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"
|
||||
|
||||
# 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'
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=WolfCut
|
||||
Comment=Free and open source video editor
|
||||
Exec=wolfcut-desktop
|
||||
Icon=wolfcut-desktop
|
||||
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 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
# concat - Concat (https://github.com/jub0t/Concat), a free and open-source
|
||||
# CapCut replacement: a Tauri 2 shell around a Rust video engine.
|
||||
#
|
||||
# Source package: the PKGBUILD builds the Tauri binary from the release
|
||||
# tarball - the same executable upstream wraps into the .deb 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.
|
||||
#
|
||||
# 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
|
||||
# page. The PKGBUILD lists that archive as a source and points the build
|
||||
# script at it (SHERPA_ONNX_ARCHIVE_DIR), so the binary is checksummed by
|
||||
# makepkg rather than fetched unverified mid-build. Its version has to follow
|
||||
# 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.
|
||||
|
||||
# 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.
|
||||
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)
|
||||
|
||||
latest_tag() {
|
||||
gh api "repos/$UPSTREAM_REPO/releases?per_page=100" \
|
||||
--jq '[.[] | select(.draft | not) | select(.tag_name | test("^v[0-9]"))]
|
||||
| sort_by(.published_at) | last | .tag_name'
|
||||
}
|
||||
|
||||
tag_to_pkgver() {
|
||||
sed 's/^v//; s/-//g'
|
||||
}
|
||||
|
||||
latest_version() {
|
||||
latest_tag | tag_to_pkgver
|
||||
}
|
||||
|
||||
# refresh_checksums <version> <pkgbuild-path>
|
||||
refresh_checksums() {
|
||||
local ver="$1" pkgbuild="$2"
|
||||
local tag tarball sherpa sha_src sha_sherpa
|
||||
|
||||
tag="$(latest_tag)"
|
||||
if [[ "$(tag_to_pkgver <<< "$tag")" != "$ver" ]]; then
|
||||
echo "newest versioned release is $tag, not the requested $ver - try again" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# kept on disk rather than streamed: the tarball is needed twice, once for
|
||||
# its checksum and once for the Cargo.lock inside it
|
||||
tarball="$(mktemp)"
|
||||
if ! curl -sfL -o "$tarball" \
|
||||
"https://github.com/$UPSTREAM_REPO/archive/refs/tags/$tag.tar.gz"; then
|
||||
rm -f "$tarball"
|
||||
echo "could not download the $tag source tarball" >&2
|
||||
return 1
|
||||
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')"
|
||||
rm -f "$tarball"
|
||||
|
||||
if [[ -z "$sherpa" ]]; then
|
||||
echo "could not read the sherpa-onnx-sys version from $tag's Cargo.lock" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
sha_sherpa="$(curl -sfL "https://github.com/k2-fsa/sherpa-onnx/releases/download/v$sherpa/sherpa-onnx-v$sherpa-linux-x64-static-lib.tar.bz2" \
|
||||
| sha256sum | cut -d' ' -f1)"
|
||||
|
||||
sed -i \
|
||||
-e "s|^_tag=.*|_tag=\"$tag\"|" \
|
||||
-e "s|^_sherpa=.*|_sherpa=\"$sherpa\"|" \
|
||||
-e "s|^sha256sums=.*|sha256sums=('$sha_src' '$sha_sherpa')|" \
|
||||
"$pkgbuild"
|
||||
}
|
||||
Reference in new issue
Block a user