3d7f21a92980ab35f3ca5f427017b697a1291ad8
[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
32     env.type_factory().regitser(lcfg_type.PrimitiveType)
33     env.type_factory().regitser(lcfg_type.MultipleChoiceType)
34
35     return env
36
37 def do_config(lcfg_env):
38     shell = InteractiveShell(lcfg_env)
39     if not shell.render_loop():
40         print("Configuration aborted.")
41         exit(-1)
42
43     lcfg_env.export()
44     lcfg_env.save()
45
46 def do_buildfile_gen(opts, lcfg_env):
47     root_path = abspath(opts.root)
48     ws_path = dirname(root_path)
49     root_name = basename(root_path)
50
51     mkgen = MakefileBuildGen(opts.out_dir)
52     env = BuildEnvironment(ws_path, mkgen)
53
54     install_lbuild_functions(env)
55
56     cfg_provider = LConfigProvider(lcfg_env)
57     env.set_config_provider(cfg_provider)
58
59     root = LunaBuildFile(env, root_name)
60
61     try:
62         root.resolve()
63     except Exception as err:
64         print("failed to resolve root build file")
65         raise err
66     
67     env.export()
68
69 def main():
70     parser = ArgumentParser()
71     parser.add_argument("--config", action="store_true", default=False)
72     parser.add_argument("--lconfig-file", default="LConfig")
73     parser.add_argument("root", nargs="?", default="LBuild")
74     parser.add_argument("-o", "--out-dir", required=True)
75
76     opts = parser.parse_args()
77     out_dir = opts.out_dir
78     if not exists(out_dir):
79         mkdir(out_dir)
80     
81     lcfg_env = prepare_lconfig_env(out_dir)
82     lcfg_env.resolve_module(opts.lconfig_file)
83     lcfg_env.update()
84     lcfg_env.load()
85
86     if opts.config:
87         do_config(lcfg_env)
88     else:
89         do_buildfile_gen(opts, lcfg_env)
90
91 if __name__ == "__main__":
92     main()