aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py50
1 files changed, 46 insertions, 4 deletions
diff --git a/interpreter.py b/interpreter.py
index 6cfe103..7e67711 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -355,9 +355,9 @@ class CrossMachineInfo(InterpreterObject):
return self.info['endian']
class IncludeDirsHolder(InterpreterObject):
- def __init__(self, curdir, dirs):
+ def __init__(self, idobj):
super().__init__()
- self.held_object = build.IncludeDirs(curdir, dirs)
+ self.held_object = idobj
class Headers(InterpreterObject):
@@ -459,11 +459,16 @@ class BuildTargetHolder(InterpreterObject):
'extract_all_objects' : self.extract_all_objects_method,
'get_id': self.get_id_method,
'outdir' : self.outdir_method,
+ 'private_dir_include' : self.private_dir_include_method,
})
def is_cross(self):
return self.held_object.is_cross()
+ def private_dir_include_method(self, args, kwargs):
+ return IncludeDirsHolder(build.IncludeDirs('', [],
+ [self.interpreter.backend.get_target_private_dir(self.held_object)]))
+
def outdir_method(self, args, kwargs):
return self.interpreter.backend.get_target_dir(self.held_object)
@@ -905,6 +910,8 @@ class Interpreter():
'pkgconfig_gen' : self.func_pkgconfig_gen,
'vcs_tag' : self.func_vcs_tag,
'set_variable' : self.func_set_variable,
+ 'is_variable' : self.func_is_variable,
+ 'get_variable' : self.func_get_variable,
'import' : self.func_import,
'files' : self.func_files,
'declare_dependency': self.func_declare_dependency,
@@ -1003,6 +1010,29 @@ class Interpreter():
value = self.to_native(args[1])
self.set_variable(varname, value)
+ @noKwargs
+ def func_get_variable(self, node, args, kwargs):
+ if len(args)<1 or len(args)>2:
+ raise InvalidCode('Get_variable takes one or two arguments.')
+ varname = args[0]
+ if not isinstance(varname, str):
+ raise InterpreterException('First argument must be a string.')
+ try:
+ return self.variables[varname]
+ except KeyError:
+ pass
+ if len(args) == 2:
+ return args[1]
+ raise InterpreterException('Tried to get unknown variable "%s".' % varname)
+
+ @stringArgs
+ @noKwargs
+ def func_is_variable(self, node, args, kwargs):
+ if len(args) != 1:
+ raise InvalidCode('Is_variable takes two arguments.')
+ varname = args[0]
+ return varname in self.variables
+
@stringArgs
@noKwargs
def func_import(self, node, args, kwargs):
@@ -1244,6 +1274,11 @@ class Interpreter():
if not self.is_subproject() and 'subproject_dir' in kwargs:
self.subproject_dir = kwargs['subproject_dir']
+ if 'meson_version' in kwargs:
+ cv = coredata.version
+ pv = kwargs['meson_version']
+ if not mesonlib.version_compare(cv, pv):
+ raise InterpreterException('Meson version is %s but project requires %s.' % (cv, pv))
self.build.projects[self.subproject] = args[0]
mlog.log('Project name: ', mlog.bold(args[0]), sep='')
self.add_languages(node, args[1:])
@@ -1656,7 +1691,7 @@ class Interpreter():
absdir = os.path.join(absbase, a)
if not os.path.isdir(absdir):
raise InvalidArguments('Include dir %s does not exist.' % a)
- i = IncludeDirsHolder(self.subdir, args)
+ i = IncludeDirsHolder(build.IncludeDirs(self.subdir, args))
return i
@stringArgs
@@ -1814,12 +1849,12 @@ class Interpreter():
def string_method_call(self, obj, method_name, args):
obj = self.to_native(obj)
+ (posargs, _) = self.reduce_arguments(args)
if method_name == 'strip':
return obj.strip()
elif method_name == 'format':
return self.format_string(obj, args)
elif method_name == 'split':
- (posargs, _) = self.reduce_arguments(args)
if len(posargs) > 1:
raise InterpreterException('Split() must have at most one argument.')
elif len(posargs) == 1:
@@ -1829,6 +1864,13 @@ class Interpreter():
return obj.split(s)
else:
return obj.split()
+ elif method_name == 'startswith' or method_name == 'endswith':
+ s = posargs[0]
+ if not isinstance(s, str):
+ raise InterpreterException('Argument must be a string.')
+ if method_name == 'startswith':
+ return obj.startswith(s)
+ return obj.endswith(s)
raise InterpreterException('Unknown method "%s" for a string.' % method_name)
def to_native(self, arg):