diff options
Diffstat (limited to 'mesonbuild/mintro.py')
-rw-r--r-- | mesonbuild/mintro.py | 80 |
1 files changed, 35 insertions, 45 deletions
diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index f6262c3..52f4ac0 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -21,6 +21,7 @@ project files and don't need this info.""" import collections import json +from mesonbuild.compilers import d from . import build, coredata as cdata from . import mesonlib from .ast import IntrospectionInterpreter, build_target_functions, AstConditionLevel, AstIDGenerator, AstIndentationGenerator, AstJSONPrinter @@ -33,6 +34,8 @@ import typing as T import os import argparse +from .mesonlib import OptionKey + def get_meson_info_file(info_dir: str) -> str: return os.path.join(info_dir, 'meson-info.json') @@ -167,8 +170,8 @@ def list_targets_from_source(intr: IntrospectionInterpreter) -> T.List[T.Dict[st return tlist -def list_targets(builddata: build.Build, installdata: backends.InstallData, backend: backends.Backend) -> T.List[T.Dict[str, T.Union[bool, str, T.List[T.Union[str, T.Dict[str, T.Union[str, T.List[str], bool]]]]]]]: - tlist = [] # type: T.List[T.Dict[str, T.Union[bool, str, T.List[T.Union[str, T.Dict[str, T.Union[str, T.List[str], bool]]]]]]] +def list_targets(builddata: build.Build, installdata: backends.InstallData, backend: backends.Backend) -> T.List[T.Any]: + tlist = [] # type: T.List[T.Any] build_dir = builddata.environment.get_build_dir() src_dir = builddata.environment.get_source_dir() @@ -197,8 +200,8 @@ def list_targets(builddata: build.Build, installdata: backends.InstallData, back if installdata and target.should_install(): t['installed'] = True - t['install_filename'] = [install_lookuptable.get(x, [None]) for x in target.get_outputs()] - t['install_filename'] = [x for sublist in t['install_filename'] for x in sublist] # flatten the list + ifn = [install_lookuptable.get(x, [None]) for x in target.get_outputs()] + t['install_filename'] = [x for sublist in ifn for x in sublist] # flatten the list else: t['installed'] = False tlist.append(t) @@ -210,30 +213,30 @@ def list_buildoptions_from_source(intr: IntrospectionInterpreter) -> T.List[T.Di def list_buildoptions(coredata: cdata.CoreData, subprojects: T.Optional[T.List[str]] = None) -> T.List[T.Dict[str, T.Union[str, bool, int, T.List[str]]]]: optlist = [] # type: T.List[T.Dict[str, T.Union[str, bool, int, T.List[str]]]] - - dir_option_names = list(cdata.BUILTIN_DIR_OPTIONS) - test_option_names = ['errorlogs', - 'stdsplit'] - core_option_names = [k for k in coredata.builtins if k not in dir_option_names + test_option_names] - - dir_options = {k: o for k, o in coredata.builtins.items() if k in dir_option_names} - test_options = {k: o for k, o in coredata.builtins.items() if k in test_option_names} - core_options = {k: o for k, o in coredata.builtins.items() if k in core_option_names} - - if subprojects: - # Add per subproject built-in options - sub_core_options = {} - for sub in subprojects: - for k, o in core_options.items(): - if o.yielding: - continue - sub_core_options[sub + ':' + k] = o - core_options.update(sub_core_options) - - def add_keys(options: 'cdata.OptionDictType', section: str, machine: str = 'any') -> None: - for key in sorted(options.keys()): - opt = options[key] - optdict = {'name': key, 'value': opt.value, 'section': section, 'machine': machine} + subprojects = subprojects or [] + + dir_option_names = set(cdata.BUILTIN_DIR_OPTIONS) + test_option_names = {OptionKey('errorlogs'), + OptionKey('stdsplit')} + + dir_options: 'cdata.KeyedOptionDictType' = {} + test_options: 'cdata.KeyedOptionDictType' = {} + core_options: 'cdata.KeyedOptionDictType' = {} + for k, v in coredata.options.items(): + if k in dir_option_names: + dir_options[k] = v + elif k in test_option_names: + test_options[k] = v + elif k.is_builtin(): + core_options[k] = v + if not v.yielding: + for s in subprojects: + core_options[k.evolve(subproject=s)] = v + + def add_keys(options: 'cdata.KeyedOptionDictType', section: str) -> None: + for key, opt in sorted(options.items()): + optdict = {'name': str(key), 'value': opt.value, 'section': section, + 'machine': key.machine.get_lower_case_name() if coredata.is_per_machine_option(key) else 'any'} if isinstance(opt, cdata.UserStringOption): typestr = 'string' elif isinstance(opt, cdata.UserBooleanOption): @@ -252,27 +255,14 @@ def list_buildoptions(coredata: cdata.CoreData, subprojects: T.Optional[T.List[s optlist.append(optdict) add_keys(core_options, 'core') - add_keys(coredata.builtins_per_machine.host, 'core', machine='host') - add_keys( - {'build.' + k: o for k, o in coredata.builtins_per_machine.build.items()}, - 'core', - machine='build', - ) - add_keys(coredata.backend_options, 'backend') - add_keys(coredata.base_options, 'base') - add_keys( - dict(coredata.flatten_lang_iterator(coredata.compiler_options.host.items())), - 'compiler', - machine='host', - ) - tmp_dict = dict(coredata.flatten_lang_iterator(coredata.compiler_options.build.items())) # type: T.Dict[str, cdata.UserOption] + add_keys({k: v for k, v in coredata.options.items() if k.is_backend()}, 'backend') + add_keys({k: v for k, v in coredata.options.items() if k.is_base()}, 'base') add_keys( - {'build.' + k: o for k, o in tmp_dict.items()}, + {k: v for k, v in sorted(coredata.options.items(), key=lambda i: i[0].machine) if k.is_compiler()}, 'compiler', - machine='build', ) add_keys(dir_options, 'directory') - add_keys(coredata.user_options, 'user') + add_keys({k: v for k, v in coredata.options.items() if k.is_project()}, 'user') add_keys(test_options, 'test') return optlist |