Change to limine bootloader

This commit is contained in:
2026-08-27 14:03:06 +03:00
parent a6c5053b1d
commit 67d281d6be
6 changed files with 92 additions and 22 deletions
+58 -13
View File
@@ -11,14 +11,14 @@ bool render_clangd_config(void) {
return false;
nob_sb_append_null(&tmpl);
const char *include_path = getenv("I686_ELF_GCC_INCLUDE");
const char *include_path = getenv("x86_64_ELF_GCC_INCLUDE");
if (include_path == NULL) {
nob_log(NOB_ERROR, "I686_ELF_GCC_INCLUDE not set");
nob_log(NOB_ERROR, "x86_64_ELF_GCC_INCLUDE not set");
nob_sb_free(tmpl);
return false;
}
const char *needle = "${env:I686_ELF_GCC_INCLUDE}";
const char *needle = "${env:X86_64_ELF_GCC_INCLUDE}";
Nob_String_Builder out = {0};
const char *cursor = tmpl.items;
@@ -45,7 +45,7 @@ bool build_assembly(Nob_Cmd *cmd) {
if (!rebuild)
return true;
nob_cmd_append(cmd, "i686-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s");
nob_cmd_append(cmd, "x86_64-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s");
if (!nob_cmd_run(cmd))
return false;
@@ -61,9 +61,14 @@ bool build_c(Nob_Cmd *cmd) {
return true;
nob_cmd_append(cmd,
"i686-elf-gcc",
"x86_64-elf-gcc",
"-std=gnu99",
"-ffreestanding",
"-mcmodel=large",
"-mno-red-zone",
"-mno-mmx",
"-mno-sse",
"-mno-sse2",
"-Wall",
"-Wextra",
"-O2",
@@ -86,7 +91,7 @@ bool link_everything(Nob_Cmd *cmd) {
const char *objectFiles[] = {BUILD_FOLDER "kernel.o", BUILD_FOLDER "boot.o"};
nob_cmd_append(cmd,
"i686-elf-gcc",
"x86_64-elf-gcc",
"-T", SRC_FOLDER "linker.ld",
"-o", BUILD_FOLDER "kernel",
"-ffreestanding",
@@ -137,10 +142,10 @@ bool clean_dir(const char *dir_path) {
}
bool build_bootable_image(Nob_Cmd *cmd) {
// NOTE: this does not rebuild on change of limine bins
const char *output = BUILD_FOLDER "kernel.iso";
const char *input[] = {BUILD_FOLDER "kernel", SRC_FOLDER "grub.cfg"};
const char *input[] = {BUILD_FOLDER "kernel", SRC_FOLDER "limine.conf"};
int rebuild = nob_needs_rebuild(output, input, NOB_ARRAY_LEN(input));
if (!rebuild)
return true;
@@ -148,18 +153,58 @@ bool build_bootable_image(Nob_Cmd *cmd) {
return false;
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot"))
return false;
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot/grub"))
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot/limine"))
return false;
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/EFI"))
return false;
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/EFI/BOOT"))
return false;
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "limine"))
return false;
nob_cmd_append(cmd, "cp", BUILD_FOLDER "kernel", BUILD_FOLDER "isodir/boot/kernel");
if (!nob_file_exists(BUILD_FOLDER "limine")) {
nob_cmd_append(cmd, "git", "clone", "https://github.com/limine-bootloader/limine.git", "--branch=v11.x-binary", "--depth=1", BUILD_FOLDER "limine");
if (!nob_cmd_run(cmd))
return false;
}
nob_cmd_append(cmd, "make", "-C", BUILD_FOLDER "limine");
if (!nob_cmd_run(cmd))
return false;
nob_cmd_append(cmd, "cp", SRC_FOLDER "grub.cfg", BUILD_FOLDER "isodir/boot/grub/grub.cfg");
nob_cmd_append(cmd, "cp",
BUILD_FOLDER "limine/limine-bios.sys",
BUILD_FOLDER "limine/limine-bios-cd.bin",
BUILD_FOLDER "limine/limine-uefi-cd.bin",
BUILD_FOLDER "isodir/boot/limine/");
if (!nob_cmd_run(cmd))
return false;
nob_cmd_append(cmd, "grub-mkrescue", "-o", BUILD_FOLDER "kernel.iso", BUILD_FOLDER "isodir");
nob_cmd_append(cmd, "cp",
BUILD_FOLDER "limine/BOOTIA32.EFI",
BUILD_FOLDER "limine/BOOTX64.EFI",
BUILD_FOLDER "isodir/EFI/BOOT/");
if (!nob_cmd_run(cmd))
return false;
nob_cmd_append(cmd, "cp", SRC_FOLDER "limine.conf", BUILD_FOLDER "isodir/boot/limine/limine.conf");
if (!nob_cmd_run(cmd))
return false;
nob_cmd_append(cmd, "cp", BUILD_FOLDER "kernel", BUILD_FOLDER "isodir/boot/");
if (!nob_cmd_run(cmd))
return false;
nob_cmd_append(cmd, "xorriso", "-as", "mkisofs",
"-b", "boot/limine/limine-bios-cd.bin",
"-no-emul-boot", "-boot-load-size", "4", "-boot-info-table",
"--efi-boot", "boot/limine/limine-uefi-cd.bin",
"-efi-boot-part", "--efi-boot-image", "--protective-msdos-label",
BUILD_FOLDER "isodir", "-o", BUILD_FOLDER "kernel.iso");
if (!nob_cmd_run(cmd))
return false;
nob_cmd_append(cmd, BUILD_FOLDER "limine/limine", "bios-install", BUILD_FOLDER "kernel.iso");
if (!nob_cmd_run(cmd))
return false;
@@ -167,7 +212,7 @@ bool build_bootable_image(Nob_Cmd *cmd) {
}
bool runQemu(Nob_Cmd *cmd) {
nob_cmd_append(cmd, "qemu-system-i386", "-cdrom", BUILD_FOLDER "kernel.iso", "-serial", "stdio");
nob_cmd_append(cmd, "qemu-system-x86_64", "-cdrom", BUILD_FOLDER "kernel.iso", "-serial", "stdio");
if (!nob_cmd_run(cmd))
return false;
return true;