add generic kremap for kernel remapping
[lunaix-os.git] / lunaix-os / scripts / build-tools / luna_build.py
index 848ceb6b5e51e7fd1c7e36da81a1c5b7ac0b5a6a..6b8e8979eaad764bb8a13cc10124dc6ec57c4f4f 100755 (executable)
@@ -7,6 +7,8 @@ from lcfg.common import LConfigEnvironment
 from integration.config_io import CHeaderConfigProvider
 from integration.lbuild_bridge import LConfigProvider
 from integration.render_ishell import InteractiveShell
 from integration.config_io import CHeaderConfigProvider
 from integration.lbuild_bridge import LConfigProvider
 from integration.render_ishell import InteractiveShell
+from integration.build_gen import MakefileBuildGen, install_lbuild_functions
+from integration.lunamenu import menuconfig, TerminalSizeCheckFailed
 
 import lcfg.types as lcfg_type
 import lcfg.builtins as builtin
 
 import lcfg.types as lcfg_type
 import lcfg.builtins as builtin
@@ -26,27 +28,44 @@ def prepare_lconfig_env(out_dir):
     env.register_builtin_func(builtin.parent)
     env.register_builtin_func(builtin.default)
     env.register_builtin_func(builtin.include)
     env.register_builtin_func(builtin.parent)
     env.register_builtin_func(builtin.default)
     env.register_builtin_func(builtin.include)
+    env.register_builtin_func(builtin.env)
+    env.register_builtin_func(builtin.set_value)
 
     env.type_factory().regitser(lcfg_type.PrimitiveType)
     env.type_factory().regitser(lcfg_type.MultipleChoiceType)
 
     return env
 
 
     env.type_factory().regitser(lcfg_type.PrimitiveType)
     env.type_factory().regitser(lcfg_type.MultipleChoiceType)
 
     return env
 
-def do_config(lcfg_env):
-    shell = InteractiveShell(lcfg_env)
-    if not shell.render_loop():
-        print("Configuration aborted.")
-        exit(-1)
+def do_config(opt, lcfg_env):
+    redo_config = not exists(opt.config_save) or opt.force
+    if not redo_config or opt.quiet:
+        return
 
 
-    lcfg_env.export()
-    lcfg_env.save()
+    try:
+        clean_quit = menuconfig(lcfg_env)
+    except TerminalSizeCheckFailed as e:
+        least = e.args[0]
+        current = e.args[1]
+        print(
+            f"Your terminal size: {current} is less than minimum requirement of {least}.\n"
+            "menuconfig will not function properly, switch to prompt based.\n")
+
+        shell = InteractiveShell(lcfg_env)
+        clean_quit = shell.render_loop()
+    
+    if not clean_quit:
+        print("Configuration aborted. Nothing has been saved.")
+        exit(-1)
 
 def do_buildfile_gen(opts, lcfg_env):
     root_path = abspath(opts.root)
     ws_path = dirname(root_path)
     root_name = basename(root_path)
 
 
 def do_buildfile_gen(opts, lcfg_env):
     root_path = abspath(opts.root)
     ws_path = dirname(root_path)
     root_name = basename(root_path)
 
-    env = BuildEnvironment(ws_path)
+    mkgen = MakefileBuildGen(opts.out_dir)
+    env = BuildEnvironment(ws_path, mkgen)
+
+    install_lbuild_functions(env)
 
     cfg_provider = LConfigProvider(lcfg_env)
     env.set_config_provider(cfg_provider)
 
     cfg_provider = LConfigProvider(lcfg_env)
     env.set_config_provider(cfg_provider)
@@ -59,12 +78,15 @@ def do_buildfile_gen(opts, lcfg_env):
         print("failed to resolve root build file")
         raise err
     
         print("failed to resolve root build file")
         raise err
     
-    env.export(opts.out_dir)
+    env.export()
 
 def main():
     parser = ArgumentParser()
     parser.add_argument("--config", action="store_true", default=False)
 
 def main():
     parser = ArgumentParser()
     parser.add_argument("--config", action="store_true", default=False)
+    parser.add_argument("--quiet", action="store_true", default=False)
     parser.add_argument("--lconfig-file", default="LConfig")
     parser.add_argument("--lconfig-file", default="LConfig")
+    parser.add_argument("--config-save", default=".config.json")
+    parser.add_argument("--force", action="store_true", default=False)
     parser.add_argument("root", nargs="?", default="LBuild")
     parser.add_argument("-o", "--out-dir", required=True)
 
     parser.add_argument("root", nargs="?", default="LBuild")
     parser.add_argument("-o", "--out-dir", required=True)
 
@@ -74,14 +96,26 @@ def main():
         mkdir(out_dir)
     
     lcfg_env = prepare_lconfig_env(out_dir)
         mkdir(out_dir)
     
     lcfg_env = prepare_lconfig_env(out_dir)
-    lcfg_env.resolve_module(opts.lconfig_file)
-    lcfg_env.update()
-    lcfg_env.load()
-
+    require_config = exists(opts.lconfig_file)
+    try:
+        if require_config:
+            lcfg_env.resolve_module(opts.lconfig_file)
+            lcfg_env.update()
+            lcfg_env.load()
+    except Exception as e:
+        print(e)
+    
     if opts.config:
     if opts.config:
-        do_config(lcfg_env)
-    else:
-        do_buildfile_gen(opts, lcfg_env)
+        if require_config:
+            do_config(opts, lcfg_env)
+        else:
+            print("No configuration file detected, skipping...")
+        
+        lcfg_env.update()
+        lcfg_env.save(opts.config_save)
+        lcfg_env.export()
+
+    do_buildfile_gen(opts, lcfg_env)
 
 if __name__ == "__main__":
     main()
\ No newline at end of file
 
 if __name__ == "__main__":
     main()
\ No newline at end of file