From 1893b8f05494868fa7a80f394adea252e1c4d52a Mon Sep 17 00:00:00 2001 From: ImagineHaxing Date: Tue, 25 Aug 2026 18:26:42 +0300 Subject: [PATCH] Make clangd work with toolchain's headers --- .clangd.template | 9 +++++++ .gitignore | 3 ++- nob.c | 66 ++++++++++++++++++++++++++++++++++++++++++++---- shell.nix | 4 +++ src/kernel.c | 16 +++++++++--- 5 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 .clangd.template diff --git a/.clangd.template b/.clangd.template new file mode 100644 index 0000000..f1c6c4c --- /dev/null +++ b/.clangd.template @@ -0,0 +1,9 @@ +CompileFlags: + Compiler: i686-elf-gcc + Add: + - "-target" + - "i686-elf" + - "-ffreestanding" + - "-nostdlibinc" + - "-isystem" + - "${env:I686_ELF_GCC_INCLUDE}" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5f8bdc5..34badc1 100644 --- a/.gitignore +++ b/.gitignore @@ -139,4 +139,5 @@ dkms.conf build/ nob -nob.old \ No newline at end of file +nob.old +.clangd \ No newline at end of file diff --git a/nob.c b/nob.c index 5beb98a..21a0004 100644 --- a/nob.c +++ b/nob.c @@ -1,9 +1,66 @@ #define NOB_IMPLEMENTATION #include "nob.h" +#include #define BUILD_FOLDER "build/" #define SRC_FOLDER "src/" +bool render_clangd_config(void) { + Nob_String_Builder tmpl = {0}; + if (!nob_read_entire_file(".clangd.template", &tmpl)) + return false; + nob_sb_append_null(&tmpl); + + const char *include_path = getenv("I686_ELF_GCC_INCLUDE"); + if (include_path == NULL) { + nob_log(NOB_ERROR, "I686_ELF_GCC_INCLUDE not set"); + nob_sb_free(tmpl); + return false; + } + + const char *needle = "${env:I686_ELF_GCC_INCLUDE}"; + Nob_String_Builder out = {0}; + + const char *cursor = tmpl.items; + const char *found; + while ((found = strstr(cursor, needle)) != NULL) { + nob_sb_append_buf(&out, cursor, found - cursor); + nob_sb_append_cstr(&out, include_path); + cursor = found + strlen(needle); + } + nob_sb_append_cstr(&out, cursor); + + bool ok = nob_write_entire_file(".clangd", out.items, out.count); + + nob_sb_free(tmpl); + nob_sb_free(out); + return ok; +} + +bool build_assembly(Nob_Cmd *cmd) { + nob_cmd_append(cmd, "i686-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s"); + if (!nob_cmd_run(cmd)) + return false; + + return true; +} + +bool build_c(Nob_Cmd *cmd) { + nob_cmd_append(cmd, + "i686-elf-gcc", + "-std=gnu99", + "-ffreestanding", + "-Wall", + "-Wextra", + "-O2", + "-o", BUILD_FOLDER "kernel.o", + "-c", SRC_FOLDER "kernel.c"); + if (!nob_cmd_run(cmd)) + return false; + + return true; +} + int main(int argc, char **argv) { NOB_GO_REBUILD_URSELF(argc, argv); @@ -12,12 +69,11 @@ int main(int argc, char **argv) { Nob_Cmd cmd = {0}; - nob_cmd_append(&cmd, "i686-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s"); - if (!nob_cmd_run(&cmd)) + if (!render_clangd_config()) return 1; - - nob_cmd_append(&cmd, "i686-elf-gcc", "-Wall", "-Wextra", "-o", BUILD_FOLDER "kernel", SRC_FOLDER "kernel.c"); - if (!nob_cmd_run(&cmd)) + if (!build_assembly(&cmd)) + return 1; + if (!build_c(&cmd)) return 1; return 0; diff --git a/shell.nix b/shell.nix index 735a67f..4d635d9 100644 --- a/shell.nix +++ b/shell.nix @@ -7,4 +7,8 @@ pkgs.mkShell { pkgsCross.i686-embedded.buildPackages.binutils gdb ]; + + shellHook = '' + export I686_ELF_GCC_INCLUDE="${pkgs.pkgsCross.i686-embedded.buildPackages.gcc.cc}/lib/gcc/i686-elf/${pkgs.pkgsCross.i686-embedded.buildPackages.gcc.version}/include" + ''; } diff --git a/src/kernel.c b/src/kernel.c index 307a8f1..5e312c6 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,6 +1,16 @@ -#include "stdio.h" +#include +#include +#include + +#if defined(__linux__) +#error "Not using a cross compiler" +#endif + +#if !defined(__i386__) +#error "Not using the right compiler" +#endif int main() { - printf("Hello, world!\n"); - return 0; + return 1; + return false; }