sokoban-v2/libs/tracy/build.zig

142 lines
7.4 KiB
Zig

const std = @import("std");
const digits2 = std.fmt.digits2;
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const tracy_enable = b.option(bool, "tracy_enable", "Enable profiling") orelse true;
const tracy_on_demand = b.option(bool, "tracy_on_demand", "On-demand profiling") orelse false;
const tracy_callstack: ?u8 = b.option(u8, "tracy_callstack", "Enforce callstack collection for tracy regions");
const tracy_no_callstack = b.option(bool, "tracy_no_callstack", "Disable all callstack related functionality") orelse false;
const tracy_no_callstack_inlines = b.option(bool, "tracy_no_callstack_inlines", "Disables the inline functions in callstacks") orelse false;
const tracy_only_localhost = b.option(bool, "tracy_only_localhost", "Only listen on the localhost interface") orelse false;
const tracy_no_broadcast = b.option(bool, "tracy_no_broadcast", "Disable client discovery by broadcast to local network") orelse false;
const tracy_only_ipv4 = b.option(bool, "tracy_only_ipv4", "Tracy will only accept connections on IPv4 addresses (disable IPv6)") orelse false;
const tracy_no_code_transfer = b.option(bool, "tracy_no_code_transfer", "Disable collection of source code") orelse false;
const tracy_no_context_switch = b.option(bool, "tracy_no_context_switch", "Disable capture of context switches") orelse false;
const tracy_no_exit = b.option(bool, "tracy_no_exit", "Client executable does not exit until all profile data is sent to server") orelse false;
const tracy_no_sampling = b.option(bool, "tracy_no_sampling", "Disable call stack sampling") orelse false;
const tracy_no_verify = b.option(bool, "tracy_no_verify", "Disable zone validation for C API") orelse false;
const tracy_no_vsync_capture = b.option(bool, "tracy_no_vsync_capture", "Disable capture of hardware Vsync events") orelse false;
const tracy_no_frame_image = b.option(bool, "tracy_no_frame_image", "Disable the frame image support and its thread") orelse false;
// NOTE For some reason system tracing on zig projects crashes tracy, will need to investigate
const tracy_no_system_tracing = b.option(bool, "tracy_no_system_tracing", "Disable systrace sampling") orelse true;
const tracy_delayed_init = b.option(bool, "tracy_delayed_init", "Enable delayed initialization of the library (init on first call)") orelse false;
const tracy_manual_lifetime = b.option(bool, "tracy_manual_lifetime", "Enable the manual lifetime management of the profile") orelse false;
const tracy_fibers = b.option(bool, "tracy_fibers", "Enable fibers support") orelse false;
const tracy_no_crash_handler = b.option(bool, "tracy_no_crash_handler", "Disable crash handling") orelse false;
const tracy_timer_fallback = b.option(bool, "tracy_timer_fallback", "Use lower resolution timers") orelse false;
const shared = b.option(bool, "shared", "Build the tracy client as a shared libary") orelse false;
const dep_src = b.dependency("src", .{});
const is_windows = target.result.os.tag == .windows;
const arena = b.graph.arena;
var defines: std.ArrayList(CDefine) = .empty;
inline for (.{
.{ tracy_enable , "TRACY_ENABLE" , "1" },
.{ tracy_on_demand , "TRACY_ON_DEMAND" , "1" },
.{ tracy_no_callstack , "TRACY_NO_CALLSTACK" , "1" },
.{ tracy_no_callstack_inlines, "TRACY_NO_CALLSTACK_INLINES", "1" },
.{ tracy_only_localhost , "TRACY_ONLY_LOCALHOST" , "1" },
.{ tracy_no_broadcast , "TRACY_NO_BROADCAST" , "1" },
.{ tracy_only_ipv4 , "TRACY_ONLY_IPV4" , "1" },
.{ tracy_no_code_transfer , "TRACY_NO_CODE_TRANSFER" , "1" },
.{ tracy_no_context_switch , "TRACY_NO_CONTEXT_SWITCH" , "1" },
.{ tracy_no_exit , "TRACY_NO_EXIT" , "1" },
.{ tracy_no_sampling , "TRACY_NO_SAMPLING" , "1" },
.{ tracy_no_verify , "TRACY_NO_VERIFY" , "1" },
.{ tracy_no_vsync_capture , "TRACY_NO_VSYNC_CAPTURE" , "1" },
.{ tracy_no_frame_image , "TRACY_NO_FRAME_IMAGE" , "1" },
.{ tracy_no_system_tracing , "TRACY_NO_SYSTEM_TRACING" , "1" },
.{ tracy_delayed_init , "TRACY_DELAYED_INIT" , "1" },
.{ tracy_manual_lifetime , "TRACY_MANUAL_LIFETIME" , "1" },
.{ tracy_fibers , "TRACY_FIBERS" , "1" },
.{ tracy_no_crash_handler , "TRACY_NO_CRASH_HANDLER" , "1" },
.{ tracy_timer_fallback , "TRACY_TIMER_FALLBACK" , "1" },
}) |entry| {
const condition = entry[0];
const name = entry[1];
const value = entry[2];
if (condition) {
try defines.append(arena, .{ .name = name, .value = value });
}
}
if (tracy_callstack) |depth| {
try defines.append(arena, .{ .name = "TRACY_CALLSTACK", .value = "\"" ++ digits2(depth) ++ "\"" });
}
{
const tracy_module = b.addModule("tracy", .{
.root_source_file = b.path("src/root.zig"),
.target = target,
.optimize = optimize,
});
const options = b.addOptions();
options.addOption(bool, "tracy_enable", tracy_enable);
options.addOption(?u8, "tracy_callstack", tracy_callstack);
options.addOption(bool, "tracy_no_callstack", tracy_no_callstack);
options.addOption(bool, "tracy_fibers", tracy_fibers);
tracy_module.addImport("options", options.createModule());
const write_file_step = b.addWriteFiles();
const translate_c = b.addTranslateC(.{
.root_source_file = write_file_step.add("c.h", "#include <tracy/TracyC.h>"),
.target = target,
.optimize = optimize,
});
translate_c.addIncludePath(dep_src.path("./public"));
if (shared and is_windows) {
translate_c.defineCMacro("TRACY_IMPORTS", "1");
}
for (defines.items) |define| {
translate_c.defineCMacro(define.name, define.value);
}
tracy_module.addImport("c", translate_c.createModule());
}
{
const mod = b.createModule(.{
.target = target,
.optimize = optimize,
});
if (is_windows) {
mod.linkSystemLibrary("dbghelp", .{});
mod.linkSystemLibrary("ws2_32", .{});
}
if (target.result.abi != .msvc) {
mod.link_libcpp = true;
} else {
mod.link_libc = true;
}
mod.addCSourceFile(.{
.file = dep_src.path("./public/TracyClient.cpp"),
.flags = if (is_windows) &.{"-fms-extensions"} else &.{},
});
if (shared and is_windows) {
mod.addCMacro("TRACY_EXPORTS", "1");
}
for (defines.items) |define| {
mod.addCMacro(define.name, define.value);
}
const tracy_client = b.addLibrary(.{
.linkage = if (shared) .dynamic else .static,
.name = "tracy",
.root_module = mod
});
tracy_client.installHeadersDirectory(dep_src.path("public"), "", .{
.include_extensions = &.{".h", ".hpp"},
});
b.installArtifact(tracy_client);
}
}
const CDefine = struct {
name: []const u8,
value: []const u8,
};