glfw: support compiling with stage2 (-fno-stage1) (#365)
This commit is contained in:
parent
19c7d0b0a6
commit
952ea5c3c5
7 changed files with 35 additions and 32 deletions
30
build.zig
30
build.zig
|
@ -61,7 +61,7 @@ fn buildLibrary(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *
|
||||||
// TODO(build-system): https://github.com/hexops/mach/issues/229#issuecomment-1100958939
|
// TODO(build-system): https://github.com/hexops/mach/issues/229#issuecomment-1100958939
|
||||||
ensureDependencySubmodule(b.allocator, "upstream") catch unreachable;
|
ensureDependencySubmodule(b.allocator, "upstream") catch unreachable;
|
||||||
|
|
||||||
const main_abs = std.fs.path.join(b.allocator, &.{ thisDir(), "src/main.zig" }) catch unreachable;
|
const main_abs = std.fs.path.join(b.allocator, &.{ (comptime thisDir()), "src/main.zig" }) catch unreachable;
|
||||||
const lib = b.addStaticLibrary("glfw", main_abs);
|
const lib = b.addStaticLibrary("glfw", main_abs);
|
||||||
lib.setBuildMode(step.build_mode);
|
lib.setBuildMode(step.build_mode);
|
||||||
lib.setTarget(step.target);
|
lib.setTarget(step.target);
|
||||||
|
@ -69,16 +69,16 @@ fn buildLibrary(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *
|
||||||
// TODO(build-system): pass system SDK options through
|
// TODO(build-system): pass system SDK options through
|
||||||
system_sdk.include(b, step, .{});
|
system_sdk.include(b, step, .{});
|
||||||
const target = (std.zig.system.NativeTargetInfo.detect(b.allocator, step.target) catch unreachable).target;
|
const target = (std.zig.system.NativeTargetInfo.detect(b.allocator, step.target) catch unreachable).target;
|
||||||
const include_glfw_src = "-I" ++ thisDir() ++ "/upstream/glfw/src";
|
const include_glfw_src = "-I" ++ (comptime thisDir()) ++ "/upstream/glfw/src";
|
||||||
switch (target.os.tag) {
|
switch (target.os.tag) {
|
||||||
.windows => lib.addCSourceFiles(&.{
|
.windows => lib.addCSourceFiles(&.{
|
||||||
thisDir() ++ "/src/sources_all.c",
|
(comptime thisDir()) ++ "/src/sources_all.c",
|
||||||
thisDir() ++ "/src/sources_windows.c",
|
(comptime thisDir()) ++ "/src/sources_windows.c",
|
||||||
}, &.{ "-D_GLFW_WIN32", include_glfw_src }),
|
}, &.{ "-D_GLFW_WIN32", include_glfw_src }),
|
||||||
.macos => lib.addCSourceFiles(&.{
|
.macos => lib.addCSourceFiles(&.{
|
||||||
thisDir() ++ "/src/sources_all.c",
|
(comptime thisDir()) ++ "/src/sources_all.c",
|
||||||
thisDir() ++ "/src/sources_macos.m",
|
(comptime thisDir()) ++ "/src/sources_macos.m",
|
||||||
thisDir() ++ "/src/sources_macos.c",
|
(comptime thisDir()) ++ "/src/sources_macos.c",
|
||||||
}, &.{ "-D_GLFW_COCOA", include_glfw_src }),
|
}, &.{ "-D_GLFW_COCOA", include_glfw_src }),
|
||||||
else => {
|
else => {
|
||||||
// TODO(future): for now, Linux must be built with glibc, not musl:
|
// TODO(future): for now, Linux must be built with glibc, not musl:
|
||||||
|
@ -92,17 +92,17 @@ fn buildLibrary(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *
|
||||||
|
|
||||||
var sources = std.ArrayList([]const u8).init(b.allocator);
|
var sources = std.ArrayList([]const u8).init(b.allocator);
|
||||||
var flags = std.ArrayList([]const u8).init(b.allocator);
|
var flags = std.ArrayList([]const u8).init(b.allocator);
|
||||||
sources.append(thisDir() ++ "/src/sources_all.c") catch unreachable;
|
sources.append((comptime thisDir()) ++ "/src/sources_all.c") catch unreachable;
|
||||||
sources.append(thisDir() ++ "/src/sources_linux.c") catch unreachable;
|
sources.append((comptime thisDir()) ++ "/src/sources_linux.c") catch unreachable;
|
||||||
if (options.x11) {
|
if (options.x11) {
|
||||||
sources.append(thisDir() ++ "/src/sources_linux_x11.c") catch unreachable;
|
sources.append((comptime thisDir()) ++ "/src/sources_linux_x11.c") catch unreachable;
|
||||||
flags.append("-D_GLFW_X11") catch unreachable;
|
flags.append("-D_GLFW_X11") catch unreachable;
|
||||||
}
|
}
|
||||||
if (options.wayland) {
|
if (options.wayland) {
|
||||||
sources.append(thisDir() ++ "/src/sources_linux_wayland.c") catch unreachable;
|
sources.append((comptime thisDir()) ++ "/src/sources_linux_wayland.c") catch unreachable;
|
||||||
flags.append("-D_GLFW_WAYLAND") catch unreachable;
|
flags.append("-D_GLFW_WAYLAND") catch unreachable;
|
||||||
}
|
}
|
||||||
flags.append("-I" ++ thisDir() ++ "/upstream/glfw/src") catch unreachable;
|
flags.append("-I" ++ (comptime thisDir()) ++ "/upstream/glfw/src") catch unreachable;
|
||||||
|
|
||||||
lib.addCSourceFiles(sources.items, flags.items);
|
lib.addCSourceFiles(sources.items, flags.items);
|
||||||
},
|
},
|
||||||
|
@ -117,7 +117,7 @@ fn ensureDependencySubmodule(allocator: std.mem.Allocator, path: []const u8) !vo
|
||||||
if (std.mem.eql(u8, no_ensure_submodules, "true")) return;
|
if (std.mem.eql(u8, no_ensure_submodules, "true")) return;
|
||||||
} else |_| {}
|
} else |_| {}
|
||||||
var child = std.ChildProcess.init(&.{ "git", "submodule", "update", "--init", path }, allocator);
|
var child = std.ChildProcess.init(&.{ "git", "submodule", "update", "--init", path }, allocator);
|
||||||
child.cwd = thisDir();
|
child.cwd = (comptime thisDir());
|
||||||
child.stderr = std.io.getStdErr();
|
child.stderr = std.io.getStdErr();
|
||||||
child.stdout = std.io.getStdOut();
|
child.stdout = std.io.getStdOut();
|
||||||
|
|
||||||
|
@ -129,11 +129,11 @@ fn thisDir() []const u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn linkGLFWDependencies(b: *Builder, step: *std.build.LibExeObjStep, options: Options) void {
|
fn linkGLFWDependencies(b: *Builder, step: *std.build.LibExeObjStep, options: Options) void {
|
||||||
const include_dir = std.fs.path.join(b.allocator, &.{ thisDir(), "upstream/glfw/include" }) catch unreachable;
|
const include_dir = std.fs.path.join(b.allocator, &.{ (comptime thisDir()), "upstream/glfw/include" }) catch unreachable;
|
||||||
defer b.allocator.free(include_dir);
|
defer b.allocator.free(include_dir);
|
||||||
step.addIncludeDir(include_dir);
|
step.addIncludeDir(include_dir);
|
||||||
|
|
||||||
const vulkan_include_dir = std.fs.path.join(b.allocator, &.{ thisDir(), "upstream/vulkan_headers/include" }) catch unreachable;
|
const vulkan_include_dir = std.fs.path.join(b.allocator, &.{ (comptime thisDir()), "upstream/vulkan_headers/include" }) catch unreachable;
|
||||||
defer b.allocator.free(vulkan_include_dir);
|
defer b.allocator.free(vulkan_include_dir);
|
||||||
step.addIncludeDir(vulkan_include_dir);
|
step.addIncludeDir(vulkan_include_dir);
|
||||||
|
|
||||||
|
|
|
@ -255,7 +255,7 @@ pub inline fn getName(self: Joystick) error{PlatformError}!?[:0]const u8 {
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
return if (name_opt) |name|
|
return if (name_opt) |name|
|
||||||
std.mem.span(name)
|
std.mem.span(@ptrCast([*:0]const u8, name))
|
||||||
else
|
else
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
@ -297,7 +297,7 @@ pub inline fn getGUID(self: Joystick) error{PlatformError}!?[:0]const u8 {
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
return if (guid_opt) |guid|
|
return if (guid_opt) |guid|
|
||||||
std.mem.span(guid)
|
std.mem.span(@ptrCast([*:0]const u8, guid))
|
||||||
else
|
else
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
@ -490,7 +490,7 @@ pub inline fn getGamepadName(self: Joystick) ?[:0]const u8 {
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
return if (name_opt) |name|
|
return if (name_opt) |name|
|
||||||
std.mem.span(name)
|
std.mem.span(@ptrCast([*:0]const u8, name))
|
||||||
else
|
else
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
@ -603,7 +603,8 @@ test "setUserPointer_syntax" {
|
||||||
const joystick = glfw.Joystick{ .jid = .one };
|
const joystick = glfw.Joystick{ .jid = .one };
|
||||||
|
|
||||||
// Must be called from joystick callback, we cannot test it.
|
// Must be called from joystick callback, we cannot test it.
|
||||||
_ = joystick.setUserPointer;
|
_ = joystick;
|
||||||
|
_ = setUserPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
test "getUserPointer_syntax" {
|
test "getUserPointer_syntax" {
|
||||||
|
@ -614,7 +615,8 @@ test "getUserPointer_syntax" {
|
||||||
const joystick = glfw.Joystick{ .jid = .one };
|
const joystick = glfw.Joystick{ .jid = .one };
|
||||||
|
|
||||||
// Must be called from joystick callback, we cannot test it.
|
// Must be called from joystick callback, we cannot test it.
|
||||||
_ = joystick.getUserPointer;
|
_ = joystick;
|
||||||
|
_ = getUserPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
test "setCallback" {
|
test "setCallback" {
|
||||||
|
|
|
@ -164,7 +164,7 @@ pub inline fn getContentScale(self: Monitor) error{PlatformError}!ContentScale {
|
||||||
/// see also: monitor_properties
|
/// see also: monitor_properties
|
||||||
pub inline fn getName(self: Monitor) [*:0]const u8 {
|
pub inline fn getName(self: Monitor) [*:0]const u8 {
|
||||||
internal_debug.assertInitialized();
|
internal_debug.assertInitialized();
|
||||||
if (c.glfwGetMonitorName(self.handle)) |name| return name;
|
if (c.glfwGetMonitorName(self.handle)) |name| return @ptrCast([*:0]const u8, name);
|
||||||
getError() catch |err| return switch (err) {
|
getError() catch |err| return switch (err) {
|
||||||
Error.NotInitialized => unreachable,
|
Error.NotInitialized => unreachable,
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
|
@ -239,7 +239,7 @@ pub inline fn getVideoModes(self: Monitor, allocator: mem.Allocator) (mem.Alloca
|
||||||
const slice = try allocator.alloc(VideoMode, @intCast(u32, count));
|
const slice = try allocator.alloc(VideoMode, @intCast(u32, count));
|
||||||
var i: u32 = 0;
|
var i: u32 = 0;
|
||||||
while (i < count) : (i += 1) {
|
while (i < count) : (i += 1) {
|
||||||
slice[i] = VideoMode{ .handle = modes[i] };
|
slice[i] = VideoMode{ .handle = @ptrCast([*c]const c.GLFWvidmode, modes)[i] };
|
||||||
}
|
}
|
||||||
return slice;
|
return slice;
|
||||||
}
|
}
|
||||||
|
@ -390,7 +390,7 @@ pub inline fn getAll(allocator: mem.Allocator) mem.Allocator.Error![]Monitor {
|
||||||
const slice = try allocator.alloc(Monitor, @intCast(u32, count));
|
const slice = try allocator.alloc(Monitor, @intCast(u32, count));
|
||||||
var i: u32 = 0;
|
var i: u32 = 0;
|
||||||
while (i < count) : (i += 1) {
|
while (i < count) : (i += 1) {
|
||||||
slice[i] = Monitor{ .handle = monitors[i].? };
|
slice[i] = Monitor{ .handle = @ptrCast([*c]const ?*c.GLFWmonitor, monitors)[i].? };
|
||||||
}
|
}
|
||||||
return slice;
|
return slice;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ pub inline fn setClipboardString(value: [*:0]const u8) error{PlatformError}!void
|
||||||
/// see also: clipboard, glfwSetClipboardString
|
/// see also: clipboard, glfwSetClipboardString
|
||||||
pub inline fn getClipboardString() error{ FormatUnavailable, PlatformError }![:0]const u8 {
|
pub inline fn getClipboardString() error{ FormatUnavailable, PlatformError }![:0]const u8 {
|
||||||
internal_debug.assertInitialized();
|
internal_debug.assertInitialized();
|
||||||
if (c.glfwGetClipboardString(null)) |c_str| return std.mem.span(c_str);
|
if (c.glfwGetClipboardString(null)) |c_str| return std.mem.span(@ptrCast([*:0]const u8, c_str));
|
||||||
getError() catch |err| return switch (err) {
|
getError() catch |err| return switch (err) {
|
||||||
Error.NotInitialized => unreachable,
|
Error.NotInitialized => unreachable,
|
||||||
Error.FormatUnavailable, Error.PlatformError => |e| e,
|
Error.FormatUnavailable, Error.PlatformError => |e| e,
|
||||||
|
|
|
@ -223,7 +223,7 @@ pub const Key = enum(c_int) {
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
return if (name_opt) |name|
|
return if (name_opt) |name|
|
||||||
std.mem.span(name)
|
std.mem.span(@ptrCast([*:0]const u8, name))
|
||||||
else
|
else
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,7 +288,7 @@ fn initHint(hint: InitHint, value: anytype) void {
|
||||||
///
|
///
|
||||||
/// thread_safety: This function may be called from any thread.
|
/// thread_safety: This function may be called from any thread.
|
||||||
pub inline fn getVersionString() [:0]const u8 {
|
pub inline fn getVersionString() [:0]const u8 {
|
||||||
return std.mem.span(c.glfwGetVersionString());
|
return std.mem.span(@ptrCast([*:0]const u8, c.glfwGetVersionString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the currently selected platform.
|
/// Returns the currently selected platform.
|
||||||
|
|
|
@ -137,7 +137,7 @@ pub inline fn extensionSupported(extension: [:0]const u8) error{ NoCurrentContex
|
||||||
std.debug.assert(extension.len != 0);
|
std.debug.assert(extension.len != 0);
|
||||||
std.debug.assert(extension[0] != 0);
|
std.debug.assert(extension[0] != 0);
|
||||||
|
|
||||||
const supported = c.glfwExtensionSupported(extension);
|
const supported = c.glfwExtensionSupported(extension.ptr);
|
||||||
getError() catch |err| return switch (err) {
|
getError() catch |err| return switch (err) {
|
||||||
Error.NoCurrentContext, Error.PlatformError => |e| e,
|
Error.NoCurrentContext, Error.PlatformError => |e| e,
|
||||||
Error.NotInitialized => unreachable,
|
Error.NotInitialized => unreachable,
|
||||||
|
@ -147,12 +147,13 @@ pub inline fn extensionSupported(extension: [:0]const u8) error{ NoCurrentContex
|
||||||
return supported == c.GLFW_TRUE;
|
return supported == c.GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const builtin = @import("builtin");
|
||||||
/// Client API function pointer type.
|
/// Client API function pointer type.
|
||||||
///
|
///
|
||||||
/// Generic function pointer used for returning client API function pointers.
|
/// Generic function pointer used for returning client API function pointers.
|
||||||
///
|
///
|
||||||
/// see also: context_glext, glfwGetProcAddress
|
/// see also: context_glext, glfwGetProcAddress
|
||||||
pub const GLProc = fn () callconv(.C) void;
|
pub const GLProc = if (builtin.zig_backend == .stage1 or builtin.zig_backend == .other) fn () callconv(.C) void else *const fn () callconv(.C) void;
|
||||||
|
|
||||||
/// Returns the address of the specified function for the current context.
|
/// Returns the address of the specified function for the current context.
|
||||||
///
|
///
|
||||||
|
@ -197,7 +198,7 @@ test "makeContextCurrent" {
|
||||||
try glfw.init(.{});
|
try glfw.init(.{});
|
||||||
defer glfw.terminate();
|
defer glfw.terminate();
|
||||||
|
|
||||||
const window = glfw.Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
const window = Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
||||||
// return without fail, because most of our CI environments are headless / we cannot open
|
// return without fail, because most of our CI environments are headless / we cannot open
|
||||||
// windows on them.
|
// windows on them.
|
||||||
std.debug.print("note: failed to create window: {}\n", .{err});
|
std.debug.print("note: failed to create window: {}\n", .{err});
|
||||||
|
@ -222,7 +223,7 @@ test "swapInterval" {
|
||||||
try glfw.init(.{});
|
try glfw.init(.{});
|
||||||
defer glfw.terminate();
|
defer glfw.terminate();
|
||||||
|
|
||||||
const window = glfw.Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
const window = Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
||||||
// return without fail, because most of our CI environments are headless / we cannot open
|
// return without fail, because most of our CI environments are headless / we cannot open
|
||||||
// windows on them.
|
// windows on them.
|
||||||
std.debug.print("note: failed to create window: {}\n", .{err});
|
std.debug.print("note: failed to create window: {}\n", .{err});
|
||||||
|
@ -239,7 +240,7 @@ test "getProcAddress" {
|
||||||
try glfw.init(.{});
|
try glfw.init(.{});
|
||||||
defer glfw.terminate();
|
defer glfw.terminate();
|
||||||
|
|
||||||
const window = glfw.Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
const window = Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
||||||
// return without fail, because most of our CI environments are headless / we cannot open
|
// return without fail, because most of our CI environments are headless / we cannot open
|
||||||
// windows on them.
|
// windows on them.
|
||||||
std.debug.print("note: failed to create window: {}\n", .{err});
|
std.debug.print("note: failed to create window: {}\n", .{err});
|
||||||
|
@ -256,7 +257,7 @@ test "extensionSupported" {
|
||||||
try glfw.init(.{});
|
try glfw.init(.{});
|
||||||
defer glfw.terminate();
|
defer glfw.terminate();
|
||||||
|
|
||||||
const window = glfw.Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
const window = Window.create(640, 480, "Hello, Zig!", null, null, .{}) catch |err| {
|
||||||
// return without fail, because most of our CI environments are headless / we cannot open
|
// return without fail, because most of our CI environments are headless / we cannot open
|
||||||
// windows on them.
|
// windows on them.
|
||||||
std.debug.print("note: failed to create window: {}\n", .{err});
|
std.debug.print("note: failed to create window: {}\n", .{err});
|
||||||
|
|
Loading…
Add table
Reference in a new issue