Rewrite the lunabuild toolchain with enhanced feature (#60)
[lunaix-os.git] / lunaix-os / scripts / build-tools / lbuild / common.py
index a973760136bacc09dca68c6e56e4f47f0348c2af..01a226cfa6f333849ca1e05eaa40b419fe420d05 100644 (file)
@@ -1,59 +1,57 @@
-from lib.utils import join_path
-import os
+import ast
+from pathlib import Path
 
-class BuildEnvironment:
-    def __init__(self, workspace_dir, generator) -> None:
-        self.__config_provider = None
-        self.__sources = []
-        self.__headers = []
-        self.__inc_dir = []
-        self.__ws_dir = workspace_dir
-        self.__ext_object = {}
-        self.__ext_function = {}
-        self.__generator = generator
+class DirectoryTracker:
+    def __init__(self):
+        self.__stack = []
 
-    def set_config_provider(self, provider):
-        self.__config_provider = provider
-    
-    def config_provider(self):
-        return self.__config_provider
-    
-    def add_sources(self, sources):
-        self.__sources += sources
+    def push(self, dir):
+        self.__stack.append(Path(dir))
 
-    def add_headers(self, sources):
-        for h in sources:
-            if not os.path.isdir(h):
-                self.__headers.append(h)
-            else:
-                self.__inc_dir.append(h)
-
-    def to_wspath(self, file):
-        path = join_path(self.__ws_dir, file)
-        return os.path.relpath(path, self.__ws_dir)
+    def pop(self):
+        self.__stack.pop()
     
-    def export(self):
-        self.__generator.generate(self)
-
-    def get_object(self, key, _default=None):
-        return _default if key not in self.__ext_object else self.__ext_object[key]
+    def active_relative(self):
+        root = self.__stack[0]
+        return self.__stack[-1].relative_to(root)
 
-    def set_object(self, key, object):
-        self.__ext_object[key] = object
-
-    def srcs(self):
-        return list(self.__sources)
-    
-    def headers(self):
-        return list(self.__headers)
+    @staticmethod
+    def context_name():
+        return "__FILESTACK__"
     
-    def includes(self):
-        return list(self.__inc_dir)
+    @staticmethod
+    def get(context):
+        return context[DirectoryTracker.context_name()]
     
-    def add_external_func(self, function):
-        name = function.__name__
-        invk = lambda *args, **kwargs: function(self, *args, **kwargs)
-        self.__ext_function[name] = invk
-
-    def external_func_table(self):
-        return self.__ext_function
\ No newline at end of file
+    @staticmethod
+    def bind(context):
+        name = DirectoryTracker.context_name()
+        context[name] = DirectoryTracker()
+
+    @staticmethod
+    def emit_enter(dir):
+        name = DirectoryTracker.context_name()
+        return ast.Expr(
+                    ast.Call(
+                        func=ast.Attribute(
+                            value=ast.Name(name, ctx=ast.Load()),
+                            attr="push",
+                            ctx=ast.Load()
+                        ),
+                        args=[
+                            ast.Constant(str(dir))
+                        ],
+                        keywords=[]))
+
+    @staticmethod
+    def emit_leave():
+        name = DirectoryTracker.context_name()
+        return ast.Expr(
+                    ast.Call(
+                        func=ast.Attribute(
+                            value=ast.Name(name, ctx=ast.Load()),
+                            attr="pop",
+                            ctx=ast.Load()
+                        ),
+                        args=[],
+                        keywords=[]))