summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/interpreter/interpreter.py22
-rw-r--r--mesonbuild/interpreter/type_checking.py31
2 files changed, 41 insertions, 12 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 5cadf5258..07afdce5f 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -77,6 +77,8 @@ from .type_checking import (
REQUIRED_KW,
NoneType,
in_set_validator,
+ variables_validator,
+ variables_convertor,
env_convertor_with_method
)
from . import primitives as P_OBJ
@@ -633,23 +635,19 @@ class Interpreter(InterpreterBase, HoldableObject):
if dict_new and variables:
FeatureNew.single_use(f'{argname} as dictionary', '0.56.0', self.subproject, location=self.current_node)
else:
- varlist = mesonlib.stringlistify(variables)
+ variables = mesonlib.stringlistify(variables)
if list_new:
FeatureNew.single_use(f'{argname} as list of strings', '0.56.0', self.subproject, location=self.current_node)
- variables = {}
- for v in varlist:
- try:
- (key, value) = v.split('=', 1)
- except ValueError:
- raise InterpreterException(f'Variable {v!r} must have a value separated by equals sign.')
- variables[key.strip()] = value.strip()
+
+ invalid_msg = variables_validator(variables)
+ if invalid_msg is not None:
+ raise InterpreterException(invalid_msg)
+
+ variables = variables_convertor(variables)
for k, v in variables.items():
- if not k or not v:
- raise InterpreterException('Empty variable name or value')
- if any(c.isspace() for c in k):
- raise InterpreterException(f'Invalid whitespace in variable name "{k}"')
if not isinstance(v, str):
raise InterpreterException('variables values must be strings.')
+
return variables
@FeatureNewKwargs('declare_dependency', '0.46.0', ['link_whole'])
diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py
index ec23f36e7..864153c28 100644
--- a/mesonbuild/interpreter/type_checking.py
+++ b/mesonbuild/interpreter/type_checking.py
@@ -107,6 +107,37 @@ def _lower_strlist(input: T.List[str]) -> T.List[str]:
return [i.lower() for i in input]
+def variables_validator(contents: T.Union[T.List[str], T.Dict[str, str]]) -> T.Optional[str]:
+ if isinstance(contents, dict):
+ variables = contents
+ else:
+ variables = {}
+ for v in contents:
+ try:
+ key, val = v.split('=', 1)
+ except ValueError:
+ return f'variable {v!r} must have a value separated by equals sign.'
+ variables[key.strip()] = val.strip()
+ for k, v in variables.items():
+ if not k:
+ return 'empty variable name'
+ if not v:
+ return 'empty variable value'
+ if any(c.isspace() for c in k):
+ return f'invalid whitespace in variable name {k!r}'
+ return None
+
+
+def variables_convertor(contents: T.Union[T.List[str], T.Dict[str, str]]) -> T.Dict[str, str]:
+ if isinstance(contents, dict):
+ return contents
+ variables = {}
+ for v in contents:
+ key, val = v.split('=', 1)
+ variables[key.strip()] = val.strip()
+ return variables
+
+
NATIVE_KW = KwargInfo(
'native', bool,
default=False,