1 from lib.sandbox import Sandbox
2 from lib.utils import join_path
3 from .common import BuildEnvironment
7 class LunaBuildFile(Sandbox):
8 def __init__(self, env: BuildEnvironment, path) -> None:
13 lambda src: self.export_sources(src),
15 lambda hdr: self.export_headers(hdr),
17 lambda name: self.check_config(name),
19 lambda name: self.read_config(name),
21 lambda file: self.import_buildfile(file)
29 self.__dir = os.path.dirname(path)
32 self.execute(self.__path)
33 self.__env.add_sources(self.__do_process(self.__srcs))
34 self.__env.add_headers(self.__do_process(self.__hdrs))
36 def __do_process(self, list):
41 resolved.append(self.__resolve_value(entry))
44 def expand_select(self, val):
45 tests = list(val.keys())
48 "select statement must have exactly one conditional")
52 if test not in outcomes:
53 self.__raise("unbounded select")
56 def __resolve_value(self, source):
58 while not isinstance(resolved, str):
59 if isinstance(resolved, dict):
60 resolved = self.expand_select(resolved)
62 self.__raise(f"entry with unknown type: {resolved}")
64 resolved = resolved.strip()
65 resolved = join_path(self.__dir, resolved)
67 return self.__env.to_wspath(resolved)
69 def import_buildfile(self, path):
70 path = self.__resolve_value(path)
71 path = self.__env.to_wspath(path)
73 if (os.path.isdir(path)):
74 path = os.path.join(path, "LBuild")
76 if not os.path.exists(path):
77 self.__raise("Build file not exist: %s", path)
79 if os.path.abspath(path) == os.path.abspath(self.__path):
80 self.__raise("self dependency detected")
82 LunaBuildFile(self.__env, path).resolve()
84 def export_sources(self, src):
85 if not isinstance(src, list):
89 def export_headers(self, hdr):
90 if not isinstance(hdr, list):
94 def check_config(self, name):
95 return self.__env.config_provider().has_config(name)
97 def read_config(self, name):
98 return self.__env.config_provider().configured_value(name)
100 def __raise(self, msg, *kargs):
101 raise Exception(msg%kargs)