| name | zig-cross |
| description | Zig cross-compilation skill. Use when cross-compiling Zig programs to different targets, using Zig's built-in cross-compilation for embedded, WASM, Windows, ARM, or using zig cc to cross-compile C code without a system cross-toolchain. Activates on queries about Zig cross-compilation, zig target triples, zig cc cross-compile, Zig embedded targets, or Zig WASM. |
Zig Cross-Compilation
Purpose
Guide agents through Zig's built-in cross-compilation: target triple selection, CPU feature targeting, zig cc for cross-compiling C projects, embedded bare-metal targets, and WASM output — all without requiring a system cross-toolchain.
Triggers
- "How do I cross-compile a Zig program for ARM?"
- "How do I build Zig for a different OS?"
- "How do I use Zig to cross-compile C code for another platform?"
- "How do I build Zig for embedded/bare-metal?"
- "How do I target WebAssembly with Zig?"
- "What Zig target triple do I use for Raspberry Pi?"
Workflow
1. Zig's native cross-compilation
Zig has cross-compilation built in — no cross-toolchain, no Docker, no sysroot needed for pure Zig code:
zig targets | python3 -c "import sys,json; d=json.load(sys.stdin); [print(t) for t in d['libc']]"
zig build-exe src/main.zig -target aarch64-linux-gnu -O ReleaseFast
zig build -Dtarget=aarch64-linux-gnu -Doptimize=ReleaseFast
zig build-exe src/main.zig -target x86_64-windows-gnu
zig build-exe src/main.zig -target aarch64-macos-none
2. Common target triples
| Target triple | Platform |
|---|
x86_64-linux-gnu | Linux x86-64 (glibc) |
x86_64-linux-musl | Linux x86-64 (musl, static) |
aarch64-linux-gnu | ARM64 Linux (Pi 4, AWS Graviton) |
aarch64-linux-musl | ARM64 Linux static |
armv7-linux-gnueabihf | ARM 32-bit Linux (Pi 2/3) |
x86_64-windows-gnu | Windows x86-64 |
aarch64-macos-none | macOS Apple Silicon |
x86_64-macos-none | macOS Intel |
wasm32-freestanding | WASM (browser, no OS) |
wasm32-wasi | WASM with WASI |
thumbv7m-freestanding-eabi | Cortex-M3 bare metal |
thumbv7em-freestanding-eabihf | Cortex-M4/M7 with FPU |
riscv32-freestanding | RISC-V 32-bit bare metal |
3. CPU feature targeting
zig build-exe src/main.zig -mcpu native
zig build-exe src/main.zig -target x86_64-linux-gnu -mcpu baseline
zig build-exe src/main.zig -target x86_64-linux-gnu -mcpu x86_64+avx2+bmi2
zig build-exe src/main.zig -target aarch64-linux-gnu -mcpu cortex_a72
zig build-exe src/main.zig \
-target thumbv7em-freestanding-eabihf \
-mcpu cortex_m4+vfp4
zig targets | python3 -c "
import sys,json
d=json.load(sys.stdin)
for c in d['cpus']:
if 'cortex' in c['name']:
print(c['name'])
"
4. zig cc for C cross-compilation
zig cc cross-compiles C without a system cross-toolchain:
zig cc -target aarch64-linux-gnu -O2 -o myapp-arm64 main.c
zig cc -target x86_64-windows-gnu main.c -o myapp.exe
zig cc -target x86_64-linux-musl -static main.c -o myapp-static
CC_LINUX_AMD64 = zig cc -target x86_64-linux-gnu
CC_LINUX_ARM64 = zig cc -target aarch64-linux-gnu
CC_WINDOWS = zig cc -target x86_64-windows-gnu
5. Build system cross-compilation
// build.zig — cross-build all targets
pub fn build(b: *std.Build) void {
const targets = [_]std.Target.Query{
.{ .cpu_arch = .x86_64, .os_tag = .linux, .abi = .gnu },
.{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .gnu },
.{ .cpu_arch = .x86_64, .os_tag = .windows, .abi = .gnu },
.{ .cpu_arch = .aarch64, .os_tag = .macos },
};
for (targets) |t| {
const target = b.resolveTargetQuery(t);
const exe = b.addExecutable(.{
.name = b.fmt("myapp-{s}", .{@tagName(t.cpu_arch.?)}),
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = .ReleaseFast,
});
b.installArtifact(exe);
}
}
zig build
6. Embedded (bare-metal) targets
zig build-exe src/main.zig \
-target thumbv7em-freestanding-eabihf \
-mcpu cortex_m4+vfp4 \
-O ReleaseSmall \
--script linker.ld
// src/main.zig — bare metal entry point
const std = @import("std");
// Custom panic handler for embedded (no OS)
pub fn panic(msg: []const u8, _: ?*std.builtin.StackTrace, _: ?usize) noreturn {
// Toggle LED or halt
while (true) {}
}
// Entry point (matches linker script)
export fn _start() void {
main() catch |err| {
_ = err;
while (true) {}
};
}
fn main() !void {
// Hardware initialization...
}
7. WebAssembly
zig build-exe src/main.zig \
-target wasm32-freestanding \
-O ReleaseSmall \
--export=init \
--export=update \
-fno-entry
zig build-exe src/main.zig \
-target wasm32-wasi \
-O ReleaseSafe
wasmtime myapp.wasm
wasm-opt -Oz myapp.wasm -o myapp.opt.wasm
For target triple reference and embedded linker script setup, see references/zig-target-triples.md.
Related skills
- Use
skills/zig/zig-compiler for single-file compilation flags
- Use
skills/zig/zig-build-system for multi-target build.zig configuration
- Use
skills/compilers/cross-gcc for system cross-toolchain setup when needed
- Use
skills/rust/rust-cross for Rust's cross-compilation approach comparison