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.__srcs)
35 self.__env.add_headers(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 isinstance(resolved, dict):
60 if isinstance(resolved, dict):
61 resolved = self.expand_select(resolved)
63 self.__raise(f"entry with unknown type: {resolved}")
65 if isinstance(resolved, list):
68 file = join_path(self.__dir, file)
69 file = self.__env.to_wspath(file)
72 rs = join_path(self.__dir, resolved)
73 rs = [self.__env.to_wspath(rs)]
77 def import_buildfile(self, path):
78 path = self.__resolve_value(path)
80 if (os.path.isdir(p)):
81 p = os.path.join(p, "LBuild")
83 if not os.path.exists(p):
84 self.__raise("Build file not exist: %s", p)
86 if os.path.abspath(p) == os.path.abspath(self.__path):
87 self.__raise("self dependency detected")
89 LunaBuildFile(self.__env, p).resolve()
91 def export_sources(self, src):
92 src = self.__resolve_value(src)
95 def export_headers(self, hdr):
96 hdr = self.__resolve_value(hdr)
99 def check_config(self, name):
100 return self.__env.config_provider().has_config(name)
102 def read_config(self, name):
103 return self.__env.config_provider().configured_value(name)
105 def __raise(self, msg, *kargs):
106 raise Exception(msg%kargs)