summaryrefslogtreecommitdiff
path: root/9agents/build.zig
blob: 0a63d9b7b8850e38b5ee13d64dd9d168ce2afe02 (plain) (blame)
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
//! Build fragment for 9agents: the coding-agents fs daemon (binary `9agents`),
//! a read-only fresh-from-disk 9P2000 view of every harness's state,
//! posted by default under the name `agents`. It is `@import`ed by the
//! root build.zig and called with the root builder, so every `b.path(...)`
//! here is relative to the cloud9 root (hence the `9agents/` prefix),
//! every option is defined by the root and every step it registers lands
//! in the root's step list under the `9agents` prefix.
//!
//! Steps: 9agents, 9agents-test, 9agents-itest.
const std = @import("std");

pub const Context = struct {
    target: std.Build.ResolvedTarget,
    optimize: std.builtin.OptimizeMode,
    cloud9: *std.Build.Module,
    /// The 9ns binary, for the --mntgen money shot in the integration
    /// suite; null when 9ns is disabled, in which case the mntgen
    /// section of the suite is skipped.
    ns: ?*std.Build.Step.Compile,
};

pub const Artifacts = struct {
    exe: *std.Build.Step.Compile,
    /// `9agents-test`: the tree's unit tests (exclusions, path safety,
    /// node ids, vanishing files — all against a fake HOME).
    test_step: *std.Build.Step,
    /// `9agents-itest`: test/e2e.sh (fixture roots + scratch registry,
    /// plus the real-registry end-to-end when the `agents` name is free).
    itest_step: *std.Build.Step,
};

pub fn add(b: *std.Build, ctx: Context) Artifacts {
    const mod = b.createModule(.{
        .root_source_file = b.path("9agents/src/main.zig"),
        .target = ctx.target,
        .optimize = ctx.optimize,
        .imports = &.{.{ .name = "cloud9", .module = ctx.cloud9 }},
    });
    const exe = b.addExecutable(.{ .name = "9agents", .root_module = mod });
    const install = b.addInstallArtifact(exe, .{});
    b.getInstallStep().dependOn(&install.step);
    b.step("9agents", "Build and install only the coding-agents fs daemon").dependOn(&install.step);

    const test_step = b.step("9agents-test", "Run the 9agents tree's unit tests (fake HOME; never the live roots)");
    test_step.dependOn(&b.addRunArtifact(b.addTest(.{ .root_module = mod })).step);

    const itest_step = b.step("9agents-itest", "Run 9agents/test/e2e.sh (posted name, reads, cmp of a transcript, mntgen mount, exclusions, live appends)");
    const run = b.addSystemCommand(&.{"bash"});
    run.addFileArg(b.path("9agents/test/e2e.sh"));
    run.addArtifactArg(exe);
    if (ctx.ns) |ns| run.addArtifactArg(ns);
    itest_step.dependOn(&run.step);
    return .{ .exe = exe, .test_step = test_step, .itest_step = itest_step };
}