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),
22 **env.external_func_table()
30 self.__dir = os.path.dirname(path)
33 self.execute(self.__path)
34 self.__env.add_sources(self.__do_process(self.__srcs))
35 self.__env.add_headers(self.__do_process(self.__hdrs))
37 def __do_process(self, list):
42 resolved.append(self.__resolve_value(entry))
45 def expand_select(self, val):
46 tests = list(val.keys())
49 "select statement must have exactly one conditional")
53 if test not in outcomes:
54 self.__raise("unbounded select")
57 def __resolve_value(self, source):
59 while not isinstance(resolved, str):
60 if isinstance(resolved, dict):
61 resolved = self.expand_select(resolved)
63 self.__raise(f"entry with unknown type: {resolved}")
65 resolved = resolved.strip()
66 resolved = join_path(self.__dir, resolved)
68 return self.__env.to_wspath(resolved)
70 def import_buildfile(self, path):
71 path = self.__resolve_value(path)
72 path = self.__env.to_wspath(path)
74 if (os.path.isdir(path)):
75 path = os.path.join(path, "LBuild")
77 if not os.path.exists(path):
78 self.__raise("Build file not exist: %s", path)
80 if os.path.abspath(path) == os.path.abspath(self.__path):
81 self.__raise("self dependency detected")
83 LunaBuildFile(self.__env, path).resolve()
85 def export_sources(self, src):
86 if not isinstance(src, list):
90 def export_headers(self, hdr):
91 if not isinstance(hdr, list):
95 def check_config(self, name):
96 return self.__env.config_provider().has_config(name)
98 def read_config(self, name):
99 return self.__env.config_provider().configured_value(name)
101 def __raise(self, msg, *kargs):
102 raise Exception(msg%kargs)