nats.zig/nats-c.build.zig

134 lines
3.9 KiB
Zig

// This file is licensed under the CC0 1.0 license.
// See: https://creativecommons.org/publicdomain/zero/1.0/legalcode
const std = @import("std");
const NatsCOptions = struct {
name: []const u8,
target: std.zig.CrossTarget,
optimize: std.builtin.OptimizeMode,
};
pub fn nats_c_lib(
b: *std.Build,
options: NatsCOptions,
) *std.Build.Step.Compile {
const lib = b.addStaticLibrary(.{
.name = options.name,
.target = options.target,
.optimize = options.optimize,
});
const cflags = [_][]const u8{
"-fno-sanitize=undefined",
};
lib.linkLibC();
lib.addCSourceFiles(&common_sources, &cflags);
lib.addIncludePath(.{ .path = nats_src_prefix ++ "include" });
// if building with streaming support
// lib.addIncludePath(.{ .path = nats_src_prefix ++ "stan" });
// lib.addCSourceFiles(&streaming_sources, &cflags);
const tinfo = lib.target_info.target;
switch (tinfo.os.tag) {
.windows => {
lib.addCSourceFiles(&win_sources, &cflags);
if (tinfo.abi != .msvc) {
lib.addCSourceFiles(&.{"src/win-crosshack.c"}, &cflags);
}
lib.defineCMacro("_WIN32", null);
lib.linkSystemLibrary("ws2_32");
},
.macos => {
lib.addCSourceFiles(&unix_sources, &cflags);
lib.defineCMacro("DARWIN", null);
},
else => {
lib.addCSourceFiles(&unix_sources, &cflags);
lib.defineCMacro("_GNU_SOURCE", null);
lib.defineCMacro("LINUX", null);
// may need to link pthread and rt. Not sure if those are inluded with linkLibC
lib.linkSystemLibrary("pthread");
lib.linkSystemLibrary("rt");
},
}
lib.defineCMacro("_REENTRANT", null);
inline for (install_headers) |header| {
lib.installHeader(nats_src_prefix ++ header, "nats/" ++ header);
}
b.installArtifact(lib);
return lib;
}
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
_ = nats_c_lib(b, .{ .name = "nats-c", .target = target, .optimize = optimize });
}
const nats_src_prefix = "deps/nats.c/src/";
const install_headers = [_][]const u8{
"nats.h",
"status.h",
"version.h",
};
const common_sources = [_][]const u8{
nats_src_prefix ++ "asynccb.c",
nats_src_prefix ++ "comsock.c",
nats_src_prefix ++ "crypto.c",
nats_src_prefix ++ "js.c",
nats_src_prefix ++ "kv.c",
nats_src_prefix ++ "nats.c",
nats_src_prefix ++ "nkeys.c",
nats_src_prefix ++ "opts.c",
nats_src_prefix ++ "pub.c",
nats_src_prefix ++ "stats.c",
nats_src_prefix ++ "sub.c",
nats_src_prefix ++ "url.c",
nats_src_prefix ++ "buf.c",
nats_src_prefix ++ "conn.c",
nats_src_prefix ++ "hash.c",
nats_src_prefix ++ "jsm.c",
nats_src_prefix ++ "msg.c",
nats_src_prefix ++ "natstime.c",
nats_src_prefix ++ "nuid.c",
nats_src_prefix ++ "parser.c",
nats_src_prefix ++ "srvpool.c",
nats_src_prefix ++ "status.c",
nats_src_prefix ++ "timer.c",
nats_src_prefix ++ "util.c",
};
const unix_sources = [_][]const u8{
nats_src_prefix ++ "unix/cond.c",
nats_src_prefix ++ "unix/mutex.c",
nats_src_prefix ++ "unix/sock.c",
nats_src_prefix ++ "unix/thread.c",
};
const win_sources = [_][]const u8{
nats_src_prefix ++ "win/cond.c",
nats_src_prefix ++ "win/mutex.c",
nats_src_prefix ++ "win/sock.c",
nats_src_prefix ++ "win/strings.c",
nats_src_prefix ++ "win/thread.c",
};
const streaming_sources = [_][]const u8{
nats_src_prefix ++ "stan/conn.c",
nats_src_prefix ++ "stan/copts.c",
nats_src_prefix ++ "stan/msg.c",
nats_src_prefix ++ "stan/protocol.pb-c.c",
nats_src_prefix ++ "stan/pub.c",
nats_src_prefix ++ "stan/sopts.c",
nats_src_prefix ++ "stan/sub.c",
};