resolve symlinks passed to -C

"meson setup" is resolving symlinks for the build directory in
validate_core_dirs.  For consistency with it, do the same when
the build directory is passed via -C to devenv, dist, init, install
and test.

This ensures for example that the path to test dependencies is
computed correctly in "meson test".

Fixes: #8765
pull/8972/head
Paolo Bonzini 3 years ago
parent 81d9acab87
commit b44a51d0fd
  1. 4
      mesonbuild/mdevenv.py
  2. 5
      mesonbuild/mdist.py
  3. 13
      mesonbuild/mesonlib/universal.py
  4. 3
      mesonbuild/minit.py
  5. 4
      mesonbuild/minstall.py
  6. 5
      mesonbuild/mtest.py

@ -4,12 +4,12 @@ import tempfile
from pathlib import Path from pathlib import Path
from . import build from . import build
from .mesonlib import MesonException, is_windows from .mesonlib import MesonException, RealPathAction, is_windows
import typing as T import typing as T
def add_arguments(parser: argparse.ArgumentParser) -> None: def add_arguments(parser: argparse.ArgumentParser) -> None:
parser.add_argument('-C', default='.', dest='wd', 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('command', nargs=argparse.REMAINDER, parser.add_argument('command', nargs=argparse.REMAINDER,
help='Command to run in developer environment (default: interactive shell)') help='Command to run in developer environment (default: interactive shell)')

@ -23,7 +23,8 @@ import json
from glob import glob from glob import glob
from pathlib import Path from pathlib import Path
from mesonbuild.environment import detect_ninja from mesonbuild.environment import detect_ninja
from mesonbuild.mesonlib import windows_proof_rmtree, MesonException, quiet_git from mesonbuild.mesonlib import (MesonException, RealPathAction, quiet_git,
windows_proof_rmtree)
from mesonbuild.wrap import wrap from mesonbuild.wrap import wrap
from mesonbuild import mlog, build from mesonbuild import mlog, build
from .scripts.meson_exe import run_exe from .scripts.meson_exe import run_exe
@ -35,7 +36,7 @@ archive_extension = {'gztar': '.tar.gz',
'zip': '.zip'} 'zip': '.zip'}
def add_arguments(parser): def add_arguments(parser):
parser.add_argument('-C', default='.', dest='wd', 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('--formats', default='xztar', parser.add_argument('--formats', default='xztar',
help='Comma separated list of archive types to create. Supports xztar (default), gztar, and zip.') help='Comma separated list of archive types to create. Supports xztar (default), gztar, and zip.')

@ -14,6 +14,7 @@
"""A library of random helper functionality.""" """A library of random helper functionality."""
from pathlib import Path from pathlib import Path
import argparse
import enum import enum
import sys import sys
import stat import stat
@ -70,6 +71,7 @@ __all__ = [
'PerThreeMachine', 'PerThreeMachine',
'PerThreeMachineDefaultable', 'PerThreeMachineDefaultable',
'ProgressBar', 'ProgressBar',
'RealPathAction',
'TemporaryDirectoryWinProof', 'TemporaryDirectoryWinProof',
'Version', 'Version',
'check_direntry_issues', 'check_direntry_issues',
@ -1843,6 +1845,17 @@ else:
ProgressBar = ProgressBarTqdm ProgressBar = ProgressBarTqdm
class RealPathAction(argparse.Action):
def __init__(self, option_strings: T.List[str], dest: str, default: str = '.', **kwargs: T.Any):
default = os.path.abspath(os.path.realpath(default))
super().__init__(option_strings, dest, nargs=None, default=default, **kwargs)
def __call__(self, parser: argparse.ArgumentParser, namespace: argparse.Namespace,
values: T.Union[str, T.Sequence[T.Any], None], option_string: str = None) -> None:
assert isinstance(values, str)
setattr(namespace, self.dest, os.path.abspath(os.path.realpath(values)))
def get_wine_shortpath(winecmd: T.List[str], wine_paths: T.Sequence[str]) -> str: def get_wine_shortpath(winecmd: T.List[str], wine_paths: T.Sequence[str]) -> str:
"""Get A short version of @wine_paths to avoid reaching WINEPATH number """Get A short version of @wine_paths to avoid reaching WINEPATH number
of char limit. of char limit.

@ -139,7 +139,8 @@ def add_arguments(parser: 'argparse.ArgumentParser') -> None:
Meson project. Meson project.
''' '''
parser.add_argument("srcfiles", metavar="sourcefile", nargs="*", help="source files. default: all recognized files in current directory") parser.add_argument("srcfiles", metavar="sourcefile", nargs="*", help="source files. default: all recognized files in current directory")
parser.add_argument('-C', default='.', dest='wd', help='directory to cd into before running') parser.add_argument('-C', dest='wd', action=mesonlib.RealPathAction,
help='directory to cd into before running')
parser.add_argument("-n", "--name", help="project name. default: name of current directory") parser.add_argument("-n", "--name", help="project name. default: name of current directory")
parser.add_argument("-e", "--executable", help="executable name. default: project name") parser.add_argument("-e", "--executable", help="executable name. default: project name")
parser.add_argument("-d", "--deps", help="dependencies, comma-separated") parser.add_argument("-d", "--deps", help="dependencies, comma-separated")

@ -28,7 +28,7 @@ from . import environment
from .backend.backends import InstallData from .backend.backends import InstallData
from .coredata import major_versions_differ, MesonVersionMismatchException from .coredata import major_versions_differ, MesonVersionMismatchException
from .coredata import version as coredata_version from .coredata import version as coredata_version
from .mesonlib import is_windows, Popen_safe from .mesonlib import Popen_safe, RealPathAction, is_windows
from .scripts import depfixer, destdir_join from .scripts import depfixer, destdir_join
from .scripts.meson_exe import run_exe from .scripts.meson_exe import run_exe
try: try:
@ -65,7 +65,7 @@ build definitions so that it will not break when the change happens.'''
selinux_updates: T.List[str] = [] selinux_updates: T.List[str] = []
def add_arguments(parser: argparse.ArgumentParser) -> None: def add_arguments(parser: argparse.ArgumentParser) -> None:
parser.add_argument('-C', default='.', dest='wd', 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('--profile-self', action='store_true', dest='profile', parser.add_argument('--profile-self', action='store_true', dest='profile',
help=argparse.SUPPRESS) help=argparse.SUPPRESS)

@ -43,7 +43,8 @@ from . import environment
from . import mlog from . import mlog
from .coredata import major_versions_differ, MesonVersionMismatchException from .coredata import major_versions_differ, MesonVersionMismatchException
from .coredata import version as coredata_version from .coredata import version as coredata_version
from .mesonlib import MesonException, OrderedSet, get_wine_shortpath, split_args, join_args from .mesonlib import (MesonException, OrderedSet, RealPathAction,
get_wine_shortpath, join_args, split_args)
from .mintro import get_infodir, load_info_file from .mintro import get_infodir, load_info_file
from .programs import ExternalProgram from .programs import ExternalProgram
from .backend.backends import TestProtocol, TestSerialisation from .backend.backends import TestProtocol, TestSerialisation
@ -104,7 +105,7 @@ def add_arguments(parser: argparse.ArgumentParser) -> None:
help='List available tests.') help='List available tests.')
parser.add_argument('--wrapper', default=None, dest='wrapper', type=split_args, parser.add_argument('--wrapper', default=None, dest='wrapper', type=split_args,
help='wrapper to run tests with (e.g. Valgrind)') help='wrapper to run tests with (e.g. Valgrind)')
parser.add_argument('-C', default='.', dest='wd', parser.add_argument('-C', dest='wd', action=RealPathAction,
# https://github.com/python/typeshed/issues/3107 # https://github.com/python/typeshed/issues/3107
# https://github.com/python/mypy/issues/7177 # https://github.com/python/mypy/issues/7177
type=os.path.abspath, # type: ignore type=os.path.abspath, # type: ignore

Loading…
Cancel
Save