0f96e3e4dfd5901e99bf01e5a0d66b353140aff2
[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, EnvScope
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.__lbuilder.register_scope(EnvScope())
39
40         self.__json  = ExportJsonFile(self.__lconfig)
41         self.__make  = ExportMakefileRules(self.__lconfig)
42         self.__headr = ExportHeaderFile(self.__lconfig)
43         self.__build = BuildScriptGenerator(self.__lbuilder)
44
45     def load(self):
46         file = self.__opt.lconfig
47         NodeBuilder.build(self.__lconfig, file)
48
49         file = self.__opt.lbuild
50         self.__lbuilder.load(file)
51
52         self.__lconfig.refresh()
53         self.__lbuilder.update()
54     
55     def restore(self):
56         save = self.__opt.save
57         if not Path(save).exists():
58             return False
59
60         restore_config_value(self.__lconfig, save)
61         return True
62
63     def save(self):
64         save = self.__opt.save
65         self.__json.export(save)
66         return True
67     
68     def generate(self):
69         outdir = Path(self.__opt.export_dir)
70         if not outdir.exists():
71             outdir.mkdir()
72
73         if self.__opt.gen_build:
74             self.__build.generate(outdir / "build.mkinc")
75
76         if self.__opt.gen_config:
77             self.__make.export(outdir / "config.mkinc")
78             self.__headr.export(outdir / "config.h")
79
80     def visual_config(self):
81         if not self.__lconfig.loaded():
82             print("no config file loaded, skipped interactive config")
83             return
84         
85         if not self.__opt.gen_config:
86             return
87         
88         if not shconfig(self.__lconfig):
89             print("configuration process aborted")
90             exit(1)
91
92 def main():
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")
100
101     opts = parser.parse_args()
102     builder = LunaBuild(opts)
103
104     try:
105         builder.load()
106         builder.restore()
107     except ConfigNodeError as e:
108         print(e)
109         exit(1)
110     
111     builder.visual_config()
112     
113     builder.save()
114     builder.generate()
115
116
117 if __name__ == "__main__":
118     main()