diff options
-rw-r--r-- | mesonbuild/coredata.py | 115 |
1 files changed, 67 insertions, 48 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 01db635..9002fd9 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -26,6 +26,7 @@ from .wrap import WrapMode import ast import argparse import configparser +from typing import Optional, Any, TypeVar, Generic, Type version = '0.50.999' backendlist = ['ninja', 'vs', 'vs2010', 'vs2015', 'vs2017', 'xcode'] @@ -335,11 +336,8 @@ class CoreData: def init_builtins(self): # Create builtin options with default values self.builtins = {} - prefix = get_builtin_option_default('prefix') - for key in get_builtin_options(): - value = get_builtin_option_default(key, prefix) - args = [key] + builtin_options[key][1:-1] + [value] - self.builtins[key] = builtin_options[key][0](*args) + for key, opt in builtin_options.items(): + self.builtins[key] = opt.init_option(key) def init_backend_options(self, backend_name): if backend_name == 'ninja': @@ -664,25 +662,24 @@ def is_builtin_option(optname): def get_builtin_option_choices(optname): if is_builtin_option(optname): - if builtin_options[optname][0] == UserComboOption: - return builtin_options[optname][2] - elif builtin_options[optname][0] == UserBooleanOption: + b = builtin_options[optname] + if b.opt_type is UserBooleanOption: return [True, False] - elif builtin_options[optname][0] == UserFeatureOption: + elif b.opt_type is UserFeatureOption: return UserFeatureOption.static_choices else: - return None + return b.choices else: raise RuntimeError('Tried to get the supported values for an unknown builtin option \'%s\'.' % optname) def get_builtin_option_description(optname): if is_builtin_option(optname): - return builtin_options[optname][1] + return builtin_options[optname].description else: raise RuntimeError('Tried to get the description for an unknown builtin option \'%s\'.' % optname) def get_builtin_option_action(optname): - default = builtin_options[optname][2] + default = builtin_options[optname].default if default is True: return 'store_false' elif default is False: @@ -692,15 +689,13 @@ def get_builtin_option_action(optname): def get_builtin_option_default(optname, prefix=''): if is_builtin_option(optname): o = builtin_options[optname] - if o[0] == UserComboOption: - return o[3] - if o[0] == UserIntegerOption: - return o[4] + if o.opt_type in [UserComboOption, UserIntegerOption]: + return o.default try: return builtin_dir_noprefix_options[optname][prefix] except KeyError: pass - return o[2] + return o.default else: raise RuntimeError('Tried to get the default value for an unknown builtin option \'%s\'.' % optname) @@ -757,38 +752,62 @@ def parse_cmd_line_options(args): args.cmd_line_options[name] = value delattr(args, name) + +_U = TypeVar('_U', bound=UserOption) + +class BuiltinOption(Generic[_U]): + + """Class for a builtin option type. + + Currently doesn't support UserIntegerOption, or a few other cases. + """ + + def __init__(self, opt_type: Type[_U], description: str, default: Any, yielding: Optional[bool] = None, *, + choices: Any = None): + self.opt_type = opt_type + self.description = description + self.default = default + self.choices = choices + self.yielding = yielding + + def init_option(self, name: str) -> _U: + """Create an instance of opt_type and return it.""" + keywords = {'yielding': self.yielding, 'value': self.default} + if self.choices: + keywords['choices'] = self.choices + return self.opt_type(name, self.description, **keywords) + + builtin_options = { - 'buildtype': [UserComboOption, 'Build type to use', ['plain', 'debug', 'debugoptimized', 'release', 'minsize', 'custom'], 'debug'], - 'strip': [UserBooleanOption, 'Strip targets on install', False], - 'unity': [UserComboOption, 'Unity build', ['on', 'off', 'subprojects'], 'off'], - 'prefix': [UserStringOption, 'Installation prefix', default_prefix()], - 'libdir': [UserStringOption, 'Library directory', default_libdir()], - 'libexecdir': [UserStringOption, 'Library executable directory', default_libexecdir()], - 'bindir': [UserStringOption, 'Executable directory', 'bin'], - 'sbindir': [UserStringOption, 'System executable directory', 'sbin'], - 'includedir': [UserStringOption, 'Header file directory', 'include'], - 'datadir': [UserStringOption, 'Data file directory', 'share'], - 'mandir': [UserStringOption, 'Manual page directory', 'share/man'], - 'infodir': [UserStringOption, 'Info page directory', 'share/info'], - 'localedir': [UserStringOption, 'Locale data directory', 'share/locale'], - 'sysconfdir': [UserStringOption, 'Sysconf data directory', 'etc'], - 'localstatedir': [UserStringOption, 'Localstate data directory', 'var'], - 'sharedstatedir': [UserStringOption, 'Architecture-independent data directory', 'com'], - 'werror': [UserBooleanOption, 'Treat warnings as errors', False], - 'warning_level': [UserComboOption, 'Compiler warning level to use', ['0', '1', '2', '3'], '1'], - 'layout': [UserComboOption, 'Build directory layout', ['mirror', 'flat'], 'mirror'], - 'default_library': [UserComboOption, 'Default library type', ['shared', 'static', 'both'], 'shared'], - 'backend': [UserComboOption, 'Backend to use', backendlist, 'ninja'], - 'stdsplit': [UserBooleanOption, 'Split stdout and stderr in test logs', True], - 'errorlogs': [UserBooleanOption, "Whether to print the logs from failing tests", True], - 'install_umask': [UserUmaskOption, 'Default umask to apply on permissions of installed files', '022'], - 'auto_features': [UserFeatureOption, "Override value of all 'auto' features", 'auto'], - 'optimization': [UserComboOption, 'Optimization level', ['0', 'g', '1', '2', '3', 's'], '0'], - 'debug': [UserBooleanOption, 'Debug', True], - 'wrap_mode': [UserComboOption, 'Wrap mode', ['default', - 'nofallback', - 'nodownload', - 'forcefallback'], 'default'], + 'buildtype': BuiltinOption(UserComboOption, 'Build type to use', 'debug', + choices=['plain', 'debug', 'debugoptimized', 'release', 'minsize', 'custom']), + 'strip': BuiltinOption(UserBooleanOption, 'Strip targets on install', False), + 'unity': BuiltinOption(UserComboOption, 'Unity build', 'off', choices=['on', 'off', 'subprojects']), + 'prefix': BuiltinOption(UserStringOption, 'Installation prefix', default_prefix()), + 'libdir': BuiltinOption(UserStringOption, 'Library directory', default_libdir()), + 'libexecdir': BuiltinOption(UserStringOption, 'Library executable directory', default_libexecdir()), + 'bindir': BuiltinOption(UserStringOption, 'Executable directory', 'bin'), + 'sbindir': BuiltinOption(UserStringOption, 'System executable directory', 'sbin'), + 'includedir': BuiltinOption(UserStringOption, 'Header file directory', 'include'), + 'datadir': BuiltinOption(UserStringOption, 'Data file directory', 'share'), + 'mandir': BuiltinOption(UserStringOption, 'Manual page directory', 'share/man'), + 'infodir': BuiltinOption(UserStringOption, 'Info page directory', 'share/info'), + 'localedir': BuiltinOption(UserStringOption, 'Locale data directory', 'share/locale'), + 'sysconfdir': BuiltinOption(UserStringOption, 'Sysconf data directory', 'etc'), + 'localstatedir': BuiltinOption(UserStringOption, 'Localstate data directory', 'var'), + 'sharedstatedir': BuiltinOption(UserStringOption, 'Architecture-independent data directory', 'com'), + 'werror': BuiltinOption(UserBooleanOption, 'Treat warnings as errors', False), + 'warning_level': BuiltinOption(UserComboOption, 'Compiler warning level to use', '1', choices=['0', '1', '2', '3']), + 'layout': BuiltinOption(UserComboOption, 'Build directory layout', 'mirror', choices=['mirror', 'flat']), + 'default_library': BuiltinOption(UserComboOption, 'Default library type', 'shared', choices=['shared', 'static', 'both']), + 'backend': BuiltinOption(UserComboOption, 'Backend to use', 'ninja', choices=backendlist), + 'stdsplit': BuiltinOption(UserBooleanOption, 'Split stdout and stderr in test logs', True), + 'errorlogs': BuiltinOption(UserBooleanOption, "Whether to print the logs from failing tests", True), + 'install_umask': BuiltinOption(UserUmaskOption, 'Default umask to apply on permissions of installed files', '022'), + 'auto_features': BuiltinOption(UserFeatureOption, "Override value of all 'auto' features", 'auto'), + 'optimization': BuiltinOption(UserComboOption, 'Optimization level', '0', choices=['0', 'g', '1', '2', '3', 's']), + 'debug': BuiltinOption(UserBooleanOption, 'Debug', True), + 'wrap_mode': BuiltinOption(UserComboOption, 'Wrap mode', 'default', choices=['default', 'nofallback', 'nodownload', 'forcefallback']), } # Special prefix-dependent defaults for installation directories that reside in |