diff options
Diffstat (limited to 'mesonbuild/mdevenv.py')
-rw-r--r-- | mesonbuild/mdevenv.py | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/mesonbuild/mdevenv.py b/mesonbuild/mdevenv.py index 0fc8595..6268c1d 100644 --- a/mesonbuild/mdevenv.py +++ b/mesonbuild/mdevenv.py @@ -2,10 +2,11 @@ import os, subprocess import argparse import tempfile import shutil +import itertools from pathlib import Path from . import build, minstall, dependencies -from .mesonlib import MesonException, RealPathAction, is_windows, setup_vsenv, OptionKey +from .mesonlib import MesonException, RealPathAction, is_windows, setup_vsenv, OptionKey, quote_arg from . import mlog import typing as T @@ -14,7 +15,9 @@ if T.TYPE_CHECKING: def add_arguments(parser: argparse.ArgumentParser) -> None: parser.add_argument('-C', dest='wd', action=RealPathAction, - help='directory to cd into before running') + help='Directory to cd into before running') + parser.add_argument('--dump', action='store_true', + help='Only print required environment (Since 0.62.0)') parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run in developer environment (default: interactive shell)') @@ -25,11 +28,7 @@ def get_windows_shell() -> str: result = subprocess.check_output(command) return result.decode().strip() -def get_env(b: build.Build, build_dir: str) -> T.Dict[str, str]: - env = os.environ.copy() - for i in b.devenv: - env = i.get_env(env) - +def get_env(b: build.Build, build_dir: str) -> T.Tuple[T.Dict[str, str], T.Set[str]]: extra_env = build.EnvironmentVariables() extra_env.set('MESON_DEVENV', ['1']) extra_env.set('MESON_PROJECT_NAME', [b.project_name]) @@ -38,7 +37,13 @@ def get_env(b: build.Build, build_dir: str) -> T.Dict[str, str]: if meson_uninstalled.is_dir(): extra_env.prepend('PKG_CONFIG_PATH', [str(meson_uninstalled)]) - return extra_env.get_env(env) + env = os.environ.copy() + varnames = set() + for i in itertools.chain(b.devenv, {extra_env}): + env = i.get_env(env) + varnames |= i.get_names() + + return env, varnames def bash_completion_files(b: build.Build, install_data: 'InstallData') -> T.List[str]: result = [] @@ -108,12 +113,21 @@ def run(options: argparse.Namespace) -> int: if not buildfile.is_file(): raise MesonException(f'Directory {options.wd!r} does not seem to be a Meson build directory.') b = build.load(options.wd) - install_data = minstall.load_install_data(str(privatedir / 'install.dat')) - setup_vsenv(b.need_vsenv) - devenv = get_env(b, options.wd) + devenv, varnames = get_env(b, options.wd) + if options.dump: + if options.command: + raise MesonException('--dump option does not allow running other command.') + for name in varnames: + print(f'{name}={quote_arg(devenv[name])}') + print(f'export {name}') + return 0 + + install_data = minstall.load_install_data(str(privatedir / 'install.dat')) write_gdb_script(privatedir, install_data) + setup_vsenv(b.need_vsenv) + args = options.command if not args: prompt_prefix = f'[{b.project_name}]' |