Introducing LunaBuild to the build flow (#36)
[lunaix-os.git] / lunaix-os / scripts / build-tools / luna_build.py
1 #!/usr/bin/env python 
2
3 from lbuild.contract import LunaBuildFile
4 from lbuild.common import BuildEnvironment
5
6 from lcfg.common import LConfigEnvironment
7 from integration.config_io import CHeaderConfigProvider
8 from integration.lbuild_bridge import LConfigProvider
9 from integration.render_ishell import InteractiveShell
10
11 import lcfg.types as lcfg_type
12 import lcfg.builtins as builtin
13
14 from os import getcwd
15 from os import mkdir
16 from os.path import abspath, basename, dirname, exists
17 from argparse import ArgumentParser
18 from lib.utils import join_path
19
20 def prepare_lconfig_env(out_dir):
21     provider = CHeaderConfigProvider(join_path(out_dir, "configs.h"))
22     env = LConfigEnvironment(getcwd(), provider)
23
24     env.register_builtin_func(builtin.v)
25     env.register_builtin_func(builtin.term_type)
26     env.register_builtin_func(builtin.parent)
27     env.register_builtin_func(builtin.default)
28     env.register_builtin_func(builtin.include)
29
30     env.type_factory().regitser(lcfg_type.PrimitiveType)
31     env.type_factory().regitser(lcfg_type.MultipleChoiceType)
32
33     return env
34
35 def do_config(lcfg_env):
36     shell = InteractiveShell(lcfg_env)
37     if not shell.render_loop():
38         print("Configuration aborted.")
39         exit(-1)
40
41     lcfg_env.export()
42     lcfg_env.save()
43
44 def do_buildfile_gen(opts, lcfg_env):
45     root_path = abspath(opts.root)
46     ws_path = dirname(root_path)
47     root_name = basename(root_path)
48
49     env = BuildEnvironment(ws_path)
50
51     cfg_provider = LConfigProvider(lcfg_env)
52     env.set_config_provider(cfg_provider)
53
54     root = LunaBuildFile(env, root_name)
55
56     try:
57         root.resolve()
58     except Exception as err:
59         print("failed to resolve root build file")
60         raise err
61     
62     env.export(opts.out_dir)
63
64 def main():
65     parser = ArgumentParser()
66     parser.add_argument("--config", action="store_true", default=False)
67     parser.add_argument("--lconfig-file", default="LConfig")
68     parser.add_argument("root", nargs="?", default="LBuild")
69     parser.add_argument("-o", "--out-dir", required=True)
70
71     opts = parser.parse_args()
72     out_dir = opts.out_dir
73     if not exists(out_dir):
74         mkdir(out_dir)
75     
76     lcfg_env = prepare_lconfig_env(out_dir)
77     lcfg_env.resolve_module(opts.lconfig_file)
78     lcfg_env.update()
79     lcfg_env.load()
80
81     if opts.config:
82         do_config(lcfg_env)
83     else:
84         do_buildfile_gen(opts, lcfg_env)
85
86 if __name__ == "__main__":
87     main()