From eba0127645821d6a9e4143baf3689d3ce817fc6c Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Tue, 31 Jan 2023 23:57:39 -0800 Subject: [PATCH] [bonnibel] Allow modules to list ld scripts in definition Previously, to add a custom linker script, a module would need to modify its variables after the fact to add to ldflags. Now module constructors take a new keyword `ld_script` and handle the ldflags and dependencies properly. --- scripts/bonnibel/module.py | 19 ++++++++++++++++--- src/kernel/kernel.module | 3 +-- src/kernel/panic.serial/serial.module | 3 +-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/bonnibel/module.py b/scripts/bonnibel/module.py index f248d14..494e3e1 100644 --- a/scripts/bonnibel/module.py +++ b/scripts/bonnibel/module.py @@ -7,10 +7,18 @@ def resolve(path): return str(Path(path).resolve()) class BuildOptions: - def __init__(self, includes=tuple(), libs=tuple(), order_only=tuple()): + def __init__(self, includes=tuple(), libs=tuple(), order_only=tuple(), ld_script=None): self.includes = list(includes) self.libs = list(libs) self.order_only = list(order_only) + self.ld_script = ld_script and str(ld_script) + + @property + def implicit(self): + if self.ld_script is not None: + return self.libs + [self.ld_script] + else: + return self.libs class Module: @@ -28,6 +36,7 @@ class Module: "default": (bool, False), "description": (str, None), "no_libc": (bool, False), + "ld_script": (str, None), } def __init__(self, name, modfile, root, **kwargs): @@ -176,6 +185,7 @@ class Module: modopts = BuildOptions( includes = [self.root, "${module_dir}"], + ld_script = self.ld_script and self.root / self.ld_script, ) if self.public_headers: modopts.includes += [f"${{build_root}}/include/{self.name}"] @@ -214,6 +224,9 @@ class Module: if modopts.libs: build.variable("libs", ["${libs}"] + modopts.libs) + if modopts.ld_script: + build.variable("ldflags", ["${ldflags}"] + ["-T", modopts.ld_script]) + header_deps = [] inputs = [] @@ -237,16 +250,16 @@ class Module: gather_phony(build, header_deps, target_rel, add_headers=True) output = target_rel(self.output) - dump = output + ".dump" build.newline() build.build( rule = self.kind, outputs = output, inputs = inputs, - implicit = modopts.libs, + implicit = modopts.implicit, order_only = modopts.order_only, ) + dump = output + ".dump" build.newline() build.build( rule = "dump", diff --git a/src/kernel/kernel.module b/src/kernel/kernel.module index b6f3890..57f2f4f 100644 --- a/src/kernel/kernel.module +++ b/src/kernel/kernel.module @@ -7,6 +7,7 @@ kernel = module("kernel", targets = [ "kernel" ], description = "jsix kernel", deps = [ "util", "cpu", "bootproto", "j6" ], + ld_script = "kernel.ld", sources = [ "apic.cpp", "assert.cpp", @@ -83,5 +84,3 @@ kernel.add_depends([ "syscalls.inc.cog", "syscall_verify.cpp.cog", ], definitions) - -kernel.variables['ldflags'] = ["${ldflags}", "-T", "${source_root}/src/kernel/kernel.ld"] diff --git a/src/kernel/panic.serial/serial.module b/src/kernel/panic.serial/serial.module index cfe6d91..c405598 100644 --- a/src/kernel/panic.serial/serial.module +++ b/src/kernel/panic.serial/serial.module @@ -6,6 +6,7 @@ panic = module("panic.serial", deps = [ "util", "elf", "kernel" ], includes = [ ".." ], description = "Serial panic handler", + ld_script = "panic.serial.ld", sources = [ "display.cpp", "entry.s", @@ -14,5 +15,3 @@ panic = module("panic.serial", "symbol_table.cpp", "../printf/printf.c", ]) - -panic.variables['ldflags'] = ["${ldflags}", "-T", "${source_root}/src/kernel/panic.serial/panic.serial.ld"]