O Sistema de Build do Zig

Por que você nunca mais vai querer escrever um Makefile na vida.

Makefiles são frágeis. CMake é uma linguagem horrível. O Zig traz uma proposta diferente: O script de build é um programa Zig.

Isso significa que você tem variáveis, loops, tipos e acesso à biblioteca padrão do Zig para compilar seu projeto.

Estrutura do build.zig

Todo projeto Zig tem uma função pub fn build(b: *std.Build) void que define o grafo de dependências.

Compilando C e C++

O Zig não é ciumento. Ele ama C.

const exe = b.addExecutable(.{
    .name = "meu-firmware",
    .root_source_file = .{ .path = "src/main.zig" },
    .target = target,
    .optimize = optimize, // ReleaseSafe, ReleaseFast, Debug
});

// Adicionando arquivos C existentes
exe.addCSourceFiles(&.{
    "src/hal/uart.c",
    "src/hal/gpio.c",
}, &.{ "-Wall", "-Wextra" }); // Flags do GCC/Clang

// Adicionando Include Directories
exe.addIncludePath(.{ .path = "src/hal/include" });

// Linkando a LibC (se necessário)
exe.linkLibC();

Cross-Compilation Trivial

Em C, cross-compilar (do Linux x86 para Raspberry Pi ARM) exige instalar toolchains complexos (sudo apt install gcc-arm-linux-gnueabihf…).

No Zig, a toolchain já está inclusa.

# Compilar para Windows 64-bit (estando no Linux!)
zig build -Dtarget=x86_64-windows

# Compilar para Raspberry Pi (ARM64 Linux)
zig build -Dtarget=aarch64-linux

# Compilar para ESP32 (RISC-V) - Experimental
zig build -Dtarget=riscv32-freestanding

O Zig baixa a libc da plataforma alvo automaticamente se necessário. É mágica.

Gestão de Dependências (build.zig.zon)

Similar ao package.json (Node) ou Cargo.toml (Rust), o Zig usa o arquivo ZON (Zig Object Notation).

// build.zig.zon
.{
    .name = "meu-projeto",
    .version = "0.1.0",
    .dependencies = .{
        .zap = .{
            .url = "https://github.com/zigzap/zap/archive/v0.1.0.tar.gz",
            .hash = "..."
        },
    },
}

No build.zig, você importa:

const zap_dep = b.dependency("zap", .{
    .target = target,
    .optimize = optimize,
});
exe.root_module.addImport("zap", zap_dep.module("zap"));
Progresso do Tópico