diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-03-08 15:37:57 -0500 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2021-03-16 09:00:50 -0400 |
commit | e0fcccc6e21341841014ff0ef685cf20d78e8fde (patch) | |
tree | 2054dd5198ec85796763c9388b64c54cc4c1c39c | |
parent | 2be074b1d445fcd30535bcf7518f8ce0738bcbf3 (diff) | |
download | meson-e0fcccc6e21341841014ff0ef685cf20d78e8fde.tar.gz |
EnvironmentVariables: Simplify and annotate
-rw-r--r-- | mesonbuild/backend/backends.py | 8 | ||||
-rw-r--r-- | mesonbuild/build.py | 45 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 44 |
3 files changed, 51 insertions, 46 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 96d2f4610..9f7f45de7 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -1223,10 +1223,10 @@ class Backend: def get_run_target_env(self, target: build.RunTarget) -> build.EnvironmentVariables: env = target.env if target.env else build.EnvironmentVariables() introspect_cmd = join_args(self.environment.get_build_command() + ['introspect']) - env.add_var(env.set, 'MESON_SOURCE_ROOT', [self.environment.get_source_dir()], {}) - env.add_var(env.set, 'MESON_BUILD_ROOT', [self.environment.get_build_dir()], {}) - env.add_var(env.set, 'MESON_SUBDIR', [target.subdir], {}) - env.add_var(env.set, 'MESONINTROSPECT', [introspect_cmd], {}) + env.set('MESON_SOURCE_ROOT', [self.environment.get_source_dir()]) + env.set('MESON_BUILD_ROOT', [self.environment.get_build_dir()]) + env.set('MESON_SUBDIR', [target.subdir]) + env.set('MESONINTROSPECT', [introspect_cmd]) return env def run_postconf_scripts(self) -> None: diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 620f40f93..e3fad3d6f 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -402,41 +402,36 @@ class EnvironmentVariables: repr_str = "<{0}: {1}>" return repr_str.format(self.__class__.__name__, self.envvars) - def add_var(self, method, name, args, kwargs): - self.varnames.add(name) - self.envvars.append((method, name, args, kwargs)) - - def has_name(self, name): + def has_name(self, name: str) -> bool: return name in self.varnames - def get_value(self, values, kwargs): - separator = kwargs.get('separator', os.pathsep) + def set(self, name: str, values: T.List[str], separator: str = os.pathsep) -> None: + self.varnames.add(name) + self.envvars.append((self._set, name, values, separator)) - value = '' - for var in values: - value += separator + var - return separator, value.strip(separator) + def append(self, name: str, values: T.List[str], separator: str = os.pathsep) -> None: + self.varnames.add(name) + self.envvars.append((self._append, name, values, separator)) - def set(self, env, name, values, kwargs): - return self.get_value(values, kwargs)[1] + def prepend(self, name: str, values: T.List[str], separator: str = os.pathsep) -> None: + self.varnames.add(name) + self.envvars.append((self._prepend, name, values, separator)) - def append(self, env, name, values, kwargs): - sep, value = self.get_value(values, kwargs) - if name in env: - return env[name] + sep + value - return value + def _set(self, env: T.Dict[str, str], name: str, values: T.List[str], separator: str) -> str: + return separator.join(values) - def prepend(self, env, name, values, kwargs): - sep, value = self.get_value(values, kwargs) - if name in env: - return value + sep + env[name] + def _append(self, env: T.Dict[str, str], name: str, values: T.List[str], separator: str) -> str: + curr = env.get(name) + return separator.join(values if curr is None else [curr] + values) - return value + def _prepend(self, env: T.Dict[str, str], name: str, values: T.List[str], separator: str) -> str: + curr = env.get(name) + return separator.join(values if curr is None else values + [curr]) def get_env(self, full_env: T.Dict[str, str]) -> T.Dict[str, str]: env = full_env.copy() - for method, name, values, kwargs in self.envvars: - env[name] = method(full_env, name, values, kwargs) + for method, name, values, separator in self.envvars: + env[name] = method(full_env, name, values, separator) return env class Target: diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index e563f36f0..84d5e5cd5 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -269,40 +269,50 @@ class EnvironmentVariablesHolder(MutableInterpreterObject, ObjectHolder[build.En elif initial_values: raise AssertionError('Unsupported EnvironmentVariablesHolder initial_values') - def __repr__(self): + def __repr__(self) -> str: repr_str = "<{0}: {1}>" return repr_str.format(self.__class__.__name__, self.held_object.envvars) - def add_var(self, method, args, kwargs): - if not isinstance(kwargs.get("separator", ""), str): + def unpack_separator(self, kwargs: T.Dict[str, T.Any]) -> str: + separator = kwargs.get('separator', os.pathsep) + if not isinstance(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") + return separator + + def warn_if_has_name(self, name: str) -> None: # Warn when someone tries to use append() or prepend() on an env var # which already has an operation set on it. People seem to think that # multiple append/prepend operations stack, but they don't. - if method != self.held_object.set and self.held_object.has_name(args[0]): - mlog.warning('Overriding previous value of environment variable {!r} with a new one' - .format(args[0]), location=self.current_node) - self.held_object.add_var(method, args[0], args[1:], kwargs) + if self.held_object.has_name(name): + mlog.warning(f'Overriding previous value of environment variable {name!r} with a new one', + location=self.current_node) @stringArgs @permittedKwargs({'separator'}) - def set_method(self, args, kwargs): - self.add_var(self.held_object.set, args, kwargs) + @typed_pos_args('environment.set', str, varargs=str, min_varargs=1) + def set_method(self, args: T.Tuple[str, T.List[str]], kwargs: T.Dict[str, T.Any]) -> None: + name, values = args + separator = self.unpack_separator(kwargs) + self.held_object.set(name, values, separator) @stringArgs @permittedKwargs({'separator'}) - def append_method(self, args, kwargs): - self.add_var(self.held_object.append, args, kwargs) + @typed_pos_args('environment.append', str, varargs=str, min_varargs=1) + def append_method(self, args: T.Tuple[str, T.List[str]], kwargs: T.Dict[str, T.Any]) -> None: + name, values = args + separator = self.unpack_separator(kwargs) + self.warn_if_has_name(name) + self.held_object.append(name, values, separator) @stringArgs @permittedKwargs({'separator'}) - def prepend_method(self, args, kwargs): - self.add_var(self.held_object.prepend, args, kwargs) + @typed_pos_args('environment.prepend', str, varargs=str, min_varargs=1) + def prepend_method(self, args: T.Tuple[str, T.List[str]], kwargs: T.Dict[str, T.Any]) -> None: + name, values = args + separator = self.unpack_separator(kwargs) + self.warn_if_has_name(name) + self.held_object.prepend(name, values, separator) class ConfigurationDataHolder(MutableInterpreterObject, ObjectHolder[build.ConfigurationData]): |