diff --git a/build.zig b/build.zig index fdc12af..ca5b33e 100644 --- a/build.zig +++ b/build.zig @@ -29,6 +29,7 @@ pub fn build(b: *std.Build) void { // Freestanding kernel - no libc, no red zone, no stack checks hal_mod.red_zone = false; hal_mod.stack_check = false; + hal_mod.code_model = .medany; const hal = b.addLibrary(.{ .name = "rumpk_hal", @@ -58,13 +59,60 @@ pub fn build(b: *std.Build) void { }); boot_mod.red_zone = false; boot_mod.stack_check = false; + boot_mod.code_model = .medany; const boot = b.addObject(.{ .name = "boot", .root_module = boot_mod, }); - _ = boot; // Mark as used for now + // ========================================================= + // Final Link: rumpk.elf + // ========================================================= + + const kernel_mod = b.createModule(.{ + .root_source_file = b.path("hal/abi.zig"), // Fake root, we add objects later + .target = target, + .optimize = optimize, + }); + kernel_mod.red_zone = false; + kernel_mod.stack_check = false; + kernel_mod.code_model = .medany; + + const kernel = b.addExecutable(.{ + .name = "rumpk.elf", + .root_module = kernel_mod, + }); + + kernel.setLinkerScript(b.path("boot/linker.ld")); + kernel.addObject(boot); + // kernel.linkLibrary(hal); // Redundant, already in kernel_mod + + // Add Nim-generated objects + { + var nimcache_dir = std.fs.cwd().openDir("build/nimcache", .{ .iterate = true }) catch |err| { + std.debug.print("Warning: Could not open nimcache dir: {}\n", .{err}); + return; + }; + defer nimcache_dir.close(); + var it = nimcache_dir.iterate(); + while (it.next() catch null) |entry| { + if (entry.kind == .file and std.mem.endsWith(u8, entry.name, ".o")) { + const path = b.fmt("build/nimcache/{s}", .{entry.name}); + kernel.addObjectFile(b.path(path)); + } + } + } + + // Add external pre-built dependencies (Order matters: Libs after users) + kernel.addObjectFile(b.path("build/switch.o")); // cpu_switch_to + kernel.addObjectFile(b.path("build/sys_arch.o")); // sys_now, nexus_lwip_panic + kernel.addObjectFile(b.path("build/libc_shim.o")); + kernel.addObjectFile(b.path("build/clib.o")); + kernel.addObjectFile(b.path("build/liblwip.a")); + kernel.addObjectFile(b.path("build/initrd.o")); + + b.installArtifact(kernel); // ========================================================= // Tests diff --git a/libs/membrane/include/arch/cc.h b/libs/membrane/include/arch/cc.h index a6e8f8f..e50c44b 100644 --- a/libs/membrane/include/arch/cc.h +++ b/libs/membrane/include/arch/cc.h @@ -16,9 +16,18 @@ #ifndef LWIP_ARCH_CC_H #define LWIP_ARCH_CC_H +// ========================================================= +// Freestanding Environment - Disable unavailable headers +// ========================================================= +#define LWIP_NO_CTYPE_H 1 // ctype.h not available +#define LWIP_NO_LIMITS_H 1 // limits.h not available +#define LWIP_NO_UNISTD_H 1 // unistd.h not available +#define LWIP_NO_INTTYPES_H 1 // inttypes.h not available + #include #include + // ========================================================= // Basic Types (Fixed-width integers) // =========================================================