summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorCharles Brunet <charles.brunet@optelgroup.com>2023-03-17 16:27:37 -0400
committerEli Schwartz <eschwartz93@gmail.com>2023-08-31 07:52:41 -0400
commitcf5adf0c646474f0259d123fad60ca5ed38ec891 (patch)
tree85ccd32aa73eecf274a937f1fc3b6f4d484b77da /mesonbuild
parentcd30d1889f2bae34f17231b9cabe665edd57e7ba (diff)
downloadmeson-cf5adf0c646474f0259d123fad60ca5ed38ec891.tar.gz
add json output format to configure file
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/interpreter/interpreter.py4
-rw-r--r--mesonbuild/interpreter/kwargs.py2
-rw-r--r--mesonbuild/utils/universal.py50
3 files changed, 33 insertions, 23 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 4751af9e8..0ba8dc76c 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -2594,8 +2594,8 @@ class Interpreter(InterpreterBase, HoldableObject):
KwargInfo('install_dir', (str, bool), default='',
validator=lambda x: 'must be `false` if boolean' if x is True else None),
OUTPUT_KW,
- KwargInfo('output_format', str, default='c', since='0.47.0',
- validator=in_set_validator({'c', 'nasm'})),
+ KwargInfo('output_format', str, default='c', since='0.47.0', since_values={'json': '1.3.0'},
+ validator=in_set_validator({'c', 'json', 'nasm'})),
)
def func_configure_file(self, node: mparser.BaseNode, args: T.List[TYPE_var],
kwargs: kwtypes.ConfigureFile):
diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py
index af5733f4e..0aee16432 100644
--- a/mesonbuild/interpreter/kwargs.py
+++ b/mesonbuild/interpreter/kwargs.py
@@ -286,7 +286,7 @@ class ConfigureFile(TypedDict):
output: str
capture: bool
format: T.Literal['meson', 'cmake', 'cmake@']
- output_format: T.Literal['c', 'nasm']
+ output_format: T.Literal['c', 'json', 'nasm']
depfile: T.Optional[str]
install: T.Optional[bool]
install_dir: T.Union[str, T.Literal[False]]
diff --git a/mesonbuild/utils/universal.py b/mesonbuild/utils/universal.py
index a39825faf..d44ec03a8 100644
--- a/mesonbuild/utils/universal.py
+++ b/mesonbuild/utils/universal.py
@@ -32,6 +32,7 @@ import textwrap
import copy
import pickle
import errno
+import json
from mesonbuild import mlog
from .core import MesonException, HoldableObject
@@ -1361,34 +1362,43 @@ CONF_NASM_PRELUDE = '''; Autogenerated by the Meson build system.
'''
-def dump_conf_header(ofilename: str, cdata: 'ConfigurationData', output_format: Literal['c', 'nasm']) -> None:
+def _dump_c_header(ofile: T.TextIO, cdata: ConfigurationData, output_format: Literal['c', 'nasm']) -> None:
+ format_desc: T.Callable[[str], str]
if output_format == 'c':
prelude = CONF_C_PRELUDE
prefix = '#'
- else:
+ format_desc = lambda desc: f'/* {desc} */\n'
+ else: # nasm
prelude = CONF_NASM_PRELUDE
prefix = '%'
+ format_desc = lambda desc: '; ' + '\n; '.join(desc.splitlines()) + '\n'
+
+ ofile.write(prelude)
+ for k in sorted(cdata.keys()):
+ (v, desc) = cdata.get(k)
+ if desc:
+ ofile.write(format_desc(desc))
+ if isinstance(v, bool):
+ if v:
+ ofile.write(f'{prefix}define {k}\n\n')
+ else:
+ ofile.write(f'{prefix}undef {k}\n\n')
+ elif isinstance(v, (int, str)):
+ ofile.write(f'{prefix}define {k} {v}\n\n')
+ else:
+ raise MesonException('Unknown data type in configuration file entry: ' + k)
+
+def dump_conf_header(ofilename: str, cdata: ConfigurationData,
+ output_format: Literal['c', 'nasm', 'json']) -> None:
ofilename_tmp = ofilename + '~'
with open(ofilename_tmp, 'w', encoding='utf-8') as ofile:
- ofile.write(prelude)
- for k in sorted(cdata.keys()):
- (v, desc) = cdata.get(k)
- if desc:
- if output_format == 'c':
- ofile.write('/* %s */\n' % desc)
- elif output_format == 'nasm':
- for line in desc.split('\n'):
- ofile.write('; %s\n' % line)
- if isinstance(v, bool):
- if v:
- ofile.write(f'{prefix}define {k}\n\n')
- else:
- ofile.write(f'{prefix}undef {k}\n\n')
- elif isinstance(v, (int, str)):
- ofile.write(f'{prefix}define {k} {v}\n\n')
- else:
- raise MesonException('Unknown data type in configuration file entry: ' + k)
+ if output_format == 'json':
+ data = {k: v[0] for k, v in cdata.values.items()}
+ json.dump(data, ofile, sort_keys=True)
+ else: # c, nasm
+ _dump_c_header(ofile, cdata, output_format)
+
replace_if_different(ofilename, ofilename_tmp)