-
Notifications
You must be signed in to change notification settings - Fork 79
Expand file tree
/
Copy pathbuild.zig
More file actions
196 lines (174 loc) · 8.06 KB
/
Copy pathbuild.zig
File metadata and controls
196 lines (174 loc) · 8.06 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
const builtin = @import("builtin");
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const codesign_identity = b.option(
[]const u8,
"codesign-identity",
"macOS codesign identity. Disabled by default and skipped for x86_64-macos.",
);
// ── Exposed module: importable as @import("codedb") ──
const codedb_mod = b.addModule("codedb", .{
.root_source_file = b.path("src/lib.zig"),
.target = target,
.optimize = optimize,
});
// ── CLI executable ──
// In ReleaseFast/Small, strip debug info to shrink the binary (~10%)
// and the RSS at runtime (smaller __TEXT footprint = fewer pages
// resident under load). Debug/ReleaseSafe keep symbols for stack traces.
const strip_debug = optimize == .ReleaseFast or optimize == .ReleaseSmall;
const exe = b.addExecutable(.{
.name = "codedb",
.root_module = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
.link_libc = true,
.strip = strip_debug,
}),
});
// ── mcp-zig dependency ──
const mcp_dep = b.dependency("mcp_zig", .{});
exe.root_module.addImport("mcp", mcp_dep.module("mcp"));
// ── nanoregex dependency ──
const nanoregex_dep = b.dependency("nanoregex", .{});
exe.root_module.addImport("nanoregex", nanoregex_dep.module("nanoregex"));
const install_exe = b.addInstallArtifact(exe, .{});
b.getInstallStep().dependOn(&install_exe.step);
// Zig 0.16 x86_64-macos binaries can segfault on macOS 26 after codesign
// (issue #504), including under Rosetta. Keep that release slice unsigned.
if (codesign_identity) |identity| {
const target_os = target.query.os_tag orelse target.result.os.tag;
const target_arch = target.query.cpu_arch orelse target.result.cpu.arch;
if (target_os == .macos and target_arch != .x86_64 and builtin.os.tag == .macos) {
const codesign = b.addSystemCommand(&.{
"codesign",
"-f",
"--options",
"runtime",
"--timestamp",
"-s",
identity,
b.getInstallPath(.bin, "codedb"),
});
codesign.step.dependOn(&install_exe.step);
b.getInstallStep().dependOn(&codesign.step);
}
}
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| run_cmd.addArgs(args);
const run_step = b.step("run", "Run codedb daemon");
run_step.dependOn(&run_cmd.step);
// ── Tests (split into independent binaries for faster compilation) ──
const test_filter = b.option([]const u8, "test-filter", "Only run tests whose name contains this substring");
const test_step = b.step("test", "Run all tests");
const test_files = [_]struct { name: []const u8, path: []const u8, needs_mcp: bool, needs_nanoregex: bool }{
.{ .name = "test-core", .path = "src/test_core.zig", .needs_mcp = false, .needs_nanoregex = false },
.{ .name = "test-explore", .path = "src/test_explore.zig", .needs_mcp = false, .needs_nanoregex = true },
.{ .name = "test-index", .path = "src/test_index.zig", .needs_mcp = true, .needs_nanoregex = true },
.{ .name = "test-parser", .path = "src/test_parser.zig", .needs_mcp = false, .needs_nanoregex = true },
.{ .name = "test-search", .path = "src/test_search.zig", .needs_mcp = true, .needs_nanoregex = true },
.{ .name = "test-snapshot", .path = "src/test_snapshot.zig", .needs_mcp = false, .needs_nanoregex = true },
.{ .name = "test-mcp", .path = "src/test_mcp.zig", .needs_mcp = true, .needs_nanoregex = true },
.{ .name = "test-query", .path = "src/test_query.zig", .needs_mcp = true, .needs_nanoregex = true },
.{ .name = "test-bench", .path = "src/test_bench.zig", .needs_mcp = false, .needs_nanoregex = true },
};
for (test_files) |tf| {
const t = b.addTest(.{
.root_module = b.createModule(.{
.root_source_file = b.path(tf.path),
.target = target,
.optimize = optimize,
.link_libc = true,
}),
});
if (tf.needs_mcp) t.root_module.addImport("mcp", mcp_dep.module("mcp"));
if (tf.needs_nanoregex) t.root_module.addImport("nanoregex", nanoregex_dep.module("nanoregex"));
if (test_filter) |f| {
const filters = b.allocator.alloc([]const u8, 1) catch @panic("oom");
filters[0] = f;
t.filters = filters;
}
const run = b.addRunArtifact(t);
test_step.dependOn(&run.step);
const individual_step = b.step(tf.name, b.fmt("Run {s}", .{tf.name}));
individual_step.dependOn(&run.step);
}
// ── Library tests (verify the module root compiles) ──
const lib_tests = b.addTest(.{
.root_module = b.createModule(.{
.root_source_file = b.path("src/lib.zig"),
.target = target,
.optimize = optimize,
.link_libc = true,
}),
});
test_step.dependOn(&b.addRunArtifact(lib_tests).step);
// ── Adversarial tests ──
const adversarial_tests = b.addTest(.{
.root_module = b.createModule(.{
.root_source_file = b.path("src/adversarial_tests.zig"),
.target = target,
.optimize = optimize,
.link_libc = true,
}),
});
adversarial_tests.root_module.addImport("nanoregex", nanoregex_dep.module("nanoregex"));
test_step.dependOn(&b.addRunArtifact(adversarial_tests).step);
// ── Benchmarks ──
const bench = b.addExecutable(.{
.name = "bench",
.root_module = b.createModule(.{
.root_source_file = b.path("src/bench.zig"),
.target = target,
.optimize = .ReleaseFast,
.link_libc = true,
}),
});
const bench_run = b.addRunArtifact(bench);
bench.root_module.addImport("mcp", mcp_dep.module("mcp"));
bench.root_module.addImport("nanoregex", nanoregex_dep.module("nanoregex"));
if (b.args) |args| bench_run.addArgs(args);
const bench_step = b.step("bench", "Run benchmarks");
bench_step.dependOn(&bench_run.step);
// ── Benchmark (repo benchmark — indexing speed, query latency, recall) ──
const benchmark = b.addExecutable(.{
.name = "benchmark",
.root_module = b.createModule(.{
.root_source_file = b.path("src/benchmark.zig"),
.target = target,
.optimize = .ReleaseFast,
.link_libc = true,
}),
});
benchmark.root_module.addImport("mcp", mcp_dep.module("mcp"));
benchmark.root_module.addImport("nanoregex", nanoregex_dep.module("nanoregex"));
const benchmark_run = b.addRunArtifact(benchmark);
if (b.args) |args| benchmark_run.addArgs(args);
const benchmark_step = b.step("benchmark", "Run repo benchmark (use -- --root /path/to/repo)");
benchmark_step.dependOn(&benchmark_run.step);
// Make module available so dependents don't need to wire it up manually
_ = codedb_mod;
// ── WASM build (for Cloudflare Workers) ──
const wasm = b.addExecutable(.{
.name = "codedb",
.root_module = b.createModule(.{
.root_source_file = b.path("src/wasm.zig"),
.target = b.resolveTargetQuery(.{
.cpu_arch = .wasm32,
.os_tag = .freestanding,
}),
.optimize = .ReleaseSmall,
}),
});
wasm.root_module.addImport("nanoregex", nanoregex_dep.module("nanoregex"));
wasm.rdynamic = true;
wasm.entry = .disabled;
const wasm_step = b.step("wasm", "Build WASM module for Cloudflare Workers");
wasm_step.dependOn(&b.addInstallArtifact(wasm, .{
.dest_dir = .{ .override = .{ .custom = "../wasm" } },
}).step);
}