fix: gen_ksymtable does not work on non-English platform
[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         
101         lcfg_env.update()
102         lcfg_env.save(opts.config_save)
103         lcfg_env.export()
104     else:
105         do_buildfile_gen(opts, lcfg_env)
106
107 if __name__ == "__main__":
108     main()