3 from lbuild.contract import LunaBuildFile
4 from lbuild.common import BuildEnvironment
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
12 import lcfg.types as lcfg_type
13 import lcfg.builtins as builtin
17 from os.path import abspath, basename, dirname, exists
18 from argparse import ArgumentParser
19 from lib.utils import join_path
21 def prepare_lconfig_env(out_dir):
22 provider = CHeaderConfigProvider(join_path(out_dir, "configs.h"))
23 env = LConfigEnvironment(getcwd(), provider)
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)
33 env.type_factory().regitser(lcfg_type.PrimitiveType)
34 env.type_factory().regitser(lcfg_type.MultipleChoiceType)
38 def do_config(opt, lcfg_env):
39 redo_config = not exists(opt.config_save) or opt.force
43 shell = InteractiveShell(lcfg_env)
44 if not shell.render_loop():
45 print("Configuration aborted.")
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)
53 mkgen = MakefileBuildGen(opts.out_dir)
54 env = BuildEnvironment(ws_path, mkgen)
56 install_lbuild_functions(env)
58 cfg_provider = LConfigProvider(lcfg_env)
59 env.set_config_provider(cfg_provider)
61 root = LunaBuildFile(env, root_name)
65 except Exception as err:
66 print("failed to resolve root build file")
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)
80 opts = parser.parse_args()
81 out_dir = opts.out_dir
82 if not exists(out_dir):
85 lcfg_env = prepare_lconfig_env(out_dir)
86 require_config = exists(opts.lconfig_file)
89 lcfg_env.resolve_module(opts.lconfig_file)
92 except Exception as e:
97 do_config(opts, lcfg_env)
99 print("No configuration file detected, skipping...")
100 lcfg_env.save(opts.config_save)
103 do_buildfile_gen(opts, lcfg_env)
105 if __name__ == "__main__":