aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2020-11-30 16:49:18 -0800
committerDylan Baker <dylan@pnwbakers.com>2021-01-04 12:15:41 -0800
commite2ef6930ff0b88beed6aeee068b4cf37037d5d9d (patch)
tree19029df136812d0e56748e4f4b08154c17fddff1
parentb37f0cce2c9d94223caf5730af508c463e125457 (diff)
downloadmeson-e2ef6930ff0b88beed6aeee068b4cf37037d5d9d.zip
meson-e2ef6930ff0b88beed6aeee068b4cf37037d5d9d.tar.gz
meson-e2ef6930ff0b88beed6aeee068b4cf37037d5d9d.tar.bz2
use OptionKey for coredata.user_options
-rw-r--r--mesonbuild/backend/ninjabackend.py2
-rw-r--r--mesonbuild/coredata.py20
-rw-r--r--mesonbuild/interpreter.py9
-rw-r--r--mesonbuild/mconf.py17
-rw-r--r--mesonbuild/mintro.py2
-rw-r--r--mesonbuild/rewriter.py2
-rwxr-xr-xrun_unittests.py9
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