Target Triple em Zig — O que é e Como Usar
Definição
Um target triple (tripla de destino) é uma string no formato arquitetura-sistema_operacional-abi que especifica a plataforma para a qual o código deve ser compilado. O Zig usa target triples para identificar o ambiente de execução do binário gerado — incluindo a CPU, o sistema operacional e a interface binária de aplicação (ABI).
Exemplos: x86_64-linux-gnu, aarch64-macos-none, arm-freestanding-none.
Por que Target Triples Importam
- Cross-compilation: Especificam exatamente para qual plataforma compilar.
- Portabilidade: O mesmo código Zig pode gerar binários para dezenas de plataformas.
- Reprodutibilidade: O target triple garante que o binário é idêntico em qualquer máquina de build.
- Condicionais de plataforma: O código pode usar
@import("builtin")para tomar decisões baseadas no target.
Formato
<arquitetura>-<sistema_operacional>-<abi>
| Componente | Exemplos | Descrição |
|---|---|---|
| Arquitetura | x86_64, aarch64, arm, riscv64, wasm32 | ISA do processador |
| Sistema Operacional | linux, macos, windows, freestanding | SO do target |
| ABI | gnu, musl, none, eabi | Interface binária de aplicação |
Exemplo Prático
Compilação com Target Triple
# Linux x86_64 com glibc
zig build-exe main.zig -target x86_64-linux-gnu
# Linux x86_64 com musl (binário estático)
zig build-exe main.zig -target x86_64-linux-musl
# macOS Apple Silicon
zig build-exe main.zig -target aarch64-macos-none
# Windows 64-bit
zig build-exe main.zig -target x86_64-windows-gnu
# ARM embarcado (sem SO)
zig build-exe main.zig -target thumb-freestanding-none
# WebAssembly
zig build-exe main.zig -target wasm32-wasi-none
Detectando o Target em Código
const std = @import("std");
const builtin = @import("builtin");
pub fn main() void {
// Informações sobre o target em tempo de compilação
std.debug.print("Arch: {s}\n", .{@tagName(builtin.cpu.arch)});
std.debug.print("OS: {s}\n", .{@tagName(builtin.os.tag)});
// Condicional de plataforma
if (builtin.os.tag == .windows) {
std.debug.print("Executando no Windows\n", .{});
} else if (builtin.os.tag == .linux) {
std.debug.print("Executando no Linux\n", .{});
}
}
Listar Targets Disponíveis
# Listar todas as arquiteturas, SOs e ABIs suportados
zig targets | head -50
# O comando retorna JSON com todos os targets disponíveis
Targets Comuns
| Target Triple | Uso |
|---|---|
x86_64-linux-gnu | Desktop/servidor Linux |
x86_64-linux-musl | Linux com binário estático |
aarch64-linux-gnu | Linux em ARM64 (Raspberry Pi 4, servidores ARM) |
aarch64-macos-none | macOS Apple Silicon |
x86_64-macos-none | macOS Intel |
x86_64-windows-gnu | Windows 64-bit |
wasm32-freestanding-none | WebAssembly |
arm-freestanding-none | Microcontroladores ARM |
Armadilhas Comuns
- gnu vs musl:
gnuusa glibc (dinâmico por padrão);muslgera binários estáticos. Para máxima portabilidade no Linux, usemusl. - freestanding: Significa sem SO — para embarcados ou WebAssembly. Não tem acesso a syscalls do OS.
- Target inválido: Nem toda combinação é válida.
arm-windows-gnupode não ser suportado. - Native: Omitir
-targetcompila para a plataforma atual (native).
Termos Relacionados
- Cross-Compilation — Compilar para outra plataforma
- build.zig — Onde o target é configurado no build system
- Release Modes — Otimizações que dependem do target
- LLVM — Backend que suporta múltiplos targets