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 options = b.addOptions(); options.addOption(bool, "tracy_enable", tracy_enable); options.addOption(bool, "tracy_on_demand", tracy_on_demand); options.addOption(?u8, "tracy_callstack", tracy_callstack); options.addOption(bool, "tracy_no_callstack", tracy_no_callstack); options.addOption(bool, "tracy_no_callstack_inlines", tracy_no_callstack_inlines); options.addOption(bool, "tracy_only_localhost", tracy_only_localhost); options.addOption(bool, "tracy_no_broadcast", tracy_no_broadcast); options.addOption(bool, "tracy_only_ipv4", tracy_only_ipv4); options.addOption(bool, "tracy_no_code_transfer", tracy_no_code_transfer); options.addOption(bool, "tracy_no_context_switch", tracy_no_context_switch); options.addOption(bool, "tracy_no_exit", tracy_no_exit); options.addOption(bool, "tracy_no_sampling", tracy_no_sampling); options.addOption(bool, "tracy_no_verify", tracy_no_verify); options.addOption(bool, "tracy_no_vsync_capture", tracy_no_vsync_capture); options.addOption(bool, "tracy_no_frame_image", tracy_no_frame_image); options.addOption(bool, "tracy_no_system_tracing", tracy_no_system_tracing); options.addOption(bool, "tracy_delayed_init", tracy_delayed_init); options.addOption(bool, "tracy_manual_lifetime", tracy_manual_lifetime); options.addOption(bool, "tracy_fibers", tracy_fibers); options.addOption(bool, "tracy_no_crash_handler", tracy_no_crash_handler); options.addOption(bool, "tracy_timer_fallback", tracy_timer_fallback); options.addOption(bool, "shared", shared); const dep_src = b.dependency("src", .{}); const tracy_module = b.addModule("tracy", .{ .root_source_file = b.path("src/root.zig"), .target = target, .optimize = optimize, }); tracy_module.addImport("tracy-options", options.createModule()); tracy_module.addIncludePath(dep_src.path("./public")); const tracy_client = b.addLibrary(.{ .linkage = if (shared) .dynamic else .static, .name = "tracy", .root_module = b.createModule(.{ .target = target, .optimize = optimize, }), }); if (target.result.os.tag == .windows) { tracy_client.root_module.linkSystemLibrary("dbghelp", .{}); tracy_client.root_module.linkSystemLibrary("ws2_32", .{}); } if (target.result.abi != .msvc) { tracy_client.root_module.link_libcpp = true; } else { tracy_client.root_module.link_libc = true; } tracy_client.root_module.addCSourceFile(.{ .file = dep_src.path("./public/TracyClient.cpp"), .flags = if (target.result.os.tag == .windows) &.{"-fms-extensions"} else &.{}, }); tracy_client.installHeadersDirectory(dep_src.path("public"), "", .{ .include_extensions = &.{".h", ".hpp"}, }); if (tracy_enable) tracy_client.root_module.addCMacro("TRACY_ENABLE", "1"); if (tracy_on_demand) tracy_client.root_module.addCMacro("TRACY_ON_DEMAND", "1"); if (tracy_callstack) |depth| { tracy_client.root_module.addCMacro("TRACY_CALLSTACK", "\"" ++ digits2(depth) ++ "\""); } if (tracy_no_callstack) tracy_client.root_module.addCMacro("TRACY_NO_CALLSTACK", "1"); if (tracy_no_callstack_inlines) tracy_client.root_module.addCMacro("TRACY_NO_CALLSTACK_INLINES", "1"); if (tracy_only_localhost) tracy_client.root_module.addCMacro("TRACY_ONLY_LOCALHOST", "1"); if (tracy_no_broadcast) tracy_client.root_module.addCMacro("TRACY_NO_BROADCAST", "1"); if (tracy_only_ipv4) tracy_client.root_module.addCMacro("TRACY_ONLY_IPV4", "1"); if (tracy_no_code_transfer) tracy_client.root_module.addCMacro("TRACY_NO_CODE_TRANSFER", "1"); if (tracy_no_context_switch) tracy_client.root_module.addCMacro("TRACY_NO_CONTEXT_SWITCH", "1"); if (tracy_no_exit) tracy_client.root_module.addCMacro("TRACY_NO_EXIT", "1"); if (tracy_no_sampling) tracy_client.root_module.addCMacro("TRACY_NO_SAMPLING", "1"); if (tracy_no_verify) tracy_client.root_module.addCMacro("TRACY_NO_VERIFY", "1"); if (tracy_no_vsync_capture) tracy_client.root_module.addCMacro("TRACY_NO_VSYNC_CAPTURE", "1"); if (tracy_no_frame_image) tracy_client.root_module.addCMacro("TRACY_NO_FRAME_IMAGE", "1"); if (tracy_no_system_tracing) tracy_client.root_module.addCMacro("TRACY_NO_SYSTEM_TRACING", "1"); if (tracy_delayed_init) tracy_client.root_module.addCMacro("TRACY_DELAYED_INIT", "1"); if (tracy_manual_lifetime) tracy_client.root_module.addCMacro("TRACY_MANUAL_LIFETIME", "1"); if (tracy_fibers) tracy_client.root_module.addCMacro("TRACY_FIBERS", "1"); if (tracy_no_crash_handler) tracy_client.root_module.addCMacro("TRACY_NO_CRASH_HANDLER", "1"); if (tracy_timer_fallback) tracy_client.root_module.addCMacro("TRACY_TIMER_FALLBACK", "1"); if (shared and target.result.os.tag == .windows) tracy_client.root_module.addCMacro("TRACY_EXPORTS", "1"); b.installArtifact(tracy_client); }