aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mintro.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/mintro.py')
-rw-r--r--mesonbuild/mintro.py80
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