summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Weißmann <volker.weissmann@gmx.de>2025-03-24 18:14:25 +0100
committerDylan Baker <dylan@pnwbakers.com>2025-05-29 09:20:27 -0700
commite7e25842c2b38be3df86cc7ddfd57988da9a141b (patch)
treed3453ae5c2e59acc52edb909cb9ca3331a7d09a3
parentcab5c8e2b73fc6084ead0f6bf61a649e0c4be1f5 (diff)
downloadmeson-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.py4
-rw-r--r--mesonbuild/mintro.py10
-rw-r--r--mesonbuild/rewriter.py3
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: