Merge commit 'dc11a13009208d59be330b9c75d1390ecb00cd02' as 'vendor/zglfw'

This commit is contained in:
2026-10-11 23:52:16 +02:00
94 changed files with 58138 additions and 0 deletions

261
vendor/zglfw/build.zig vendored Normal file
View File

@@ -0,0 +1,261 @@
const std = @import("std");
pub fn build(b: *std.Build) void {
const optimize = b.standardOptimizeOption(.{});
const target = b.standardTargetOptions(.{});
const options = .{
.shared = b.option(
bool,
"shared",
"Build GLFW as shared lib",
) orelse false,
.enable_x11 = b.option(
bool,
"x11",
"Whether to build with X11 support (default: true)",
) orelse true,
.enable_wayland = b.option(
bool,
"wayland",
"Whether to build with Wayland support (default: true)",
) orelse true,
.enable_vulkan_import = b.option(
bool,
"import_vulkan",
"Whether to build with external Vulkan dependency (default: false)",
) orelse false,
};
const options_step = b.addOptions();
inline for (std.meta.fields(@TypeOf(options))) |field| {
options_step.addOption(field.type, field.name, @field(options, field.name));
}
const options_module = options_step.createModule();
const module = b.addModule("root", .{
.root_source_file = b.path("src/zglfw.zig"),
.imports = &.{
.{ .name = "zglfw_options", .module = options_module },
},
});
if (target.result.os.tag == .emscripten) return;
const glfw = b.addLibrary(.{
.name = "glfw",
.linkage = if (options.shared) .dynamic else .static,
.root_module = b.createModule(.{
.target = target,
.optimize = optimize,
}),
});
if (options.shared and target.result.os.tag == .windows) {
glfw.root_module.addCMacro("_GLFW_BUILD_DLL", "");
}
b.installArtifact(glfw);
glfw.installHeadersDirectory(b.path("libs/glfw/include"), "", .{});
addIncludePaths(b, glfw.root_module, target, options);
linkSystemLibs(b, glfw, target, options);
const src_dir = "libs/glfw/src/";
switch (target.result.os.tag) {
.windows => {
glfw.root_module.addCSourceFiles(.{
.files = &.{
src_dir ++ "platform.c",
src_dir ++ "monitor.c",
src_dir ++ "init.c",
src_dir ++ "vulkan.c",
src_dir ++ "input.c",
src_dir ++ "context.c",
src_dir ++ "window.c",
src_dir ++ "osmesa_context.c",
src_dir ++ "egl_context.c",
src_dir ++ "null_init.c",
src_dir ++ "null_monitor.c",
src_dir ++ "null_window.c",
src_dir ++ "null_joystick.c",
src_dir ++ "wgl_context.c",
src_dir ++ "win32_thread.c",
src_dir ++ "win32_init.c",
src_dir ++ "win32_monitor.c",
src_dir ++ "win32_time.c",
src_dir ++ "win32_joystick.c",
src_dir ++ "win32_window.c",
src_dir ++ "win32_module.c",
},
.flags = &.{"-D_GLFW_WIN32"},
});
},
.macos => {
glfw.root_module.addCSourceFiles(.{
.files = &.{
src_dir ++ "platform.c",
src_dir ++ "monitor.c",
src_dir ++ "init.c",
src_dir ++ "vulkan.c",
src_dir ++ "input.c",
src_dir ++ "context.c",
src_dir ++ "window.c",
src_dir ++ "osmesa_context.c",
src_dir ++ "egl_context.c",
src_dir ++ "null_init.c",
src_dir ++ "null_monitor.c",
src_dir ++ "null_window.c",
src_dir ++ "null_joystick.c",
src_dir ++ "posix_thread.c",
src_dir ++ "posix_module.c",
src_dir ++ "posix_poll.c",
src_dir ++ "nsgl_context.m",
src_dir ++ "cocoa_time.c",
src_dir ++ "cocoa_joystick.m",
src_dir ++ "cocoa_init.m",
src_dir ++ "cocoa_window.m",
src_dir ++ "cocoa_monitor.m",
},
.flags = &.{"-D_GLFW_COCOA"},
});
},
.linux => {
glfw.root_module.addCSourceFiles(.{
.files = &.{
src_dir ++ "platform.c",
src_dir ++ "monitor.c",
src_dir ++ "init.c",
src_dir ++ "vulkan.c",
src_dir ++ "input.c",
src_dir ++ "context.c",
src_dir ++ "window.c",
src_dir ++ "osmesa_context.c",
src_dir ++ "egl_context.c",
src_dir ++ "null_init.c",
src_dir ++ "null_monitor.c",
src_dir ++ "null_window.c",
src_dir ++ "null_joystick.c",
src_dir ++ "posix_time.c",
src_dir ++ "posix_thread.c",
src_dir ++ "posix_module.c",
},
.flags = &.{},
});
if (options.enable_x11 or options.enable_wayland) {
glfw.root_module.addCSourceFiles(.{
.files = &.{
src_dir ++ "xkb_unicode.c",
src_dir ++ "linux_joystick.c",
src_dir ++ "posix_poll.c",
},
.flags = &.{},
});
}
if (options.enable_x11) {
glfw.root_module.addCSourceFiles(.{
.files = &.{
src_dir ++ "x11_init.c",
src_dir ++ "x11_monitor.c",
src_dir ++ "x11_window.c",
src_dir ++ "glx_context.c",
},
.flags = &.{},
});
glfw.root_module.addCMacro("_GLFW_X11", "1");
glfw.root_module.linkSystemLibrary("X11", .{});
}
if (options.enable_wayland) {
glfw.root_module.addCSourceFiles(.{
.files = &.{
src_dir ++ "wl_init.c",
src_dir ++ "wl_monitor.c",
src_dir ++ "wl_window.c",
},
.flags = &.{},
});
glfw.root_module.addIncludePath(b.path(src_dir ++ "wayland"));
glfw.root_module.addCMacro("_GLFW_WAYLAND", "1");
}
},
else => {},
}
addIncludePaths(b, module, target, options);
const test_step = b.step("test", "Run zglfw tests");
const tests = b.addTest(.{
.name = "zglfw-tests",
.root_module = b.createModule(.{
.root_source_file = b.path("src/zglfw.zig"),
.target = target,
.optimize = optimize,
}),
});
addIncludePaths(b, tests.root_module, target, options);
linkSystemLibs(b, tests, target, options);
tests.root_module.addImport("zglfw_options", options_module);
tests.root_module.linkLibrary(glfw);
b.installArtifact(tests);
test_step.dependOn(&b.addRunArtifact(tests).step);
}
fn addIncludePaths(b: *std.Build, unit: anytype, target: std.Build.ResolvedTarget, options: anytype) void {
unit.addIncludePath(b.path("libs/glfw/include"));
switch (target.result.os.tag) {
.linux => {
if (b.lazyDependency("system_sdk", .{})) |system_sdk| {
unit.addSystemIncludePath(system_sdk.path("linux/include"));
if (options.enable_wayland) {
unit.addSystemIncludePath(system_sdk.path("linux/include/wayland"));
}
}
},
else => {},
}
}
fn linkSystemLibs(b: *std.Build, compile_step: *std.Build.Step.Compile, target: std.Build.ResolvedTarget, options: anytype) void {
compile_step.root_module.link_libc = true;
switch (target.result.os.tag) {
.windows => {
compile_step.root_module.linkSystemLibrary("gdi32", .{});
compile_step.root_module.linkSystemLibrary("user32", .{});
compile_step.root_module.linkSystemLibrary("shell32", .{});
},
.macos => {
if (b.lazyDependency("system_sdk", .{})) |system_sdk| {
compile_step.root_module.addFrameworkPath(system_sdk.path("macos12/System/Library/Frameworks"));
compile_step.root_module.addSystemIncludePath(system_sdk.path("macos12/usr/include"));
compile_step.root_module.addLibraryPath(system_sdk.path("macos12/usr/lib"));
}
compile_step.root_module.linkSystemLibrary("objc", .{});
compile_step.root_module.linkFramework("IOKit", .{});
compile_step.root_module.linkFramework("CoreFoundation", .{});
compile_step.root_module.linkFramework("Metal", .{});
compile_step.root_module.linkFramework("AppKit", .{});
compile_step.root_module.linkFramework("CoreServices", .{});
compile_step.root_module.linkFramework("CoreGraphics", .{});
compile_step.root_module.linkFramework("Foundation", .{});
},
.linux => {
if (b.lazyDependency("system_sdk", .{})) |system_sdk| {
if (target.result.cpu.arch.isX86()) {
compile_step.root_module.addLibraryPath(system_sdk.path("linux/lib/x86_64-linux-gnu"));
} else {
compile_step.root_module.addLibraryPath(system_sdk.path("linux/lib/aarch64-linux-gnu"));
}
compile_step.root_module.addSystemIncludePath(system_sdk.path("linux/include"));
compile_step.root_module.addSystemIncludePath(system_sdk.path("linux/include/wayland"));
}
if (options.enable_x11) {
compile_step.root_module.addCMacro("_GLFW_X11", "1");
compile_step.root_module.linkSystemLibrary("X11", .{});
}
if (options.enable_wayland) {
compile_step.root_module.addCMacro("_GLFW_WAYLAND", "1");
}
},
else => {},
}
}