const std = @import("std");

pub fn build(b: *std.Build) void {
    const target = b.resolveTargetQuery(.{
        .cpu_arch = .aarch64,
        .os_tag = .freestanding,
    });

    const optimize = b.standardOptimizeOption(.{});

    const kernel = b.addExecutable(.{
        .name = "kernel.elf",
        .root_source_file = b.path("src/main.zig"),
        .target = target,
        .optimize = optimize,
    });
    kernel.setLinkerScript(b.path("src/Link.ld"));
    kernel.addIncludePath(b.path("include"));
    kernel.addAssemblyFile(b.path("src/startup.s"));

    b.installArtifact(kernel);

    const kernel_bin = b.addObjCopy(kernel.getEmittedBin(), .{
        .format = .bin,
        .basename = "kernel.img",
    });
    const install_kernel = b.addInstallFile(
        kernel_bin.getOutput(),
        "boot/kernel8.img",
    );
    b.getInstallStep().dependOn(&install_kernel.step);

    const firmware = b.dependency("rpi_firmware", .{});
    b.installDirectory(.{
        .source_dir = firmware.path("boot"),
        .install_dir = .prefix,
        .install_subdir = "boot",
        .include_extensions = &.{
            "start4.elf",
            "start4db.elf",
            "fixup4.dat",
            "bcm2711-rpi-4-b.dtb",
        },
    });

    b.installFile("config.txt", "boot/config.txt");
}