NumericalOS

numos/archtable.py

back to source

"""Generate boot/lib/arch_table.sh from ArchTarget records.

The bootstrap's architecture table is generated, never hand-maintained:
adding an arch is a node insert, not a code edit.
"""

HEADER = """# GENERATED FROM ArchTarget NODES - DO NOT EDIT
# Regenerate with: py -m numos.archtable
"""


def render_arch_table(arch_targets):
    """Return POSIX sh defining numos_canonical_arch and numos_arch_has_static."""
    out = [HEADER, "numos_canonical_arch() {", '  case "$1" in']
    for target in sorted(arch_targets, key=lambda t: t["canonical"]):
        pattern = "|".join(target["aliases"])
        out.append("    %s) echo %s ;;" % (pattern, target["canonical"]))
    out.append("    *) return 1 ;;")
    out.append("  esac")
    out.append("}")
    out.append("")
    out.append("numos_arch_has_static() {")
    out.append('  case "$1" in')
    static = sorted(t["canonical"] for t in arch_targets if t["zig_triple"])
    if static:
        out.append("    %s) return 0 ;;" % "|".join(static))
    out.append("    *) return 1 ;;")
    out.append("  esac")
    out.append("}")
    return "\n".join(out) + "\n"


def main():
    import os
    from numos import seed
    path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
                        "boot", "lib", "arch_table.sh")
    with open(path, "w", newline="\n") as handle:
        handle.write(render_arch_table(seed.ARCH_TARGETS))
    print("wrote %s" % path)


if __name__ == "__main__":
    main()