aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mintro.py
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2020-10-26 08:33:19 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2020-12-14 10:42:32 +0100
commit879e9d19f5d0db2450de2dfd6fdc9a31043f64ab (patch)
tree3fd193346467f8f4271ae7dbd7f933428abfec4c /mesonbuild/mintro.py
parentbab108742244bdfde769ea34424a0c0722a460c2 (diff)
downloadmeson-879e9d19f5d0db2450de2dfd6fdc9a31043f64ab.zip
meson-879e9d19f5d0db2450de2dfd6fdc9a31043f64ab.tar.gz
meson-879e9d19f5d0db2450de2dfd6fdc9a31043f64ab.tar.bz2
mintro: export functions to load the meson-info files
With the next patch, "meson test" will be using the targets introspection information. Provide helper functions to share bits of code between mintro.py and mtest.py.
Diffstat (limited to 'mesonbuild/mintro.py')
-rw-r--r--mesonbuild/mintro.py47
1 files changed, 30 insertions, 17 deletions
diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py
index d36927f..f6262c3 100644
--- a/mesonbuild/mintro.py
+++ b/mesonbuild/mintro.py
@@ -385,12 +385,25 @@ def print_results(options: argparse.Namespace, results: T.Sequence[T.Tuple[str,
print(json.dumps(out, indent=indent))
return 0
+def get_infodir(builddir: T.Optional[str] = None) -> str:
+ infodir = 'meson-info'
+ if builddir is not None:
+ infodir = os.path.join(builddir, infodir)
+ return infodir
+
+def get_info_file(infodir: str, kind: T.Optional[str] = None) -> str:
+ return os.path.join(infodir,
+ 'meson-info.json' if not kind else 'intro-{}.json'.format(kind))
+
+def load_info_file(infodir: str, kind: T.Optional[str] = None) -> T.Any:
+ with open(get_info_file(infodir, kind), 'r') as fp:
+ return json.load(fp)
+
def run(options: argparse.Namespace) -> int:
datadir = 'meson-private'
- infodir = 'meson-info'
+ infodir = get_infodir(options.builddir)
if options.builddir is not None:
datadir = os.path.join(options.builddir, datadir)
- infodir = os.path.join(options.builddir, infodir)
indent = 4 if options.indent else None
results = [] # type: T.List[T.Tuple[str, T.Union[dict, T.List[T.Any]]]]
sourcedir = '.' if options.builddir == 'meson.build' else options.builddir[:-11]
@@ -411,17 +424,18 @@ def run(options: argparse.Namespace) -> int:
results += [(key, val.no_bd(intr))]
return print_results(options, results, indent)
- infofile = get_meson_info_file(infodir)
- if not os.path.isdir(datadir) or not os.path.isdir(infodir) or not os.path.isfile(infofile):
- print('Current directory is not a meson build directory.\n'
- 'Please specify a valid build dir or change the working directory to it.\n'
- 'It is also possible that the build directory was generated with an old\n'
- 'meson version. Please regenerate it in this case.')
- return 1
-
- with open(infofile, 'r') as fp:
- raw = json.load(fp)
+ try:
+ raw = load_info_file(infodir)
intro_vers = raw.get('introspection', {}).get('version', {}).get('full', '0.0.0')
+ except FileNotFoundError:
+ if not os.path.isdir(datadir) or not os.path.isdir(infodir):
+ print('Current directory is not a meson build directory.\n'
+ 'Please specify a valid build dir or change the working directory to it.')
+ else:
+ print('Introspection file {} does not exist.\n'
+ 'It is also possible that the build directory was generated with an old\n'
+ 'meson version. Please regenerate it in this case.'.format(get_info_file(infodir)))
+ return 1
vers_to_check = get_meson_introspection_required_version()
for i in vers_to_check:
@@ -437,12 +451,11 @@ def run(options: argparse.Namespace) -> int:
continue
if not options.all and not getattr(options, i, False):
continue
- curr = os.path.join(infodir, 'intro-{}.json'.format(i))
- if not os.path.isfile(curr):
- print('Introspection file {} does not exist.'.format(curr))
+ try:
+ results += [(i, load_info_file(infodir, i))]
+ except FileNotFoundError:
+ print('Introspection file {} does not exist.'.format(get_info_file(infodir, i)))
return 1
- with open(curr, 'r') as fp:
- results += [(i, json.load(fp))]
return print_results(options, results, indent)