diff options
Diffstat (limited to 'interpreter.py')
-rw-r--r-- | interpreter.py | 50 |
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): |