87 lines
3.1 KiB
Zig
87 lines
3.1 KiB
Zig
const std = @import("std");
|
|
const kernel_build = @import("../../../kernel/build.zig");
|
|
const Step = std.Build.Step;
|
|
|
|
pub fn buildSetup(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, kcapsule: *Step.Compile) *Step.Compile {
|
|
const offset_generate = b.addSystemCommand(&[_][]const u8{
|
|
"sh",
|
|
"arch/x86/boot/helper.sh",
|
|
"generate_offset_header",
|
|
});
|
|
offset_generate.addFileArg(kcapsule.getEmittedBin());
|
|
offset_generate.step.dependOn(&kcapsule.step);
|
|
const setup = b.addExecutable(.{
|
|
.name = "setup",
|
|
.use_lld = true,
|
|
.use_llvm = true,
|
|
.root_module = b.createModule(.{
|
|
.root_source_file = b.path("arch/x86/boot/setup/stage1.zig"),
|
|
.target = target,
|
|
.optimize = optimize,
|
|
}),
|
|
});
|
|
setup.step.dependOn(&offset_generate.step);
|
|
setup.step.addWatchInput(b.path("arch/x86/boot/offset.h")) catch {};
|
|
setup.addAssemblyFile(b.path("arch/x86/boot/header.S"));
|
|
setup.addIncludePath(b.path("include"));
|
|
setup.addIncludePath(b.path("arch/x86/boot"));
|
|
setup.setLinkerScript(b.path("arch/x86/boot/setup.ld"));
|
|
return setup;
|
|
}
|
|
pub fn buildKcapsule(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode) *Step.Compile {
|
|
const kernel = kernel_build.buildKernelBin(b, target, optimize);
|
|
const kcapsule = b.addExecutable(.{
|
|
.name = "kcapsule",
|
|
.use_lld = true,
|
|
.use_llvm = true,
|
|
.root_module = b.createModule(.{
|
|
.root_source_file = b.path("arch/x86/boot/extractor.zig"),
|
|
.target = target,
|
|
.optimize = optimize,
|
|
.pic = true,
|
|
}),
|
|
});
|
|
const efi_target = b.resolveTargetQuery(.{
|
|
.cpu_arch = .x86_64,
|
|
.os_tag = .freestanding,
|
|
.abi = .msvc,
|
|
});
|
|
const efi_loader = b.addObject(.{
|
|
.name = "efi_loader",
|
|
.use_lld = true,
|
|
.use_llvm = true,
|
|
.root_module = b.createModule(.{
|
|
.root_source_file = b.path("drivers/firmware/efi/x86.zig"),
|
|
.target = efi_target,
|
|
.optimize = optimize,
|
|
.pic = true,
|
|
}),
|
|
});
|
|
kcapsule.pie = true;
|
|
kcapsule.entry = .{ .symbol_name = "efi_pe_entry" };
|
|
kcapsule.addObject(efi_loader);
|
|
kcapsule.addAssemblyFile(b.path("arch/x86/boot/payload.S"));
|
|
kcapsule.setLinkerScript(b.path("arch/x86/boot/kcapsule.ld"));
|
|
kcapsule.step.dependOn(&kernel.step);
|
|
|
|
return kcapsule;
|
|
}
|
|
pub fn buildImage(b: *std.Build, optimize: std.builtin.OptimizeMode) *Step {
|
|
const target = b.resolveTargetQuery(.{ .cpu_arch = .x86_64, .os_tag = .freestanding, .abi = .none });
|
|
|
|
const kcapsule = buildKcapsule(b, target, optimize);
|
|
const setup = buildSetup(b, target, optimize, kcapsule);
|
|
const image = b.addSystemCommand(&[_][]const u8{
|
|
"sh",
|
|
"arch/x86/boot/helper.sh",
|
|
"build_image",
|
|
});
|
|
|
|
image.addFileArg(setup.getEmittedBin());
|
|
image.addFileArg(kcapsule.getEmittedBin());
|
|
image.step.dependOn(&setup.step);
|
|
image.step.dependOn(&kcapsule.step);
|
|
|
|
return &image.step;
|
|
}
|