hblang/build.zig
Jakub Doka 5b9e112ebd
fixed more bugs
Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
2025-03-17 17:18:02 +01:00

221 lines
7.5 KiB
Zig

const std = @import("std");
fn wasmAsset(b: *std.Build, optimize: std.builtin.OptimizeMode, comptime name: []const u8, expeors: []const []const u8) std.Build.LazyPath {
const exe = b.addExecutable(.{
.name = name,
.root_source_file = b.path("src/depell/" ++ name ++ ".zig"),
.target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding }),
.optimize = optimize,
});
exe.entry = .disabled;
exe.root_module.export_symbol_names = expeors;
return exe.getEmittedBin();
}
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
hbc: {
const exe = b.addExecutable(.{
.name = "hbc",
.root_source_file = b.path("src/hbc.zig"),
.target = target,
.optimize = optimize,
});
b.installArtifact(exe);
break :hbc;
}
const test_step = b.step("test", "run tests");
const test_filter = b.option([]const u8, "tf", "passed as a filter to tests");
vendored_tests: {
const grn = b.addExecutable(.{
.name = "gen_vendored_tests",
.root_source_file = b.path("scripts/gen_vendored_tests.zig"),
.target = b.graph.host,
.optimize = .Debug,
.use_llvm = false,
.use_lld = false,
});
const run_gen = b.addRunArtifact(grn);
run_gen.has_side_effects = true;
run_gen.addDirectoryArg(b.path("vendored-tests"));
run_gen.addArg("hbc-tests");
const out = run_gen.addOutputFileArg("vendored_tests.zig");
const test_run = b.addTest(.{
.name = "vendored_tests",
.root_source_file = out,
.target = b.graph.host,
.optimize = optimize,
.filter = test_filter,
.use_llvm = false,
.use_lld = false,
});
test_run.root_module.addAnonymousImport("utils", .{ .root_source_file = b.path("src/tests.zig") });
test_step.dependOn(&b.addRunArtifact(test_run).step);
break :vendored_tests;
}
example_tests: {
const gen = b.addExecutable(.{
.name = "gen_tests.zig",
.root_source_file = b.path("scripts/gen_tests.zig"),
.target = b.graph.host,
.optimize = .Debug,
.use_llvm = false,
.use_lld = false,
});
const run_gen = b.addRunArtifact(gen);
run_gen.addFileArg(b.path("README.md"));
const out = run_gen.addOutputFileArg("tests.zig");
const test_run = b.addTest(.{
.name = "example_tests",
.root_source_file = out,
.target = b.graph.host,
.optimize = optimize,
.filter = test_filter,
.use_llvm = false,
.use_lld = false,
});
test_run.root_module.addAnonymousImport("utils", .{ .root_source_file = b.path("src/tests.zig") });
test_step.dependOn(&b.addRunArtifact(test_run).step);
break :example_tests;
}
example_tests: {
const test_run = b.addTest(.{
.name = "fuzz_finding_tests",
.root_source_file = b.path("src/fuzz_finding_tests.zig"),
.target = b.graph.host,
.optimize = optimize,
.filter = test_filter,
.use_llvm = false,
.use_lld = false,
});
test_run.root_module.addAnonymousImport("utils", .{ .root_source_file = b.path("src/tests.zig") });
test_step.dependOn(&b.addRunArtifact(test_run).step);
break :example_tests;
}
const test_module = test_module: {
const module = b.addModule("test", .{
.root_source_file = b.path("src/tests.zig"),
.target = b.graph.host,
.optimize = optimize,
});
break :test_module module;
};
check: {
const check_step = b.step("check", "type check");
check_step.dependOn(&b.addTest(.{ .root_module = test_module }).step);
break :check;
}
fuzzing: {
const dict_gen = b.addExecutable(.{
.name = "gen_fuzz_dict.zig",
.root_source_file = b.path("scripts/gen_fuzz_dict.zig"),
.target = b.graph.host,
.optimize = .Debug,
.use_llvm = false,
.use_lld = false,
});
dict_gen.root_module.addAnonymousImport("Lexer", .{ .root_source_file = b.path("src/frontend/Lexer.zig") });
const run_gen = b.addRunArtifact(dict_gen);
const dict_out = run_gen.addOutputFileArg("hblang.dict");
run_gen.addFileArg(b.path("README.md"));
const cases = run_gen.addOutputDirectoryArg("fuzz-cases");
const fuzz = b.addStaticLibrary(.{
.name = "fuzz",
.root_source_file = b.path("src/fuzz.zig"),
.single_threaded = true,
.target = b.graph.host,
.optimize = optimize,
.strip = false,
});
fuzz.pie = true;
fuzz.want_lto = true;
fuzz.bundle_compiler_rt = true;
const afl_lto = b.addSystemCommand(&.{ "afl-clang-lto", "-o" });
const afl_lto_out = afl_lto.addOutputFileArg("fuzz");
afl_lto.addArtifactArg(fuzz);
const fuzz_duration = b.option([]const u8, "fuzz-duration", "n seconds to fuzz for") orelse "1";
const fuzzes = b.option(usize, "jobs", "amount of cores to fuzz on") orelse try std.Thread.getCpuCount();
// this is pure crap
const run_whatev = b.addSystemCommand(&.{"echo"});
run_whatev.has_side_effects = true;
const out_dir = run_whatev.addOutputDirectoryArg("findings");
const gen_finding_tests = b.addExecutable(.{
.name = "gen_fuzz_finding_tests.zig",
.root_source_file = b.path("scripts/gen_fuzz_finding_tests.zig"),
.target = b.graph.host,
.optimize = .Debug,
.use_llvm = false,
.use_lld = false,
});
const run_gen_finding_tests = b.addRunArtifact(gen_finding_tests);
run_gen_finding_tests.addDirectoryArg(out_dir);
run_gen_finding_tests.addArg("enabled");
const fuzz_out = run_gen_finding_tests.addOutputFileArg("fuzz_finding_tests.zig");
const cleanup = b.addSystemCommand(&.{ "killall", "afl-fuzz" });
if (fuzzes != 1) run_gen_finding_tests.step.dependOn(&cleanup.step);
run_gen_finding_tests.has_side_effects = true;
for (0..fuzzes) |i| {
const run_afl = b.addSystemCommand(&.{"afl-fuzz"});
run_afl.addArg("-i");
run_afl.addDirectoryArg(cases);
run_afl.addArg("-o");
run_afl.addDirectoryArg(out_dir);
run_afl.addArg(if (i == 0) "-M" else "-S");
run_afl.addArg(try std.fmt.allocPrint(b.allocator, "worker{}", .{i}));
run_afl.addArg("-x");
run_afl.addFileArg(dict_out);
run_afl.addArgs(&.{ "-V", fuzz_duration });
run_afl.addArg("--");
run_afl.addFileArg(afl_lto_out);
run_afl.has_side_effects = true;
_ = run_afl.captureStdErr();
if (i != 0) _ = run_afl.captureStdOut();
run_gen_finding_tests.step.dependOn(&run_afl.step);
if (i == 0 and fuzzes != 1) cleanup.step.dependOn(&run_afl.step);
}
const fuzz_step = b.step("fuzz", "run the fuzzer");
fuzz_step.dependOn(&b.addInstallFile(fuzz_out, "fuzz_finding_tests.zig").step);
break :fuzzing;
}
}