Targets · Zig · Project setup

Project setup

Everything around the rendered code that makes a working, buildable Zig project.

Contents

How a Program becomes Zig, in parts. Start with the introduction, then follow each part into the rendered output and the runtime it links against.

The files

A rendered Zig program is an ordinary Zig project: a build.zig script and a src/ tree, with each top module its own file.

my-app/
  build.zig             # the build script
  build.zig.zon         # dependencies (if any)
  src/
    main.zig            # pub fn main() !void { Program.application(...) }
    reactive.zig        # the runtime (Reactive + Context + drivers)
    ui.zig  maths.zig ...  # one file per top module
// build.zig
const std = @import("std");
pub fn build(b: *std.Build) void {
    const exe = b.addExecutable(.{
        .name = "my-app",
        .root_source_file = b.path("src/main.zig"),
        .target = b.standardTargetOptions(.{}),
    });
    b.installArtifact(exe);
}

Build and run

The Zig toolchain builds and runs it — no extra tooling.

zig build              # compile to zig-out/bin
zig build run          # build and run
zig build -Doptimize=ReleaseFast   # an optimised binary

The output is a single native binary with no runtime dependency, which is what makes Zig a good fit for small, self-contained tools built from a Program.