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()