mirror of
https://github.com/zig-gamedev/zsdl.git
synced 2026-11-03 19:25:58 +00:00
Zig bindings for SDL libs.
- C 90.6%
- Zig 4.7%
- C++ 4.1%
- CMake 0.4%
- Objective-C 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| libs | ||
| src | ||
| .gitignore | ||
| build.zig | ||
| build.zig.zon | ||
| LICENSE | ||
| README.md | ||
zsdl
Zigified bindings for SDL libs. Work in progress.
Getting started (SDL2)
Example build.zig:
pub fn build(b: *std.Build) !void {
const exe = b.addExecutable(.{ ... });
exe.linkLibC();
const zsdl = b.dependency("zsdl", .{});
exe.root_module.addImport("zsdl2", zsdl.module("zsdl2"));
exe.root_module.addImport("zsdl2_ttf", zsdl.module("zsdl2_ttf"));
exe.root_module.addImport("zsdl2_image", zsdl.module("zsdl2_image"));
// Link against SDL libs
linkSdlLibs(exe);
}
Link against SDL:
pub fn linkSdlLibs(compile_step: *std.Build.Step.Compile) void {
// Adjust as needed for the libraries you are using.
switch (compile_step.rootModuleTarget().os.tag) {
.windows => {
compile_step.root_module.linkSystemLibrary("SDL2", .{});
compile_step.root_module.linkSystemLibrary("SDL2main", .{}); // Only needed for SDL2, not ttf or image
compile_step.root_module.linkSystemLibrary("SDL2_ttf", .{});
compile_step.root_module.linkSystemLibrary("SDL2_image", .{});
},
.linux => {
compile_step.root_module.linkSystemLibrary("SDL2", .{});
compile_step.root_module.linkSystemLibrary("SDL2_ttf", .{});
compile_step.root_module.linkSystemLibrary("SDL2_image", .{});
},
.macos => {
compile_step.root_module.linkFramework("SDL2", .{});
compile_step.root_module.linkFramework("SDL2_ttf", .{});
compile_step.root_module.linkFramework("SDL2_image", .{});
},
else => {},
}
}
Using prebuilt libraries
To use the prebuilt libraries, add the following to your build.zig:
pub fn build(b: *std.Build) !void {
// ... other build steps ...
// Use prebuilt libs instead of relying on system-installed SDL.
@import("zsdl").prebuilt_sdl2.addLibraryPathsTo(exe);
if (@import("zsdl").prebuilt_sdl2.install(b, target.result, .bin, .{
.ttf = true,
.image = true,
})) |install_sdl2_step| {
b.getInstallStep().dependOn(install_sdl2_step);
}
// Prebuilt libraries are installed to the executable directory. Set the RPath so the
// executable knows where to look at runtime.
switch (exe.rootModuleTarget().os.tag) {
.windows => {}, // rpath is not used on Windows
.linux => exe.root_module.addRPathSpecial("$ORIGIN"),
.macos => exe.root_module.addRPathSpecial("@executable_path"),
else => {},
}
}
Using zsdl2 in your code
const std = @import("std");
const sdl = @import("zsdl2");
pub fn main() !void {
...
try sdl.init(.{ .audio = true, .video = true });
defer sdl.quit();
const window = try sdl.Window.create(
"zig-gamedev-window",
sdl.Window.pos_undefined,
sdl.Window.pos_undefined,
600,
600,
.{ .opengl = true, .allow_highdpi = true },
);
defer window.destroy();
...
}
Getting started (SDL3)
TODO: Document SDL3 bindings usage