summaryrefslogtreecommitdiff
path: root/build.zig
blob: 3228cf211fefd8ffbc1a07d197c28c890dde9945 (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
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
const std = @import("std");
pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});
    const module = b.addModule("cloud9", .{
        .root_source_file = b.path("src/root.zig"),
        .target = target,
        .optimize = optimize,
    });
    const tests = b.addTest(.{ .root_module = module });
    b.step("test", "Run protocol and session tests").dependOn(&b.addRunArtifact(tests).step);
    const wasm_target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding });
    const wasm_core = b.createModule(.{
        .root_source_file = b.path("src/root.zig"),
        .target = wasm_target,
        .optimize = optimize,
    });
    const wasm = b.addExecutable(.{ .name = "cloud9", .root_module = b.createModule(.{
        .root_source_file = b.path("app/client.zig"),
        .target = wasm_target,
        .optimize = optimize,
        .imports = &.{.{ .name = "cloud9", .module = wasm_core }},
    }) });
    wasm.entry = .disabled;
    wasm.rdynamic = true;
    wasm.export_memory = true;
    wasm.stack_size = 256 * 1024;
    wasm.initial_memory = 1024 * 1024;
    wasm.max_memory = 1024 * 1024;
    const web = b.step("web", "Install the standalone browser client into zig-out/web");
    web.dependOn(&b.addInstallFileWithDir(wasm.getEmittedBin(), .{ .custom = "web/_cloud9" }, "cloud9.wasm").step);
    for ([_][]const u8{ "index.html", "app.mjs", "client.mjs", "style.css" }) |file| {
        web.dependOn(&b.addInstallFileWithDir(b.path(b.fmt("app/web/{s}", .{file})), .{ .custom = if (std.mem.eql(u8, file, "index.html")) "web" else "web/_cloud9" }, file).step);
    }
    const bridge = b.addExecutable(.{ .name = "cloud9-http", .root_module = b.createModule(.{
        .root_source_file = b.path("app/main.zig"),
        .target = target,
        .optimize = optimize,
        .link_libc = true,
        .imports = &.{.{ .name = "cloud9", .module = module }},
    }) });
    bridge.root_module.addAnonymousImport("client.wasm", .{ .root_source_file = wasm.getEmittedBin() });
    b.installArtifact(bridge);
    const run_bridge = b.addRunArtifact(bridge);
    if (b.args) |args| run_bridge.addArgs(args);
    b.step("serve", "Run the HTTP/WebSocket bridge (--upstream tcp:127.0.0.1:564)").dependOn(&run_bridge.step);
    const native_http = b.addExecutable(.{ .name = "cloud9-http-test", .root_module = b.createModule(.{
        .root_source_file = b.path("test/web/native.zig"),
        .target = target,
        .optimize = optimize,
        .link_libc = true,
        .imports = &.{.{ .name = "cloud9", .module = module }},
    }) });
    const http_tests = b.addTest(.{ .root_module = b.createModule(.{
        .root_source_file = b.path("test/http.zig"),
        .target = target,
        .optimize = optimize,
        .imports = &.{.{ .name = "cloud9", .module = module }},
    }) });
    b.step("http-test", "Test HTTP WebSocket transport framing").dependOn(&b.addRunArtifact(http_tests).step);
    const e2e = b.addSystemCommand(&.{ "node", "test/web/e2e.mjs" });
    e2e.addArtifactArg(bridge);
    e2e.addArtifactArg(native_http);
    b.step("e2e", "Run Chromium through the bridge against a local go9p server").dependOn(&e2e.step);
    const probe = b.addExecutable(.{
        .name = "cloud9-probe",
        .root_module = b.createModule(.{
            .root_source_file = b.path("test/differential/probe.zig"),
            .target = target,
            .optimize = optimize,
            .link_libc = true,
            .imports = &.{.{ .name = "cloud9", .module = module }},
        }),
    });
    b.installArtifact(probe);
    const session_probe = b.addExecutable(.{
        .name = "cloud9-session-probe",
        .root_module = b.createModule(.{
            .root_source_file = b.path("test/differential/session.zig"),
            .target = target,
            .optimize = optimize,
            .link_libc = true,
            .imports = &.{.{ .name = "cloud9", .module = module }},
        }),
    });

    const diff = b.addSystemCommand(&.{ "go", "run", "." });
    diff.setCwd(b.path("test/differential"));
    diff.addArg("--probe");
    diff.addArtifactArg(probe);
    diff.addArg("--session-probe");
    diff.addArtifactArg(session_probe);
    if (b.args) |args| diff.addArgs(args);
    b.step("differential", "Compare valid traffic with pinned 9fans and go9p").dependOn(&diff.step);
    const transport_tests = b.addTest(.{ .root_module = b.createModule(.{
        .root_source_file = b.path("test/transport.zig"),
        .target = target,
        .optimize = optimize,
        .link_libc = true,
        .imports = &.{.{ .name = "cloud9", .module = module }},
    }) });
    b.step("transport-test", "Test TCP, Unix and std.Io adapters").dependOn(&b.addRunArtifact(transport_tests).step);
    if (b.option(bool, "quic", "Test QUIC with system OpenSSL 3.6+") orelse false) {
        const header = b.addWriteFiles().add("openssl.h", "#include <openssl/ssl.h>\n#include <openssl/quic.h>\n#include <openssl/err.h>\n");
        const translated = b.addTranslateC(.{ .root_source_file = header, .target = target, .optimize = optimize, .link_libc = true });
        const ssl = translated.createModule();
        const tests_quic = b.addTest(.{ .root_module = b.createModule(.{
            .root_source_file = b.path("test/quic.zig"),
            .target = target,
            .optimize = optimize,
            .link_libc = true,
            .imports = &.{ .{ .name = "cloud9", .module = module }, .{ .name = "openssl", .module = ssl } },
        }) });
        tests_quic.root_module.linkSystemLibrary("ssl", .{});
        tests_quic.root_module.linkSystemLibrary("crypto", .{});
        b.step("quic-test", "Test optional QUIC transport").dependOn(&b.addRunArtifact(tests_quic).step);
    }
    const fuzz = b.addExecutable(.{ .name = "cloud9-fuzz", .root_module = b.createModule(.{
        .root_source_file = b.path("test/fuzz.zig"),
        .target = target,
        .optimize = optimize,
        .imports = &.{.{ .name = "cloud9", .module = module }},
    }) });
    const run_fuzz = b.addRunArtifact(fuzz);
    if (b.args) |args| run_fuzz.addArgs(args);
    b.step("fuzz", "Run deterministic local decoder and server probes (seed, iterations)").dependOn(&run_fuzz.step);
}