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
|
#!/usr/bin/env python3
from argparse import ArgumentParser
from ninja.ninja_syntax import Writer as Ninja
from os import getenv
from pathlib import Path
def main():
arg_parser = ArgumentParser()
arg_parser.add_argument("arch_name")
arg_parser.add_argument("board_name")
arg_parser.add_argument("libkernel")
arg_parser.add_argument("srcdir")
args = arg_parser.parse_args()
libkernel = Path(args.libkernel).resolve() / "lib/libvernos_kernel.a"
srcdir = Path(args.srcdir).resolve()
objdir = Path("obj")
objdir.mkdir()
linker_script = str(srcdir / f"{args.board_name}.ld")
objs: list[str] = []
with open("build.ninja", "w") as f:
ninja = Ninja(f)
# Inherit some environment variables.
for var in ["AS", "ASFLAGS", "LD", "LDFLAGS", "STRIP"]:
ninja.variable(var, getenv(var))
# Add rules to assemble and link.
ninja.rule("as", "$AS $ASFLAGS -g -o $out $in")
ninja.rule("ld", f"$LD $LDFLAGS -T{linker_script} -o $out $in")
ninja.rule("strip", f"$STRIP -o $out $in")
ninja.rule("strip-onlysyms", f"$STRIP --only-keep-debug -o $out $in")
for path in srcdir.iterdir():
if path.suffix != ".s":
continue
obj = str(objdir / f"{path.stem}.o")
ninja.build(obj, "as", str(path))
objs.append(obj)
ninja.build("vernos_kernel_unstripped.elf", "ld", objs + [str(libkernel)])
ninja.build("vernos_kernel.elf", "strip", "vernos_kernel_unstripped.elf")
ninja.build(
"vernos_kernel.sym", "strip-onlysyms", "vernos_kernel_unstripped.elf"
)
if __name__ == "__main__":
main()
|