aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mdevenv.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/mdevenv.py')
-rw-r--r--mesonbuild/mdevenv.py36
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}]'