native_toolchain_zig library
Zig support for Dart's build hooks.
This package provides ZigBuilder, which automatically compiles Zig code and bundles it with your Dart/Flutter application using native assets.
Quick Start
// hook/build.dart
import 'package:hooks/hooks.dart';
import 'package:native_toolchain_zig/native_toolchain_zig.dart';
void main(List<String> args) async {
await build(args, (input, output) async {
await ZigBuilder(
assetName: 'my_package.dart',
zigDir: 'zig',
).run(input: input, output: output, logger: null);
});
}
Project Structure
my_package/
├── hook/
│ └── build.dart # Build hook using ZigBuilder
├── lib/
│ └── my_package.dart # Dart bindings with @Native
└── zig/
├── src/
│ └── lib.zig # Zig source code
└── build.zig # Zig build configuration
Zig Build Configuration
Create a build.zig file compatible with Zig 0.15.0+.
Dynamic Library (default)
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const lib = b.addLibrary(.{
.name = "my_package",
.linkage = .dynamic,
.root_module = b.createModule(.{
.root_source_file = b.path("src/lib.zig"),
.target = target,
.optimize = optimize,
}),
});
b.installArtifact(lib);
}
Both Static and Dynamic Libraries
To produce both library types in a single build:
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const root_module = b.createModule(.{
.root_source_file = b.path("src/lib.zig"),
.target = target,
.optimize = optimize,
});
// Dynamic library (.so, .dylib, .dll)
const dynamic_lib = b.addLibrary(.{
.name = "my_package",
.linkage = .dynamic,
.root_module = root_module,
});
b.installArtifact(dynamic_lib);
// Static library (.a, .lib)
const static_lib = b.addLibrary(.{
.name = "my_package",
.linkage = .static,
.root_module = root_module,
});
b.installArtifact(static_lib);
}
Configurable Linkage via Command Line
To control linkage type via -Dlinkage=static or -Dlinkage=dynamic:
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const linkage = b.option(
std.builtin.LinkMode,
"linkage",
"Library linkage type",
) orelse .dynamic;
const lib = b.addLibrary(.{
.name = "my_package",
.linkage = linkage,
.root_module = b.createModule(.{
.root_source_file = b.path("src/lib.zig"),
.target = target,
.optimize = optimize,
}),
});
b.installArtifact(lib);
}
Pass the linkage option from Dart using ZigBuilder.extraArguments:
ZigBuilder(
assetName: 'my_package.dart',
zigDir: 'zig',
extraArguments: ['-Dlinkage=static'],
)
Classes
- Target
- Represents a Zig cross-compilation target.
- ZigBuilder
-
Builds Zig code as native assets using
zig build.
Enums
- Optimization
- Zig build optimization levels.