From f953cd2855bf36beffa6a4d608e9bf4b226e9442 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 10 Oct 2026 21:08:18 -0400 Subject: [PATCH] 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--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 * 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 --------- Co-authored-by: Claude Opus 5.5 --- .github/workflows/freebsd.yml | 2 + .github/workflows/release.yml | 64 ++++++++++++++++++++++++++++++- Cargo.lock | 72 +++++++++++++++++------------------ Cargo.toml | 2 +- README.md | 4 +- crates/media/src/convert.rs | 2 +- docs/releasing.md | 9 +++++ packaging/linux/package.sh | 27 +++++++++---- 8 files changed, 135 insertions(+), 47 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index acbc0103..8df49946 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -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. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7249489a..7454af88 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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: diff --git a/Cargo.lock b/Cargo.lock index dea4bf4c..fc323e96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", ] diff --git a/Cargo.toml b/Cargo.toml index 4e6e7ba8..33fbdd14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/README.md b/README.md index 96aa9a17..914a4090 100644 --- a/README.md +++ b/README.md @@ -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--windows-x64.msi /qn | Fedora/RHEL/openSUSE | `effectcraft--linux-x86_64.rpm` | `effectcraft--linux-aarch64.rpm` | | | Tarball | `effectcraft--linux-x86_64.tar.gz` | `effectcraft--linux-aarch64.tar.gz` | Unpack anywhere | +RISC-V 64-bit: `effectcraft--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 diff --git a/crates/media/src/convert.rs b/crates/media/src/convert.rs index d9ef9323..7865c3dc 100644 --- a/crates/media/src/convert.rs +++ b/crates/media/src/convert.rs @@ -154,7 +154,7 @@ fn half_420(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; diff --git a/docs/releasing.md b/docs/releasing.md index dfba8926..3cd1f112 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -58,6 +58,7 @@ jobs are refused by the environment's branch rule, and no draft release is made. | Windows 11 ARM64 | `effectcraft--windows-arm64.msi`, `effectcraft--windows-arm64-portable.zip` | cross-compiled on `windows-latest` | | Linux x86_64 | `effectcraft--linux-x86_64.{AppImage,deb,rpm,tar.gz}` | `ubuntu-22.04` | | Linux aarch64 | `effectcraft--linux-aarch64.{AppImage,deb,rpm,tar.gz}` | `ubuntu-22.04-arm` | +| Linux riscv64 | `effectcraft--linux-riscv64.tar.gz` | cross-compiled on `ubuntu-24.04` (CLI smoke-tested under QEMU) | | Linux AppImage updates | `effectcraft--linux-{x86_64,aarch64}.AppImage.zsync` | with the AppImages | | Flatpak x86_64, aarch64 | `effectcraft--linux-{x86_64,aarch64}.flatpak` (the Linux tarball, repackaged) | `ubuntu-24.04`, `ubuntu-24.04-arm` | | FreeBSD 14+ x86_64 | `effectcraft--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 diff --git a/packaging/linux/package.sh b/packaging/linux/package.sh index 799a0970..f149e663 100755 --- a/packaging/linux/package.sh +++ b/packaging/linux/package.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Build and package EffectCraft for Linux ( is x86_64 or aarch64): +# Build and package EffectCraft for Linux ( is x86_64 or aarch64, or riscv64 when cross-compiling): # # $DIST/effectcraft--linux-.AppImage any distro with glibc >= the build host's # $DIST/effectcraft--linux-.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"