diff options
| author | Volker Weißmann <volker.weissmann@gmx.de> | 2025-03-24 18:14:25 +0100 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-05-29 09:20:27 -0700 |
| commit | e7e25842c2b38be3df86cc7ddfd57988da9a141b (patch) | |
| tree | d3453ae5c2e59acc52edb909cb9ca3331a7d09a3 | |
| parent | cab5c8e2b73fc6084ead0f6bf61a649e0c4be1f5 (diff) | |
| download | meson-e7e25842c2b38be3df86cc7ddfd57988da9a141b.tar.gz | |
rewriter: Bugfix concerning `UnknownValue`
Without this commit, the static introspection tool crashes when
introspecting systemd since certain values are `UnknownValue`
which was unexpected.
(I tested sytemd's commit hash fefcb935cd.)
| -rw-r--r-- | mesonbuild/build.py | 4 | ||||
| -rw-r--r-- | mesonbuild/mintro.py | 10 | ||||
| -rw-r--r-- | mesonbuild/rewriter.py | 3 |
3 files changed, 12 insertions, 5 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 73f99cb66..8049f160d 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -33,7 +33,7 @@ from .compilers import ( is_header, is_object, is_source, clink_langs, sort_clink, all_languages, is_known_suffix, detect_static_linker ) -from .interpreterbase import FeatureNew, FeatureDeprecated +from .interpreterbase import FeatureNew, FeatureDeprecated, UnknownValue if T.TYPE_CHECKING: from typing_extensions import Literal, TypedDict @@ -648,7 +648,7 @@ class Target(HoldableObject, metaclass=abc.ABCMeta): def process_kwargs_base(self, kwargs: T.Dict[str, T.Any]) -> None: if 'build_by_default' in kwargs: self.build_by_default = kwargs['build_by_default'] - if not isinstance(self.build_by_default, bool): + if not isinstance(self.build_by_default, (bool, UnknownValue)): raise InvalidArguments('build_by_default must be a boolean value.') if not self.build_by_default and kwargs.get('install', False): diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index db62dc06c..6986186bd 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -31,6 +31,12 @@ if T.TYPE_CHECKING: from .interpreter import Interpreter +class IntrospectionEncoder(json.JSONEncoder): + def default(self, obj: T.Any) -> T.Any: + if isinstance(obj, UnknownValue): + return 'unknown' + return json.JSONEncoder.default(self, obj) + def get_meson_info_file(info_dir: str) -> str: return os.path.join(info_dir, 'meson-info.json') @@ -492,12 +498,12 @@ def print_results(options: argparse.Namespace, results: T.Sequence[T.Tuple[str, return 1 elif len(results) == 1 and not options.force_dict: # Make to keep the existing output format for a single option - print(json.dumps(results[0][1], indent=indent)) + print(json.dumps(results[0][1], indent=indent, cls=IntrospectionEncoder)) else: out = {} for i in results: out[i[0]] = i[1] - print(json.dumps(out, indent=indent)) + print(json.dumps(out, indent=indent, cls=IntrospectionEncoder)) return 0 def get_infodir(builddir: T.Optional[str] = None) -> str: diff --git a/mesonbuild/rewriter.py b/mesonbuild/rewriter.py index 9023033b9..4c2fb11bc 100644 --- a/mesonbuild/rewriter.py +++ b/mesonbuild/rewriter.py @@ -17,6 +17,7 @@ from mesonbuild.mesonlib import MesonException, setup_vsenv, relpath from . import mlog, environment from functools import wraps from .mparser import Token, ArrayNode, ArgumentNode, ArithmeticNode, AssignmentNode, BaseNode, StringNode, BooleanNode, ElementaryNode, IdNode, FunctionNode, PlusAssignmentNode +from .mintro import IntrospectionEncoder import json, os, re, sys, codecs import typing as T from pathlib import Path @@ -399,7 +400,7 @@ class Rewriter: def print_info(self) -> None: if self.info_dump is None: return - sys.stdout.write(json.dumps(self.info_dump, indent=2)) + sys.stdout.write(json.dumps(self.info_dump, indent=2, cls=IntrospectionEncoder)) def on_error(self) -> T.Tuple[AnsiDecorator, AnsiDecorator]: if self.skip_errors: |
