Files
zing/build.zig
T
2025-03-13 18:06:14 +02:00

75 lines
2.0 KiB
Zig

const std = @import("std");
pub fn build(b: *std.Build) void {
const optimize = .Debug;
const target = b.standardTargetOptions(.{
.default_target = .{
.cpu_arch = .riscv64,
.os_tag = .freestanding,
.abi = .none,
}
});
const kernel_module = b.addModule("kernel", .{
.optimize = optimize,
.target = target,
.pic = true,
.red_zone = false,
.code_model = .medium,
.root_source_file = b.path("src/kernel.zig")
});
const kernel = b.addExecutable(.{
.name = "kernel",
.root_module = kernel_module,
.pic = true
});
kernel.pie = true;
kernel.entry = .{.symbol_name = "__rv64_entry"};
kernel.setLinkerScript(b.path("etc/riscv64-unknown-none.ld"));
kernel.addCSourceFiles(.{
.files = &.{
"src/arch/riscv64/entry.S"
},
.flags = &.{},
});
b.installArtifact(kernel);
const elf2bin = b.addSystemCommand(&.{
"llvm-objcopy",
"-O", "binary",
"zig-out/bin/kernel",
"zig-out/bin/kernel.bin"
});
// TODO QEMU binary override
const qemu_info = switch (target.result.cpu.arch) {
.riscv64 => .{ "qemu-system-riscv64", "rv64" },
else => unreachable,
};
const qemu_cmd = b.addSystemCommand(&.{
qemu_info[0],
"-M", "virt",
"-kernel", "zig-out/bin/kernel.bin",
"-m", "256M",
"-cpu", qemu_info[1],
"-serial", "mon:stdio",
"-display", "none"
});
if (target.result.cpu.arch == .riscv64) {
qemu_cmd.addArgs(&.{
"-bios", "etc/boot/rv64_fw_jump.bin"
});
}
elf2bin.step.dependOn(b.getInstallStep());
qemu_cmd.step.dependOn(&elf2bin.step);
if (b.args) |args| qemu_cmd.addArgs(args);
const run_step = b.step("run", "Start the OS in qemu");
run_step.dependOn(&qemu_cmd.step);
}