raylib-template/libs/tracy/build.zig
2025-12-05 03:27:30 +02:00

125 lines
6.5 KiB
Zig

const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const options = b.addOptions();
const tracy_enable = option(b, options, bool, "tracy_enable", "Enable profiling", true);
const tracy_on_demand = option(b, options, bool, "tracy_on_demand", "On-demand profiling", false);
const tracy_callstack = callstack: {
const opt = b.option(u8, "tracy_callstack", "Enforce callstack collection for tracy regions");
options.addOption(?u8, "tracy_callstack", opt);
break :callstack opt;
};
const tracy_no_callstack = option(b, options, bool, "tracy_no_callstack", "Disable all callstack related functionality", false);
const tracy_no_callstack_inlines = option(b, options, bool, "tracy_no_callstack_inlines", "Disables the inline functions in callstacks", false);
const tracy_only_localhost = option(b, options, bool, "tracy_only_localhost", "Only listen on the localhost interface", false);
const tracy_no_broadcast = option(b, options, bool, "tracy_no_broadcast", "Disable client discovery by broadcast to local network", false);
const tracy_only_ipv4 = option(b, options, bool, "tracy_only_ipv4", "Tracy will only accept connections on IPv4 addresses (disable IPv6)", false);
const tracy_no_code_transfer = option(b, options, bool, "tracy_no_code_transfer", "Disable collection of source code", false);
const tracy_no_context_switch = option(b, options, bool, "tracy_no_context_switch", "Disable capture of context switches", false);
const tracy_no_exit = option(b, options, bool, "tracy_no_exit", "Client executable does not exit until all profile data is sent to server", false);
const tracy_no_sampling = option(b, options, bool, "tracy_no_sampling", "Disable call stack sampling", false);
const tracy_no_verify = option(b, options, bool, "tracy_no_verify", "Disable zone validation for C API", false);
const tracy_no_vsync_capture = option(b, options, bool, "tracy_no_vsync_capture", "Disable capture of hardware Vsync events", false);
const tracy_no_frame_image = option(b, options, bool, "tracy_no_frame_image", "Disable the frame image support and its thread", false);
// @FIXME: For some reason system tracing crashes the program, will need to investigate
// panics during some drawf thing within libbacktrace (c++)
const tracy_no_system_tracing = option(b, options, bool, "tracy_no_system_tracing", "Disable systrace sampling", true);
const tracy_delayed_init = option(b, options, bool, "tracy_delayed_init", "Enable delayed initialization of the library (init on first call)", false);
const tracy_manual_lifetime = option(b, options, bool, "tracy_manual_lifetime", "Enable the manual lifetime management of the profile", false);
const tracy_fibers = option(b, options, bool, "tracy_fibers", "Enable fibers support", false);
const tracy_no_crash_handler = option(b, options, bool, "tracy_no_crash_handler", "Disable crash handling", false);
const tracy_timer_fallback = option(b, options, bool, "tracy_timer_fallback", "Use lower resolution timers", false);
const shared = option(b, options, bool, "shared", "Build the tracy client as a shared libary", false);
const tracy_source_dep = b.dependency("tracy_source", .{});
const mod = b.addModule("tracy", .{
.target = target,
.optimize = optimize,
});
// Avoid building Tracy completely if it is disabled.
mod.addIncludePath(tracy_source_dep.path("public"));
if (target.result.os.tag == .windows) {
mod.linkSystemLibrary("dbghelp", .{ .needed = true });
mod.linkSystemLibrary("ws2_32", .{ .needed = true });
}
mod.link_libcpp = true;
const config_header = b.addConfigHeader(.{ .include_path = "TracyConfig.h" }, .{});
inline for (.{
.{ tracy_enable, "TRACY_ENABLE", "" },
.{ tracy_on_demand, "TRACY_ON_DEMAND", "" },
.{ tracy_callstack != null, "TRACY_CALLSTACK", b.fmt("{?d}", .{tracy_callstack}) },
.{ tracy_no_callstack, "TRACY_NO_CALLSTACK", "" },
.{ tracy_no_callstack_inlines, "TRACY_NO_CALLSTACK_INLINES", "" },
.{ tracy_only_localhost, "TRACY_ONLY_LOCALHOST", "" },
.{ tracy_no_broadcast, "TRACY_NO_BROADCAST", "" },
.{ tracy_only_ipv4, "TRACY_ONLY_IPV4", "" },
.{ tracy_no_code_transfer, "TRACY_NO_CODE_TRANSFER", "" },
.{ tracy_no_context_switch, "TRACY_NO_CONTEXT_SWITCH", "" },
.{ tracy_no_exit, "TRACY_NO_EXIT", "" },
.{ tracy_no_sampling, "TRACY_NO_SAMPLING", "" },
.{ tracy_no_verify, "TRACY_NO_VERIFY", "" },
.{ tracy_no_vsync_capture, "TRACY_NO_VSYNC_CAPTURE", ""},
.{ tracy_no_frame_image, "TRACY_NO_FRAME_IMAGE", ""},
.{ tracy_no_system_tracing, "TRACY_NO_SYSTEM_TRACING", ""},
.{ tracy_delayed_init, "TRACY_DELAYED_INIT", ""},
.{ tracy_manual_lifetime, "TRACY_MANUAL_LIFETIME", ""},
.{ tracy_fibers, "TRACY_FIBERS", "" },
.{ tracy_no_crash_handler, "TRACY_NO_CRASH_HANDLER", "" },
.{ tracy_timer_fallback, "TRACY_TIMER_FALLBACK", "" },
.{ shared and target.result.os.tag == .windows, "TRACY_EXPORTS", "" }
}) |triplet| {
const enabled, const name, const value = triplet;
if (enabled) {
mod.addCMacro(name, value);
config_header.addValue(name, []const u8, value);
}
}
mod.addCSourceFile(.{
.file = tracy_source_dep.path("public/TracyClient.cpp"),
.flags = &.{}
});
const lib = b.addLibrary(.{
.linkage = if (shared) .dynamic else .static,
.name = "tracy",
.root_module = mod,
});
const include_extensions = &.{".h",".hpp"};
lib.installHeadersDirectory(tracy_source_dep.path("public/tracy"), "tracy", .{
.include_extensions = include_extensions,
});
lib.installHeadersDirectory(tracy_source_dep.path("public/common"), "common", .{
.include_extensions = include_extensions,
});
lib.installHeadersDirectory(tracy_source_dep.path("public/client"), "client", .{
.include_extensions = include_extensions,
});
lib.installConfigHeader(config_header);
b.installArtifact(lib);
}
pub fn option(
b: *std.Build,
options: *std.Build.Step.Options,
comptime T: type,
name_raw: []const u8,
description_raw: []const u8,
default: T,
) T {
const opt = b.option(T, name_raw, description_raw) orelse default;
options.addOption(T, name_raw, opt);
return opt;
}