2 from argparse import ArgumentParser
3 from pathlib import Path
5 from lbuild.build import BuildEnvironment
6 from lbuild.scope import ScopeProvider
7 from lcfg2.builder import NodeBuilder
8 from lcfg2.config import ConfigEnvironment
9 from lcfg2.common import ConfigNodeError
11 from shared.export import ExportJsonFile
12 from shared.export import ExportHeaderFile
13 from shared.export import ExportMakefileRules
14 from shared.export import restore_config_value
15 from shared.scopes import ConfigScope, EnvScope
16 from shared.build_gen import BuildScriptGenerator
17 from shared.shconfig import shconfig
20 def __init__(self, options):
21 self.__lbuilder = BuildEnvironment()
22 self.__lconfig = ConfigEnvironment()
25 scope = ConfigScope(self.__lconfig)
26 self.__lbuilder.register_scope(scope)
28 scope = ScopeProvider("src")
29 scope.file_subscope("c")
30 scope.file_subscope("h")
31 self.__lbuilder.register_scope(scope)
33 scope = ScopeProvider("flag")
36 self.__lbuilder.register_scope(scope)
38 self.__lbuilder.register_scope(EnvScope())
40 self.__json = ExportJsonFile(self.__lconfig)
41 self.__make = ExportMakefileRules(self.__lconfig)
42 self.__headr = ExportHeaderFile(self.__lconfig)
43 self.__build = BuildScriptGenerator(self.__lbuilder)
46 file = self.__opt.lconfig
47 NodeBuilder.build(self.__lconfig, file)
49 file = self.__opt.lbuild
50 self.__lbuilder.load(file)
52 self.__lconfig.refresh()
53 self.__lbuilder.update()
56 save = self.__opt.save
57 if not Path(save).exists():
60 restore_config_value(self.__lconfig, save)
64 save = self.__opt.save
65 self.__json.export(save)
69 outdir = Path(self.__opt.export_dir)
70 if not outdir.exists():
73 if self.__opt.gen_build:
74 self.__build.generate(outdir / "build.mkinc")
76 if self.__opt.gen_config:
77 self.__make.export(outdir / "config.mkinc")
78 self.__headr.export(outdir / "config.h")
80 def visual_config(self):
81 if not self.__lconfig.loaded():
82 print("no config file loaded, skipped interactive config")
85 if not self.__opt.gen_config:
88 if not shconfig(self.__lconfig):
89 print("configuration process aborted")
93 parser = ArgumentParser()
94 parser.add_argument("--lconfig", default="LConfig")
95 parser.add_argument("--lbuild", default="LBuild")
96 parser.add_argument("--save", default=".config.json")
97 parser.add_argument("--gen-build", action="store_true", default=False)
98 parser.add_argument("--gen-config", action="store_true", default=False)
99 parser.add_argument("export_dir")
101 opts = parser.parse_args()
102 builder = LunaBuild(opts)
107 except ConfigNodeError as e:
111 builder.visual_config()
117 if __name__ == "__main__":