mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-19 10:16:12 +03:00
can specify a wasm target in build
This commit is contained in:
@ -19,6 +19,7 @@ const utf8proc = @import("pkg/utf8proc/build.zig");
|
|||||||
const zlib = @import("pkg/zlib/build.zig");
|
const zlib = @import("pkg/zlib/build.zig");
|
||||||
const tracylib = @import("pkg/tracy/build.zig");
|
const tracylib = @import("pkg/tracy/build.zig");
|
||||||
const system_sdk = @import("vendor/mach/libs/glfw/system_sdk.zig");
|
const system_sdk = @import("vendor/mach/libs/glfw/system_sdk.zig");
|
||||||
|
const WasmTarget = @import("src/os/wasm/target.zig").Target;
|
||||||
|
|
||||||
// Build options, see the build options help for more info.
|
// Build options, see the build options help for more info.
|
||||||
var tracy: bool = false;
|
var tracy: bool = false;
|
||||||
@ -134,6 +135,11 @@ pub fn build(b: *std.build.Builder) !void {
|
|||||||
const wasm_shared: bool = true;
|
const wasm_shared: bool = true;
|
||||||
exe_options.addOption(bool, "wasm_shared", wasm_shared);
|
exe_options.addOption(bool, "wasm_shared", wasm_shared);
|
||||||
|
|
||||||
|
// We want to support alternate wasm targets in the future (i.e.
|
||||||
|
// server side) so we have this now although its hardcoded.
|
||||||
|
const wasm_specific_target: WasmTarget = .browser;
|
||||||
|
exe_options.addOption(WasmTarget, "wasm_target", wasm_specific_target);
|
||||||
|
|
||||||
const wasm = b.addSharedLibrary(
|
const wasm = b.addSharedLibrary(
|
||||||
"ghostty-wasm",
|
"ghostty-wasm",
|
||||||
"src/main_wasm.zig",
|
"src/main_wasm.zig",
|
||||||
|
@ -77,6 +77,7 @@ fetch(url.href).then(response =>
|
|||||||
const config_str = makeStr("font-family = monospace");
|
const config_str = makeStr("font-family = monospace");
|
||||||
config_load_string(config, config_str.ptr, config_str.len);
|
config_load_string(config, config_str.ptr, config_str.len);
|
||||||
config_finalize(config);
|
config_finalize(config);
|
||||||
|
free(config_str.ptr);
|
||||||
|
|
||||||
// Create our atlas
|
// Create our atlas
|
||||||
// const atlas = atlas_new(512, 0 /* greyscale */);
|
// const atlas = atlas_new(512, 0 /* greyscale */);
|
||||||
|
29
src/App.zig
29
src/App.zig
@ -266,3 +266,32 @@ pub const Message = union(enum) {
|
|||||||
font_size: ?font.face.DesiredSize = null,
|
font_size: ?font.face.DesiredSize = null,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Wasm API.
|
||||||
|
pub const Wasm = if (!builtin.target.isWasm()) struct {} else struct {
|
||||||
|
const wasm = @import("os/wasm.zig");
|
||||||
|
const alloc = wasm.alloc;
|
||||||
|
|
||||||
|
// export fn app_new(config: *Config) ?*App {
|
||||||
|
// return app_new_(config) catch |err| {
|
||||||
|
// log.err("error initializing app err={}", .{err});
|
||||||
|
// return null;
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// fn app_new_(config: *Config) !*App {
|
||||||
|
// const app = try App.create(alloc, config);
|
||||||
|
// errdefer app.destroy();
|
||||||
|
//
|
||||||
|
// const result = try alloc.create(App);
|
||||||
|
// result.* = app;
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// export fn app_free(ptr: ?*App) void {
|
||||||
|
// if (ptr) |v| {
|
||||||
|
// v.destroy();
|
||||||
|
// alloc.destroy(v);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
};
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
const DevMode = @This();
|
const DevMode = @This();
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
const builtin = @import("builtin");
|
||||||
const imgui = @import("imgui");
|
const imgui = @import("imgui");
|
||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
@ -14,7 +15,7 @@ const Config = @import("config.zig").Config;
|
|||||||
|
|
||||||
/// If this is false, the rest of the terminal will be compiled without
|
/// If this is false, the rest of the terminal will be compiled without
|
||||||
/// dev mode support at all.
|
/// dev mode support at all.
|
||||||
pub const enabled = true;
|
pub const enabled = !builtin.target.isWasm();
|
||||||
|
|
||||||
/// The global DevMode instance that can be used app-wide. Assume all functions
|
/// The global DevMode instance that can be used app-wide. Assume all functions
|
||||||
/// are NOT thread-safe unless otherwise noted.
|
/// are NOT thread-safe unless otherwise noted.
|
||||||
|
@ -12,13 +12,16 @@ const builtin = @import("builtin");
|
|||||||
|
|
||||||
pub usingnamespace @import("apprt/structs.zig");
|
pub usingnamespace @import("apprt/structs.zig");
|
||||||
pub const glfw = @import("apprt/glfw.zig");
|
pub const glfw = @import("apprt/glfw.zig");
|
||||||
|
pub const browser = @import("apprt/browser.zig");
|
||||||
pub const Window = @import("apprt/Window.zig");
|
pub const Window = @import("apprt/Window.zig");
|
||||||
|
|
||||||
/// The implementation to use for the app runtime. This is comptime chosen
|
/// The implementation to use for the app runtime. This is comptime chosen
|
||||||
/// so that every build has exactly one application runtime implementation.
|
/// so that every build has exactly one application runtime implementation.
|
||||||
/// Note: it is very rare to use Runtime directly; most usage will use
|
/// Note: it is very rare to use Runtime directly; most usage will use
|
||||||
/// Window or something.
|
/// Window or something.
|
||||||
pub const runtime = switch (builtin.os.tag) {
|
pub const runtime = if (builtin.target.isWasm())
|
||||||
|
browser
|
||||||
|
else switch (builtin.os.tag) {
|
||||||
else => glfw,
|
else => glfw,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
2
src/apprt/browser.zig
Normal file
2
src/apprt/browser.zig
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pub const App = struct {};
|
||||||
|
pub const Window = struct {};
|
@ -8,6 +8,7 @@ pub usingnamespace @import("os/wasm/log.zig");
|
|||||||
pub usingnamespace @import("font/main.zig");
|
pub usingnamespace @import("font/main.zig");
|
||||||
pub usingnamespace @import("terminal/main.zig");
|
pub usingnamespace @import("terminal/main.zig");
|
||||||
pub usingnamespace @import("config.zig").Wasm;
|
pub usingnamespace @import("config.zig").Wasm;
|
||||||
|
pub usingnamespace @import("App.zig").Wasm;
|
||||||
|
|
||||||
// Set our log level. We try to get as much logging as possible but in
|
// Set our log level. We try to get as much logging as possible but in
|
||||||
// ReleaseSmall mode where we're optimizing for space, we elevate the
|
// ReleaseSmall mode where we're optimizing for space, we elevate the
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
const options = @import("build_options");
|
const options = @import("build_options");
|
||||||
|
const Target = @import("wasm/target.zig").Target;
|
||||||
|
|
||||||
comptime {
|
comptime {
|
||||||
if (!builtin.target.isWasm()) {
|
if (!builtin.target.isWasm()) {
|
||||||
@ -13,6 +14,16 @@ comptime {
|
|||||||
/// in JS will be backed by a SharedArrayBuffer and some behaviors change.
|
/// in JS will be backed by a SharedArrayBuffer and some behaviors change.
|
||||||
pub const shared_mem = options.wasm_shared;
|
pub const shared_mem = options.wasm_shared;
|
||||||
|
|
||||||
|
/// Our specific target platform.
|
||||||
|
pub const target: ?Target = if (!builtin.target.isWasm()) null else target: {
|
||||||
|
const result = @intToEnum(Target, @enumToInt(options.wasm_target));
|
||||||
|
// This maybe isn't necessary but I don't know if enums without a specific
|
||||||
|
// tag type and value are guaranteed to be the same between build.zig
|
||||||
|
// compilation and our own source compilation so I have this just in case.
|
||||||
|
std.debug.assert(std.mem.eql(u8, @tagName(result), @tagName(options.wasm_target)));
|
||||||
|
break :target result;
|
||||||
|
};
|
||||||
|
|
||||||
/// The allocator to use in wasm environments.
|
/// The allocator to use in wasm environments.
|
||||||
///
|
///
|
||||||
/// The return values of this should NOT be sent to the host environment
|
/// The return values of this should NOT be sent to the host environment
|
||||||
|
6
src/os/wasm/target.zig
Normal file
6
src/os/wasm/target.zig
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/// The wasm target platform. This is used to toggle certain features
|
||||||
|
/// on and off since the standard triple target is often not specific
|
||||||
|
/// enough (i.e. we can't tell wasm32-freestanding is for browser or not).
|
||||||
|
pub const Target = enum {
|
||||||
|
browser,
|
||||||
|
};
|
@ -14,13 +14,17 @@ pub usingnamespace @import("renderer/message.zig");
|
|||||||
pub usingnamespace @import("renderer/size.zig");
|
pub usingnamespace @import("renderer/size.zig");
|
||||||
pub const Metal = @import("renderer/Metal.zig");
|
pub const Metal = @import("renderer/Metal.zig");
|
||||||
pub const OpenGL = @import("renderer/OpenGL.zig");
|
pub const OpenGL = @import("renderer/OpenGL.zig");
|
||||||
|
pub const WebGL = @import("renderer/WebGL.zig");
|
||||||
pub const Options = @import("renderer/Options.zig");
|
pub const Options = @import("renderer/Options.zig");
|
||||||
pub const Thread = @import("renderer/Thread.zig");
|
pub const Thread = @import("renderer/Thread.zig");
|
||||||
pub const State = @import("renderer/State.zig");
|
pub const State = @import("renderer/State.zig");
|
||||||
|
|
||||||
/// The implementation to use for the renderer. This is comptime chosen
|
/// The implementation to use for the renderer. This is comptime chosen
|
||||||
/// so that every build has exactly one renderer implementation.
|
/// so that every build has exactly one renderer implementation.
|
||||||
pub const Renderer = switch (builtin.os.tag) {
|
const wasm = @import("os/wasm.zig");
|
||||||
|
pub const Renderer = if (wasm.target) |target| switch (target) {
|
||||||
|
.browser => WebGL,
|
||||||
|
} else switch (builtin.os.tag) {
|
||||||
.macos => Metal,
|
.macos => Metal,
|
||||||
else => OpenGL,
|
else => OpenGL,
|
||||||
};
|
};
|
||||||
|
2
src/renderer/WebGL.zig
Normal file
2
src/renderer/WebGL.zig
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
//! Renderer implementation for WebGL in the browser.
|
||||||
|
pub const WebGL = @This();
|
Reference in New Issue
Block a user