add validator to restrict the flexibility of LConfig
[lunaix-os.git] / lunaix-os / scripts / build-tools / luna_build.py
1 #!/usr/bin/env python 
2 from argparse           import ArgumentParser
3 from pathlib            import Path
4
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
10
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
16 from shared.build_gen   import BuildScriptGenerator
17 from shared.shconfig    import shconfig
18
19 class LunaBuild:
20     def __init__(self, options):
21         self.__lbuilder = BuildEnvironment()
22         self.__lconfig  = ConfigEnvironment()
23         self.__opt = options
24
25         scope = ConfigScope(self.__lconfig)
26         self.__lbuilder.register_scope(scope)
27
28         scope = ScopeProvider("src")
29         scope.file_subscope("c")
30         scope.file_subscope("h")
31         self.__lbuilder.register_scope(scope)
32
33         scope = ScopeProvider("flag")
34         scope.subscope("cc")
35         scope.subscope("ld")
36         self.__lbuilder.register_scope(scope)
37
38         self.__json  = ExportJsonFile(self.__lconfig)
39         self.__make  = ExportMakefileRules(self.__lconfig)
40         self.__headr = ExportHeaderFile(self.__lconfig)
41         self.__build = BuildScriptGenerator(self.__lbuilder)
42
43     def load(self):
44         file = self.__opt.lconfig
45         NodeBuilder.build(self.__lconfig, file)
46
47         file = self.__opt.lbuild
48         self.__lbuilder.load(file)
49
50         self.__lconfig.refresh()
51         self.__lbuilder.update()
52     
53     def restore(self):
54         save = self.__opt.save
55         if not Path(save).exists():
56             return False
57
58         restore_config_value(self.__lconfig, save)
59         return True
60
61     def save(self):
62         save = self.__opt.save
63         self.__json.export(save)
64         return True
65     
66     def generate(self):
67         outdir = Path(self.__opt.export_dir)
68         if not outdir.exists():
69             outdir.mkdir()
70
71         if self.__opt.gen_build:
72             self.__build.generate(outdir / "build.mkinc")
73
74         if self.__opt.gen_config:
75             self.__make.export(outdir / "config.mkinc")
76             self.__headr.export(outdir / "config.h")
77
78     def visual_config(self):
79         if not shconfig(self.__lconfig):
80             print("configuration process aborted")
81             exit(1)
82
83 def main():
84     parser = ArgumentParser()
85     parser.add_argument("--lconfig", default="LConfig")
86     parser.add_argument("--lbuild", default="LBuild")
87     parser.add_argument("--save", default=".config.json")
88     parser.add_argument("--gen-build", action="store_true", default=False)
89     parser.add_argument("--gen-config", action="store_true", default=False)
90     parser.add_argument("export_dir")
91
92     opts = parser.parse_args()
93     builder = LunaBuild(opts)
94
95     try:
96         builder.load()
97         builder.restore()
98     except ConfigNodeError as e:
99         print(e)
100         exit(1)
101     
102     builder.visual_config()
103     
104     builder.save()
105     builder.generate()
106
107
108 if __name__ == "__main__":
109     main()