aboutsummaryrefslogtreecommitdiff
path: root/build.zig
blob: 648c7872e88584ea51d5589a512bfdd92ab74206 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const std = @import("std");
const fs = std.fs;
const Build = @import("std").Build;
const Target = @import("std").Target;
const CrossTarget = @import("std").zig.CrossTarget;
const Feature = @import("std").Target.Cpu.Feature;

pub fn build(b: *Build) !void {
    const debug = b.option(bool, "debug", "Enable debug") orelse false;

    const features = Target.x86.Feature;
    var disabled_features = Feature.Set.empty;
    var enabled_features = Feature.Set.empty;
    disabled_features.addFeature(@intFromEnum(features.mmx));
    disabled_features.addFeature(@intFromEnum(features.sse));
    disabled_features.addFeature(@intFromEnum(features.sse2));
    disabled_features.addFeature(@intFromEnum(features.avx));
    disabled_features.addFeature(@intFromEnum(features.avx2));
    enabled_features.addFeature(@intFromEnum(features.soft_float));

    const kernel_target_query = Target.Query{
        .cpu_arch = Target.Cpu.Arch.x86_64,
        .os_tag = Target.Os.Tag.freestanding,
        .abi = Target.Abi.none,
        .cpu_features_sub = disabled_features,
        .cpu_features_add = enabled_features,
    };
    const kernel_target = b.resolveTargetQuery(kernel_target_query);

    var optimize = std.builtin.OptimizeMode.Debug;
    if (!debug) {
        optimize = b.standardOptimizeOption(.{});
    }

    const kernel = b.addExecutable(.{
        .name = "kernel.elf",
        .root_source_file = .{ .path = "src/main.zig" },
        .optimize = optimize,
        .target = kernel_target,
    });
    kernel.setLinkerScriptPath(.{ .path = "src/linker.ld" });
    kernel.entry = .disabled;
    b.installArtifact(kernel);

    const kernel_step = b.step("kernel", "Build the kernel");
    //kernel_step.dependOn(&kernel.install_step.?.step);

    const iso_dir = b.fmt("{?s}/iso_root", .{b.cache_root.path});
    // const kernel_path = b.install_path ++ "/" ++ kernel.out_filename;
    // const kernel_path = b.getInstallPath(kernel.install_step.?.dest_dir, kernel.out_filename);
    const kernel_path = try fs.path.join(b.allocator, &[_][]const u8{ b.install_path, "bin", kernel.out_filename });
    const iso_path = b.fmt("{s}/disk.iso", .{b.exe_dir});

    const iso_cmd_str = &[_][]const u8{ "/bin/sh", "-c", std.mem.concat(b.allocator, u8, &[_][]const u8{ "mkdir -p ", iso_dir, " && ", "cp ", kernel_path, " ", iso_dir, " && ", "cp src/grub.cfg ", iso_dir, " && ", "grub-mkrescue -o ", iso_path, " ", iso_dir }) catch unreachable };

    const iso_cmd = b.addSystemCommand(iso_cmd_str);
    iso_cmd.step.dependOn(kernel_step);

    const iso_step = b.step("iso", "Build an ISO image");
    iso_step.dependOn(&iso_cmd.step);
    b.default_step.dependOn(iso_step);

    const run_cmd_str = &[_][]const u8{ "qemu-system-x86_64", "-cdrom", iso_path, "-debugcon", "stdio", "-vga", "virtio", "-m", "4G", "-machine", "q35,accel=kvm:whpx:tcg", "-no-reboot", "-no-shutdown" };

    const run_cmd = b.addSystemCommand(run_cmd_str);
    run_cmd.step.dependOn(b.getInstallStep());

    const run_step = b.step("run", "Run the kernel");
    run_step.dependOn(&run_cmd.step);
}