Installation

Prerequisites

Required

Optional

Most examples need nothing else. These are the exceptions:

ToolUsed by
cmake and gitThe CMake interop and JUCE examples
cargoThe Rust interop example
nodeThe WebAssembly validation and export examples
A clang++ with C++20 module supportThe 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.