Installation
Prerequisites
Required
- Zig 0.14.1, 0.15.2 or 0.16.0. All three are tested in CI and verified against the full test suite.
Optional
Most examples need nothing else. These are the exceptions:
| Tool | Used by |
|---|---|
cmake and git | The CMake interop and JUCE examples |
cargo | The Rust interop example |
node | The WebAssembly validation and export examples |
A clang++ with C++20 module support | The C++20 modules example |
Setup
git clone https://github.com/godofecht/zaza.git
cd zaza
./setup.sh
setup.sh reports your Zig version, warns if it is outside the tested range,
creates the machine-local ./zig wrapper if it is missing, lists which optional
examples your machine cannot run, and then runs the test suite. It is safe to
run repeatedly.
Real output on a machine with everything installed:
Toolchain
ok zig 0.15.2 (/opt/homebrew/bin/zig)
Wrapper
ok ./zig wrapper present
Optional tools
ok git - git version 2.50.1 (Apple Git-155)
ok cmake - cmake version 4.3.3
ok cargo - cargo 1.92.0 (344c4567c 2025-10-21)
ok node - v25.5.0
ok file - present
ok clang++ with modules - /opt/homebrew/opt/llvm/bin/clang++
Examples
ok every example is available on this machine
Tests
ZAZA_EXAMPLES=none zig build test --summary all
Build Summary: 43/43 steps succeeded; 87/87 tests passed
And on a machine missing several of the optional tools:
Optional tools
ok git - git version 2.50.1 (Apple Git-155)
warn cmake not found
warn cargo not found
warn node not found
ok file - present
warn no clang++ with C++20 module support at /nope/clang++
Unavailable without the tools above
cmake_shim, cmake_combo, cmake_net, juce, zaza-juce (needs cmake)
rust_interop (needs cargo)
wasm_wasi, wasm_exports (needs node)
cxx20_modules (set ZAZA_MODULES_CXX to a clang++ that supports C++20 modules)
Everything else runs with Zig alone.
The ./zig wrapper
Several targets shell out to a sibling build file, and they invoke ./zig by
name rather than a bare zig. The wrapper pins both Zig cache directories to
the repo root, which is what those nested builds expect. It hardcodes one
machine's paths, so it is gitignored and absent from a fresh clone.
setup.sh creates it. Without it, package-consumer, cross-compile-cli,
rust-interop, and example-matrix fail with exit code 127.