Release prep: 0.8.0 and a Linux riscv64 release build (#669)

* Release prep: bump to 0.8.0 and add a Linux riscv64 release build

- release.yml: new `linux-riscv64` job, ported from GridCraft. It cross-compiles on
  ubuntu-24.04 against riscv64 libraries from ports.ubuntu.com (the Linux job's X11/Wayland/GL
  -dev packages plus ALSA), ships effectcraft-<v>-linux-riscv64.tar.gz, and smoke-tests
  effectcraft-cli under qemu-riscv64. The draft-release job now needs it, so its tarball is
  uploaded and covered by SHA256SUMS.txt.
- packaging/linux/package.sh: cross-compiles when CROSS_ARCH/CROSS_TARGET/CROSS_COMPILE are set
  (cargo --target, the cross strip, the EMULATOR smoke test), as GridCraft's does.
- Version 0.7.0 -> 0.8.0 (cargo xtask version set), Cargo.lock refreshed.
- README and docs/releasing.md list the riscv64 tarball.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix FreeBSD CI: pointer_wrap test harness, wasm32 target, clippy as_chunks

- pointer_wrap tests: the harnesses dropped run_ui's FullOutput with the font atlas upload still
  in textures_delta, and epaint 0.36's drop check panics on that in debug builds. Every
  pointer_wrap test failed on every platform; FreeBSD is the only CI that runs them. Clear the
  delta, as the other UI tests do.
- freebsd.yml: install wasm32-unknown-unknown in the VM. Without it the host plug-in test's build
  of examples/plugins/posterize-bands failed (E0463, no std) and the test skipped silently; now
  it builds and runs.
- media/convert.rs: chunks_exact(2) -> as_chunks::<2>() (clippy chunks_exact_to_as_chunks,
  new in Rust 1.99); same pairs, same dropped remainder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon ThomasandClaude Opus 5.5 authored and GitHub committed 2026-10-10 21:08:18 -04:00
1 parent 4b58cd2eb7
commit f953cd2855
8 files changed
+135 -47

No files matched your search

+2
View File
@@ -41,6 +41,8 @@ jobs:
prepare: |
pkg install -y git curl pkgconf cmake python3 libxkbcommon wayland libX11 libXcursor libXrandr libXi libxcb mesa-libs vulkan-loader gtk3 fontconfig freetype2 alsa-lib
curl -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal
# The host tests build examples/plugins/posterize-bands for wasm32 and load it.
"$HOME/.cargo/bin/rustup" target add wasm32-unknown-unknown
run: |
. "$HOME/.cargo/env"
# The checkout is synced in under another owner; let tests that call git read it.
+63 -1
View File
@@ -213,6 +213,68 @@ jobs:
path: dist/release/*
if-no-files-found: error
linux-riscv64:
name: Linux riscv64
needs: version
# Cross-compiled on x86_64 (no hosted RISC-V runners) against the runner's own Ubuntu release
# from ports.ubuntu.com, so the binaries need that release's glibc (24.04: 2.39). 22.04's
# riscv64 ports lag its amd64 updates, which breaks the multiarch install. tar.gz only; the
# CLI is smoke-tested under QEMU.
runs-on: ubuntu-24.04
# No `environment: release`: this job signs nothing, so it gets no release secrets.
env:
EFFECTCRAFT_VERSION: ${{ needs.version.outputs.version }}
EFFECTCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@686976e191b89faba57d3206551f0f330d8cb249 # stable
with:
targets: riscv64gc-unknown-linux-gnu
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
key: release-linux-riscv64
- name: Apply version override
if: inputs.version != ''
run: cargo xtask version set "$EFFECTCRAFT_VERSION"
- name: Install cross-compilation dependencies
run: |
. /etc/os-release
sudo dpkg --add-architecture riscv64
# Pin the existing (archive.ubuntu.com) sources to amd64; riscv64 comes from ports.
if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then
sudo sed -i '/^Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
fi
if [ -f /etc/apt/sources.list ]; then
sudo sed -i 's/^deb /deb [arch=amd64] /g' /etc/apt/sources.list
sudo sed -i 's/^deb-src /deb-src [arch=amd64] /g' /etc/apt/sources.list
fi
for suite in "$VERSION_CODENAME" "$VERSION_CODENAME-updates" "$VERSION_CODENAME-security"; do
echo "deb [arch=riscv64] http://ports.ubuntu.com/ubuntu-ports $suite main universe restricted multiverse"
done | sudo tee /etc/apt/sources.list.d/riscv64.list
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu libc6-dev-riscv64-cross libc6-dev:riscv64 qemu-user \
libxkbcommon-dev:riscv64 libwayland-dev:riscv64 libx11-dev:riscv64 libxrandr-dev:riscv64 \
libxi-dev:riscv64 libgl1-mesa-dev:riscv64 libasound2-dev:riscv64 \
desktop-file-utils appstream
- name: Build and package (tar.gz)
env:
CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER: riscv64-linux-gnu-gcc
PKG_CONFIG_SYSROOT_DIR: /
PKG_CONFIG_PATH: /usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig
PKG_CONFIG_ALLOW_CROSS: "1"
CROSS_ARCH: riscv64
CROSS_TARGET: riscv64gc-unknown-linux-gnu
CROSS_COMPILE: riscv64-linux-gnu-
EMULATOR: qemu-riscv64
QEMU_LD_PREFIX: /usr/riscv64-linux-gnu
run: packaging/linux/package.sh --formats tar
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: release-linux-riscv64
path: dist/release/*.tar.gz
if-no-files-found: error
flatpak:
name: Flatpak ${{ matrix.arch }}
needs: [version, linux]
@@ -333,7 +395,7 @@ jobs:
release:
name: Draft GitHub Release
# Needs the signed jobs, so a dry run on a branch (where they are refused) never gets here.
needs: [version, macos, windows, linux, flatpak, freebsd, web]
needs: [version, macos, windows, linux, linux-riscv64, flatpak, freebsd, web]
runs-on: ubuntu-latest
environment: release
permissions:
Generated
+36 -36
View File
@@ -1134,7 +1134,7 @@ dependencies = [
[[package]]
name = "effectcraft"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"cpal",
"effectcraft-engine",
@@ -1158,7 +1158,7 @@ dependencies = [
[[package]]
name = "effectcraft-automation"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-engine",
"effectcraft-host",
@@ -1170,14 +1170,14 @@ dependencies = [
[[package]]
name = "effectcraft-av1enc"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"filmcraft-av1",
]
[[package]]
name = "effectcraft-cli"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"cpu-time",
"effectcraft-automation",
@@ -1193,7 +1193,7 @@ dependencies = [
[[package]]
name = "effectcraft-color"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"proptest",
"serde",
@@ -1201,7 +1201,7 @@ dependencies = [
[[package]]
name = "effectcraft-effects"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1218,7 +1218,7 @@ dependencies = [
[[package]]
name = "effectcraft-engine"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-effects",
@@ -1251,7 +1251,7 @@ dependencies = [
[[package]]
name = "effectcraft-export"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-av1enc",
"effectcraft-color",
@@ -1281,7 +1281,7 @@ dependencies = [
[[package]]
name = "effectcraft-expr"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"boa_engine",
"effectcraft-color",
@@ -1298,7 +1298,7 @@ dependencies = [
[[package]]
name = "effectcraft-geom"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"proptest",
"serde",
@@ -1306,7 +1306,7 @@ dependencies = [
[[package]]
name = "effectcraft-gpu"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"bytemuck",
"effectcraft-color",
@@ -1328,14 +1328,14 @@ dependencies = [
[[package]]
name = "effectcraft-hevcenc"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"filmcraft-hevc",
]
[[package]]
name = "effectcraft-host"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-engine",
"effectcraft-export",
@@ -1359,7 +1359,7 @@ dependencies = [
[[package]]
name = "effectcraft-interchange"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-keyframe",
@@ -1378,7 +1378,7 @@ dependencies = [
[[package]]
name = "effectcraft-keyframe"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1390,7 +1390,7 @@ dependencies = [
[[package]]
name = "effectcraft-lottie"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-effects",
@@ -1407,7 +1407,7 @@ dependencies = [
[[package]]
name = "effectcraft-media"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-model",
"effectcraft-pdf",
@@ -1433,7 +1433,7 @@ dependencies = [
[[package]]
name = "effectcraft-model"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-geom",
"image",
@@ -1444,14 +1444,14 @@ dependencies = [
[[package]]
name = "effectcraft-opusenc"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"filmcraft-opus",
]
[[package]]
name = "effectcraft-path"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-geom",
"effectcraft-keyframe",
@@ -1463,7 +1463,7 @@ dependencies = [
[[package]]
name = "effectcraft-pdf"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-raster",
"effectcraft-svg",
@@ -1477,7 +1477,7 @@ dependencies = [
[[package]]
name = "effectcraft-plugin"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-effects",
"effectcraft-keyframe",
@@ -1489,7 +1489,7 @@ dependencies = [
[[package]]
name = "effectcraft-project"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1502,14 +1502,14 @@ dependencies = [
[[package]]
name = "effectcraft-psd"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"miniz_oxide 0.8.9",
]
[[package]]
name = "effectcraft-raster"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1518,7 +1518,7 @@ dependencies = [
[[package]]
name = "effectcraft-render"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-effects",
@@ -1540,7 +1540,7 @@ dependencies = [
[[package]]
name = "effectcraft-script"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"boa_engine",
"effectcraft-engine",
@@ -1555,7 +1555,7 @@ dependencies = [
[[package]]
name = "effectcraft-segment"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"miniz_oxide 0.8.9",
"ndarray",
@@ -1564,7 +1564,7 @@ dependencies = [
[[package]]
name = "effectcraft-svg"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-geom",
"effectcraft-path",
@@ -1576,7 +1576,7 @@ dependencies = [
[[package]]
name = "effectcraft-text"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-keyframe",
"harfrust",
@@ -1588,7 +1588,7 @@ dependencies = [
[[package]]
name = "effectcraft-time"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"proptest",
"serde",
@@ -1596,7 +1596,7 @@ dependencies = [
[[package]]
name = "effectcraft-track"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-raster",
"effectcraft-segment",
@@ -1608,7 +1608,7 @@ dependencies = [
[[package]]
name = "effectcraft-ui-egui"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-color",
"effectcraft-engine",
@@ -1639,11 +1639,11 @@ dependencies = [
[[package]]
name = "effectcraft-vp9enc"
version = "0.7.0"
version = "0.8.0"
[[package]]
name = "effectcraft-web"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"effectcraft-engine",
"effectcraft-export",
@@ -6453,7 +6453,7 @@ checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
[[package]]
name = "xtask"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"serde_json",
]
+1 -1
View File
@@ -4,7 +4,7 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/*"]
[workspace.package]
version = "0.7.0"
version = "0.8.0"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
+3 -1
View File
@@ -184,7 +184,7 @@ See [docs/agents.md](docs/agents.md) and [docs/control-protocol.md](docs/control
Installers for each version are on the [Releases](https://github.com/storytold/effectcraft/releases)
page: a universal macOS app; Windows MSIs and portable zips for x64, x86 and ARM64; Linux
AppImage, Flatpak, deb, rpm and tar.gz for x86_64 and aarch64; a FreeBSD x86_64 tarball; and the
AppImage, Flatpak, deb, rpm and tar.gz for x86_64 and aarch64, plus a riscv64 tar.gz; a FreeBSD x86_64 tarball; and the
web build. [Downloads](#downloads) lists every file. The Windows ARM64 build runs natively on
Windows on ARM, without x64 emulation. CI installs that MSI on Windows 11 ARM64 hardware, checks
both programs are ARM64 and runs the command-line tool there, but it doesn't open the app's window
@@ -287,6 +287,8 @@ into a folder of your choice: `msiexec /i effectcraft-<ver>-windows-x64.msi /qn
| Fedora/RHEL/openSUSE | `effectcraft-<ver>-linux-x86_64.rpm` | `effectcraft-<ver>-linux-aarch64.rpm` | |
| Tarball | `effectcraft-<ver>-linux-x86_64.tar.gz` | `effectcraft-<ver>-linux-aarch64.tar.gz` | Unpack anywhere |
RISC-V 64-bit: `effectcraft-<ver>-linux-riscv64.tar.gz` (tarball only; needs glibc 2.39+, e.g. Ubuntu 24.04+ or Debian 13+).
**File drag-and-drop on Linux:** The current eframe/winit 0.30 native Wayland backend does not
deliver file-hover or file-drop events. On Hyprland and other native Wayland sessions, use
**File ▸ Import ▸ File…** (which accepts multiple files), or start EffectCraft via XWayland if
+1 -1
View File
@@ -154,7 +154,7 @@ fn half_420<T: Sample>(w: usize, h: usize, [luma, cb, cr]: [&[T]; 3], k: &Yuv) -
(dst[0], dst[cw + 1]) = (dst[1], dst[cw]);
}
let (top, bottom) = (row_of(luma, 2 * cy, w), row_of(luma, 2 * cy + 1, w));
let pixels = top.chunks_exact(2).zip(bottom.chunks_exact(2)).zip(uc.windows(3).zip(vc.windows(3)));
let pixels = top.as_chunks::<2>().0.iter().zip(bottom.as_chunks::<2>().0).zip(uc.windows(3).zip(vc.windows(3)));
for (o, ((a, b), (u, v))) in row.iter_mut().zip(pixels) {
let (u, v) = ((u[0] + u[2]) * 0.125 + u[1] * 0.75, (v[0] + v[2]) * 0.125 + v[1] * 0.75);
let yy = ((a[0].f() + a[1].f() + b[0].f() + b[1].f()) * 0.25 - k.y_off) * k.y_scale;
+9
View File
@@ -58,6 +58,7 @@ jobs are refused by the environment's branch rule, and no draft release is made.
| Windows 11 ARM64 | `effectcraft-<v>-windows-arm64.msi`, `effectcraft-<v>-windows-arm64-portable.zip` | cross-compiled on `windows-latest` |
| Linux x86_64 | `effectcraft-<v>-linux-x86_64.{AppImage,deb,rpm,tar.gz}` | `ubuntu-22.04` |
| Linux aarch64 | `effectcraft-<v>-linux-aarch64.{AppImage,deb,rpm,tar.gz}` | `ubuntu-22.04-arm` |
| Linux riscv64 | `effectcraft-<v>-linux-riscv64.tar.gz` | cross-compiled on `ubuntu-24.04` (CLI smoke-tested under QEMU) |
| Linux AppImage updates | `effectcraft-<v>-linux-{x86_64,aarch64}.AppImage.zsync` | with the AppImages |
| Flatpak x86_64, aarch64 | `effectcraft-<v>-linux-{x86_64,aarch64}.flatpak` (the Linux tarball, repackaged) | `ubuntu-24.04`, `ubuntu-24.04-arm` |
| FreeBSD 14+ x86_64 | `effectcraft-<v>-freebsd-x86_64.tar.gz` | a FreeBSD 14.3 VM on `ubuntu-latest` |
@@ -85,6 +86,14 @@ RHEL 10. Building on a newer image would silently raise that floor. `packaging/l
builds the AppImage, `.deb`, `.rpm` and tarball; the workflow then runs the AppImage's
`--version` as a smoke test.
### Linux: riscv64
GitHub has no RISC-V runners, so the `linux-riscv64` job cross-compiles on `ubuntu-24.04` for
`riscv64gc-unknown-linux-gnu`, against riscv64 libraries (X11/Wayland/GL, ALSA) from
ports.ubuntu.com. It ships the tarball only, needs glibc 2.39 (Ubuntu 24.04+, Debian 13+), and runs
`effectcraft-cli --version` under `qemu-riscv64` as a smoke test. `package.sh` cross-compiles when
`CROSS_ARCH`, `CROSS_TARGET` and `CROSS_COMPILE` are set (see its header).
### Linux: AppImage updates and Flatpak
Each AppImage embeds update information
+20 -7
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Build and package EffectCraft for Linux (<arch> is x86_64 or aarch64):
# Build and package EffectCraft for Linux (<arch> is x86_64 or aarch64, or riscv64 when cross-compiling):
#
# $DIST/effectcraft-<version>-linux-<arch>.AppImage any distro with glibc >= the build host's
# $DIST/effectcraft-<version>-linux-<arch>.AppImage.zsync delta updates (needs zsyncmake)
@@ -13,6 +13,10 @@
# (downloaded into $CARGO_TARGET_DIR if missing). Build on an old distro (CI: Ubuntu 22.04,
# glibc 2.35) so the binaries run on newer ones. Optional: desktop-file-validate, appstreamcli,
# zsyncmake (the zsync package) for the AppImage's .zsync.
#
# Cross-compiling (CI: riscv64, tar only): set CROSS_ARCH (riscv64), CROSS_TARGET (the Rust target),
# CROSS_COMPILE (the binutils prefix, for strip) and optionally EMULATOR (qemu-riscv64) to smoke-test
# the CLI.
set -euo pipefail
# shellcheck source=../env.sh
. "$(dirname "${BASH_SOURCE[0]}")/../env.sh"
@@ -25,13 +29,14 @@ while [ $# -gt 0 ]; do
case "$1" in
--skip-build) SKIP_BUILD=1; shift ;;
--formats) FORMATS="$2"; shift 2 ;;
-h | --help) sed -n '2,17p' "$0"; exit 0 ;;
-h | --help) sed -n '2,19p' "$0"; exit 0 ;;
*) echo "unknown argument: $1" >&2; exit 2 ;;
esac
done
ARCH="$(uname -m)"
ARCH="${CROSS_ARCH:-$(uname -m)}"
case "$ARCH" in
riscv64) DEB_ARCH=riscv64 ;;
x86_64) DEB_ARCH=amd64 ;;
aarch64 | arm64) ARCH=aarch64; DEB_ARCH=arm64 ;;
*) echo "unsupported architecture $ARCH" >&2; exit 2 ;;
@@ -42,9 +47,13 @@ BASENAME="effectcraft-$VERSION-linux-$ARCH"
echo "==> EffectCraft $VERSION for Linux $ARCH ($FORMATS)"
if [ "$SKIP_BUILD" = 0 ]; then
(cd "$ROOT" && cargo build --release --locked -p effectcraft -p effectcraft-cli)
if [ -n "${CROSS_TARGET:-}" ]; then
(cd "$ROOT" && cargo build --release --locked -p effectcraft -p effectcraft-cli --target "$CROSS_TARGET")
else
(cd "$ROOT" && cargo build --release --locked -p effectcraft -p effectcraft-cli)
fi
fi
BIN="$CARGO_TARGET_DIR/release"
BIN="$CARGO_TARGET_DIR/${CROSS_TARGET:+$CROSS_TARGET/}release"
WORK="$CARGO_TARGET_DIR/linux-package"
STAGE="$WORK/root"
rm -rf "$WORK"
@@ -52,7 +61,7 @@ rm -rf "$WORK"
# ---- stage an FHS tree (shared by every format) -------------------------------------------------
install -Dm755 "$BIN/effectcraft" "$STAGE/usr/bin/effectcraft"
install -Dm755 "$BIN/effectcraft-cli" "$STAGE/usr/bin/effectcraft-cli"
strip "$STAGE/usr/bin/effectcraft" "$STAGE/usr/bin/effectcraft-cli" 2>/dev/null || true
"${CROSS_COMPILE:-}strip" "$STAGE/usr/bin/effectcraft" "$STAGE/usr/bin/effectcraft-cli" 2>/dev/null || true
install -Dm644 "$HERE/$APP_ID.desktop" "$STAGE/usr/share/applications/$APP_ID.desktop"
install -Dm644 "$HERE/$APP_ID.mime.xml" "$STAGE/usr/share/mime/packages/$APP_ID.xml"
mkdir -p "$STAGE/usr/share/metainfo"
@@ -135,6 +144,10 @@ if has appimage; then
fi
fi
"$STAGE/usr/bin/effectcraft-cli" --version
if [ -z "${CROSS_TARGET:-}" ]; then
"$STAGE/usr/bin/effectcraft-cli" --version
elif [ -n "${EMULATOR:-}" ]; then
"$EMULATOR" "$STAGE/usr/bin/effectcraft-cli" --version
fi
echo "==> done"
ls -lh "$DIST"