-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.zig
More file actions
128 lines (105 loc) · 4.94 KB
/
build.zig
File metadata and controls
128 lines (105 loc) · 4.94 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
const std = @import("std");
// Although this function looks imperative, note that its job is to
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
// The interpreter is generated at build time using a Zig program that
// uses LLVM to emit efficient bytecode handlers.
const vm_assembler = b.addExecutable(.{
.name = "assembler",
.root_source_file = b.path("vm/assembler.zig"),
.target = target,
.optimize = optimize,
});
vm_assembler.linkLibC();
vm_assembler.linkSystemLibrary("LLVM-18");
const vm_assembler_unit_tests = b.addTest(.{
.root_source_file = b.path("vm/assembler.zig"),
.target = target,
.optimize = optimize,
});
vm_assembler_unit_tests.linkLibC();
vm_assembler_unit_tests.linkSystemLibrary("LLVM-18");
const run_vm_assembler_unit_tests = b.addRunArtifact(vm_assembler_unit_tests);
// Run the assembler (as part of the main build process) and capture its output LLVM bitcode.
const run_assembler = b.addRunArtifact(vm_assembler);
const interpreter_bc = run_assembler.addOutputFileArg("interpreter.bc");
// Run the bitcode through the standard optimizer.
// TODO: disabled until we use custom optimization passes, since this was
// generating poor code with -O3 (worse than non-optimized in some cases)
// const opt_run = b.addSystemCommand(&.{"opt"});
// opt_run.addFileArg(interpreter_bc);
// opt_run.addArg("-o");
// const opt_bc = opt_run.addOutputFileArg("interpreter-opt.bc");
// Compile the bitcode into assembly for the target platform.
const llc_run = b.addSystemCommand(&.{"llc"});
// llc_run.addFileArg(opt_bc);
llc_run.addFileArg(interpreter_bc);
llc_run.addArg("-o");
const interpreter_s = llc_run.addOutputFileArg("interpreter.s");
const vm_unit_tests = b.addTest(.{
.root_source_file = b.path("vm/test.zig"),
.target = target,
.optimize = optimize,
});
// Add the generated interpreter to the executable source.
vm_unit_tests.addAssemblyFile(interpreter_s);
const run_vm_unit_tests = b.addRunArtifact(vm_unit_tests);
const exe = b.addExecutable(.{
.name = "boa",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
// Add the generated interpreter to the executable source.
exe.addAssemblyFile(interpreter_s);
// This declares intent for the executable to be installed into the
// standard location when the user invokes the "install" step (the default
// step when running `zig build`).
b.installArtifact(exe);
// This *creates* a Run step in the build graph, to be executed when another
// step is evaluated that depends on it. The next line below will establish
// such a dependency.
const run_cmd = b.addRunArtifact(exe);
// By making the run step depend on the install step, it will be run from the
// installation directory rather than directly from within the cache directory.
// This is not necessary, however, if the application depends on other installed
// files, this ensures they will be present and in the expected location.
run_cmd.step.dependOn(b.getInstallStep());
// This allows the user to pass arguments to the application in the build
// command itself, like this: `zig build run -- arg1 arg2 etc`
if (b.args) |args| {
run_cmd.addArgs(args);
}
// This creates a build step. It will be visible in the `zig build --help` menu,
// and can be selected like this: `zig build run`
// This will evaluate the `run` step rather than the default, which is "install".
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const exe_unit_tests = b.addTest(.{
.root_source_file = b.path("src/root.zig"),
.target = target,
.optimize = optimize,
});
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
// Similar to creating the run step earlier, this exposes a `test` step to
// the `zig build --help` menu, providing a way for the user to request
// running the unit tests.
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_exe_unit_tests.step);
test_step.dependOn(&run_vm_assembler_unit_tests.step);
test_step.dependOn(&run_vm_unit_tests.step);
const vm_benchmark = b.addExecutable(.{
.name = "vm",
.root_source_file = b.path("vm/test.zig"),
.target = target,
.optimize = optimize,
});
// Add the generated interpreter to the executable source.
vm_benchmark.addAssemblyFile(interpreter_s);
const run_vm_benchmark = b.addRunArtifact(vm_benchmark);
const run_vm_step = b.step("run-vm", "Run vm benchmark");
run_vm_step.dependOn(&run_vm_benchmark.step);
}