diff options
Diffstat (limited to '')
-rw-r--r-- | build.zig | 284 |
1 files changed, 145 insertions, 139 deletions
@@ -1,14 +1,14 @@ const std = @import("std"); -fn pkgPath(comptime out: []const u8) std.build.FileSource { +fn moduleSource(comptime out: []const u8) FileSource { if (comptime std.fs.path.dirname(@src().file)) |base| { const outpath = comptime base ++ std.fs.path.sep_str ++ out; - return .{ .path = outpath }; + return FileSource.relative(outpath); } else { - return .{ .path = out }; + return FileSource.relative(out); } } -pub fn addPicoHTTP(step: *std.build.LibExeObjStep, comptime with_obj: bool) void { +pub fn addPicoHTTP(step: *CompileStep, comptime with_obj: bool) void { step.addIncludePath("src/deps"); if (with_obj) { @@ -45,91 +45,29 @@ const color_map = std.ComptimeStringMap([]const u8, .{ var compiler_rt_path: []const u8 = ""; var compiler_rt_path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; -fn addInternalPackages(step: *std.build.LibExeObjStep, allocator: std.mem.Allocator, zig_exe: []const u8, target: anytype) !void { - var bun = std.build.Pkg{ - .name = "bun", - .source = pkgPath("src/bun_redirect.zig"), - }; - - var io_darwin: std.build.Pkg = .{ - .name = "async_io", - .source = pkgPath("src/io/io_darwin.zig"), - }; - var io_linux: std.build.Pkg = .{ - .name = "async_io", - .source = pkgPath("src/io/io_linux.zig"), - }; - var io_stub: std.build.Pkg = .{ - .name = "async_io", - .source = pkgPath("src/io/io_stub.zig"), - }; - - var io = if (target.isDarwin()) - io_darwin - else if (target.isLinux()) - io_linux - else - io_stub; +fn addInternalPackages(b: *Build, step: *CompileStep, _: std.mem.Allocator, _: []const u8, target: anytype) !void { + var bun = b.createModule(.{ + .source_file = FileSource.relative("src/bun_redirect.zig"), + }); - var javascript_core_real: std.build.Pkg = .{ - .name = "javascript_core", - .source = pkgPath("src/jsc.zig"), - }; + var io: *Module = brk: { + if (target.isDarwin()) { + break :brk b.createModule(.{ + .source_file = FileSource.relative("src/io/io_darwin.zig"), + }); + } else if (target.isLinux()) { + break :brk b.createModule(.{ + .source_file = FileSource.relative("src/io/io_linux.zig"), + }); + } - var javascript_core_stub: std.build.Pkg = .{ - .name = "javascript_core", - .source = pkgPath("src/jsc_stub.zig"), + break :brk b.createModule(.{ + .source_file = FileSource.relative("src/io/io_stub.zig"), + }); }; - var javascript_core = if (target.getOsTag() == .freestanding) - javascript_core_stub - else - javascript_core_real; - javascript_core.dependencies = &[_]std.build.Pkg{}; - step.addPackage(io); - step.addPackage(bun); - - const paths_to_try = .{ - "{s}/../lib/compiler_rt/stack_probe.zig", - "{s}/../../lib/compiler_rt/stack_probe.zig", - "{s}/../../../lib/compiler_rt/stack_probe.zig", - "{s}/../../../../lib/compiler_rt/stack_probe.zig", - "{s}/../lib/zig/compiler_rt/stack_probe.zig", - "{s}/../../lib/zig/compiler_rt/stack_probe.zig", - "{s}/../../../lib/zig/compiler_rt/stack_probe.zig", - "{s}/../../../../lib/zig/compiler_rt/stack_probe.zig", - }; - var found = false; - if (compiler_rt_path.len > 0) { - const compiler_rt: std.build.Pkg = .{ - .name = "compiler_rt", - .source = .{ .path = compiler_rt_path }, - }; - found = true; - step.addPackage(compiler_rt); - } else { - inline for (paths_to_try) |path_fmt| { - if (!found) brk: { - // workaround for https://github.com/ziglang/zig/issues/14099 - const path = try std.fmt.allocPrint(allocator, path_fmt, .{zig_exe}); - var target_path = std.os.realpath( - std.fs.path.resolve(allocator, &.{path}) catch break :brk, - &compiler_rt_path_buf, - ) catch break :brk; - const compiler_rt: std.build.Pkg = .{ - .name = "compiler_rt", - .source = .{ .path = target_path }, - }; - found = true; - step.addPackage(compiler_rt); - compiler_rt_path = target_path; - } - } - } - - if (!found) { - std.io.getStdErr().writeAll("\nwarning: Could not find compiler_rt. This might cause a build error until https://github.com/ziglang/zig/issues/14099 is fixed.\n\n") catch {}; - } + step.addModule("async_io", io); + step.addModule("bun", bun); } const BunBuildOptions = struct { @@ -154,7 +92,7 @@ const BunBuildOptions = struct { var output_dir: []const u8 = ""; fn panicIfNotFound(comptime filepath: []const u8) []const u8 { - var file = std.fs.cwd().openFile(filepath, .{ .mode = .read_only }) catch |err| { + var file = std.fs.cwd().openFile(filepath, .{ .optimize = .read_only }) catch |err| { std.debug.panic("error: {s} opening {s}. Please ensure you've downloaded git submodules, and ran `make vendor`, `make jsc`.", .{ filepath, @errorName(err) }); }; file.close(); @@ -197,14 +135,22 @@ fn updateRuntime() anyerror!void { } var x64 = "x64"; -var mode: std.builtin.Mode = undefined; +var optimize: std.builtin.OptimizeMode = undefined; -const Builder = std.build.Builder; +const Build = std.Build; const CrossTarget = std.zig.CrossTarget; -const Mode = std.builtin.Mode; +const OptimizeMode = std.builtin.OptimizeMode; +const CompileStep = std.build.CompileStep; +const FileSource = std.build.FileSource; +const Module = std.build.Module; const fs = std.fs; -pub fn build(b: *std.build.Builder) !void { +const l = enum { + Hello, + Enum, +}; + +pub fn build(b: *Build) !void { // Standard target options allows the person running `zig build` to choose // what target to build for. Here we do not override the defaults, which // means any target is allowed, and the default is native. Other options @@ -212,10 +158,10 @@ pub fn build(b: *std.build.Builder) !void { var target = b.standardTargetOptions(.{}); // Standard release options allow the person running `zig build` to select // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. - mode = b.standardReleaseOptions(); + optimize = b.standardOptimizeOption(.{}); var output_dir_buf = std.mem.zeroes([4096]u8); - var bin_label = if (mode == std.builtin.Mode.Debug) "packages/debug-bun-" else "packages/bun-"; + var bin_label = if (optimize == std.builtin.OptimizeMode.Debug) "packages/debug-bun-" else "packages/bun-"; var triplet_buf: [64]u8 = undefined; var os_tagname = @tagName(target.getOs().tag); @@ -258,7 +204,7 @@ pub fn build(b: *std.build.Builder) !void { } std.fs.cwd().makePath(output_dir) catch {}; - const bun_executable_name = if (mode == std.builtin.Mode.Debug) "bun-debug" else "bun"; + const bun_executable_name = if (optimize == std.builtin.OptimizeMode.Debug) "bun-debug" else "bun"; const root_src = if (target.getOsTag() == std.Target.Os.Tag.freestanding) "src/main_wasm.zig" else @@ -268,15 +214,22 @@ pub fn build(b: *std.build.Builder) !void { const min_version: std.builtin.Version = if (target.getOsTag() != .freestanding) target.getOsVersionMin().semver - else .{ .major = 0, .minor = 0, .patch = 0 }; + else + .{ .major = 0, .minor = 0, .patch = 0 }; const max_version: std.builtin.Version = if (target.getOsTag() != .freestanding) target.getOsVersionMax().semver - else .{ .major = 0, .minor = 0, .patch = 0 }; + else + .{ .major = 0, .minor = 0, .patch = 0 }; var obj_step = b.step("obj", "Build bun as a .o file"); obj_step.dependOn(&b.addLog("Output: {s}/{s}\n", .{ output_dir, bun_executable_name }).step); - var obj = b.addObject(bun_executable_name, root_src); + var obj = b.addObject(.{ + .name = bun_executable_name, + .root_source_file = FileSource.relative(root_src), + .target = target, + .optimize = optimize, + }); var default_build_options: BunBuildOptions = brk: { const is_baseline = arch.isX86() and (target.cpu_model == .baseline or !std.Target.x86.featureSetHas(target.getCpuFeatures(), .avx2)); @@ -316,11 +269,11 @@ pub fn build(b: *std.build.Builder) !void { }; { - obj.setTarget(target); addPicoHTTP(obj, false); obj.setMainPkgPath(b.pathFromRoot(".")); try addInternalPackages( + b, obj, b.allocator, b.zig_exe, @@ -351,7 +304,7 @@ pub fn build(b: *std.build.Builder) !void { defer obj_step.dependOn(&obj.step); - obj.setBuildMode(mode); + // obj.setBuildMode(optimize); var actual_build_options = default_build_options; if (b.option(bool, "generate-sizes", "Generate sizes of things") orelse false) { @@ -364,8 +317,8 @@ pub fn build(b: *std.build.Builder) !void { obj.linkLibC(); obj.strip = false; - obj.bundle_compiler_rt = true; - obj.omit_frame_pointer = mode != .Debug; + obj.bundle_compiler_rt = false; + obj.omit_frame_pointer = optimize != .Debug; if (b.option(bool, "for-editor", "Do not emit bin, just check for errors") orelse false) { obj.emit_bin = .no_emit; @@ -384,7 +337,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("headers-obj", "Build JavaScriptCore headers"); - var headers_obj: *std.build.LibExeObjStep = b.addObject("headers", "src/bindgen.zig"); + var headers_obj = b.addObject(.{ + .name = "headers", + .root_source_file = FileSource.relative("src/bindgen.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); var headers_build_options = default_build_options; @@ -395,7 +353,12 @@ pub fn build(b: *std.build.Builder) !void { { const wasm = b.step("bun-wasm", "Build WASM"); - var wasm_step: *std.build.LibExeObjStep = b.addStaticLibrary("bun-wasm", "src/main_wasm.zig"); + var wasm_step = b.addStaticLibrary(.{ + .name = "bun-wasm", + .root_source_file = FileSource.relative("src/main_wasm.zig"), + .target = target, + .optimize = optimize, + }); defer wasm.dependOn(&wasm_step.step); wasm_step.strip = false; // wasm_step.link_function_sections = true; @@ -406,7 +369,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("httpbench-obj", "Build HTTPBench tool (object files)"); - var headers_obj: *std.build.LibExeObjStep = b.addObject("httpbench", "misctools/http_bench.zig"); + var headers_obj = b.addObject(.{ + .name = "httpbench", + .root_source_file = FileSource.relative("misctools/http_bench.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -414,7 +382,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("machbench-obj", "Build Machbench tool (object files)"); - var headers_obj: *std.build.LibExeObjStep = b.addObject("machbench", "misctools/machbench.zig"); + var headers_obj = b.addObject(.{ + .name = "machbench", + .root_source_file = FileSource.relative("misctools/machbench.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -422,7 +395,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("fetch-obj", "Build fetch (object files)"); - var headers_obj: *std.build.LibExeObjStep = b.addObject("fetch", "misctools/fetch.zig"); + var headers_obj = b.addObject(.{ + .name = "fetch", + .root_source_file = FileSource.relative("misctools/fetch.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -430,7 +408,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("string-bench", "Build string bench"); - var headers_obj: *std.build.LibExeObjStep = b.addExecutable("string-bench", "src/bench/string-handling.zig"); + var headers_obj = b.addExecutable(.{ + .name = "string-bench", + .root_source_file = FileSource.relative("src/bench/string-handling.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -438,7 +421,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("sha-bench-obj", "Build sha bench"); - var headers_obj: *std.build.LibExeObjStep = b.addObject("sha", "src/sha.zig"); + var headers_obj = b.addObject(.{ + .name = "sha", + .root_source_file = FileSource.relative("src/sha.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -446,7 +434,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("vlq-bench", "Build vlq bench"); - var headers_obj: *std.build.LibExeObjStep = b.addExecutable("vlq-bench", "src/sourcemap/vlq_bench.zig"); + var headers_obj: *CompileStep = b.addExecutable(.{ + .name = "vlq-bench", + .root_source_file = FileSource.relative("src/sourcemap/vlq_bench.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -454,7 +447,12 @@ pub fn build(b: *std.build.Builder) !void { { const headers_step = b.step("tgz-obj", "Build tgz (object files)"); - var headers_obj: *std.build.LibExeObjStep = b.addObject("tgz", "misctools/tgz.zig"); + var headers_obj: *CompileStep = b.addObject(.{ + .name = "tgz", + .root_source_file = FileSource.relative("misctools/tgz.zig"), + .target = target, + .optimize = optimize, + }); defer headers_step.dependOn(&headers_obj.step); try configureObjectStep(b, headers_obj, @TypeOf(target), target, obj.main_pkg_path.?); headers_obj.addOptions("build_options", default_build_options.step(b)); @@ -467,7 +465,10 @@ pub fn build(b: *std.build.Builder) !void { var test_bin_ = b.option([]const u8, "test-bin", "Emit bin to"); var test_filter = b.option([]const u8, "test-filter", "Filter for test"); - var headers_obj: *std.build.LibExeObjStep = b.addTest(test_file orelse "src/main.zig"); + var headers_obj: *CompileStep = b.addTest(.{ + .root_source_file = FileSource.relative(test_file orelse "src/main.zig"), + .target = target, + }); headers_obj.setFilter(test_filter); if (test_bin_) |test_bin| { headers_obj.name = std.fs.path.basename(test_bin); @@ -486,28 +487,33 @@ pub fn build(b: *std.build.Builder) !void { headers_obj.addOptions("build_options", default_build_options.step(b)); } - for (headers_obj.packages.items) |pkg_| { - const pkg: std.build.Pkg = pkg_; - if (std.mem.eql(u8, pkg.name, "clap")) continue; - var test_ = b.addTestSource(pkg.source); - - test_.setMainPkgPath(obj.main_pkg_path.?); - test_.setTarget(target); - try configureObjectStep(b, test_, @TypeOf(target), target, obj.main_pkg_path.?); - try linkObjectFiles(b, test_, target); - test_.addOptions("build_options", default_build_options.step(b)); - - if (pkg.dependencies) |children| { - test_.packages = std.ArrayList(std.build.Pkg).init(b.allocator); - try test_.packages.appendSlice(children); - } - - var before = b.addLog("\x1b[" ++ color_map.get("magenta").? ++ "\x1b[" ++ color_map.get("b").? ++ "[{s} tests]" ++ "\x1b[" ++ color_map.get("d").? ++ " ----\n\n" ++ "\x1b[0m", .{pkg.name}); - var after = b.addLog("\x1b[" ++ color_map.get("d").? ++ "–––---\n\n" ++ "\x1b[0m", .{}); - headers_step.dependOn(&before.step); - headers_step.dependOn(&test_.step); - headers_step.dependOn(&after.step); - } + // var iter = headers_obj.modules.iterator(); + // while (iter.next()) |item| { + // const module = @ptrCast(*Module, item.value_ptr); + // } + // // while (headers_obj.modules.) + // for (headers_obj.packages.items) |pkg_| { + // const pkg: std.build.Pkg = pkg_; + // if (std.mem.eql(u8, pkg.name, "clap")) continue; + // var test_ = b.addTestSource(pkg.source); + + // b + // .test_.setMainPkgPath(obj.main_pkg_path.?); + // try configureObjectStep(b, test_, @TypeOf(target), target, obj.main_pkg_path.?); + // try linkObjectFiles(b, test_, target); + // test_.addOptions("build_options", default_build_options.step(b)); + + // if (pkg.dependencies) |children| { + // test_.packages = std.ArrayList(std.build.Pkg).init(b.allocator); + // try test_.packages.appendSlice(children); + // } + + // var before = b.addLog("\x1b[" ++ color_map.get("magenta").? ++ "\x1b[" ++ color_map.get("b").? ++ "[{s} tests]" ++ "\x1b[" ++ color_map.get("d").? ++ " ----\n\n" ++ "\x1b[0m", .{pkg.name}); + // var after = b.addLog("\x1b[" ++ color_map.get("d").? ++ "–––---\n\n" ++ "\x1b[0m", .{}); + // headers_step.dependOn(&before.step); + // headers_step.dependOn(&test_.step); + // headers_step.dependOn(&after.step); + // } } if (obj.emit_bin != .no_emit) obj.setOutputDir(output_dir); @@ -520,7 +526,7 @@ pub var original_make_fn: ?*const fn (step: *std.build.Step) anyerror!void = nul // we cannot use this with debugging // so I am leaving this here for now, with the eventual intent to switch to std.build.Builder // but it is dead code -pub fn linkObjectFiles(b: *std.build.Builder, obj: *std.build.LibExeObjStep, target: anytype) !void { +pub fn linkObjectFiles(b: *Build, obj: *CompileStep, target: anytype) !void { if (target.getOsTag() == .freestanding) return; var dirs_to_search = std.BoundedArray([]const u8, 32).init(0) catch unreachable; @@ -577,22 +583,22 @@ pub fn linkObjectFiles(b: *std.build.Builder, obj: *std.build.LibExeObjStep, tar } } -pub fn configureObjectStep(b: *std.build.Builder, obj: *std.build.LibExeObjStep, comptime Target: type, target: Target, main_pkg_path: []const u8) !void { +pub fn configureObjectStep(b: *std.build.Builder, obj: *CompileStep, comptime Target: type, target: Target, main_pkg_path: []const u8) !void { obj.setMainPkgPath(main_pkg_path); - obj.setTarget(target); - try addInternalPackages(obj, std.heap.page_allocator, b.zig_exe, target); + // obj.setTarget(target); + try addInternalPackages(b, obj, std.heap.page_allocator, b.zig_exe, target); if (target.getOsTag() != .freestanding) addPicoHTTP(obj, false); obj.strip = false; obj.setOutputDir(output_dir); - obj.setBuildMode(mode); - obj.bundle_compiler_rt = true; + // obj.setBuildMode(optimize); + obj.bundle_compiler_rt = false; if (target.getOsTag() != .freestanding) obj.linkLibC(); - if (target.getOsTag() != .freestanding) obj.bundle_compiler_rt = true; + if (target.getOsTag() != .freestanding) obj.bundle_compiler_rt = false; if (target.getOsTag() == .linux) { // obj.want_lto = tar; |