aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rwxr-xr-xinterpreter.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py
index 223ff85..570def3 100755
--- a/interpreter.py
+++ b/interpreter.py
@@ -38,6 +38,47 @@ class InterpreterObject():
return self.methods[method_name](args, kwargs)
raise InvalidCode('Unknown method "%s" in object.' % method_name)
+class Generator(InterpreterObject):
+
+ def __init__(self, args, kwargs):
+ InterpreterObject.__init__(self)
+ if len(args) != 1:
+ raise InvalidArguments('Generator requires one and only one positional argument')
+ if not isinstance(args[0], Executable):
+ raise InvalidArguments('First generator argument must be an executable object.')
+ self.exe = args[0]
+ self.methods.update({'process' : self.process_method})
+ self.process_kwargs(kwargs)
+
+ def process_kwargs(self, kwargs):
+ if 'arguments' not in kwargs:
+ raise InvalidArguments('Generator must have "arguments" keyword argument.')
+ args = kwargs['arguments']
+ if isinstance(args, str):
+ args = [args]
+ if not isinstance(args, list):
+ raise InvalidArguments('"Arguments" keyword argument must be a string or a list of strings.')
+ for a in args:
+ if not isinstance(a, str):
+ raise InvalidArguments('A non-string object in "arguments" keyword argument.')
+ self.arglist = args
+
+ if 'name_rule' not in kwargs:
+ raise InvalidArguments('Generator must have "name_rule" keyword argument.')
+ rule = kwargs['name_rule']
+ if not isinstance(rule, str):
+ raise InvalidArguments('"name_rule" keyword argument must be a string.')
+ if not '@BASENAME@' in rule:
+ raise InvalidArguments('"name_rule" must contain @BASENAME@.')
+ self.name_rule = rule
+
+ def get_base_outname(self, inname):
+ base = os.path.split()[1]
+ return self.name_rule.replace('@BASENAME@', base)
+
+ def process_method(self, args, kwargs):
+ return self
+
# This currently returns data for the current environment.
# It should return info for the target host.
class Host(InterpreterObject):
@@ -351,6 +392,7 @@ class Interpreter():
self.build_func_dict()
self.build_def_files = [environment.build_filename]
self.subdir = ''
+ self.generators = []
def build_func_dict(self):
self.funcs = {'project' : self.func_project,
@@ -359,6 +401,7 @@ class Interpreter():
'find_dep' : self.func_find_dep,
'static_library' : self.func_static_lib,
'shared_library' : self.func_shared_lib,
+ 'generator' : self.func_generator,
'add_test' : self.func_add_test,
'headers' : self.func_headers,
'man' : self.func_man,
@@ -491,6 +534,11 @@ class Interpreter():
def func_shared_lib(self, node, args, kwargs):
return self.build_target(node, args, kwargs, SharedLibrary)
+ def func_generator(self, node, args, kwargs):
+ gen = Generator(args, kwargs)
+ self.generators.append(gen)
+ return gen
+
def func_add_test(self, node, args, kwargs):
self.validate_arguments(args, 2, [str, Executable])
t = Test(args[0], args[1])
@@ -651,6 +699,8 @@ class Interpreter():
return self.method_call(arg)
elif isinstance(arg, nodes.BoolStatement) or isinstance(arg, nodes.BoolExpression):
return arg.get_value()
+ elif isinstance(arg, nodes.ArrayStatement):
+ return [self.reduce_single(curarg) for curarg in arg.args.arguments]
else:
raise InvalidCode('Line %d: Irreducible argument.' % arg.lineno())