aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py43
1 files changed, 37 insertions, 6 deletions
diff --git a/interpreter.py b/interpreter.py
index c8947c2..064a2e9 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -411,8 +411,8 @@ class JarHolder(BuildTargetHolder):
super().__init__(build.Jar, name, subdir, is_cross, sources, objects, environment, kwargs)
class CustomTargetHolder(InterpreterObject):
- def __init__(self, name, subdir, kwargs):
- self.held_object = build.CustomTarget(name, subdir, kwargs)
+ def __init__(self, object_to_hold):
+ self.held_object = object_to_hold
def is_cross(self):
return self.held_object.is_cross()
@@ -593,18 +593,27 @@ class CompilerHolder(InterpreterObject):
mlog.log('Has header "%s":' % string, h)
return haz
+class ModuleState:
+ pass
+
class ModuleHolder(InterpreterObject):
- def __init__(self, modname):
+ def __init__(self, modname, interpreter):
InterpreterObject.__init__(self)
self.modname = modname
self.m = importlib.import_module('modules.' + modname)
+ self.interpreter = interpreter
def method_call(self, method_name, args, kwargs):
try:
fn = getattr(self.m, method_name)
except AttributeError:
raise InvalidArguments('Module %s does not have method %s.' % (self.modname, method_name))
- fn(args, kwargs)
+ state = ModuleState()
+ state.build_to_src = os.path.relpath(self.interpreter.environment.get_source_dir(),
+ self.interpreter.environment.get_build_dir())
+ state.subdir = self.interpreter.subdir
+ value = fn(state, args, kwargs)
+ return self.interpreter.module_method_callback(value)
class MesonMain(InterpreterObject):
def __init__(self, build, interpreter):
@@ -759,6 +768,28 @@ class Interpreter():
'import' : self.func_import,
}
+ def module_method_callback(self, invalues):
+ unwrap_single = False
+ if invalues is None:
+ return
+ if not isinstance(invalues, list):
+ unwrap_single = True
+ invalues = [invalues]
+ outvalues = []
+ for v in invalues:
+ if isinstance(v, build.CustomTarget):
+ if v.name in self.build.targets:
+ raise InterpreterException('Tried to create target %s which already exists.' % v.name)
+ self.build.targets[v.name] = v
+ outvalues.append(CustomTargetHolder(v))
+ elif isinstance(v, int) or isinstance(v, str):
+ outvalues.append(v)
+ else:
+ raise InterpreterException('Module returned a value of unknown type.')
+ if len(outvalues) == 1 and unwrap_single:
+ return outvalues[0]
+ return outvalues
+
def get_build_def_files(self):
return self.build_def_files
@@ -821,7 +852,7 @@ class Interpreter():
if not isinstance(modname, str):
raise InvalidCode('Argument to import was not a string')
if not modname in self.modules:
- self.modules[modname] = ModuleHolder(modname)
+ self.modules[modname] = ModuleHolder(modname, self)
return self.modules[modname]
def set_variable(self, varname, variable):
@@ -1200,7 +1231,7 @@ class Interpreter():
% name)
if name in self.build.targets:
raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name)
- tg = CustomTargetHolder(name, self.subdir, kwargs)
+ tg = CustomTargetHolder(build.CustomTarget(name, self.subdir, kwargs))
self.build.targets[name] = tg.held_object
return tg