Add harfbuzz build (not used yet)

This commit is contained in:
Mitchell Hashimoto
2022-08-28 10:09:39 -07:00
parent 8ff98446a9
commit 367aba62c4
7 changed files with 118 additions and 2 deletions

3
.gitmodules vendored
View File

@ -22,3 +22,6 @@
[submodule "vendor/utf8proc"] [submodule "vendor/utf8proc"]
path = vendor/utf8proc path = vendor/utf8proc
url = https://github.com/JuliaStrings/utf8proc.git url = https://github.com/JuliaStrings/utf8proc.git
[submodule "vendor/harfbuzz"]
path = vendor/harfbuzz
url = https://github.com/harfbuzz/harfbuzz.git

View File

@ -4,6 +4,7 @@ const Builder = std.build.Builder;
const LibExeObjStep = std.build.LibExeObjStep; const LibExeObjStep = std.build.LibExeObjStep;
const glfw = @import("vendor/mach/glfw/build.zig"); const glfw = @import("vendor/mach/glfw/build.zig");
const freetype = @import("pkg/freetype/build.zig"); const freetype = @import("pkg/freetype/build.zig");
const harfbuzz = @import("pkg/harfbuzz/build.zig");
const libuv = @import("pkg/libuv/build.zig"); const libuv = @import("pkg/libuv/build.zig");
const libpng = @import("pkg/libpng/build.zig"); const libpng = @import("pkg/libpng/build.zig");
const utf8proc = @import("pkg/utf8proc/build.zig"); const utf8proc = @import("pkg/utf8proc/build.zig");
@ -156,6 +157,7 @@ fn addDeps(
) !void { ) !void {
// We always need the Zig packages // We always need the Zig packages
step.addPackage(freetype.pkg); step.addPackage(freetype.pkg);
step.addPackage(harfbuzz.pkg);
step.addPackage(glfw.pkg); step.addPackage(glfw.pkg);
step.addPackage(libuv.pkg); step.addPackage(libuv.pkg);
step.addPackage(utf8proc.pkg); step.addPackage(utf8proc.pkg);
@ -185,6 +187,7 @@ fn addDeps(
step.addIncludePath(freetype.include_path_self); step.addIncludePath(freetype.include_path_self);
step.linkSystemLibrary("bzip2"); step.linkSystemLibrary("bzip2");
step.linkSystemLibrary("freetype2"); step.linkSystemLibrary("freetype2");
step.linkSystemLibrary("harfbuzz");
step.linkSystemLibrary("libpng"); step.linkSystemLibrary("libpng");
step.linkSystemLibrary("libuv"); step.linkSystemLibrary("libuv");
step.linkSystemLibrary("zlib"); step.linkSystemLibrary("zlib");
@ -201,7 +204,7 @@ fn addDeps(
}); });
// Freetype // Freetype
_ = try freetype.link(b, step, .{ const freetype_step = try freetype.link(b, step, .{
.libpng = freetype.Options.Libpng{ .libpng = freetype.Options.Libpng{
.enabled = true, .enabled = true,
.step = libpng_step, .step = libpng_step,
@ -215,8 +218,17 @@ fn addDeps(
}, },
}); });
// Harfbuzz
_ = try harfbuzz.link(b, step, .{
.freetype = .{
.enabled = true,
.step = freetype_step,
.include = &freetype.include_paths,
},
});
// Libuv // Libuv
var libuv_step = try libuv.link(b, step); const libuv_step = try libuv.link(b, step);
system_sdk.include(b, libuv_step, .{}); system_sdk.include(b, libuv_step, .{});
} }
} }

View File

@ -17,6 +17,7 @@
, bzip2 , bzip2
, fontconfig , fontconfig
, freetype , freetype
, harfbuzz
, libpng , libpng
, libGL , libGL
, libuv , libuv
@ -35,6 +36,7 @@ let
] ++ lib.optionals stdenv.isLinux [ ] ++ lib.optionals stdenv.isLinux [
bzip2 bzip2
freetype freetype
harfbuzz
libpng libpng
libuv libuv
zlib zlib
@ -71,6 +73,7 @@ in mkShell rec {
] ++ lib.optionals stdenv.isLinux [ ] ++ lib.optionals stdenv.isLinux [
bzip2 bzip2
freetype freetype
harfbuzz
libpng libpng
libuv libuv
zlib zlib

View File

@ -5,6 +5,8 @@ const root = thisDir() ++ "../../../vendor/freetype/";
const include_path = root ++ "include"; const include_path = root ++ "include";
pub const include_path_self = thisDir(); pub const include_path_self = thisDir();
pub const include_paths = .{ include_path, include_path_self };
pub const pkg = std.build.Pkg{ pub const pkg = std.build.Pkg{
.name = "freetype", .name = "freetype",
.source = .{ .path = thisDir() ++ "/main.zig" }, .source = .{ .path = thisDir() ++ "/main.zig" },

94
pkg/harfbuzz/build.zig Normal file
View File

@ -0,0 +1,94 @@
const std = @import("std");
/// Directories with our includes.
const root = thisDir() ++ "../../../vendor/harfbuzz/";
const include_path = root ++ "include";
pub const include_paths = .{include_path};
pub const pkg = std.build.Pkg{
.name = "harfbuzz",
.source = .{ .path = thisDir() ++ "/main.zig" },
};
fn thisDir() []const u8 {
return std.fs.path.dirname(@src().file) orelse ".";
}
pub const Options = struct {
freetype: Freetype = .{},
pub const Freetype = struct {
enabled: bool = false,
step: ?*std.build.LibExeObjStep = null,
include: ?[]const []const u8 = null,
};
};
pub fn link(
b: *std.build.Builder,
step: *std.build.LibExeObjStep,
opt: Options,
) !*std.build.LibExeObjStep {
const lib = try buildHarfbuzz(b, step, opt);
step.linkLibrary(lib);
step.addIncludePath(include_path);
return lib;
}
pub fn buildHarfbuzz(
b: *std.build.Builder,
step: *std.build.LibExeObjStep,
opt: Options,
) !*std.build.LibExeObjStep {
const lib = b.addStaticLibrary("harfbuzz", null);
lib.setTarget(step.target);
lib.setBuildMode(step.build_mode);
// Include
lib.addIncludePath(include_path);
// Link
lib.linkLibC();
lib.linkLibCpp();
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(dir);
}
// Compile
var flags = std.ArrayList([]const u8).init(b.allocator);
defer flags.deinit();
try flags.appendSlice(&.{
"-DHAVE_UNISTD_H",
"-DHAVE_SYS_MMAN_H",
"-DHAVE_STDBOOL_H",
// We always have pthread
"-DHAVE_PTHREAD=1",
});
if (opt.freetype.enabled) try flags.appendSlice(&.{
"-DHAVE_FREETYPE=1",
// Let's just assume a new freetype
"-DHAVE_FT_GET_VAR_BLEND_COORDINATES=1",
"-DHAVE_FT_SET_VAR_BLEND_COORDINATES=1",
"-DHAVE_FT_DONE_MM_VAR=1",
"-DHAVE_FT_GET_TRANSFORM=1",
});
// C files
lib.addCSourceFiles(srcs, flags.items);
return lib;
}
const srcs = &.{
root ++ "src/harfbuzz.cc",
};

1
pkg/harfbuzz/main.zig Normal file
View File

@ -0,0 +1 @@
// Todo!

1
vendor/harfbuzz vendored Submodule

@ -0,0 +1 @@
Subproject commit 9e4ae09fe76e0ab908095940c880b4ded94c1e18