diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2020-11-30 16:49:18 -0800 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-01-04 12:15:41 -0800 |
commit | e2ef6930ff0b88beed6aeee068b4cf37037d5d9d (patch) | |
tree | 19029df136812d0e56748e4f4b08154c17fddff1 | |
parent | b37f0cce2c9d94223caf5730af508c463e125457 (diff) | |
download | meson-e2ef6930ff0b88beed6aeee068b4cf37037d5d9d.zip meson-e2ef6930ff0b88beed6aeee068b4cf37037d5d9d.tar.gz meson-e2ef6930ff0b88beed6aeee068b4cf37037d5d9d.tar.bz2 |
use OptionKey for coredata.user_options
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 2 | ||||
-rw-r--r-- | mesonbuild/coredata.py | 20 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 9 | ||||
-rw-r--r-- | mesonbuild/mconf.py | 17 | ||||
-rw-r--r-- | mesonbuild/mintro.py | 2 | ||||
-rw-r--r-- | mesonbuild/rewriter.py | 2 | ||||
-rwxr-xr-x | run_unittests.py | 9 |
7 files changed, 39 insertions, 22 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index b847c2c..38df344 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -3030,7 +3030,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) def get_user_option_args(self): cmds = [] for (k, v) in self.environment.coredata.user_options.items(): - cmds.append('-D' + k + '=' + (v.value if isinstance(v.value, str) else str(v.value).lower())) + cmds.append('-D' + str(k) + '=' + (v.value if isinstance(v.value, str) else str(v.value).lower())) # The order of these arguments must be the same between runs of Meson # to ensure reproducible output. The order we pass them shouldn't # affect behavior in any other way. diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 44cfe2e..53434ab 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -37,6 +37,7 @@ if T.TYPE_CHECKING: from .mesonlib import OptionOverrideProxy OptionDictType = T.Union[T.Dict[str, 'UserOption[T.Any]'], OptionOverrideProxy] + KeyedOptionDictType = T.Union[T.Dict['OptionKey', 'UserOption[T.Any]'], OptionOverrideProxy] CompilerCheckCacheKey = T.Tuple[T.Tuple[str, ...], str, str, T.Tuple[str, ...], str] version = '0.56.99' @@ -553,7 +554,7 @@ class CoreData: self.builtins = {} # type: OptionDictType self.builtins_per_machine: PerMachine['OptionDictType'] = PerMachine({}, {}) self.backend_options = {} # type: OptionDictType - self.user_options = {} # type: OptionDictType + self.user_options: 'KeyedOptionDictType' = {} self.compiler_options = PerMachine( defaultdict(dict), defaultdict(dict), @@ -835,7 +836,7 @@ class CoreData: def _get_all_nonbuiltin_options(self) -> T.Iterable[T.Dict[str, UserOption]]: yield self.backend_options - yield self.user_options + yield {str(k): v for k, v in self.user_options.items()} yield dict(self.flatten_lang_iterator(self.get_prefixed_options_per_machine(self.compiler_options))) yield self.base_options @@ -865,23 +866,24 @@ class CoreData: return self.compiler_options[for_machine][lang]['link_args'].value def merge_user_options(self, options: T.Dict[str, UserOption[T.Any]]) -> None: - for (name, value) in options.items(): - if name not in self.user_options: - self.user_options[name] = value + for name, value in options.items(): + key = OptionKey.from_string(name) + if key not in self.user_options: + self.user_options[key] = value continue - oldval = self.user_options[name] + oldval = self.user_options[key] if type(oldval) != type(value): - self.user_options[name] = value + self.user_options[key] = value elif oldval.choices != value.choices: # If the choices have changed, use the new value, but attempt # to keep the old options. If they are not valid keep the new # defaults but warn. - self.user_options[name] = value + self.user_options[key] = value try: value.set_value(oldval.value) except MesonException as e: - mlog.warning('Old value(s) of {} are no longer valid, resetting to default ({}).'.format(name, value.value)) + mlog.warning('Old value(s) of {} are no longer valid, resetting to default ({}).'.format(key, value.value)) def is_cross_build(self, when_building_for: MachineChoice = MachineChoice.HOST) -> bool: if when_building_for == MachineChoice.BUILD: diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index c5cac32..a266e1f 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -3050,7 +3050,7 @@ external dependencies (including libraries) must go to "dependencies".''') mlog.log() return result - def get_option_internal(self, optname): + def get_option_internal(self, optname: str): raw_optname = optname if self.is_subproject(): optname = self.subproject + ':' + optname @@ -3069,9 +3069,10 @@ external dependencies (including libraries) must go to "dependencies".''') return v try: - opt = self.coredata.user_options[optname] - if opt.yielding and ':' in optname and raw_optname in self.coredata.user_options: - popt = self.coredata.user_options[raw_optname] + key = coredata.OptionKey.from_string(optname) + opt = self.coredata.user_options[key] + if opt.yielding and key.subproject and key.as_root() in self.coredata.user_options: + popt = self.coredata.user_options[key.as_root()] if type(opt) is type(popt): opt = popt else: diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index 24638eb..9a68f7d 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -19,6 +19,7 @@ import typing as T if T.TYPE_CHECKING: import argparse + from .coredata import OptionKey, UserOption def add_arguments(parser: 'argparse.ArgumentParser') -> None: coredata.register_builtin_arguments(parser) @@ -107,7 +108,7 @@ class Conf: else: print('{0:{width[0]}} {1:{width[1]}} {3}'.format(*line, width=col_widths)) - def split_options_per_subproject(self, options): + def split_options_per_subproject(self, options: T.Dict[str, 'UserOption']) -> T.Dict[str, T.Dict[str, 'UserOption']]: result = {} for k, o in options.items(): subproject = '' @@ -119,6 +120,18 @@ class Conf: result.setdefault(subproject, {})[k] = o return result + def split_options_per_subproject2(self, options: 'coredata.KeyedOptionDictType') -> T.Dict[str, T.Dict[str, 'UserOption']]: + result = {} + for k, o in options.items(): + subproject = k.subproject + if k.subproject: + k = k.as_root() + if o.yielding and k in options: + self.yielding_options.add(k) + self.all_subprojects.add(subproject) + result.setdefault(subproject, {})[str(k)] = o + return result + def _add_line(self, name, value, choices, descr): self.name_col.append(' ' * self.print_margin + name) self.value_col.append(value) @@ -211,7 +224,7 @@ class Conf: dict(self.coredata.flatten_lang_iterator( (insert_build_prefix(k), o) for k, o in self.coredata.compiler_options.build.items()))) - project_options = self.split_options_per_subproject(self.coredata.user_options) + project_options = self.split_options_per_subproject2(self.coredata.user_options) show_build_options = self.default_values_only or self.build.environment.is_cross_build() self.add_section('Main project options') diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index f6262c3..a01963c 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -272,7 +272,7 @@ def list_buildoptions(coredata: cdata.CoreData, subprojects: T.Optional[T.List[s machine='build', ) add_keys(dir_options, 'directory') - add_keys(coredata.user_options, 'user') + add_keys({str(k): v for k, v in coredata.user_options.items()}, 'user') add_keys(test_options, 'test') return optlist diff --git a/mesonbuild/rewriter.py b/mesonbuild/rewriter.py index 857ba0e..480ba60 100644 --- a/mesonbuild/rewriter.py +++ b/mesonbuild/rewriter.py @@ -471,7 +471,7 @@ class Rewriter: **cdata.base_options, **(dict(cdata.flatten_lang_iterator(cdata.compiler_options.host.items()))), **{'build.' + k: o for k, o in cdata.flatten_lang_iterator(cdata.compiler_options.build.items())}, - **cdata.user_options, + **{str(k): v for k, v in cdata.user_options.items()}, } for key, val in sorted(cmd['options'].items()): diff --git a/run_unittests.py b/run_unittests.py index 83c1854..1a7a0c4 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -3681,6 +3681,7 @@ class AllPlatformTests(BasePlatformTests): def test_command_line(self): testdir = os.path.join(self.unit_test_dir, '34 command line') + K = mesonbuild.coredata.OptionKey # Verify default values when passing no args that affect the # configuration, and as a bonus, test that --profile-self works. @@ -3688,8 +3689,8 @@ class AllPlatformTests(BasePlatformTests): obj = mesonbuild.coredata.load(self.builddir) self.assertEqual(obj.builtins['default_library'].value, 'static') self.assertEqual(obj.builtins['warning_level'].value, '1') - self.assertEqual(obj.user_options['set_sub_opt'].value, True) - self.assertEqual(obj.user_options['subp:subp_opt'].value, 'default3') + self.assertEqual(obj.user_options[K('set_sub_opt')].value, True) + self.assertEqual(obj.user_options[K('subp_opt', 'subp')].value, 'default3') self.wipe() # warning_level is special, it's --warnlevel instead of --warning-level @@ -3775,7 +3776,7 @@ class AllPlatformTests(BasePlatformTests): # Test we can set subproject option self.init(testdir, extra_args=['-Dsubp:subp_opt=foo', '--fatal-meson-warnings']) obj = mesonbuild.coredata.load(self.builddir) - self.assertEqual(obj.user_options['subp:subp_opt'].value, 'foo') + self.assertEqual(obj.user_options[K('subp_opt', 'subp')].value, 'foo') self.wipe() # c_args value should be parsed with split_args @@ -3790,7 +3791,7 @@ class AllPlatformTests(BasePlatformTests): self.init(testdir, extra_args=['-Dset_percent_opt=myoption%', '--fatal-meson-warnings']) obj = mesonbuild.coredata.load(self.builddir) - self.assertEqual(obj.user_options['set_percent_opt'].value, 'myoption%') + self.assertEqual(obj.user_options[K('set_percent_opt')].value, 'myoption%') self.wipe() # Setting a 2nd time the same option should override the first value |