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
71
72
73
74
75
76
|
const std = @import("std");
const Builder = @import("std").build.Builder;
const Target = @import("std").Target;
const CrossTarget = @import("std").zig.CrossTarget;
const Feature = @import("std").Target.Cpu.Feature;
pub fn build(b: *Builder) void {
const features = Target.x86.Feature;
var disabled_features = Feature.Set.empty;
var enabled_features = Feature.Set.empty;
disabled_features.addFeature(@enumToInt(features.mmx));
disabled_features.addFeature(@enumToInt(features.sse));
disabled_features.addFeature(@enumToInt(features.sse2));
disabled_features.addFeature(@enumToInt(features.avx));
disabled_features.addFeature(@enumToInt(features.avx2));
enabled_features.addFeature(@enumToInt(features.soft_float));
const target = CrossTarget{
.cpu_arch = Target.Cpu.Arch.i386,
.os_tag = Target.Os.Tag.freestanding,
.abi = Target.Abi.none,
.cpu_features_sub = disabled_features,
.cpu_features_add = enabled_features
};
const mode = b.standardReleaseOptions();
const kernel = b.addExecutable("kernel.elf", "src/main.zig");
kernel.setTarget(target);
kernel.setBuildMode(mode);
kernel.setLinkerScriptPath(.{ .path = "src/linker.ld" });
kernel.code_model = .kernel;
kernel.install();
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});
const kernel_path = b.getInstallPath(kernel.install_step.?.dest_dir, 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);
}
|