1
0
Fork 0
mirror of https://github.com/zigzap/zap.git synced 2025-10-20 15:14:08 +00:00
zap/build.zig
2023-01-11 15:47:32 +01:00

138 lines
4.7 KiB
Zig

const std = @import("std");
const facilio = std.build.Pkg{
.name = "facilio",
.source = std.build.FileSource{ .path = "src/deps/facilio.zig" },
};
pub fn build(b: *std.build.Builder) !void {
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const lib = b.addStaticLibrary("zap", "src/main.zig");
lib.setBuildMode(mode);
lib.addPackage(facilio);
const lib_facilio = try addFacilioLib(lib);
lib.linkLibrary(lib_facilio);
lib.install();
const main_tests = b.addTest("src/main.zig");
main_tests.setBuildMode(mode);
const test_step = b.step("test", "Run library tests");
test_step.dependOn(&main_tests.step);
}
pub fn addFacilioLib(exe: *std.build.LibExeObjStep) !*std.build.LibExeObjStep {
ensureGit(exe.builder.allocator);
try ensureSubmodule(exe.builder.allocator, "src/deps/facilio");
ensureMake(exe.builder.allocator);
try makeFacilioLibdump(exe.builder.allocator);
var b = exe.builder;
var lib_facilio = b.addStaticLibrary("facilio", null);
lib_facilio.linkLibC();
// Generate flags
var flags = std.ArrayList([]const u8).init(std.heap.page_allocator);
if (b.is_release) try flags.append("-Os");
try flags.append("-Wno-return-type-c-linkage");
try flags.append("-fno-sanitize=undefined");
lib_facilio.addIncludePath("./src/deps/facilio/libdump/all");
// legacy for fio_mem
lib_facilio.addIncludePath("src/deps/facilio/lib/facil/legacy");
// Add C
lib_facilio.addCSourceFiles(&.{
"src/deps/facilio/libdump/all/http.c",
"src/deps/facilio/libdump/all/fiobj_numbers.c",
"src/deps/facilio/libdump/all/fio_siphash.c",
"src/deps/facilio/libdump/all/fiobj_str.c",
"src/deps/facilio/libdump/all/http1.c",
"src/deps/facilio/libdump/all/fiobj_ary.c",
"src/deps/facilio/libdump/all/fiobj_data.c",
"src/deps/facilio/libdump/all/fiobj_hash.c",
"src/deps/facilio/libdump/all/websockets.c",
"src/deps/facilio/libdump/all/fiobj_json.c",
"src/deps/facilio/libdump/all/fio.c",
"src/deps/facilio/libdump/all/fiobject.c",
"src/deps/facilio/libdump/all/http_internal.c",
"src/deps/facilio/libdump/all/fiobj_mustache.c",
}, flags.items);
return lib_facilio;
}
fn sdkPath(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;
};
}
fn ensureGit(allocator: std.mem.Allocator) void {
const result = std.ChildProcess.exec(.{
.allocator = allocator,
.argv = &.{ "git", "--version" },
}) 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 ensureSubmodule(allocator: std.mem.Allocator, path: []const u8) !void {
if (std.process.getEnvVarOwned(allocator, "NO_ENSURE_SUBMODULES")) |no_ensure_submodules| {
defer allocator.free(no_ensure_submodules);
if (std.mem.eql(u8, no_ensure_submodules, "true")) return;
} else |_| {}
var child = std.ChildProcess.init(&.{ "git", "submodule", "update", "--init", path }, allocator);
child.cwd = sdkPath("/");
child.stderr = std.io.getStdErr();
child.stdout = std.io.getStdOut();
_ = try child.spawnAndWait();
}
fn ensureMake(allocator: std.mem.Allocator) void {
const result = std.ChildProcess.exec(.{
.allocator = allocator,
.argv = &.{ "make", "--version" },
}) catch { // e.g. FileNotFound
std.log.err("error: 'make --version' failed. Is make not installed?", .{});
std.process.exit(1);
};
defer {
allocator.free(result.stderr);
allocator.free(result.stdout);
}
if (result.term.Exited != 0) {
std.log.err("error: 'make --version' failed. Is make not installed?", .{});
std.process.exit(1);
}
}
fn makeFacilioLibdump(allocator: std.mem.Allocator) !void {
var child = std.ChildProcess.init(&.{
"make",
"-C",
"./src/deps/facilio",
"libdump",
}, allocator);
child.cwd = sdkPath("/");
child.stderr = std.io.getStdErr();
child.stdout = std.io.getStdOut();
_ = try child.spawnAndWait();
}