summaryrefslogtreecommitdiff
path: root/boards/configure.py
blob: cbe255a08d5c4ffb63caf163f7ed29d1144aaf29 (plain)
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()