#!/usr/bin/env python3 def generate(output, config, arch, manifest): from os import makedirs from glob import iglob from pathlib import Path from bonnibel.module import Module, ModuleList from bonnibel.project import Project root = Path(__file__).parent.resolve() project = Project(root) output = root / output manifest = root / manifest sources = [ str(root / "src/**/*.module"), str(root / "external/*.module"), ] modules = ModuleList(arch) for source in sources: for modfile in iglob(source, recursive=True): modfile = Path(modfile) path = modfile.parent def module_init(name, **kwargs): if not "root" in kwargs: kwargs["root"] = path m = Module(name, modfile, **kwargs) modules.add(m) return m glo = { "module": module_init, "source_root": root, "build_root": output, "module_root": path, "config": config, "arch": arch, } code = compile(open(modfile, 'r').read(), modfile, "exec") loc = {} exec(code, glo, loc) makedirs(output.resolve(), exist_ok=True) project.generate(root, output, modules, config, arch, manifest) modules.generate(output) if __name__ == "__main__": import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent / "scripts")) from argparse import ArgumentParser from bonnibel import BonnibelError default_arch = "amd64" p = ArgumentParser(description="Generate jsix build files") p.add_argument("--manifest", "-m", metavar="FILE", default="assets/manifests/default.yaml", help="File to use as the system manifest") p.add_argument("--conf", "-c", metavar="NAME", default="debug", help="Configuration to build (eg, 'debug' or 'release')") p.add_argument("--arch", "-a", metavar="NAME", default=default_arch, help="Architecture to build (eg, 'amd64' or 'linux')") p.add_argument("--verbose", "-v", action='count', default=0, help="More verbose log output") p.add_argument("output", metavar="DIR", default=None, nargs='?', help="Where to create the build root") args = p.parse_args() output = args.output or f"build.{args.arch}" try: generate(output, args.conf, args.arch, args.manifest) except BonnibelError as be: import sys print(f"Error: {be}", file=sys.stderr) sys.exit(1)