Install snapdir for Zig
The Zig binding is a thin @cImport wrapper over the snapdir C ABI, which
wraps the canonical Rust core — so you get the same BLAKE3 walk, manifests, and
64-character snapshot IDs as the CLI. There is no Zig package registry blob for
the native library, so you build it from the published snapdir-ffi source
crate and zig fetch --save the wrapper.
Install
The Zig binding is build-from-source: it links the native snapdir FFI static
library. You need a Rust toolchain, cbindgen, and Zig 0.13.0. First
build the C ABI from the snapdir-ffi
crate and generate its header (the crate ships no header, so run cbindgen),
placing both in include/ and lib/:
# needs a Rust toolchain + cbindgen; on Alpine also: apk add libgcc
cargo build --release # -> libsnapdir_ffi.a
cbindgen --config cbindgen.toml --crate snapdir-ffi --output include/snapdir.h .
Then add the Zig wrapper to your project and import it from build.zig:
zig fetch --save git+https://github.com/snapdir/snapdir#<rev>
// consumer build.zig
const snapdir_dep = b.dependency("snapdir", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("snapdir", snapdir_dep.module("snapdir"));
// + link the vendored libsnapdir_ffi.a (see the build.zig NOTE).
Because the static library is built for one CPU arch, build.zig links it with
the matching target. On Alpine/musl the Rust staticlib links libgcc_s,
which Alpine ships only as the versioned libgcc_s.so.1, so run
ln -sf /usr/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so and build native (no
-Dtarget, since the container is already the musl target).
Platform support
Every binding runs on Linux (glibc and Alpine/musl, x64 and arm64) and macOS; Windows is unsupported, since snapdir is Unix-only.
The one binding-wide exception is Java, which is glibc-only today (musl support is planned for 1.11.1). The Zig binding has no such caveat — it links on glibc and musl alike.
Next
- Zig quickstart — a 60-second push → pull round-trip.
- snapdir for Zig — the full binding reference.