diff options
author | Thibault Saunier <saunierthibault@gmail.com> | 2016-09-14 17:11:27 -0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2016-09-14 23:11:27 +0300 |
commit | a2e7ebc575a47bfb3dfb774591cde3fdc6873dc9 (patch) | |
tree | bde1198cb0fde59c2ca09b78ff7a832a38aad238 /mesonbuild/interpreter.py | |
parent | 8fd8c16a879742a840b8f3a431539a261b8552ba (diff) | |
download | meson-a2e7ebc575a47bfb3dfb774591cde3fdc6873dc9.zip meson-a2e7ebc575a47bfb3dfb774591cde3fdc6873dc9.tar.gz meson-a2e7ebc575a47bfb3dfb774591cde3fdc6873dc9.tar.bz2 |
Add a new 'environment' object to be used to build test environment (#781)
Allowing user to fine tune tests environment variables
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter.py | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 316f8c4..80617dd 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -180,6 +180,37 @@ class ConfigureFileHolder(InterpreterObject): InterpreterObject.__init__(self) self.held_object = build.ConfigureFile(subdir, sourcename, targetname, configuration_data) + +class EnvironmentVariablesHolder(InterpreterObject): + def __init__(self): + super().__init__() + self.held_object = build.EnvironmentVariables() + self.methods.update({'set': self.set_method, + 'append': self.append_method, + 'prepend' : self.prepend_method, + }) + + @stringArgs + def add_var(self, method, args, kwargs): + if not isinstance(kwargs.get("separator", ""), str): + raise InterpreterException("EnvironmentVariablesHolder methods 'separator'" + " argument needs to be a string.") + if len(args) < 2: + raise InterpreterException("EnvironmentVariablesHolder methods require at least" + "2 arguments, first is the name of the variable and" + " following one are values") + self.held_object.envvars.append((method, args[0], args[1:], kwargs)) + + def set_method(self, args, kwargs): + self.add_var(self.held_object.set, args, kwargs) + + def append_method(self, args, kwargs): + self.add_var(self.held_object.append, args, kwargs) + + def prepend_method(self, args, kwargs): + self.add_var(self.held_object.prepend, args, kwargs) + + class ConfigurationDataHolder(InterpreterObject): def __init__(self): super().__init__() @@ -1124,6 +1155,7 @@ class Interpreter(): 'files' : self.func_files, 'declare_dependency': self.func_declare_dependency, 'assert': self.func_assert, + 'environment' : self.func_environment, } def module_method_callback(self, invalues): @@ -1949,18 +1981,21 @@ class Interpreter(): if not isinstance(i, (str, mesonlib.File)): raise InterpreterException('Command line arguments must be strings') envlist = kwargs.get('env', []) - if not isinstance(envlist, list): - envlist = [envlist] - env = {} - for e in envlist: - if '=' not in e: - raise InterpreterException('Env var definition must be of type key=val.') - (k, val) = e.split('=', 1) - k = k.strip() - val = val.strip() - if ' ' in k: - raise InterpreterException('Env var key must not have spaces in it.') - env[k] = val + if isinstance(envlist, EnvironmentVariablesHolder): + env = envlist.held_object + else: + if not isinstance(envlist, list): + envlist = [envlist] + env = {} + for e in envlist: + if '=' not in e: + raise InterpreterException('Env var definition must be of type key=val.') + (k, val) = e.split('=', 1) + k = k.strip() + val = val.strip() + if ' ' in k: + raise InterpreterException('Env var key must not have spaces in it.') + env[k] = val valgrind_args = kwargs.get('valgrind_args', []) if not isinstance(valgrind_args, list): valgrind_args = [valgrind_args] @@ -2147,6 +2182,10 @@ class Interpreter(): else: self.build.global_link_args[lang] = args + + def func_environment(self, node, args, kwargs): + return EnvironmentVariablesHolder() + def flatten(self, args): if isinstance(args, mparser.StringNode): return args.value |