diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 5bbe1da38..8b1e4c1b6 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -8,14 +8,16 @@ jobs:
os: [ubuntu-latest]
target: [
- aarch64-macos,
- x86_64-macos,
-
aarch64-linux-gnu,
x86_64-linux-gnu,
# No windows support currently.
# i386-windows,
# x86_64-windows-gnu,
+
+ # We don't support cross-compiling to macOS because the macOS build
+ # requires xcode due to the swift harness.
+ #aarch64-macos,
+ #x86_64-macos,
]
runs-on: ${{ matrix.os }}
needs: test
diff --git a/.gitmodules b/.gitmodules
index 4df722c19..0e951e350 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,42 +1,6 @@
-[submodule "vendor/freetype"]
- path = vendor/freetype
- url = https://github.com/freetype/freetype.git
-[submodule "vendor/tracy"]
- path = vendor/tracy
- url = https://github.com/wolfpld/tracy.git
-[submodule "vendor/mach-sdk/sdk-linux-aarch64"]
- path = vendor/mach-sdk/sdk-linux-aarch64
- url = https://github.com/hexops/sdk-linux-aarch64.git
-[submodule "vendor/zlib"]
- path = vendor/zlib
- url = https://github.com/madler/zlib.git
-[submodule "vendor/libpng"]
- path = vendor/libpng
- url = https://github.com/glennrp/libpng.git
-[submodule "vendor/utf8proc"]
- path = vendor/utf8proc
- url = https://github.com/JuliaStrings/utf8proc.git
[submodule "vendor/harfbuzz"]
path = vendor/harfbuzz
url = https://github.com/harfbuzz/harfbuzz.git
-[submodule "vendor/zig-libxml2"]
- path = vendor/zig-libxml2
- url = https://github.com/mitchellh/zig-libxml2.git
-[submodule "vendor/cimgui"]
- path = vendor/cimgui
- url = https://github.com/cimgui/cimgui.git
-[submodule "vendor/zig-js"]
- path = vendor/zig-js
- url = https://github.com/mitchellh/zig-js.git
-[submodule "vendor/zig-objc"]
- path = vendor/zig-objc
- url = https://github.com/mitchellh/zig-objc.git
-[submodule "vendor/libxev"]
- path = vendor/libxev
- url = https://github.com/mitchellh/libxev.git
-[submodule "vendor/mach-sdk/sdk-linux-x86_64"]
- path = vendor/mach-sdk/sdk-linux-x86_64
- url = https://github.com/hexops/sdk-linux-x86_64.git
-[submodule "vendor/mach-glfw"]
- path = vendor/mach-glfw
- url = https://github.com/mitchellh/mach-glfw.git
+[submodule "vendor/libxml2"]
+ path = vendor/libxml2
+ url = https://github.com/GNOME/libxml2.git
diff --git a/build.zig b/build.zig
index fc944059b..efdd794f3 100644
--- a/build.zig
+++ b/build.zig
@@ -14,22 +14,6 @@ const LipoStep = @import("src/build/LipoStep.zig");
const XCFrameworkStep = @import("src/build/XCFrameworkStep.zig");
const Version = @import("src/build/Version.zig");
-const glfw = @import("vendor/mach-glfw/build.zig");
-const fontconfig = @import("pkg/fontconfig/build.zig");
-const freetype = @import("pkg/freetype/build.zig");
-const harfbuzz = @import("pkg/harfbuzz/build.zig");
-const js = @import("vendor/zig-js/build.zig");
-const libxev = @import("vendor/libxev/build.zig");
-const libxml2 = @import("vendor/zig-libxml2/libxml2.zig");
-const libpng = @import("pkg/libpng/build.zig");
-const macos = @import("pkg/macos/build.zig");
-const objc = @import("vendor/zig-objc/build.zig");
-const pixman = @import("pkg/pixman/build.zig");
-const utf8proc = @import("pkg/utf8proc/build.zig");
-const zlib = @import("pkg/zlib/build.zig");
-const tracylib = @import("pkg/tracy/build.zig");
-const system_sdk = @import("vendor/mach-glfw/system_sdk.zig");
-
// Do a comptime Zig version requirement. The required Zig version is
// somewhat arbitrary: it is meant to be a version that we feel works well,
// but we liberally update it. In the future, we'll be more careful about
@@ -610,33 +594,6 @@ pub fn build(b: *std.Build) !void {
const test_run = b.addRunArtifact(main_test);
test_step.dependOn(&test_run.step);
}
-
- // Named package dependencies don't have their tests run by reference,
- // so we iterate through them here. We're only interested in dependencies
- // we wrote (are in the "pkg/" directory).
- var it = main_test.modules.iterator();
- while (it.next()) |entry| {
- const name = entry.key_ptr.*;
- const module = entry.value_ptr.*;
- if (std.mem.eql(u8, name, "build_options")) continue;
- if (std.mem.eql(u8, name, "glfw")) continue;
-
- const test_exe = b.addTest(.{
- .name = b.fmt("{s}-test", .{name}),
- .root_source_file = module.source_file,
- .target = target,
- });
- if (emit_test_exe) b.installArtifact(test_exe);
-
- _ = try addDeps(b, test_exe, true);
- // if (pkg.dependencies) |children| {
- // test_.packages = std.ArrayList(std.build.Pkg).init(b.allocator);
- // try test_.packages.appendSlice(children);
- // }
-
- const test_run = b.addRunArtifact(test_exe);
- test_step.dependOn(&test_run.step);
- }
}
}
@@ -652,20 +609,6 @@ fn addDeps(
var static_libs = FileSourceList.init(b.allocator);
errdefer static_libs.deinit();
- // Wasm we do manually since it is such a different build.
- if (step.target.getCpuArch() == .wasm32) {
- // We link this package but its a no-op since Tracy
- // never actually WORKS with wasm.
- step.addModule("tracy", tracylib.module(b));
- step.addModule("utf8proc", utf8proc.module(b));
- step.addModule("zig-js", js.module(b));
-
- // utf8proc
- _ = try utf8proc.link(b, step);
-
- return static_libs;
- }
-
// For dynamic linking, we prefer dynamic linking and to search by
// mode first. Mode first will search all paths for a dynamic library
// before falling back to static.
@@ -674,6 +617,68 @@ fn addDeps(
.search_strategy = .mode_first,
};
+ // Dependencies
+ const js_dep = b.dependency("zig_js", .{ .target = step.target, .optimize = step.optimize });
+ const libxev_dep = b.dependency("libxev", .{ .target = step.target, .optimize = step.optimize });
+ const objc_dep = b.dependency("zig_objc", .{ .target = step.target, .optimize = step.optimize });
+ const fontconfig_dep = b.dependency("fontconfig", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const freetype_dep = b.dependency("freetype", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ .@"enable-libpng" = true,
+ });
+ const mach_glfw_dep = b.dependency("mach_glfw", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const libpng_dep = b.dependency("libpng", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const macos_dep = b.dependency("macos", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const pixman_dep = b.dependency("pixman", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const tracy_dep = b.dependency("tracy", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const zlib_dep = b.dependency("zlib", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const utf8proc_dep = b.dependency("utf8proc", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ });
+ const harfbuzz_dep = b.dependency("harfbuzz", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ .@"enable-freetype" = true,
+ .@"enable-coretext" = font_backend.hasCoretext(),
+ });
+
+ // Wasm we do manually since it is such a different build.
+ if (step.target.getCpuArch() == .wasm32) {
+ // We link this package but its a no-op since Tracy
+ // never actually WORKS with wasm.
+ step.addModule("tracy", tracy_dep.module("tracy"));
+ step.addModule("utf8proc", utf8proc_dep.module("utf8proc"));
+ step.addModule("zig-js", js_dep.module("zig-js"));
+
+ // utf8proc
+ step.linkLibrary(utf8proc_dep.artifact("utf8proc"));
+
+ return static_libs;
+ }
+
// On Linux, we need to add a couple common library paths that aren't
// on the standard search list. i.e. GTK is often in /usr/lib/x86_64-linux-gnu
// on x86_64.
@@ -692,50 +697,43 @@ fn addDeps(
// We always require the system SDK so that our system headers are available.
// This makes things like `os/log.h` available for cross-compiling.
- system_sdk.include(b, step, .{});
+ try addSystemSDK(b, step);
// We always need the Zig packages
// TODO: This can't be the right way to use the new Zig modules system,
// so take a closer look at this again later.
- if (font_backend.hasFontconfig()) step.addModule("fontconfig", fontconfig.module(b));
- const mod_freetype = freetype.module(b);
- const mod_macos = macos.module(b);
- const mod_libxev = b.createModule(.{
- .source_file = .{ .path = "vendor/libxev/src/main.zig" },
- });
- step.addModule("freetype", mod_freetype);
- step.addModule("harfbuzz", harfbuzz.module(b, .{
- .freetype = mod_freetype,
- .macos = mod_macos,
- }));
- step.addModule("xev", mod_libxev);
- step.addModule("pixman", pixman.module(b));
- step.addModule("utf8proc", utf8proc.module(b));
+ if (font_backend.hasFontconfig()) step.addModule(
+ "fontconfig",
+ fontconfig_dep.module("fontconfig"),
+ );
+ step.addModule("freetype", freetype_dep.module("freetype"));
+ step.addModule("harfbuzz", harfbuzz_dep.module("harfbuzz"));
+ step.addModule("xev", libxev_dep.module("xev"));
+ step.addModule("pixman", pixman_dep.module("pixman"));
+ step.addModule("utf8proc", utf8proc_dep.module("utf8proc"));
// Mac Stuff
if (step.target.isDarwin()) {
- step.addModule("objc", objc.module(b));
- step.addModule("macos", mod_macos);
- _ = try macos.link(b, step, .{});
-
- // todo: do this is in zig-objc instead.
- step.linkSystemLibraryName("objc");
+ step.addModule("objc", objc_dep.module("objc"));
+ step.addModule("macos", macos_dep.module("macos"));
+ step.linkLibrary(macos_dep.artifact("macos"));
+ try static_libs.append(macos_dep.artifact("macos").getEmittedBin());
}
// Tracy
- step.addModule("tracy", tracylib.module(b));
+ step.addModule("tracy", tracy_dep.module("tracy"));
if (tracy) {
- var tracy_step = try tracylib.link(b, step);
- system_sdk.include(b, tracy_step, .{});
+ step.linkLibrary(tracy_dep.artifact("tracy"));
+ try static_libs.append(tracy_dep.artifact("tracy").getEmittedBin());
}
// utf8proc
- const utf8proc_step = try utf8proc.link(b, step);
- try static_libs.append(utf8proc_step.getEmittedBin());
+ step.linkLibrary(utf8proc_dep.artifact("utf8proc"));
+ try static_libs.append(utf8proc_dep.artifact("utf8proc").getEmittedBin());
// Dynamic link
if (!static) {
- step.addIncludePath(.{ .path = freetype.include_path_self });
+ step.addIncludePath(freetype_dep.path(""));
step.linkSystemLibrary2("bzip2", dynamic_link_opts);
step.linkSystemLibrary2("freetype2", dynamic_link_opts);
step.linkSystemLibrary2("harfbuzz", dynamic_link_opts);
@@ -750,78 +748,28 @@ fn addDeps(
// Other dependencies, we may dynamically link
if (static) {
- const zlib_step = try zlib.link(b, step);
- try static_libs.append(zlib_step.getEmittedBin());
+ step.linkLibrary(zlib_dep.artifact("z"));
+ try static_libs.append(zlib_dep.artifact("z").getEmittedBin());
- const libpng_step = try libpng.link(b, step, .{
- .zlib = .{
- .step = zlib_step,
- .include = &zlib.include_paths,
- },
- });
- try static_libs.append(libpng_step.getEmittedBin());
+ step.linkLibrary(libpng_dep.artifact("png"));
+ try static_libs.append(libpng_dep.artifact("png").getEmittedBin());
// Freetype
- const freetype_step = try freetype.link(b, step, .{
- .libpng = freetype.Options.Libpng{
- .enabled = true,
- .step = libpng_step,
- .include = &libpng.include_paths,
- },
-
- .zlib = .{
- .enabled = true,
- .step = zlib_step,
- .include = &zlib.include_paths,
- },
- });
- try static_libs.append(freetype_step.getEmittedBin());
+ step.linkLibrary(freetype_dep.artifact("freetype"));
+ try static_libs.append(freetype_dep.artifact("freetype").getEmittedBin());
// Harfbuzz
- const harfbuzz_step = try harfbuzz.link(b, step, .{
- .freetype = .{
- .enabled = true,
- .step = freetype_step,
- .include = &freetype.include_paths,
- },
-
- .coretext = .{
- .enabled = font_backend.hasCoretext(),
- },
- });
- system_sdk.include(b, harfbuzz_step, .{});
- try static_libs.append(harfbuzz_step.getEmittedBin());
+ step.linkLibrary(harfbuzz_dep.artifact("harfbuzz"));
+ try static_libs.append(harfbuzz_dep.artifact("harfbuzz").getEmittedBin());
// Pixman
- const pixman_step = try pixman.link(b, step, .{});
- try static_libs.append(pixman_step.getEmittedBin());
+ step.linkLibrary(pixman_dep.artifact("pixman"));
+ try static_libs.append(pixman_dep.artifact("pixman").getEmittedBin());
// Only Linux gets fontconfig
if (font_backend.hasFontconfig()) {
- // Libxml2
- const libxml2_lib = try libxml2.create(
- b,
- step.target,
- step.optimize,
- .{
- .lzma = false,
- .zlib = false,
- .iconv = !step.target.isWindows(),
- },
- );
- libxml2_lib.link(step);
-
// Fontconfig
- const fontconfig_step = try fontconfig.link(b, step, .{
- .freetype = .{
- .enabled = true,
- .step = freetype_step,
- .include = &freetype.include_paths,
- },
-
- .libxml2 = true,
- });
- libxml2_lib.link(fontconfig_step);
+ step.linkLibrary(fontconfig_dep.artifact("fontconfig"));
}
}
@@ -837,26 +785,29 @@ fn addDeps(
// get access to glib for dbus.
if (flatpak) step.linkSystemLibrary2("gtk4", dynamic_link_opts);
+ // We may link GLFW below
+ const glfw_dep = b.dependency("glfw", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ .x11 = step.target.isLinux(),
+ .wayland = step.target.isLinux(),
+ .metal = step.target.isDarwin(),
+ });
+
switch (app_runtime) {
.none => {},
.glfw => {
- step.addModule("glfw", glfw.module(b));
- const glfw_opts: glfw.Options = .{
- .metal = step.target.isDarwin(),
- .opengl = false,
- };
- try glfw.link(b, step, glfw_opts);
+ step.addModule("glfw", mach_glfw_dep.module("mach-glfw"));
+ step.linkLibrary(mach_glfw_dep.artifact("mach-glfw"));
+ step.linkLibrary(glfw_dep.artifact("glfw"));
},
.gtk => {
// We need glfw for GTK because we use GLFW to get DPI.
- step.addModule("glfw", glfw.module(b));
- const glfw_opts: glfw.Options = .{
- .metal = step.target.isDarwin(),
- .opengl = false,
- };
- try glfw.link(b, step, glfw_opts);
+ step.addModule("glfw", mach_glfw_dep.module("mach-glfw"));
+ step.linkLibrary(mach_glfw_dep.artifact("mach-glfw"));
+ step.linkLibrary(glfw_dep.artifact("glfw"));
step.linkSystemLibrary2("gtk4", dynamic_link_opts);
},
@@ -866,6 +817,31 @@ fn addDeps(
return static_libs;
}
+/// Adds the proper system headers for the target.
+fn addSystemSDK(
+ b: *std.Build,
+ step: *std.Build.CompileStep,
+) !void {
+ if (step.target.isDarwin()) {
+ try @import("apple_sdk").addPaths(b, step);
+ }
+
+ if (step.target.isLinux()) {
+ step.linkLibrary(b.dependency("x11_headers", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ }).artifact("x11-headers"));
+ }
+
+ // GLFW requires these on all platforms so we just add them here. It
+ // doesn't hurt to add them if we don't use GLFW since they're all
+ // namespaced.
+ step.linkLibrary(b.dependency("vulkan_headers", .{
+ .target = step.target,
+ .optimize = step.optimize,
+ }).artifact("vulkan-headers"));
+}
+
fn benchSteps(
b: *std.Build,
target: std.zig.CrossTarget,
diff --git a/build.zig.zon b/build.zig.zon
new file mode 100644
index 000000000..612bfd3b0
--- /dev/null
+++ b/build.zig.zon
@@ -0,0 +1,50 @@
+.{
+ .name = "ghostty",
+ .version = "0.1.0",
+ .dependencies = .{
+ // Zig libs
+ .libxev = .{
+ .url = "https://github.com/mitchellh/libxev/archive/ecbc161a5dace26a1fd47e494f8be2cfd051cbfb.tar.gz",
+ .hash = "1220f34357168affd9aab1a3fcafcaff093c44beb75ce1d4d4b75490e90729221771",
+ },
+ .mach_glfw = .{
+ .url = "https://github.com/hexops/mach-glfw/archive/321efd4065b57e31d8ab0bce720852c1d680d443.tar.gz",
+ .hash = "122002e355cf42b8d257efc95229c9ee6be4cca189c1718f86179cb7c21225beeb75",
+ },
+ .zig_objc = .{
+ .url = "https://github.com/mitchellh/zig-objc/archive/01c16aaeeb674622f4a0e715aeeb16c8ce0bc30e.tar.gz",
+ .hash = "1220f9c919a1171ecf5d097a0d0349e8a9a01b45afa41006dd7eb0afa6243a5fa21f",
+ },
+ .zig_js = .{
+ .url = "https://github.com/mitchellh/zig-js/archive/60ac42ab137461cdba2b38cc6c5e16376470aae6.tar.gz",
+ .hash = "1220319b42fbc0116f3f198343256018e9f1da9483cef259201afe4ebab0ce0d8f6a",
+ },
+
+ .glfw = .{
+ .url = "https://pkg.machengine.org/glfw/92abc63294d389c8f2a546686b6c072930b029e0.tar.gz",
+ .hash = "12205a6ce386007b97e22ef4b78a4f68c98af2cd6e1fde82589191fda79b9de54d0d",
+ },
+
+ // C libs
+ .fontconfig = .{ .path = "./pkg/fontconfig" },
+ .freetype = .{ .path = "./pkg/freetype" },
+ .harfbuzz = .{ .path = "./pkg/harfbuzz" },
+ .libpng = .{ .path = "./pkg/libpng" },
+ .macos = .{ .path = "./pkg/macos" },
+ .pixman = .{ .path = "./pkg/pixman" },
+ .tracy = .{ .path = "./pkg/tracy" },
+ .utf8proc = .{ .path = "./pkg/utf8proc" },
+ .zlib = .{ .path = "./pkg/zlib" },
+
+ // System headers
+ .apple_sdk = .{ .path = "./pkg/apple-sdk" },
+ .vulkan_headers = .{
+ .url = "https://pkg.machengine.org/vulkan-headers/fc495148a910ac7817ce0ec2d5948231806f2ac0.tar.gz",
+ .hash = "12209aeba80369fa8638b82179b47e6742adb98a3a5b01bc518565504a922baad3e4",
+ },
+ .x11_headers = .{
+ .url = "https://pkg.machengine.org/x11-headers/26d12e9fc0d893085bcb711088a4a19afdff1adc.tar.gz",
+ .hash = "1220371a61d8bb57fce8ee1741f623cc19b0edd7d1b4adc9918663f8a7ef08aa4f3f",
+ },
+ },
+}
diff --git a/nix/devshell.nix b/nix/devshell.nix
index 5b1c18e7d..78d8de6fb 100644
--- a/nix/devshell.nix
+++ b/nix/devshell.nix
@@ -51,6 +51,7 @@ let
freetype
harfbuzz
libpng
+ pixman
zlib
libX11
diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig
new file mode 100644
index 000000000..248fd5fea
--- /dev/null
+++ b/pkg/apple-sdk/build.zig
@@ -0,0 +1,141 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+
+ const lib = b.addStaticLibrary(.{
+ .name = "stub",
+ .target = target,
+ .optimize = optimize,
+ });
+ lib.linkLibC();
+ lib.addCSourceFiles(&.{"stub.c"}, &.{});
+ try addPaths(b, lib);
+
+ b.installArtifact(lib);
+}
+
+/// Add the necessary paths to the given compilation step for the Xcode SDK.
+///
+/// This is required to workaround a Zig issue where we can't depend directly
+/// on the hexops/xcode-frameworks repository: https://github.com/ziglang/zig/pull/15382
+///
+/// This is copied and adapted from hexops/mach. I modified it slightly
+/// for my own personal taste (nothing wrong with theirs!), but the logic
+/// is effectively identical.
+pub fn addPaths(b: *std.Build, step: *std.build.CompileStep) !void {
+ // branch: mach
+ try ensureGitRepoCloned(
+ b.allocator,
+ // WARNING: forked temporarily for https://github.com/hexops/xcode-frameworks/issues/4
+ "https://github.com/mitchellh/xcode-frameworks",
+ "983deb1ab8d03861db30ea297cc78e6d121da4db",
+ xSdkPath("/zig-cache/xcode_frameworks"),
+ );
+
+ // https://github.com/ziglang/zig/issues/17358
+ if (step.target.isNative()) b.sysroot = xSdkPath("/zig-cache/xcode_frameworks");
+
+ step.addSystemFrameworkPath(.{ .path = xSdkPath("/zig-cache/xcode_frameworks/Frameworks") });
+ step.addSystemIncludePath(.{ .path = xSdkPath("/zig-cache/xcode_frameworks/include") });
+ step.addLibraryPath(.{ .path = xSdkPath("/zig-cache/xcode_frameworks/lib") });
+}
+
+fn ensureGitRepoCloned(
+ allocator: std.mem.Allocator,
+ clone_url: []const u8,
+ revision: []const u8,
+ dir: []const u8,
+) !void {
+ if (envVarIsTruthy(allocator, "NO_ENSURE_SUBMODULES") or
+ envVarIsTruthy(allocator, "NO_ENSURE_GIT")) return;
+
+ ensureGit(allocator);
+
+ if (std.fs.openDirAbsolute(dir, .{})) |_| {
+ const current_revision = try currentGitRevision(allocator, dir);
+ if (!std.mem.eql(u8, current_revision, revision)) {
+ // Reset to the desired revision
+ exec(
+ allocator,
+ &[_][]const u8{ "git", "fetch" },
+ dir,
+ ) catch |err| std.debug.print(
+ "warning: failed to 'git fetch' in {s}: {s}\n",
+ .{ dir, @errorName(err) },
+ );
+ try exec(allocator, &[_][]const u8{ "git", "checkout", "--quiet", "--force", revision }, dir);
+ try exec(allocator, &[_][]const u8{ "git", "submodule", "update", "--init", "--recursive" }, dir);
+ }
+ return;
+ } else |err| return switch (err) {
+ error.FileNotFound => {
+ std.log.info("cloning required dependency..\ngit clone {s} {s}..\n", .{ clone_url, dir });
+ try exec(allocator, &[_][]const u8{ "git", "clone", "-c", "core.longpaths=true", clone_url, dir }, ".");
+ try exec(allocator, &[_][]const u8{ "git", "checkout", "--quiet", "--force", revision }, dir);
+ try exec(allocator, &[_][]const u8{ "git", "submodule", "update", "--init", "--recursive" }, dir);
+ return;
+ },
+ else => err,
+ };
+}
+
+fn exec(
+ allocator: std.mem.Allocator,
+ argv: []const []const u8,
+ cwd: []const u8,
+) !void {
+ var child = std.ChildProcess.init(argv, allocator);
+ child.cwd = cwd;
+ _ = try child.spawnAndWait();
+}
+
+fn currentGitRevision(allocator: std.mem.Allocator, cwd: []const u8) ![]const u8 {
+ const result = try std.ChildProcess.exec(.{
+ .allocator = allocator,
+ .argv = &.{ "git", "rev-parse", "HEAD" },
+ .cwd = cwd,
+ });
+ allocator.free(result.stderr);
+ if (result.stdout.len > 0) return result.stdout[0 .. result.stdout.len - 1]; // trim newline
+ return result.stdout;
+}
+
+fn ensureGit(allocator: std.mem.Allocator) void {
+ const argv = &[_][]const u8{ "git", "--version" };
+ const result = std.ChildProcess.exec(.{
+ .allocator = allocator,
+ .argv = argv,
+ .cwd = ".",
+ }) catch { // e.g. FileNotFound
+ std.log.err("mach: error: 'git --version' failed. Is git not installed?", .{});
+ std.process.exit(1);
+ };
+ defer {
+ allocator.free(result.stderr);
+ allocator.free(result.stdout);
+ }
+ if (result.term.Exited != 0) {
+ std.log.err("mach: error: 'git --version' failed. Is git not installed?", .{});
+ std.process.exit(1);
+ }
+}
+
+fn envVarIsTruthy(allocator: std.mem.Allocator, name: []const u8) bool {
+ if (std.process.getEnvVarOwned(allocator, name)) |truthy| {
+ defer allocator.free(truthy);
+ if (std.mem.eql(u8, truthy, "true")) return true;
+ return false;
+ } else |_| {
+ return false;
+ }
+}
+
+fn xSdkPath(comptime suffix: []const u8) []const u8 {
+ if (suffix[0] != '/') @compileError("suffix must be an absolute path");
+ return comptime blk: {
+ const root_dir = std.fs.path.dirname(@src().file) orelse ".";
+ break :blk root_dir ++ suffix;
+ };
+}
diff --git a/pkg/apple-sdk/stub.c b/pkg/apple-sdk/stub.c
new file mode 100644
index 000000000..ce34f4ab0
--- /dev/null
+++ b/pkg/apple-sdk/stub.c
@@ -0,0 +1 @@
+// Blank on purpose
diff --git a/pkg/fontconfig/build.zig b/pkg/fontconfig/build.zig
index 03b9573c0..bfdac3a33 100644
--- a/pkg/fontconfig/build.zig
+++ b/pkg/fontconfig/build.zig
@@ -1,107 +1,52 @@
const std = @import("std");
-const builtin = @import("builtin");
const NativeTargetInfo = std.zig.system.NativeTargetInfo;
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/fontconfig-2.14.0/";
-const include_path = root;
-const include_path_self = thisDir();
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-pub const include_paths = .{ include_path, include_path_self };
+ const libxml2_enabled = b.option(bool, "enable-libxml2", "Build libxml2") orelse true;
+ const freetype_enabled = b.option(bool, "enable-freetype", "Build freetype") orelse true;
-pub fn module(b: *std.Build) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" },
- });
-}
+ _ = b.addModule("fontconfig", .{ .source_file = .{ .path = "main.zig" } });
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub const Options = struct {
- freetype: Freetype = .{},
- expat: Expat = .{},
- libxml2: bool = false,
-
- pub const Freetype = struct {
- enabled: bool = false,
- step: ?*std.build.LibExeObjStep = null,
- include: ?[]const []const u8 = null,
- };
-
- pub const Expat = struct {
- enabled: bool = false,
- step: ?*std.build.LibExeObjStep = null,
- include: ?[]const []const u8 = null,
- };
-};
-
-pub fn link(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const lib = try buildFontconfig(b, step, opt);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- step.addIncludePath(.{ .path = include_path_self });
- return lib;
-}
-
-pub fn buildFontconfig(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const target = step.target;
+ const upstream = b.dependency("fontconfig", .{});
const lib = b.addStaticLibrary(.{
.name = "fontconfig",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
});
-
- // Include
- lib.addIncludePath(.{ .path = include_path });
- lib.addIncludePath(.{ .path = include_path_self });
-
- // Link
lib.linkLibC();
- if (opt.expat.enabled) {
- if (opt.expat.step) |expat|
- lib.linkLibrary(expat)
- else
- lib.linkSystemLibrary("expat");
-
- if (opt.expat.include) |dirs|
- for (dirs) |dir| lib.addIncludePath(.{ .path = dir });
- }
- if (opt.freetype.enabled) {
- if (opt.freetype.step) |freetype|
- lib.linkLibrary(freetype)
- else
- lib.linkSystemLibrary("freetype2");
-
- if (opt.freetype.include) |dirs|
- for (dirs) |dir| lib.addIncludePath(.{ .path = dir });
- }
if (!target.isWindows()) {
lib.linkSystemLibrary("pthread");
}
+ if (freetype_enabled) {
+ const freetype_dep = b.dependency("freetype", .{ .target = target, .optimize = optimize });
+ lib.linkLibrary(freetype_dep.artifact("freetype"));
+ }
+ if (libxml2_enabled) {
+ const libxml2_dep = b.dependency("libxml2", .{ .target = target, .optimize = optimize });
+ lib.linkLibrary(libxml2_dep.artifact("xml2"));
+ }
+
+ lib.addIncludePath(upstream.path(""));
+ lib.addIncludePath(.{ .path = "override/include" });
- // Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
-
try flags.appendSlice(&.{
"-DHAVE_DIRENT_H",
"-DHAVE_FCNTL_H",
"-DHAVE_STDLIB_H",
"-DHAVE_STRING_H",
"-DHAVE_UNISTD_H",
+ "-DHAVE_SYS_STATVFS_H",
"-DHAVE_SYS_PARAM_H",
+ "-DHAVE_SYS_MOUNT_H",
+ "-DHAVE_LINK",
"-DHAVE_MKSTEMP",
+ "-DHAVE_MKOSTEMP",
"-DHAVE__MKTEMP_S",
"-DHAVE_MKDTEMP",
"-DHAVE_GETOPT",
@@ -109,9 +54,15 @@ pub fn buildFontconfig(
//"-DHAVE_GETPROGNAME",
//"-DHAVE_GETEXECNAME",
"-DHAVE_RAND",
+ "-DHAVE_RANDOM",
+ "-DHAVE_LRAND48",
//"-DHAVE_RANDOM_R",
+ "-DHAVE_RAND_R",
+ "-DHAVE_READLINK",
"-DHAVE_FSTATVFS",
"-DHAVE_FSTATFS",
+ "-DHAVE_LSTAT",
+ "-DHAVE_MMAP",
"-DHAVE_VPRINTF",
"-DHAVE_FT_GET_BDF_PROPERTY",
@@ -156,21 +107,6 @@ pub fn buildFontconfig(
else => @panic("unsupported arch"),
}
-
- if (opt.libxml2) {
- try flags.appendSlice(&.{
- "-DENABLE_LIBXML2",
- "-DLIBXML_STATIC",
- "-DLIBXML_PUSH_ENABLED",
- });
- if (target.isWindows()) {
- // NOTE: this should be defined on all targets
- try flags.appendSlice(&.{
- "-Werror=implicit-function-declaration",
- });
- }
- }
-
if (target.isWindows()) {
try flags.appendSlice(&.{
"-DFC_CACHEDIR=\"LOCAL_APPDATA_FONTCONFIG_CACHE\"",
@@ -181,8 +117,6 @@ pub fn buildFontconfig(
} else {
try flags.appendSlice(&.{
"-DHAVE_SYS_STATVFS_H",
- "-DHAVE_SYS_VFS_H",
- "-DHAVE_SYS_STATFS_H",
"-DHAVE_SYS_MOUNT_H",
"-DHAVE_LINK",
"-DHAVE_MKOSTEMP",
@@ -200,41 +134,88 @@ pub fn buildFontconfig(
"-DCONFIGDIR=\"/usr/local/fontconfig/conf.d\"",
"-DFC_DEFAULT_FONTS=\"
/usr/share/fonts/usr/local/share/fonts\"",
});
+ if (target.isLinux()) {
+ try flags.appendSlice(&.{
+ "-DHAVE_SYS_STATFS_H",
+ "-DHAVE_SYS_VFS_H",
+ });
+ }
+ }
+ if (libxml2_enabled) {
+ try flags.appendSlice(&.{
+ "-DENABLE_LIBXML2",
+ "-DLIBXML_STATIC",
+ "-DLIBXML_PUSH_ENABLED",
+ });
+ if (target.isWindows()) {
+ // NOTE: this should be defined on all targets
+ try flags.appendSlice(&.{
+ "-Werror=implicit-function-declaration",
+ });
+ }
}
- // C files
- lib.addCSourceFiles(srcs, flags.items);
+ for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = upstream.path(src),
+ .flags = flags.items,
+ });
+ }
- return lib;
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path("fontconfig"),
+ .install_dir = .header,
+ .install_subdir = "fontconfig",
+ .include_extensions = &.{".h"},
+ });
+
+ b.installArtifact(lib);
+
+ const test_exe = b.addTest(.{
+ .name = "test",
+ .root_source_file = .{ .path = "main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+ test_exe.linkLibrary(lib);
+ const tests_run = b.addRunArtifact(test_exe);
+ const test_step = b.step("test", "Run tests");
+ test_step.dependOn(&tests_run.step);
}
-const srcs = &.{
- root ++ "src/fcatomic.c",
- root ++ "src/fccache.c",
- root ++ "src/fccfg.c",
- root ++ "src/fccharset.c",
- root ++ "src/fccompat.c",
- root ++ "src/fcdbg.c",
- root ++ "src/fcdefault.c",
- root ++ "src/fcdir.c",
- root ++ "src/fcformat.c",
- root ++ "src/fcfreetype.c",
- root ++ "src/fcfs.c",
- root ++ "src/fcptrlist.c",
- root ++ "src/fchash.c",
- root ++ "src/fcinit.c",
- root ++ "src/fclang.c",
- root ++ "src/fclist.c",
- root ++ "src/fcmatch.c",
- root ++ "src/fcmatrix.c",
- root ++ "src/fcname.c",
- root ++ "src/fcobjs.c",
- root ++ "src/fcpat.c",
- root ++ "src/fcrange.c",
- root ++ "src/fcserialize.c",
- root ++ "src/fcstat.c",
- root ++ "src/fcstr.c",
- root ++ "src/fcweight.c",
- root ++ "src/fcxml.c",
- root ++ "src/ftglue.c",
+const headers = &.{
+ "fontconfig/fontconfig.h",
+ "fontconfig/fcprivate.h",
+ "fontconfig/fcfreetype.h",
+};
+
+const srcs: []const []const u8 = &.{
+ "src/fcatomic.c",
+ "src/fccache.c",
+ "src/fccfg.c",
+ "src/fccharset.c",
+ "src/fccompat.c",
+ "src/fcdbg.c",
+ "src/fcdefault.c",
+ "src/fcdir.c",
+ "src/fcformat.c",
+ "src/fcfreetype.c",
+ "src/fcfs.c",
+ "src/fcptrlist.c",
+ "src/fchash.c",
+ "src/fcinit.c",
+ "src/fclang.c",
+ "src/fclist.c",
+ "src/fcmatch.c",
+ "src/fcmatrix.c",
+ "src/fcname.c",
+ "src/fcobjs.c",
+ "src/fcpat.c",
+ "src/fcrange.c",
+ "src/fcserialize.c",
+ "src/fcstat.c",
+ "src/fcstr.c",
+ "src/fcweight.c",
+ "src/fcxml.c",
+ "src/ftglue.c",
};
diff --git a/pkg/fontconfig/build.zig.zon b/pkg/fontconfig/build.zig.zon
new file mode 100644
index 000000000..e82647b76
--- /dev/null
+++ b/pkg/fontconfig/build.zig.zon
@@ -0,0 +1,13 @@
+.{
+ .name = "fontconfig",
+ .version = "2.14.2",
+ .dependencies = .{
+ .fontconfig = .{
+ .url = "https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.14.2.tar.gz",
+ .hash = "12201149afb3326c56c05bb0a577f54f76ac20deece63aa2f5cd6ff31a4fa4fcb3b7",
+ },
+
+ .freetype = .{ .path = "../freetype" },
+ .libxml2 = .{ .path = "../libxml2" },
+ },
+}
diff --git a/pkg/fontconfig/override/include/fcalias.h b/pkg/fontconfig/override/include/fcalias.h
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/fontconfig/override/include/fcaliastail.h b/pkg/fontconfig/override/include/fcaliastail.h
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/fontconfig/override/include/fcftalias.h b/pkg/fontconfig/override/include/fcftalias.h
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/fontconfig/override/include/fcftaliastail.h b/pkg/fontconfig/override/include/fcftaliastail.h
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/fontconfig/override/include/fcobjshash.h b/pkg/fontconfig/override/include/fcobjshash.h
new file mode 100644
index 000000000..f06234ac3
--- /dev/null
+++ b/pkg/fontconfig/override/include/fcobjshash.h
@@ -0,0 +1,347 @@
+/* ANSI-C code produced by gperf version 3.1 */
+/* Command-line: gperf --pic -m 100 fcobjshash.gperf */
+/* Computed positions: -k'3,5' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646. */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to ."
+#endif
+
+#line 1 "fcobjshash.gperf"
+
+#line 13 "fcobjshash.gperf"
+struct FcObjectTypeInfo {
+int name;
+int id;
+};
+#include
+/* maximum key range = 59, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+FcObjectTypeHash (register const char *str, register size_t len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 4, 10, 32,
+ 21, 29, 28, 49, 14, 4, 66, 66, 5, 31,
+ 18, 22, 27, 66, 15, 9, 8, 23, 23, 13,
+ 23, 16, 4, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66
+ };
+ register unsigned int hval = len;
+
+ switch (hval)
+ {
+ default:
+ hval += asso_values[(unsigned char)str[4]];
+ /*FALLTHROUGH*/
+ case 4:
+ case 3:
+ hval += asso_values[(unsigned char)str[2]];
+ break;
+ }
+ return hval;
+}
+
+struct FcObjectTypeNamePool_t
+ {
+ char FcObjectTypeNamePool_str7[sizeof("dpi")];
+ char FcObjectTypeNamePool_str8[sizeof("size")];
+ char FcObjectTypeNamePool_str9[sizeof("file")];
+ char FcObjectTypeNamePool_str13[sizeof("hash")];
+ char FcObjectTypeNamePool_str14[sizeof("rgba")];
+ char FcObjectTypeNamePool_str15[sizeof("spacing")];
+ char FcObjectTypeNamePool_str16[sizeof("scalable")];
+ char FcObjectTypeNamePool_str17[sizeof("slant")];
+ char FcObjectTypeNamePool_str18[sizeof("matrix")];
+ char FcObjectTypeNamePool_str19[sizeof("outline")];
+ char FcObjectTypeNamePool_str20[sizeof("charset")];
+ char FcObjectTypeNamePool_str21[sizeof("antialias")];
+ char FcObjectTypeNamePool_str22[sizeof("lang")];
+ char FcObjectTypeNamePool_str23[sizeof("embolden")];
+ char FcObjectTypeNamePool_str24[sizeof("weight")];
+ char FcObjectTypeNamePool_str25[sizeof("color")];
+ char FcObjectTypeNamePool_str26[sizeof("charwidth")];
+ char FcObjectTypeNamePool_str27[sizeof("variable")];
+ char FcObjectTypeNamePool_str28[sizeof("charheight")];
+ char FcObjectTypeNamePool_str29[sizeof("hinting")];
+ char FcObjectTypeNamePool_str30[sizeof("autohint")];
+ char FcObjectTypeNamePool_str31[sizeof("fullname")];
+ char FcObjectTypeNamePool_str32[sizeof("postscriptname")];
+ char FcObjectTypeNamePool_str33[sizeof("verticallayout")];
+ char FcObjectTypeNamePool_str34[sizeof("lcdfilter")];
+ char FcObjectTypeNamePool_str35[sizeof("fullnamelang")];
+ char FcObjectTypeNamePool_str36[sizeof("hintstyle")];
+ char FcObjectTypeNamePool_str37[sizeof("pixelsize")];
+ char FcObjectTypeNamePool_str38[sizeof("scale")];
+ char FcObjectTypeNamePool_str39[sizeof("globaladvance")];
+ char FcObjectTypeNamePool_str40[sizeof("width")];
+ char FcObjectTypeNamePool_str41[sizeof("order")];
+ char FcObjectTypeNamePool_str42[sizeof("family")];
+ char FcObjectTypeNamePool_str43[sizeof("fonthashint")];
+ char FcObjectTypeNamePool_str44[sizeof("namelang")];
+ char FcObjectTypeNamePool_str45[sizeof("embeddedbitmap")];
+ char FcObjectTypeNamePool_str46[sizeof("familylang")];
+ char FcObjectTypeNamePool_str47[sizeof("capability")];
+ char FcObjectTypeNamePool_str48[sizeof("rasterizer")];
+ char FcObjectTypeNamePool_str49[sizeof("index")];
+ char FcObjectTypeNamePool_str50[sizeof("style")];
+ char FcObjectTypeNamePool_str51[sizeof("foundry")];
+ char FcObjectTypeNamePool_str52[sizeof("fontversion")];
+ char FcObjectTypeNamePool_str53[sizeof("minspace")];
+ char FcObjectTypeNamePool_str54[sizeof("stylelang")];
+ char FcObjectTypeNamePool_str55[sizeof("fontvariations")];
+ char FcObjectTypeNamePool_str56[sizeof("fontformat")];
+ char FcObjectTypeNamePool_str57[sizeof("decorative")];
+ char FcObjectTypeNamePool_str58[sizeof("fontfeatures")];
+ char FcObjectTypeNamePool_str59[sizeof("symbol")];
+ char FcObjectTypeNamePool_str60[sizeof("prgname")];
+ char FcObjectTypeNamePool_str65[sizeof("aspect")];
+ };
+static const struct FcObjectTypeNamePool_t FcObjectTypeNamePool_contents =
+ {
+ "dpi",
+ "size",
+ "file",
+ "hash",
+ "rgba",
+ "spacing",
+ "scalable",
+ "slant",
+ "matrix",
+ "outline",
+ "charset",
+ "antialias",
+ "lang",
+ "embolden",
+ "weight",
+ "color",
+ "charwidth",
+ "variable",
+ "charheight",
+ "hinting",
+ "autohint",
+ "fullname",
+ "postscriptname",
+ "verticallayout",
+ "lcdfilter",
+ "fullnamelang",
+ "hintstyle",
+ "pixelsize",
+ "scale",
+ "globaladvance",
+ "width",
+ "order",
+ "family",
+ "fonthashint",
+ "namelang",
+ "embeddedbitmap",
+ "familylang",
+ "capability",
+ "rasterizer",
+ "index",
+ "style",
+ "foundry",
+ "fontversion",
+ "minspace",
+ "stylelang",
+ "fontvariations",
+ "fontformat",
+ "decorative",
+ "fontfeatures",
+ "symbol",
+ "prgname",
+ "aspect"
+ };
+#define FcObjectTypeNamePool ((const char *) &FcObjectTypeNamePool_contents)
+const struct FcObjectTypeInfo *
+FcObjectTypeLookup (register const char *str, register size_t len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 52,
+ MIN_WORD_LENGTH = 3,
+ MAX_WORD_LENGTH = 14,
+ MIN_HASH_VALUE = 7,
+ MAX_HASH_VALUE = 65
+ };
+
+ static const struct FcObjectTypeInfo wordlist[] =
+ {
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#line 43 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str7,FC_DPI_OBJECT},
+#line 27 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str8,FC_SIZE_OBJECT},
+#line 38 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str9,FC_FILE_OBJECT},
+ {-1}, {-1}, {-1},
+#line 62 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str13,FC_HASH_OBJECT},
+#line 44 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str14,FC_RGBA_OBJECT},
+#line 30 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str15,FC_SPACING_OBJECT},
+#line 42 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str16,FC_SCALABLE_OBJECT},
+#line 24 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str17,FC_SLANT_OBJECT},
+#line 49 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str18,FC_MATRIX_OBJECT},
+#line 41 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str19,FC_OUTLINE_OBJECT},
+#line 50 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str20,FC_CHARSET_OBJECT},
+#line 32 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str21,FC_ANTIALIAS_OBJECT},
+#line 51 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str22,FC_LANG_OBJECT},
+#line 55 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str23,FC_EMBOLDEN_OBJECT},
+#line 25 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str24,FC_WEIGHT_OBJECT},
+#line 64 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str25,FC_COLOR_OBJECT},
+#line 47 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str26,FC_CHARWIDTH_OBJECT},
+#line 67 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str27,FC_VARIABLE_OBJECT},
+#line 48 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str28,FC_CHAR_HEIGHT_OBJECT},
+#line 34 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str29,FC_HINTING_OBJECT},
+#line 36 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str30,FC_AUTOHINT_OBJECT},
+#line 22 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str31,FC_FULLNAME_OBJECT},
+#line 63 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str32,FC_POSTSCRIPT_NAME_OBJECT},
+#line 35 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str33,FC_VERTICAL_LAYOUT_OBJECT},
+#line 58 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str34,FC_LCD_FILTER_OBJECT},
+#line 23 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str35,FC_FULLNAMELANG_OBJECT},
+#line 33 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str36,FC_HINT_STYLE_OBJECT},
+#line 29 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str37,FC_PIXEL_SIZE_OBJECT},
+#line 45 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str38,FC_SCALE_OBJECT},
+#line 37 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str39,FC_GLOBAL_ADVANCE_OBJECT},
+#line 26 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str40,FC_WIDTH_OBJECT},
+#line 69 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str41,FC_ORDER_OBJECT},
+#line 18 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str42,FC_FAMILY_OBJECT},
+#line 68 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str43,FC_FONT_HAS_HINT_OBJECT},
+#line 59 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str44,FC_NAMELANG_OBJECT},
+#line 56 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str45,FC_EMBEDDED_BITMAP_OBJECT},
+#line 19 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str46,FC_FAMILYLANG_OBJECT},
+#line 53 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str47,FC_CAPABILITY_OBJECT},
+#line 40 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str48,FC_RASTERIZER_OBJECT},
+#line 39 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str49,FC_INDEX_OBJECT},
+#line 20 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str50,FC_STYLE_OBJECT},
+#line 31 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str51,FC_FOUNDRY_OBJECT},
+#line 52 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str52,FC_FONTVERSION_OBJECT},
+#line 46 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str53,FC_MINSPACE_OBJECT},
+#line 21 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str54,FC_STYLELANG_OBJECT},
+#line 66 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str55,FC_FONT_VARIATIONS_OBJECT},
+#line 54 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str56,FC_FONTFORMAT_OBJECT},
+#line 57 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str57,FC_DECORATIVE_OBJECT},
+#line 60 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str58,FC_FONT_FEATURES_OBJECT},
+#line 65 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str59,FC_SYMBOL_OBJECT},
+#line 61 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str60,FC_PRGNAME_OBJECT},
+ {-1}, {-1}, {-1}, {-1},
+#line 28 "fcobjshash.gperf"
+ {(int)(size_t)&((struct FcObjectTypeNamePool_t *)0)->FcObjectTypeNamePool_str65,FC_ASPECT_OBJECT}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ register unsigned int key = FcObjectTypeHash (str, len);
+
+ if (key <= MAX_HASH_VALUE)
+ {
+ register int o = wordlist[key].name;
+ if (o >= 0)
+ {
+ register const char *s = o + FcObjectTypeNamePool;
+
+ if (*str == *s && !strcmp (str + 1, s + 1))
+ return &wordlist[key];
+ }
+ }
+ }
+ return 0;
+}
diff --git a/pkg/freetype/build.zig b/pkg/freetype/build.zig
index 89534f10c..24006e17f 100644
--- a/pkg/freetype/build.zig
+++ b/pkg/freetype/build.zig
@@ -1,172 +1,143 @@
const std = @import("std");
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/freetype/";
-const include_path = root ++ "include";
-pub const include_path_self = thisDir();
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+ const libpng_enabled = b.option(bool, "enable-libpng", "Build libpng") orelse false;
-pub const include_paths = .{ include_path, include_path_self };
+ _ = b.addModule("freetype", .{ .source_file = .{ .path = "main.zig" } });
-pub fn module(b: *std.Build) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" },
- });
-}
-
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub const Options = struct {
- libpng: Libpng = .{},
- zlib: Zlib = .{},
-
- pub const Libpng = struct {
- enabled: bool = false,
- step: ?*std.build.LibExeObjStep = null,
- include: ?[]const []const u8 = null,
- };
-
- pub const Zlib = struct {
- enabled: bool = false,
- step: ?*std.build.LibExeObjStep = null,
- include: ?[]const []const u8 = null,
- };
-};
-
-pub fn link(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const lib = try buildFreetype(b, step, opt);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- step.addIncludePath(.{ .path = include_path_self });
- return lib;
-}
-
-pub fn buildFreetype(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const target = step.target;
+ const upstream = b.dependency("freetype", .{});
const lib = b.addStaticLibrary(.{
.name = "freetype",
.target = target,
- .optimize = step.optimize,
+ .optimize = optimize,
});
-
- // Include
- lib.addIncludePath(.{ .path = include_path });
-
- // Link
lib.linkLibC();
- if (opt.libpng.enabled) {
- if (opt.libpng.step) |libpng|
- lib.linkLibrary(libpng)
- else
- lib.linkSystemLibrary("libpng");
+ lib.addIncludePath(upstream.path("include"));
- if (opt.libpng.include) |dirs|
- for (dirs) |dir| lib.addIncludePath(.{ .path = dir });
- }
- if (opt.zlib.enabled) {
- if (opt.zlib.step) |zlib|
- lib.linkLibrary(zlib)
- else
- lib.linkSystemLibrary("z");
-
- if (opt.zlib.include) |dirs|
- for (dirs) |dir| lib.addIncludePath(.{ .path = dir });
+ // Dependencies
+ const zlib_dep = b.dependency("zlib", .{ .target = target, .optimize = optimize });
+ lib.linkLibrary(zlib_dep.artifact("z"));
+ if (libpng_enabled) {
+ const libpng_dep = b.dependency("libpng", .{ .target = target, .optimize = optimize });
+ lib.linkLibrary(libpng_dep.artifact("png"));
}
- // Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
-
try flags.appendSlice(&.{
"-DFT2_BUILD_LIBRARY",
+ "-DFT_CONFIG_OPTION_SYSTEM_ZLIB=1",
+
"-DHAVE_UNISTD_H",
"-DHAVE_FCNTL_H",
"-fno-sanitize=undefined",
});
- if (opt.libpng.enabled) try flags.append("-DFT_CONFIG_OPTION_USE_PNG=1");
- if (opt.zlib.enabled) try flags.append("-DFT_CONFIG_OPTION_SYSTEM_ZLIB=1");
+ if (libpng_enabled) try flags.append("-DFT_CONFIG_OPTION_USE_PNG=1");
+
+ for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = upstream.path(src),
+ .flags = flags.items,
+ });
+ }
- // C files
- lib.addCSourceFiles(srcs, flags.items);
switch (target.getOsTag()) {
.linux => lib.addCSourceFile(.{
- .file = .{ .path = root ++ "builds/unix/ftsystem.c" },
+ .file = upstream.path("builds/unix/ftsystem.c"),
.flags = flags.items,
}),
.windows => lib.addCSourceFile(.{
- .file = .{ .path = root ++ "builds/windows/ftsystem.c" },
+ .file = upstream.path("builds/windows/ftsystem.c"),
.flags = flags.items,
}),
else => lib.addCSourceFile(.{
- .file = .{ .path = root ++ "src/base/ftsystem.c" },
+ .file = upstream.path("src/base/ftsystem.c"),
.flags = flags.items,
}),
}
switch (target.getOsTag()) {
.windows => {
- lib.addCSourceFiles(&.{
- root ++ "builds/windows/ftdebug.c",
- }, flags.items);
+ lib.addCSourceFile(.{
+ .file = upstream.path("builds/windows/ftdebug.c"),
+ .flags = flags.items,
+ });
+ lib.addWin32ResourceFile(.{
+ .file = upstream.path("src/base/ftver.rc"),
+ });
},
else => lib.addCSourceFile(.{
- .file = .{ .path = root ++ "src/base/ftdebug.c" },
+ .file = upstream.path("src/base/ftdebug.c"),
.flags = flags.items,
}),
}
- return lib;
+ lib.installHeader("freetype-zig.h", "freetype-zig.h");
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path("include"),
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
+ });
+
+ b.installArtifact(lib);
+
+ {
+ const test_exe = b.addTest(.{
+ .name = "test",
+ .root_source_file = .{ .path = "main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+ test_exe.linkLibrary(lib);
+ const tests_run = b.addRunArtifact(test_exe);
+ const test_step = b.step("test", "Run tests");
+ test_step.dependOn(&tests_run.step);
+ }
}
-const srcs = &.{
- root ++ "src/autofit/autofit.c",
- root ++ "src/base/ftbase.c",
- root ++ "src/base/ftbbox.c",
- root ++ "src/base/ftbdf.c",
- root ++ "src/base/ftbitmap.c",
- root ++ "src/base/ftcid.c",
- root ++ "src/base/ftfstype.c",
- root ++ "src/base/ftgasp.c",
- root ++ "src/base/ftglyph.c",
- root ++ "src/base/ftgxval.c",
- root ++ "src/base/ftinit.c",
- root ++ "src/base/ftmm.c",
- root ++ "src/base/ftotval.c",
- root ++ "src/base/ftpatent.c",
- root ++ "src/base/ftpfr.c",
- root ++ "src/base/ftstroke.c",
- root ++ "src/base/ftsynth.c",
- root ++ "src/base/fttype1.c",
- root ++ "src/base/ftwinfnt.c",
- root ++ "src/bdf/bdf.c",
- root ++ "src/bzip2/ftbzip2.c",
- root ++ "src/cache/ftcache.c",
- root ++ "src/cff/cff.c",
- root ++ "src/cid/type1cid.c",
- root ++ "src/gzip/ftgzip.c",
- root ++ "src/lzw/ftlzw.c",
- root ++ "src/pcf/pcf.c",
- root ++ "src/pfr/pfr.c",
- root ++ "src/psaux/psaux.c",
- root ++ "src/pshinter/pshinter.c",
- root ++ "src/psnames/psnames.c",
- root ++ "src/raster/raster.c",
- root ++ "src/sdf/sdf.c",
- root ++ "src/sfnt/sfnt.c",
- root ++ "src/smooth/smooth.c",
- root ++ "src/svg/svg.c",
- root ++ "src/truetype/truetype.c",
- root ++ "src/type1/type1.c",
- root ++ "src/type42/type42.c",
- root ++ "src/winfonts/winfnt.c",
+const srcs: []const []const u8 = &.{
+ "src/autofit/autofit.c",
+ "src/base/ftbase.c",
+ "src/base/ftbbox.c",
+ "src/base/ftbdf.c",
+ "src/base/ftbitmap.c",
+ "src/base/ftcid.c",
+ "src/base/ftfstype.c",
+ "src/base/ftgasp.c",
+ "src/base/ftglyph.c",
+ "src/base/ftgxval.c",
+ "src/base/ftinit.c",
+ "src/base/ftmm.c",
+ "src/base/ftotval.c",
+ "src/base/ftpatent.c",
+ "src/base/ftpfr.c",
+ "src/base/ftstroke.c",
+ "src/base/ftsynth.c",
+ "src/base/fttype1.c",
+ "src/base/ftwinfnt.c",
+ "src/bdf/bdf.c",
+ "src/bzip2/ftbzip2.c",
+ "src/cache/ftcache.c",
+ "src/cff/cff.c",
+ "src/cid/type1cid.c",
+ "src/gzip/ftgzip.c",
+ "src/lzw/ftlzw.c",
+ "src/pcf/pcf.c",
+ "src/pfr/pfr.c",
+ "src/psaux/psaux.c",
+ "src/pshinter/pshinter.c",
+ "src/psnames/psnames.c",
+ "src/raster/raster.c",
+ "src/sdf/sdf.c",
+ "src/sfnt/sfnt.c",
+ "src/smooth/smooth.c",
+ "src/svg/svg.c",
+ "src/truetype/truetype.c",
+ "src/type1/type1.c",
+ "src/type42/type42.c",
+ "src/winfonts/winfnt.c",
};
diff --git a/pkg/freetype/build.zig.zon b/pkg/freetype/build.zig.zon
new file mode 100644
index 000000000..29b694973
--- /dev/null
+++ b/pkg/freetype/build.zig.zon
@@ -0,0 +1,13 @@
+.{
+ .name = "freetype",
+ .version = "2.13.2",
+ .dependencies = .{
+ .freetype = .{
+ .url = "https://github.com/freetype/freetype/archive/refs/tags/VER-2-13-2.tar.gz",
+ .hash = "1220b81f6ecfb3fd222f76cf9106fecfa6554ab07ec7fdc4124b9bb063ae2adf969d",
+ },
+
+ .libpng = .{ .path = "../libpng" },
+ .zlib = .{ .path = "../zlib" },
+ },
+}
diff --git a/pkg/harfbuzz/build.zig b/pkg/harfbuzz/build.zig
index 1135ca322..2923f59ab 100644
--- a/pkg/harfbuzz/build.zig
+++ b/pkg/harfbuzz/build.zig
@@ -1,98 +1,55 @@
const std = @import("std");
+const apple_sdk = @import("apple_sdk");
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/harfbuzz/";
-const include_path = root ++ "src/";
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-pub const include_paths = .{include_path};
+ const coretext_enabled = b.option(bool, "enable-coretext", "Build coretext") orelse false;
+ const freetype_enabled = b.option(bool, "enable-freetype", "Build freetype") orelse true;
-pub fn module(b: *std.Build, deps: struct {
- freetype: *std.build.Module,
- macos: *std.build.Module,
-}) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" },
+ const freetype = b.dependency("freetype", .{
+ .target = target,
+ .optimize = optimize,
+ .@"enable-libpng" = true,
+ });
+ const macos = b.dependency("macos", .{ .target = target, .optimize = optimize });
+
+ const module = b.addModule("harfbuzz", .{
+ .source_file = .{ .path = "main.zig" },
.dependencies = &.{
- .{ .name = "freetype", .module = deps.freetype },
- .{ .name = "macos", .module = deps.macos },
+ .{ .name = "freetype", .module = freetype.module("freetype") },
+ .{ .name = "macos", .module = macos.module("macos") },
},
});
-}
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
+ const upstream_root = "../../vendor/harfbuzz";
-pub const Options = struct {
- freetype: Freetype = .{},
- coretext: CoreText = .{},
-
- pub const Freetype = struct {
- enabled: bool = false,
- step: ?*std.build.LibExeObjStep = null,
- include: ?[]const []const u8 = null,
- };
-
- pub const CoreText = struct {
- enabled: bool = false,
- };
-};
-
-pub fn link(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const lib = try buildHarfbuzz(b, step, opt);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- return lib;
-}
-
-pub fn buildHarfbuzz(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
const lib = b.addStaticLibrary(.{
.name = "harfbuzz",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
});
-
- // Include
- lib.addIncludePath(.{ .path = include_path });
-
- // Link
lib.linkLibC();
lib.linkLibCpp();
- if (opt.freetype.enabled) {
- if (opt.freetype.step) |freetype|
- lib.linkLibrary(freetype)
- else
- lib.linkSystemLibrary("freetype2");
+ lib.addIncludePath(.{ .path = upstream_root ++ "/src" });
- if (opt.freetype.include) |dirs|
- for (dirs) |dir| lib.addIncludePath(.{ .path = dir });
- }
+ const freetype_dep = b.dependency("freetype", .{ .target = target, .optimize = optimize });
+ lib.linkLibrary(freetype_dep.artifact("freetype"));
- // Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
-
try flags.appendSlice(&.{
"-DHAVE_STDBOOL_H",
});
-
- if (!step.target.isWindows()) {
+ if (!target.isWindows()) {
try flags.appendSlice(&.{
"-DHAVE_UNISTD_H",
"-DHAVE_SYS_MMAN_H",
"-DHAVE_PTHREAD=1",
});
}
-
- if (opt.freetype.enabled) try flags.appendSlice(&.{
+ if (freetype_enabled) try flags.appendSlice(&.{
"-DHAVE_FREETYPE=1",
// Let's just assume a new freetype
@@ -101,21 +58,39 @@ pub fn buildHarfbuzz(
"-DHAVE_FT_DONE_MM_VAR=1",
"-DHAVE_FT_GET_TRANSFORM=1",
});
-
- if (opt.coretext.enabled) {
- try flags.appendSlice(&.{
- "-DHAVE_CORETEXT=1",
- });
-
+ if (coretext_enabled) {
+ try flags.appendSlice(&.{"-DHAVE_CORETEXT=1"});
+ try apple_sdk.addPaths(b, lib);
lib.linkFramework("ApplicationServices");
}
- // C files
- lib.addCSourceFiles(srcs, flags.items);
+ lib.addCSourceFile(.{
+ .file = .{ .path = upstream_root ++ "/src/harfbuzz.cc" },
+ .flags = flags.items,
+ });
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = .{ .path = upstream_root ++ "/src" },
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
+ });
- return lib;
+ b.installArtifact(lib);
+
+ {
+ const test_exe = b.addTest(.{
+ .name = "test",
+ .root_source_file = .{ .path = "main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+ test_exe.linkLibrary(lib);
+
+ var it = module.dependencies.iterator();
+ while (it.next()) |entry| test_exe.addModule(entry.key_ptr.*, entry.value_ptr.*);
+ test_exe.linkLibrary(freetype_dep.artifact("freetype"));
+ const tests_run = b.addRunArtifact(test_exe);
+ const test_step = b.step("test", "Run tests");
+ test_step.dependOn(&tests_run.step);
+ }
}
-
-const srcs = &.{
- root ++ "src/harfbuzz.cc",
-};
diff --git a/pkg/harfbuzz/build.zig.zon b/pkg/harfbuzz/build.zig.zon
new file mode 100644
index 000000000..5609dab3e
--- /dev/null
+++ b/pkg/harfbuzz/build.zig.zon
@@ -0,0 +1,9 @@
+.{
+ .name = "harfbuzz",
+ .version = "2.13.2",
+ .dependencies = .{
+ .freetype = .{ .path = "../freetype" },
+ .macos = .{ .path = "../macos" },
+ .apple_sdk = .{ .path = "../apple-sdk" },
+ },
+}
diff --git a/pkg/harfbuzz/libharfbuzz.a b/pkg/harfbuzz/libharfbuzz.a
new file mode 100644
index 000000000..6226b2c02
Binary files /dev/null and b/pkg/harfbuzz/libharfbuzz.a differ
diff --git a/pkg/libpng/build.zig b/pkg/libpng/build.zig
index 0e98059ac..f54c06893 100644
--- a/pkg/libpng/build.zig
+++ b/pkg/libpng/build.zig
@@ -1,102 +1,66 @@
const std = @import("std");
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/libpng/";
-const include_path = root;
-const include_path_pnglibconf = thisDir();
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-pub const include_paths = .{ include_path, include_path_pnglibconf };
+ const upstream = b.dependency("libpng", .{});
-pub const pkg = std.build.Pkg{
- .name = "libpng",
- .source = .{ .path = thisDir() ++ "/main.zig" },
-};
-
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub const Options = struct {
- zlib: Zlib = .{},
-
- pub const Zlib = struct {
- step: ?*std.build.LibExeObjStep = null,
- include: ?[]const []const u8 = null,
- };
-};
-
-pub fn link(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const lib = try buildLib(b, step, opt);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- return lib;
-}
-
-pub fn buildLib(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const target = step.target;
const lib = b.addStaticLibrary(.{
.name = "png",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
});
-
- // Include
- lib.addIncludePath(.{ .path = include_path });
- lib.addIncludePath(.{ .path = include_path_pnglibconf });
-
- // Link
lib.linkLibC();
if (target.isLinux()) {
lib.linkSystemLibrary("m");
}
- if (opt.zlib.step) |zlib|
- lib.linkLibrary(zlib)
- else
- lib.linkSystemLibrary("z");
+ const zlib_dep = b.dependency("zlib", .{ .target = target, .optimize = optimize });
+ lib.linkLibrary(zlib_dep.artifact("z"));
+ lib.addIncludePath(upstream.path(""));
+ lib.addIncludePath(.{ .path = "" });
- if (opt.zlib.include) |dirs|
- for (dirs) |dir| lib.addIncludePath(.{ .path = dir });
-
- // Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
-
try flags.appendSlice(&.{
"-DPNG_ARM_NEON_OPT=0",
"-DPNG_POWERPC_VSX_OPT=0",
"-DPNG_INTEL_SSE_OPT=0",
"-DPNG_MIPS_MSA_OPT=0",
});
+ for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = upstream.path(src),
+ .flags = flags.items,
+ });
+ }
- // C files
- lib.addCSourceFiles(srcs, flags.items);
+ lib.installHeader("pnglibconf.h", "pnglibconf.h");
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path(""),
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
+ });
- return lib;
+ b.installArtifact(lib);
}
-const srcs = &.{
- root ++ "png.c",
- root ++ "pngerror.c",
- root ++ "pngget.c",
- root ++ "pngmem.c",
- root ++ "pngpread.c",
- root ++ "pngread.c",
- root ++ "pngrio.c",
- root ++ "pngrtran.c",
- root ++ "pngrutil.c",
- root ++ "pngset.c",
- root ++ "pngtrans.c",
- root ++ "pngwio.c",
- root ++ "pngwrite.c",
- root ++ "pngwtran.c",
- root ++ "pngwutil.c",
+const srcs: []const []const u8 = &.{
+ "png.c",
+ "pngerror.c",
+ "pngget.c",
+ "pngmem.c",
+ "pngpread.c",
+ "pngread.c",
+ "pngrio.c",
+ "pngrtran.c",
+ "pngrutil.c",
+ "pngset.c",
+ "pngtrans.c",
+ "pngwio.c",
+ "pngwrite.c",
+ "pngwtran.c",
+ "pngwutil.c",
};
diff --git a/pkg/libpng/build.zig.zon b/pkg/libpng/build.zig.zon
new file mode 100644
index 000000000..ebad1dcb4
--- /dev/null
+++ b/pkg/libpng/build.zig.zon
@@ -0,0 +1,14 @@
+.{
+ .name = "libpng",
+ .version = "1.6.40",
+ .dependencies = .{
+ .libpng = .{
+ .url = "https://github.com/glennrp/libpng/archive/refs/tags/v1.6.40.tar.gz",
+ .hash = "12203d2722e3af6f9556503b114c25fe3eead528a93f5f26eefcb187a460d1548e07",
+ },
+
+ .zlib = .{
+ .path = "../zlib",
+ },
+ },
+}
diff --git a/pkg/libxml2/build.zig b/pkg/libxml2/build.zig
new file mode 100644
index 000000000..979021308
--- /dev/null
+++ b/pkg/libxml2/build.zig
@@ -0,0 +1,221 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+
+ const upstream_root = "../../vendor/libxml2";
+
+ const lib = b.addStaticLibrary(.{
+ .name = "xml2",
+ .target = target,
+ .optimize = optimize,
+ });
+ lib.linkLibC();
+
+ lib.addIncludePath(.{ .path = upstream_root ++ "/include" });
+ lib.addIncludePath(.{ .path = "override/include" });
+ if (target.isWindows()) {
+ lib.addIncludePath(.{ .path = "override/config/win32" });
+ lib.linkSystemLibrary("ws2_32");
+ } else {
+ lib.addIncludePath(.{ .path = "override/config/posix" });
+ }
+
+ var flags = std.ArrayList([]const u8).init(b.allocator);
+ defer flags.deinit();
+ try flags.appendSlice(&.{
+ // Version info, hardcoded
+ comptime "-DLIBXML_VERSION=" ++ Version.number(),
+ comptime "-DLIBXML_VERSION_STRING=" ++ Version.string(),
+ "-DLIBXML_VERSION_EXTRA=\"\"",
+ comptime "-DLIBXML_DOTTED_VERSION=" ++ Version.dottedString(),
+
+ // These might now always be true (particularly Windows) but for
+ // now we just set them all. We should do some detection later.
+ "-DSEND_ARG2_CAST=",
+ "-DGETHOSTBYNAME_ARG_CAST=",
+ "-DGETHOSTBYNAME_ARG_CAST_CONST=",
+
+ // Always on
+ "-DLIBXML_STATIC=1",
+ "-DLIBXML_AUTOMATA_ENABLED=1",
+ "-DWITHOUT_TRIO=1",
+ });
+ if (!target.isWindows()) {
+ try flags.appendSlice(&.{
+ "-DHAVE_ARPA_INET_H=1",
+ "-DHAVE_ARPA_NAMESER_H=1",
+ "-DHAVE_DL_H=1",
+ "-DHAVE_NETDB_H=1",
+ "-DHAVE_NETINET_IN_H=1",
+ "-DHAVE_PTHREAD_H=1",
+ "-DHAVE_SHLLOAD=1",
+ "-DHAVE_SYS_DIR_H=1",
+ "-DHAVE_SYS_MMAN_H=1",
+ "-DHAVE_SYS_NDIR_H=1",
+ "-DHAVE_SYS_SELECT_H=1",
+ "-DHAVE_SYS_SOCKET_H=1",
+ "-DHAVE_SYS_TIMEB_H=1",
+ "-DHAVE_SYS_TIME_H=1",
+ "-DHAVE_SYS_TYPES_H=1",
+ });
+ }
+
+ // Enable our `./configure` options. For bool-type fields we translate
+ // it to the `LIBXML_{field}_ENABLED` C define where field is uppercased.
+ inline for (std.meta.fields(Options)) |field| {
+ const opt = b.option(bool, field.name, "Configure flag") orelse
+ @as(*const bool, @ptrCast(field.default_value.?)).*;
+ if (opt) {
+ var nameBuf: [32]u8 = undefined;
+ const name = std.ascii.upperString(&nameBuf, field.name);
+ const define = try std.fmt.allocPrint(b.allocator, "-DLIBXML_{s}_ENABLED=1", .{name});
+ try flags.append(define);
+
+ if (std.mem.eql(u8, field.name, "history")) {
+ try flags.appendSlice(&.{
+ "-DHAVE_LIBHISTORY=1",
+ "-DHAVE_LIBREADLINE=1",
+ });
+ }
+ if (std.mem.eql(u8, field.name, "mem_debug")) {
+ try flags.append("-DDEBUG_MEMORY_LOCATION=1");
+ }
+ if (std.mem.eql(u8, field.name, "regexp")) {
+ try flags.append("-DLIBXML_UNICODE_ENABLED=1");
+ }
+ if (std.mem.eql(u8, field.name, "run_debug")) {
+ try flags.append("-DLIBXML_DEBUG_RUNTIME=1");
+ }
+ if (std.mem.eql(u8, field.name, "thread")) {
+ try flags.append("-DHAVE_LIBPTHREAD=1");
+ }
+ }
+ }
+
+ inline for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = .{ .path = upstream_root ++ "/" ++ src },
+ .flags = flags.items,
+ });
+ }
+
+ lib.installHeader("override/include/libxml/xmlversion.h", "libxml/xmlversion.h");
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = .{ .path = upstream_root ++ "/include" },
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
+ });
+
+ b.installArtifact(lib);
+}
+
+/// The version information for this library. This is hardcoded for now but
+/// in the future we will parse this from configure.ac.
+pub const Version = struct {
+ pub const major = "2";
+ pub const minor = "11";
+ pub const micro = "5";
+
+ pub fn number() []const u8 {
+ return comptime major ++ "0" ++ minor ++ "0" ++ micro;
+ }
+
+ pub fn string() []const u8 {
+ return comptime "\"" ++ number() ++ "\"";
+ }
+
+ pub fn dottedString() []const u8 {
+ return comptime "\"" ++ major ++ "." ++ minor ++ "." ++ micro ++ "\"";
+ }
+};
+
+/// Compile-time options for the library. These mostly correspond to
+/// options exposed by the native build system used by the library.
+/// These are mapped to `b.option` calls.
+const Options = struct {
+ // These options are all defined in libxml2's configure.c and correspond
+ // to `--with-X` options for `./configure`. Their defaults are properly set.
+ c14n: bool = true,
+ catalog: bool = true,
+ debug: bool = true,
+ ftp: bool = false,
+ history: bool = true,
+ html: bool = true,
+ iconv: bool = true,
+ icu: bool = false,
+ iso8859x: bool = true,
+ legacy: bool = false,
+ mem_debug: bool = false,
+ minimum: bool = true,
+ output: bool = true,
+ pattern: bool = true,
+ push: bool = true,
+ reader: bool = true,
+ regexp: bool = true,
+ run_debug: bool = false,
+ sax1: bool = true,
+ schemas: bool = true,
+ schematron: bool = true,
+ thread: bool = true,
+ thread_alloc: bool = false,
+ tree: bool = true,
+ valid: bool = true,
+ writer: bool = true,
+ xinclude: bool = true,
+ xpath: bool = true,
+ xptr: bool = true,
+ xptr_locs: bool = false,
+ modules: bool = true,
+ lzma: bool = false,
+ zlib: bool = false,
+};
+
+const srcs = &.{
+ "buf.c",
+ "c14n.c",
+ "catalog.c",
+ "chvalid.c",
+ "debugXML.c",
+ "dict.c",
+ "encoding.c",
+ "entities.c",
+ "error.c",
+ "globals.c",
+ "hash.c",
+ "HTMLparser.c",
+ "HTMLtree.c",
+ "legacy.c",
+ "list.c",
+ "nanoftp.c",
+ "nanohttp.c",
+ "parser.c",
+ "parserInternals.c",
+ "pattern.c",
+ "relaxng.c",
+ "SAX.c",
+ "SAX2.c",
+ "schematron.c",
+ "threads.c",
+ "tree.c",
+ "uri.c",
+ "valid.c",
+ "xinclude.c",
+ "xlink.c",
+ "xmlIO.c",
+ "xmlmemory.c",
+ "xmlmodule.c",
+ "xmlreader.c",
+ "xmlregexp.c",
+ "xmlsave.c",
+ "xmlschemas.c",
+ "xmlschemastypes.c",
+ "xmlstring.c",
+ "xmlunicode.c",
+ "xmlwriter.c",
+ "xpath.c",
+ "xpointer.c",
+ "xzlib.c",
+};
diff --git a/pkg/libxml2/build.zig.zon b/pkg/libxml2/build.zig.zon
new file mode 100644
index 000000000..403292ca3
--- /dev/null
+++ b/pkg/libxml2/build.zig.zon
@@ -0,0 +1,5 @@
+.{
+ .name = "libxml2",
+ .version = "2.11.5",
+ .dependencies = .{},
+}
diff --git a/pkg/libxml2/override/config/posix/config.h b/pkg/libxml2/override/config/posix/config.h
new file mode 100644
index 000000000..442284980
--- /dev/null
+++ b/pkg/libxml2/override/config/posix/config.h
@@ -0,0 +1,80 @@
+// This recreates parts of the generated config.h from cmake. Most of the
+// defines actually happen directly in libxml2.zig. Some of these SHOULD
+// be converted to build-time determined.
+
+/* Whether struct sockaddr::__ss_family exists */
+// #define HAVE_BROKEN_SS_FAMILY 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_DLFCN_H 1
+
+/* Have dlopen based dso */
+#define HAVE_DLOPEN 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `ftime' function. */
+#define HAVE_FTIME 1
+
+/* Define if getaddrinfo is there */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `isascii' function. */
+#define HAVE_ISASCII 1
+
+/* Define to 1 if you have the `mmap' function. */
+#define HAVE_MMAP 1
+
+/* Define to 1 if you have the `munmap' function. */
+#define HAVE_MUNMAP 1
+
+/* mmap() is no good without munmap() */
+#if defined(HAVE_MMAP) && !defined(HAVE_MUNMAP)
+# undef /**/ HAVE_MMAP
+#endif
+
+/* Define to 1 if you have the header file. */
+#define HAVE_POLL_H 1
+
+/* Define to 1 if you have the `putenv' function. */
+#define HAVE_PUTENV 1
+
+/* Define to 1 if you have the `rand_r' function. */
+#define HAVE_RAND_R 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_RESOLV_H 1
+
+/* Define to 1 if you have the `stat' function. */
+#define HAVE_STAT 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Whether va_copy() is available */
+#define HAVE_VA_COPY 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ZLIB_H 1
+
+/* Whether __va_copy() is available */
+#define HAVE___VA_COPY 1
+
+/* Support for IPv6 */
+#define SUPPORT_IP6 1
+
+/* Define if va_list is an array type */
+#define VA_LIST_IS_ARRAY 1
diff --git a/pkg/libxml2/override/config/win32/config.h b/pkg/libxml2/override/config/win32/config.h
new file mode 100644
index 000000000..5108d08c0
--- /dev/null
+++ b/pkg/libxml2/override/config/win32/config.h
@@ -0,0 +1,20 @@
+#ifndef __LIBXML_WIN32_CONFIG__
+#define __LIBXML_WIN32_CONFIG__
+
+#define SEND_ARG2_CAST
+#define GETHOSTBYNAME_ARG_CAST
+
+#define HAVE_SYS_STAT_H
+#define HAVE_STAT
+#define HAVE_FCNTL_H
+
+#if defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER >= 1600)
+#define HAVE_STDINT_H
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1900
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+#endif
+
+#endif /* __LIBXML_WIN32_CONFIG__ */
diff --git a/pkg/libxml2/override/include/libxml/xmlversion.h b/pkg/libxml2/override/include/libxml/xmlversion.h
new file mode 100644
index 000000000..039d704dc
--- /dev/null
+++ b/pkg/libxml2/override/include/libxml/xmlversion.h
@@ -0,0 +1,18 @@
+// This recreates parts of the generated libxml/xmlversion.h.in that we need
+// to build libxml2 without actually templating the header file. We define most
+// of the defines in that file using flags to the compiler in libxml2.zig
+
+#ifndef __XML_VERSION_H__
+#define __XML_VERSION_H__
+
+#include
+
+// We are not GCC.
+#define XML_IGNORE_FPTR_CAST_WARNINGS
+#define XML_POP_WARNINGS
+#define LIBXML_ATTR_FORMAT(fmt,args)
+#define LIBXML_ATTR_ALLOC_SIZE(x)
+#define ATTRIBUTE_UNUSED
+#define XML_DEPRECATED
+
+#endif
diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig
index 1a0b428f8..aed7e5d28 100644
--- a/pkg/macos/build.zig
+++ b/pkg/macos/build.zig
@@ -1,43 +1,50 @@
const std = @import("std");
const builtin = @import("builtin");
+const apple_sdk = @import("apple_sdk");
-pub fn module(b: *std.Build) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" },
- });
-}
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub const Options = struct {};
-
-pub fn link(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- _ = opt;
- var flags = std.ArrayList([]const u8).init(b.allocator);
- defer flags.deinit();
+ const module = b.addModule("macos", .{ .source_file = .{ .path = "main.zig" } });
const lib = b.addStaticLibrary(.{
.name = "macos",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
});
- step.addCSourceFile(.{
- .file = .{ .path = comptime thisDir() ++ "/os/log.c" },
+
+ var flags = std.ArrayList([]const u8).init(b.allocator);
+ defer flags.deinit();
+ lib.addCSourceFile(.{
+ .file = .{ .path = "os/log.c" },
.flags = flags.items,
});
- step.addCSourceFile(.{
- .file = .{ .path = comptime thisDir() ++ "/text/ext.c" },
+ lib.addCSourceFile(.{
+ .file = .{ .path = "text/ext.c" },
.flags = flags.items,
});
- step.linkFramework("Carbon");
- step.linkFramework("CoreFoundation");
- step.linkFramework("CoreGraphics");
- step.linkFramework("CoreText");
- return lib;
+ lib.linkFramework("Carbon");
+ lib.linkFramework("CoreFoundation");
+ lib.linkFramework("CoreGraphics");
+ lib.linkFramework("CoreText");
+ try apple_sdk.addPaths(b, lib);
+
+ b.installArtifact(lib);
+
+ {
+ const test_exe = b.addTest(.{
+ .name = "test",
+ .root_source_file = .{ .path = "main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+ test_exe.linkLibrary(lib);
+ var it = module.dependencies.iterator();
+ while (it.next()) |entry| test_exe.addModule(entry.key_ptr.*, entry.value_ptr.*);
+
+ const tests_run = b.addRunArtifact(test_exe);
+ const test_step = b.step("test", "Run tests");
+ test_step.dependOn(&tests_run.step);
+ }
}
diff --git a/pkg/macos/build.zig.zon b/pkg/macos/build.zig.zon
new file mode 100644
index 000000000..45ab2fa2b
--- /dev/null
+++ b/pkg/macos/build.zig.zon
@@ -0,0 +1,7 @@
+.{
+ .name = "macos",
+ .version = "0.1.0",
+ .dependencies = .{
+ .apple_sdk = .{ .path = "../apple-sdk" },
+ },
+}
diff --git a/pkg/pixman/build.zig b/pkg/pixman/build.zig
index bcee196d3..ef2a91286 100644
--- a/pkg/pixman/build.zig
+++ b/pkg/pixman/build.zig
@@ -1,80 +1,27 @@
const std = @import("std");
-const builtin = @import("builtin");
-
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/pixman/";
-const include_path = root ++ "pixman/";
-const include_path_self = thisDir();
-
-pub const include_paths = .{ include_path, include_path_self };
-
-pub fn module(b: *std.Build) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" },
- });
-}
-
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub const Options = struct {};
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
- const mode = b.standardReleaseOptions();
+ const optimize = b.standardOptimizeOption(.{});
- const tests = b.addTestExe("pixman-test", "main.zig");
- tests.setBuildMode(mode);
- tests.setTarget(target);
- _ = try link(b, tests, .{});
- b.installArtifact(tests);
+ const module = b.addModule("pixman", .{ .source_file = .{ .path = "main.zig" } });
- const test_step = b.step("test", "Run tests");
- const tests_run = b.addRunArtifact(tests);
- test_step.dependOn(&tests_run.step);
-}
-
-pub fn link(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- const lib = try buildPixman(b, step, opt);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- step.addIncludePath(.{ .path = include_path_self });
- return lib;
-}
-
-pub fn buildPixman(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
- opt: Options,
-) !*std.build.LibExeObjStep {
- _ = opt;
-
- const target = step.target;
+ const upstream = b.dependency("pixman", .{});
const lib = b.addStaticLibrary(.{
.name = "pixman",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
});
-
- // Include
- lib.addIncludePath(.{ .path = include_path });
- lib.addIncludePath(.{ .path = include_path_self });
-
- // Link
lib.linkLibC();
if (!target.isWindows()) {
lib.linkSystemLibrary("pthread");
}
- // Compile
+ lib.addIncludePath(upstream.path(""));
+ lib.addIncludePath(.{ .path = "" });
+
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
-
try flags.appendSlice(&.{
"-DHAVE_SIGACTION=1",
"-DHAVE_ALARM=1",
@@ -95,7 +42,6 @@ pub fn buildPixman(
"-fno-sanitize=undefined",
"-fno-sanitize-trap=undefined",
});
-
if (!target.isWindows()) {
try flags.appendSlice(&.{
"-DHAVE_PTHREADS=1",
@@ -104,41 +50,69 @@ pub fn buildPixman(
});
}
- // C files
- lib.addCSourceFiles(srcs, flags.items);
+ for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = upstream.path(src),
+ .flags = flags.items,
+ });
+ }
- return lib;
+ lib.installHeader("pixman-version.h", "pixman-version.h");
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path("pixman"),
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
+ });
+
+ b.installArtifact(lib);
+
+ {
+ const test_exe = b.addTest(.{
+ .name = "test",
+ .root_source_file = .{ .path = "main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+ test_exe.linkLibrary(lib);
+ var it = module.dependencies.iterator();
+ while (it.next()) |entry| test_exe.addModule(entry.key_ptr.*, entry.value_ptr.*);
+
+ const tests_run = b.addRunArtifact(test_exe);
+ const test_step = b.step("test", "Run tests");
+ test_step.dependOn(&tests_run.step);
+ }
}
-const srcs = &.{
- root ++ "pixman/pixman.c",
- root ++ "pixman/pixman-access.c",
- root ++ "pixman/pixman-access-accessors.c",
- root ++ "pixman/pixman-bits-image.c",
- root ++ "pixman/pixman-combine32.c",
- root ++ "pixman/pixman-combine-float.c",
- root ++ "pixman/pixman-conical-gradient.c",
- root ++ "pixman/pixman-filter.c",
- root ++ "pixman/pixman-x86.c",
- root ++ "pixman/pixman-mips.c",
- root ++ "pixman/pixman-arm.c",
- root ++ "pixman/pixman-ppc.c",
- root ++ "pixman/pixman-edge.c",
- root ++ "pixman/pixman-edge-accessors.c",
- root ++ "pixman/pixman-fast-path.c",
- root ++ "pixman/pixman-glyph.c",
- root ++ "pixman/pixman-general.c",
- root ++ "pixman/pixman-gradient-walker.c",
- root ++ "pixman/pixman-image.c",
- root ++ "pixman/pixman-implementation.c",
- root ++ "pixman/pixman-linear-gradient.c",
- root ++ "pixman/pixman-matrix.c",
- root ++ "pixman/pixman-noop.c",
- root ++ "pixman/pixman-radial-gradient.c",
- root ++ "pixman/pixman-region16.c",
- root ++ "pixman/pixman-region32.c",
- root ++ "pixman/pixman-solid-fill.c",
- //root ++ "pixman/pixman-timer.c",
- root ++ "pixman/pixman-trap.c",
- root ++ "pixman/pixman-utils.c",
+const srcs: []const []const u8 = &.{
+ "pixman/pixman.c",
+ "pixman/pixman-access.c",
+ "pixman/pixman-access-accessors.c",
+ "pixman/pixman-bits-image.c",
+ "pixman/pixman-combine32.c",
+ "pixman/pixman-combine-float.c",
+ "pixman/pixman-conical-gradient.c",
+ "pixman/pixman-filter.c",
+ "pixman/pixman-x86.c",
+ "pixman/pixman-mips.c",
+ "pixman/pixman-arm.c",
+ "pixman/pixman-ppc.c",
+ "pixman/pixman-edge.c",
+ "pixman/pixman-edge-accessors.c",
+ "pixman/pixman-fast-path.c",
+ "pixman/pixman-glyph.c",
+ "pixman/pixman-general.c",
+ "pixman/pixman-gradient-walker.c",
+ "pixman/pixman-image.c",
+ "pixman/pixman-implementation.c",
+ "pixman/pixman-linear-gradient.c",
+ "pixman/pixman-matrix.c",
+ "pixman/pixman-noop.c",
+ "pixman/pixman-radial-gradient.c",
+ "pixman/pixman-region16.c",
+ "pixman/pixman-region32.c",
+ "pixman/pixman-solid-fill.c",
+ //"pixman/pixman-timer.c",
+ "pixman/pixman-trap.c",
+ "pixman/pixman-utils.c",
};
diff --git a/pkg/pixman/build.zig.zon b/pkg/pixman/build.zig.zon
new file mode 100644
index 000000000..7c2777047
--- /dev/null
+++ b/pkg/pixman/build.zig.zon
@@ -0,0 +1,10 @@
+.{
+ .name = "pixman",
+ .version = "0.42.2",
+ .dependencies = .{
+ .pixman = .{
+ .url = "https://gitlab.freedesktop.org/pixman/pixman/-/archive/pixman-0.42.2/pixman-pixman-0.42.2.tar.gz",
+ .hash = "12209b9206f9a5d31ccd9a2312cc72cb9dfc3e034aee1883c549dc1d753fae457230",
+ },
+ },
+}
diff --git a/pkg/tracy/build.zig b/pkg/tracy/build.zig
index 23c94422d..86140938a 100644
--- a/pkg/tracy/build.zig
+++ b/pkg/tracy/build.zig
@@ -1,68 +1,91 @@
const std = @import("std");
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/tracy/";
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-pub fn module(b: *std.Build) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/tracy.zig" },
- });
-}
+ _ = b.addModule("tracy", .{ .source_file = .{ .path = "tracy.zig" } });
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub fn link(b: *std.Build, step: *std.build.LibExeObjStep) !*std.build.LibExeObjStep {
- const tracy = try buildTracy(b, step);
- step.linkLibrary(tracy);
- step.addIncludePath(.{ .path = root });
- return tracy;
-}
-
-pub fn buildTracy(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
-) !*std.build.LibExeObjStep {
- const target = step.target;
+ const upstream = b.dependency("tracy", .{});
const lib = b.addStaticLibrary(.{
.name = "tracy",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
});
-
- var flags = std.ArrayList([]const u8).init(b.allocator);
- defer flags.deinit();
-
- try flags.appendSlice(&.{
- "-DTRACY_ENABLE",
- "-fno-sanitize=undefined",
- });
-
- if (target.isWindows()) {
- try flags.appendSlice(&.{
- "-D_WIN32_WINNT=0x601",
- });
- }
-
- lib.addIncludePath(.{ .path = root });
- lib.addCSourceFile(.{
- .file = .{ .path = try std.fs.path.join(
- b.allocator,
- &.{ root, "TracyClient.cpp" },
- ) },
- .flags = flags.items,
- });
-
lib.linkLibC();
- lib.linkSystemLibrary("c++");
-
- if (lib.target.isWindows()) {
+ lib.linkLibCpp();
+ if (target.isWindows()) {
lib.linkSystemLibrary("Advapi32");
lib.linkSystemLibrary("User32");
lib.linkSystemLibrary("Ws2_32");
lib.linkSystemLibrary("DbgHelp");
}
- return lib;
+ lib.addIncludePath(upstream.path(""));
+
+ var flags = std.ArrayList([]const u8).init(b.allocator);
+ defer flags.deinit();
+ try flags.appendSlice(&.{
+ "-DTRACY_ENABLE",
+ "-fno-sanitize=undefined",
+ });
+ if (target.isWindows()) {
+ try flags.appendSlice(&.{
+ "-D_WIN32_WINNT=0x601",
+ });
+ }
+
+ lib.addCSourceFile(.{
+ .file = upstream.path("TracyClient.cpp"),
+ .flags = flags.items,
+ });
+
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path(""),
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{ ".h", ".hpp" },
+ });
+
+ b.installArtifact(lib);
}
+
+const headers = &.{
+ "TracyC.h",
+ "TracyOpenGL.hpp",
+ "Tracy.hpp",
+ "TracyD3D11.hpp",
+ "TracyD3D12.hpp",
+ "TracyOpenCL.hpp",
+ "TracyVulkan.hpp",
+ "client/TracyCallstack.h",
+ "client/TracyScoped.hpp",
+ "client/TracyStringHelpers.hpp",
+ "client/TracySysTrace.hpp",
+ "client/TracyDxt1.hpp",
+ "client/TracyRingBuffer.hpp",
+ "client/tracy_rpmalloc.hpp",
+ "client/TracyDebug.hpp",
+ "client/TracyLock.hpp",
+ "client/TracyThread.hpp",
+ "client/TracyArmCpuTable.hpp",
+ "client/TracyProfiler.hpp",
+ "client/TracyCallstack.hpp",
+ "client/TracySysTime.hpp",
+ "client/TracyFastVector.hpp",
+ "common/TracyApi.h",
+ "common/TracyYield.hpp",
+ "common/tracy_lz4hc.hpp",
+ "common/TracySystem.hpp",
+ "common/TracyProtocol.hpp",
+ "common/TracyQueue.hpp",
+ "common/TracyUwp.hpp",
+ "common/TracyAlloc.hpp",
+ "common/TracyAlign.hpp",
+ "common/TracyForceInline.hpp",
+ "common/TracyColor.hpp",
+ "common/tracy_lz4.hpp",
+ "common/TracyStackFrames.hpp",
+ "common/TracySocket.hpp",
+ "common/TracyMutex.hpp",
+};
diff --git a/pkg/tracy/build.zig.zon b/pkg/tracy/build.zig.zon
new file mode 100644
index 000000000..d70dd2a89
--- /dev/null
+++ b/pkg/tracy/build.zig.zon
@@ -0,0 +1,10 @@
+.{
+ .name = "tracy",
+ .version = "0.8.2",
+ .dependencies = .{
+ .tracy = .{
+ .url = "https://github.com/wolfpld/tracy/archive/refs/tags/v0.8.2.1.tar.gz",
+ .hash = "1220289ca424ec488316b75c992b9f02846caaa70287f958b3966e02d5ca81789d27",
+ },
+ },
+}
diff --git a/pkg/utf8proc/build.zig b/pkg/utf8proc/build.zig
index 7152766d6..4f0240d73 100644
--- a/pkg/utf8proc/build.zig
+++ b/pkg/utf8proc/build.zig
@@ -1,55 +1,39 @@
const std = @import("std");
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/utf8proc/";
-const include_path = root;
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-pub const include_paths = .{include_path};
+ _ = b.addModule("utf8proc", .{ .source_file = .{ .path = "main.zig" } });
-pub fn module(b: *std.Build) *std.build.Module {
- return b.createModule(.{
- .source_file = .{ .path = (comptime thisDir()) ++ "/main.zig" },
- });
-}
-
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub fn link(b: *std.Build, step: *std.build.LibExeObjStep) !*std.build.LibExeObjStep {
- const lib = try buildLib(b, step);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- return lib;
-}
-
-pub fn buildLib(
- b: *std.Build,
- step: *std.build.LibExeObjStep,
-) !*std.build.LibExeObjStep {
+ const upstream = b.dependency("utf8proc", .{});
const lib = b.addStaticLibrary(.{
.name = "utf8proc",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
+ });
+ lib.linkLibC();
+ lib.addIncludePath(upstream.path(""));
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path(""),
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
});
- // Include
- lib.addIncludePath(.{ .path = include_path });
-
- // Link
- lib.linkLibC();
-
- // Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
try flags.append("-DUTF8PROC_EXPORTS");
defer flags.deinit();
+ for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = upstream.path(src),
+ .flags = flags.items,
+ });
+ }
- // C files
- lib.addCSourceFiles(srcs, flags.items);
-
- return lib;
+ b.installArtifact(lib);
}
-const srcs = &.{
- root ++ "utf8proc.c",
+const srcs: []const []const u8 = &.{
+ "utf8proc.c",
};
diff --git a/pkg/utf8proc/build.zig.zon b/pkg/utf8proc/build.zig.zon
new file mode 100644
index 000000000..a4ecb6ab3
--- /dev/null
+++ b/pkg/utf8proc/build.zig.zon
@@ -0,0 +1,10 @@
+.{
+ .name = "utf8proc",
+ .version = "2.8.0",
+ .dependencies = .{
+ .utf8proc = .{
+ .url = "https://github.com/JuliaStrings/utf8proc/archive/refs/tags/v2.8.0.tar.gz",
+ .hash = "1220056ce228a8c58f1fa66ab778f5c8965e62f720c1d30603c7d534cb7d8a605ad7",
+ },
+ },
+}
diff --git a/pkg/zlib/build.zig b/pkg/zlib/build.zig
index fa2a57acb..de00f4b73 100644
--- a/pkg/zlib/build.zig
+++ b/pkg/zlib/build.zig
@@ -1,74 +1,57 @@
const std = @import("std");
-/// Directories with our includes.
-const root = thisDir() ++ "../../../vendor/zlib/";
-const include_path = root;
+pub fn build(b: *std.Build) !void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
-pub const include_paths = .{include_path};
+ const upstream = b.dependency("zlib", .{});
-pub const pkg = std.build.Pkg{
- .name = "zlib",
- .source = .{ .path = thisDir() ++ "/main.zig" },
-};
-
-fn thisDir() []const u8 {
- return std.fs.path.dirname(@src().file) orelse ".";
-}
-
-pub fn link(b: *std.build.Builder, step: *std.build.LibExeObjStep) !*std.build.LibExeObjStep {
- const lib = try buildLib(b, step);
- step.linkLibrary(lib);
- step.addIncludePath(.{ .path = include_path });
- return lib;
-}
-
-pub fn buildLib(
- b: *std.build.Builder,
- step: *std.build.LibExeObjStep,
-) !*std.build.LibExeObjStep {
const lib = b.addStaticLibrary(.{
.name = "z",
- .target = step.target,
- .optimize = step.optimize,
+ .target = target,
+ .optimize = optimize,
+ });
+ lib.linkLibC();
+ lib.addIncludePath(upstream.path(""));
+ lib.installHeadersDirectoryOptions(.{
+ .source_dir = upstream.path(""),
+ .install_dir = .header,
+ .install_subdir = "",
+ .include_extensions = &.{".h"},
});
- // Include
- lib.addIncludePath(.{ .path = include_path });
-
- // Link
- lib.linkLibC();
-
- // Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
-
try flags.appendSlice(&.{
"-DHAVE_SYS_TYPES_H",
"-DHAVE_STDINT_H",
"-DHAVE_STDDEF_H",
"-DZ_HAVE_UNISTD_H",
});
+ for (srcs) |src| {
+ lib.addCSourceFile(.{
+ .file = upstream.path(src),
+ .flags = flags.items,
+ });
+ }
- // C files
- lib.addCSourceFiles(srcs, flags.items);
-
- return lib;
+ b.installArtifact(lib);
}
-const srcs = &.{
- root ++ "adler32.c",
- root ++ "compress.c",
- root ++ "crc32.c",
- root ++ "deflate.c",
- root ++ "gzclose.c",
- root ++ "gzlib.c",
- root ++ "gzread.c",
- root ++ "gzwrite.c",
- root ++ "inflate.c",
- root ++ "infback.c",
- root ++ "inftrees.c",
- root ++ "inffast.c",
- root ++ "trees.c",
- root ++ "uncompr.c",
- root ++ "zutil.c",
+const srcs: []const []const u8 = &.{
+ "adler32.c",
+ "compress.c",
+ "crc32.c",
+ "deflate.c",
+ "gzclose.c",
+ "gzlib.c",
+ "gzread.c",
+ "gzwrite.c",
+ "inflate.c",
+ "infback.c",
+ "inftrees.c",
+ "inffast.c",
+ "trees.c",
+ "uncompr.c",
+ "zutil.c",
};
diff --git a/pkg/zlib/build.zig.zon b/pkg/zlib/build.zig.zon
new file mode 100644
index 000000000..7550da4a3
--- /dev/null
+++ b/pkg/zlib/build.zig.zon
@@ -0,0 +1,10 @@
+.{
+ .name = "zlib",
+ .version = "1.3.0",
+ .dependencies = .{
+ .zlib = .{
+ .url = "https://github.com/madler/zlib/archive/refs/tags/v1.3.tar.gz",
+ .hash = "12207d353609d95cee9da7891919e6d9582e97b7aa2831bd50f33bf523a582a08547",
+ },
+ },
+}
diff --git a/vendor/cimgui b/vendor/cimgui
deleted file mode 160000
index 9ce2c32da..000000000
--- a/vendor/cimgui
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9ce2c32dada1e1fcb90f2c9bab2568895db719f5
diff --git a/vendor/freetype b/vendor/freetype
deleted file mode 160000
index 4d8db130e..000000000
--- a/vendor/freetype
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4d8db130ea4342317581bab65fc96365ce806b77
diff --git a/vendor/libpng b/vendor/libpng
deleted file mode 160000
index f8e5fa92b..000000000
--- a/vendor/libpng
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f8e5fa92b0e37ab597616f554bee254157998227
diff --git a/vendor/libxev b/vendor/libxev
deleted file mode 160000
index 9068c5d95..000000000
--- a/vendor/libxev
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9068c5d954f97b8498f265b1dd6db9d67f6bc103
diff --git a/vendor/libxml2 b/vendor/libxml2
new file mode 160000
index 000000000..58de9d31d
--- /dev/null
+++ b/vendor/libxml2
@@ -0,0 +1 @@
+Subproject commit 58de9d31da4d0e8cb6bcf7f5e99714f9df2c4411
diff --git a/vendor/mach-glfw b/vendor/mach-glfw
deleted file mode 160000
index 30727db96..000000000
--- a/vendor/mach-glfw
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 30727db96a3f6bccf51bcf2b68b200527f25fa9c
diff --git a/vendor/mach-sdk/sdk-linux-aarch64 b/vendor/mach-sdk/sdk-linux-aarch64
deleted file mode 160000
index a279b0a3e..000000000
--- a/vendor/mach-sdk/sdk-linux-aarch64
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a279b0a3ef2f103b308defcd7e1a32e20346f70b
diff --git a/vendor/mach-sdk/sdk-linux-x86_64 b/vendor/mach-sdk/sdk-linux-x86_64
deleted file mode 160000
index ebd1ce12e..000000000
--- a/vendor/mach-sdk/sdk-linux-x86_64
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ebd1ce12e9abc152c7ed43afbcdb4b6e1c95be07
diff --git a/vendor/tracy b/vendor/tracy
deleted file mode 160000
index a8511d357..000000000
--- a/vendor/tracy
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a8511d357650282c6915f7aa9775e9c4945e42b5
diff --git a/vendor/utf8proc b/vendor/utf8proc
deleted file mode 160000
index 1cb28a66c..000000000
--- a/vendor/utf8proc
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 1cb28a66ca79a0845e99433fd1056257456cef8b
diff --git a/vendor/zig-js b/vendor/zig-js
deleted file mode 160000
index 3639752be..000000000
--- a/vendor/zig-js
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 3639752be98d5168f821704dca02b5eb8b915ea9
diff --git a/vendor/zig-libxml2 b/vendor/zig-libxml2
deleted file mode 160000
index 5aae6093c..000000000
--- a/vendor/zig-libxml2
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5aae6093c9faa8699d4a39b530b44daf5df91c0e
diff --git a/vendor/zig-objc b/vendor/zig-objc
deleted file mode 160000
index 51584a2f7..000000000
--- a/vendor/zig-objc
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 51584a2f7842ae10c9859b76ba5722ddf3f58e24
diff --git a/vendor/zlib b/vendor/zlib
deleted file mode 160000
index 09155eaa2..000000000
--- a/vendor/zlib
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 09155eaa2f9270dc4ed1fa13e2b4b2613e6e4851