diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2020-12-02 09:52:37 -0800 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-01-04 12:15:41 -0800 |
commit | 30ec7612c87676e541c924995feb476bf4254eab (patch) | |
tree | 7649ee3a04699b21c3f907ea4763732f9818a821 | |
parent | 7142c922856ed0e060b3a0e1b75b6f542f40fca2 (diff) | |
download | meson-30ec7612c87676e541c924995feb476bf4254eab.zip meson-30ec7612c87676e541c924995feb476bf4254eab.tar.gz meson-30ec7612c87676e541c924995feb476bf4254eab.tar.bz2 |
coredata: Add a type to the OptionKey
This is useful for figuring out what kind of option this is. My hope is
that in the longterm this is less useful, but we'll still want it for
the configuration summary printing.
-rw-r--r-- | mesonbuild/coredata.py | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 7bbd7ee..263d2fe 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -1,4 +1,4 @@ -# Copyrigh 2012-2020 The Meson development team +# Copyright 2012-2020 The Meson development team # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -49,40 +49,35 @@ default_yielding = False _T = T.TypeVar('_T') -class ArgumentGroup(enum.Enum): +class OptionType(enum.Enum): """Enum used to specify what kind of argument a thing is.""" BUILTIN = 0 BASE = 1 COMPILER = 2 - USER = 3 + PROJECT = 3 BACKEND = 4 -def classify_argument(key: 'OptionKey') -> ArgumentGroup: +def classify_argument(key: 'OptionKey') -> OptionType: """Classify arguments into groups so we know which dict to assign them to.""" - from .compilers import all_languages, base_options + from .compilers import base_options all_builtins = set(BUILTIN_OPTIONS) | set(BUILTIN_OPTIONS_PER_MACHINE) | set(builtin_dir_noprefix_options) - lang_prefixes = tuple('{}_'.format(l) for l in all_languages) if key.name in base_options: assert key.machine is MachineChoice.HOST - return ArgumentGroup.BASE - elif key.name.startswith(lang_prefixes): - return ArgumentGroup.COMPILER + return OptionType.BASE + elif key.lang is not None: + return OptionType.COMPILER elif key.name in all_builtins: - # if for_machine is MachineChoice.BUILD: - # if option in BUILTIN_OPTIONS_PER_MACHINE: - # return ArgumentGroup.BUILTIN - # raise MesonException('Argument {} is not allowed per-machine'.format(option)) - return ArgumentGroup.BUILTIN + return OptionType.BUILTIN elif key.name.startswith('backend_'): - return ArgumentGroup.BACKEND + return OptionType.BACKEND else: assert key.machine is MachineChoice.HOST - return ArgumentGroup.USER + return OptionType.PROJECT class OptionKey: @@ -94,21 +89,30 @@ class OptionKey: internally easier to reason about and produce. """ - __slots__ = ['name', 'subproject', 'machine', 'lang', '_hash'] + __slots__ = ['name', 'subproject', 'machine', 'lang', '_hash', '_type'] name: str subproject: str machine: MachineChoice lang: T.Optional[str] + _hash: int + type: OptionType def __init__(self, name: str, subproject: str = '', machine: MachineChoice = MachineChoice.HOST, - lang: T.Optional[str] = None): + lang: T.Optional[str] = None, _type: T.Optional[OptionType] = None): + # the _type option to the constructor is kinda private. We want to be + # able tos ave the state and avoid the lookup function when + # pickling/unpickling, but we need to be able to calculate it when + # constructing a new OptionKey object.__setattr__(self, 'name', name) object.__setattr__(self, 'subproject', subproject) object.__setattr__(self, 'machine', machine) object.__setattr__(self, 'lang', lang) object.__setattr__(self, '_hash', hash((name, subproject, machine, lang))) + if _type is None: + _type = classify_argument(self) + object.__setattr__(self, 'type', _type) def __setattr__(self, key: str, value: T.Any) -> None: raise AttributeError('OptionKey instances do not support mutation.') @@ -119,6 +123,7 @@ class OptionKey: 'subproject': self.subproject, 'machine': self.machine, 'lang': self.lang, + '_type': self.type, } def __setstate__(self, state: T.Dict[str, T.Any]) -> None: @@ -216,6 +221,26 @@ class OptionKey: """Convenience method for key.evolve(machine=MachinceChoice.HOST).""" return self.evolve(machine=MachineChoice.HOST) + def is_backend(self) -> bool: + """Convenience method to check if this is a backend option.""" + return self.type is OptionType.BACKEND + + def is_builtin(self) -> bool: + """Convenience method to check if this is a builtin option.""" + return self.type is OptionType.BUILTIN + + def is_compiler(self) -> bool: + """Convenience method to check if this is a builtin option.""" + return self.type is OptionType.COMPILER + + def is_project(self) -> bool: + """Convenience method to check if this is a project option.""" + return self.type is OptionType.PROJECT + + def is_base(self) -> bool: + """Convenience method to check if this is a base option.""" + return self.type is OptionType.BASE + class MesonVersionMismatchException(MesonException): '''Build directory generated with Meson version is incompatible with current version''' |