f5893c6e6cb110afd4c947cd525def1c01cac429
[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 from integration.build_gen import MakefileBuildGen, install_lbuild_functions
11
12 import lcfg.types as lcfg_type
13 import lcfg.builtins as builtin
14
15 from os import getcwd
16 from os import mkdir
17 from os.path import abspath, basename, dirname, exists
18 from argparse import ArgumentParser
19 from lib.utils import join_path
20
21 def prepare_lconfig_env(out_dir):
22     provider = CHeaderConfigProvider(join_path(out_dir, "configs.h"))
23     env = LConfigEnvironment(getcwd(), provider)
24
25     env.register_builtin_func(builtin.v)
26     env.register_builtin_func(builtin.term_type)
27     env.register_builtin_func(builtin.parent)
28     env.register_builtin_func(builtin.default)
29     env.register_builtin_func(builtin.include)
30     env.register_builtin_func(builtin.env)
31     env.register_builtin_func(builtin.set_value)
32
33     env.type_factory().regitser(lcfg_type.PrimitiveType)
34     env.type_factory().regitser(lcfg_type.MultipleChoiceType)
35
36     return env
37
38 def do_config(opt, lcfg_env):
39     redo_config = not exists(opt.config_save) or opt.force
40     if not redo_config:
41         return
42     
43     shell = InteractiveShell(lcfg_env)
44     if not shell.render_loop():
45         print("Configuration aborted.")
46         exit(-1)
47
48 def do_buildfile_gen(opts, lcfg_env):
49     root_path = abspath(opts.root)
50     ws_path = dirname(root_path)
51     root_name = basename(root_path)
52
53     mkgen = MakefileBuildGen(opts.out_dir)
54     env = BuildEnvironment(ws_path, mkgen)
55
56     install_lbuild_functions(env)
57
58     cfg_provider = LConfigProvider(lcfg_env)
59     env.set_config_provider(cfg_provider)
60
61     root = LunaBuildFile(env, root_name)
62
63     try:
64         root.resolve()
65     except Exception as err:
66         print("failed to resolve root build file")
67         raise err
68     
69     env.export()
70
71 def main():
72     parser = ArgumentParser()
73     parser.add_argument("--config", action="store_true", default=False)
74     parser.add_argument("--lconfig-file", default="LConfig")
75     parser.add_argument("--config-save", default=".config.json")
76     parser.add_argument("--force", action="store_true", default=False)
77     parser.add_argument("root", nargs="?", default="LBuild")
78     parser.add_argument("-o", "--out-dir", required=True)
79
80     opts = parser.parse_args()
81     out_dir = opts.out_dir
82     if not exists(out_dir):
83         mkdir(out_dir)
84     
85     lcfg_env = prepare_lconfig_env(out_dir)
86     require_config = exists(opts.lconfig_file)
87     try:
88         if require_config:
89             lcfg_env.resolve_module(opts.lconfig_file)
90             lcfg_env.update()
91             lcfg_env.load()
92     except Exception as e:
93         print(e)
94     
95     if opts.config:
96         if require_config:
97             do_config(opts, lcfg_env)
98         else:
99             print("No configuration file detected, skipping...")
100         lcfg_env.save(opts.config_save)
101         lcfg_env.export()
102     else:
103         do_buildfile_gen(opts, lcfg_env)
104
105 if __name__ == "__main__":
106     main()