1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
//! Wraps a Darwin static archive with the libsystem_override.sh
//! post-processing step so that consumers linking the archive bind
//! well-known libc/libm symbols (memcpy, memmove, memset, cos, sin,
//! ...) to Apple's libSystem instead of the bundled Zig compiler-rt.
//! See src/build/libsystem_override.sh for the full rationale.
//!
//! This applies to every static archive we produce, public
//! (e.g. libghostty-vt) and app-internal alike: the compiler-rt
//! bundle must stay because the few symbols libSystem does not
//! provide (f128 conversions, *q math, sincos*, ___zig_probe_stack)
//! have live references, e.g. from the bundled ubsan runtime and
//! x86_64 stack probing in Debug builds.
//!
//! Note shared libraries can't use either approach: Zig 0.16 links
//! compiler-rt as an eagerly-included object, so its definitions are
//! already bound into the dylib at link time and cannot be repaired
//! post-hoc. That needs an upstream Zig fix.
const std = @import("std");
const builtin = @import("builtin");
pub const Result = struct {
/// The step performing the override, or null if the override
/// doesn't apply to this target/host (in which case `output` is
/// the unmodified input).
step: ?*std.Build.Step,
output: std.Build.LazyPath,
};
/// Post-process the given static archive on Darwin. Requires a Darwin
/// host for the Apple toolchain (nmedit); in all other configurations
/// this is a no-op and the input is returned unmodified, which is
/// functional (the bundled compiler-rt symbols are used), just slower.
pub fn create(
b: *std.Build,
target: std.Build.ResolvedTarget,
input: std.Build.LazyPath,
out_name: []const u8,
) Result {
if (!target.result.os.tag.isDarwin() or
comptime !builtin.os.tag.isDarwin())
{
return .{ .step = null, .output = input };
}
const run = b.addSystemCommand(&.{"/bin/sh"});
run.setName("libsystem override");
run.addFileArg(b.path("src/build/libsystem_override.sh"));
run.addFileArg(input);
const output = run.addOutputFileArg(out_name);
return .{ .step = &run.step, .output = output };
}
|