Skip to content

Commit

Permalink
limit wrapped-due-to-env special case for env to only apply for env…
Browse files Browse the repository at this point in the history
….set

In commit 2cb7350 we added a special
case for environment() objects to allow skipping `meson --internal exe`
overhead when /usr/bin/env exists and can be used to set environment
variables instead of using a pickled wrapper.

This special case assumed that environment is used for setting
variables, but it is also possible, albeit less common, to
append/prepend to them, in which case `meson --internal exe` will
compute the final value as an offset from whatever the current environment
variables inherited from ninja are. It is not possible to precompute
this when generating command lines for ninja, so using arguments to
/usr/bin/env is not possible. All it can do is set (override) an
environment variable.

In this case, we have to use the python wrapper and cannot optimize it
away. Add a tracking bit to the env object and propagate it to the
backend.
  • Loading branch information
eli-schwartz committed Jun 24, 2024
1 parent 1570289 commit aab2533
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
2 changes: 1 addition & 1 deletion mesonbuild/backend/backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ def as_meson_exe_cmdline(self, exe: T.Union[str, mesonlib.File, build.BuildTarge
# It's also overridden for a few conditions that can't be handled
# inside a command line

can_use_env = not force_serialize
can_use_env = env.can_use_env and not force_serialize
force_serialize = force_serialize or bool(reasons)

if capture:
Expand Down
8 changes: 7 additions & 1 deletion mesonbuild/utils/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ def __init__(self, values: T.Optional[EnvInitValueType] = None,
# The set of all env vars we have operations for. Only used for self.has_name()
self.varnames: T.Set[str] = set()
self.unset_vars: T.Set[str] = set()
self.can_use_env = True

if values:
init_func = getattr(self, init_method)
Expand Down Expand Up @@ -95,7 +96,9 @@ def merge(self, other: EnvironmentVariables) -> None:
self.envvars.append((method, name, values, separator))
if name in self.unset_vars:
self.unset_vars.remove(name)
self.unset_vars.update(other.unset_vars)
if other.unset_vars:
self.can_use_env = False
self.unset_vars.update(other.unset_vars)

def set(self, name: str, values: T.List[str], separator: str = os.pathsep) -> None:
if name in self.unset_vars:
Expand All @@ -104,17 +107,20 @@ def set(self, name: str, values: T.List[str], separator: str = os.pathsep) -> No
self.envvars.append((self._set, name, values, separator))

def unset(self, name: str) -> None:
self.can_use_env = False
if name in self.varnames:
raise MesonException(f'You cannot unset the {name!r} variable because it is already set')
self.unset_vars.add(name)

def append(self, name: str, values: T.List[str], separator: str = os.pathsep) -> None:
self.can_use_env = False
if name in self.unset_vars:
raise MesonException(f'You cannot append to unset variable {name!r}')
self.varnames.add(name)
self.envvars.append((self._append, name, values, separator))

def prepend(self, name: str, values: T.List[str], separator: str = os.pathsep) -> None:
self.can_use_env = False
if name in self.unset_vars:
raise MesonException(f'You cannot prepend to unset variable {name!r}')
self.varnames.add(name)
Expand Down

0 comments on commit aab2533

Please sign in to comment.