diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-10-13 10:45:23 -0400 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2021-10-14 14:17:50 -0400 |
commit | 8a0d12ec295780977d0e2cb7e2f64f1e3a3e0067 (patch) | |
tree | d9e8cff75f657c7282459e18c0bb8408a4ec430e | |
parent | 5e96730d7d9f1f6bebf66d04381bc5ec0f80a1cc (diff) | |
download | meson-8a0d12ec295780977d0e2cb7e2f64f1e3a3e0067.zip meson-8a0d12ec295780977d0e2cb7e2f64f1e3a3e0067.tar.gz meson-8a0d12ec295780977d0e2cb7e2f64f1e3a3e0067.tar.bz2 |
optinterpreter: Fix builtin option names not being reserved anymore
-rw-r--r-- | mesonbuild/optinterpreter.py | 20 | ||||
-rw-r--r-- | unittests/platformagnostictests.py | 34 |
2 files changed, 36 insertions, 18 deletions
diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py index 7818915..64c4af2 100644 --- a/mesonbuild/optinterpreter.py +++ b/mesonbuild/optinterpreter.py @@ -15,7 +15,6 @@ import re import typing as T -from . import compilers from . import coredata from . import mesonlib from . import mparser @@ -43,21 +42,6 @@ if T.TYPE_CHECKING: }) -forbidden_option_names = set(coredata.BUILTIN_OPTIONS.keys()) -forbidden_prefixes = [lang + '_' for lang in compilers.all_languages] + ['b_', 'backend_'] -reserved_prefixes = ['cross_'] - -def is_invalid_name(name: str, *, log: bool = True) -> bool: - if name in forbidden_option_names: - return True - pref = name.split('_')[0] + '_' - if pref in forbidden_prefixes: - return True - if pref in reserved_prefixes: - if log: - mlog.deprecation('Option uses prefix "%s", which is reserved for Meson. This will become an error in the future.' % pref) - return False - class OptionException(mesonlib.MesonException): pass @@ -176,7 +160,8 @@ class OptionInterpreter: opt_name = args[0] if optname_regex.search(opt_name) is not None: raise OptionException('Option names can only contain letters, numbers or dashes.') - if is_invalid_name(opt_name): + key = mesonlib.OptionKey.from_string(opt_name).evolve(subproject=self.subproject) + if not key.is_project(): raise OptionException('Option name %s is reserved.' % opt_name) opt_type = kwargs['type'] @@ -192,7 +177,6 @@ class OptionInterpreter: opt = parser(description, T.cast('ParserArgs', parser_kwargs)) opt.deprecated = kwargs['deprecated'] - key = mesonlib.OptionKey(opt_name, self.subproject) if key in self.options: mlog.deprecation(f'Option {opt_name} already exists.') self.options[key] = opt diff --git a/unittests/platformagnostictests.py b/unittests/platformagnostictests.py index b26404d..1c52f63 100644 --- a/unittests/platformagnostictests.py +++ b/unittests/platformagnostictests.py @@ -13,11 +13,13 @@ # limitations under the License. import os +import tempfile from unittest import skipIf from .baseplatformtests import BasePlatformTests from .helpers import is_ci from mesonbuild.mesonlib import is_linux +from mesonbuild.optinterpreter import OptionInterpreter, OptionException @skipIf(is_ci() and not is_linux(), "Run only on fast platforms") class PlatformAgnosticTests(BasePlatformTests): @@ -32,3 +34,35 @@ class PlatformAgnosticTests(BasePlatformTests): ''' testdir = os.path.join(self.unit_test_dir, '99 relative find program') self.init(testdir, workdir=testdir) + + def test_invalid_option_names(self): + interp = OptionInterpreter('') + + def write_file(code: str): + with tempfile.NamedTemporaryFile('w', dir=self.builddir, encoding='utf-8', delete=False) as f: + f.write(code) + return f.name + + fname = write_file("option('default_library', type: 'string')") + self.assertRaisesRegex(OptionException, 'Option name default_library is reserved.', + interp.process, fname) + + fname = write_file("option('c_anything', type: 'string')") + self.assertRaisesRegex(OptionException, 'Option name c_anything is reserved.', + interp.process, fname) + + fname = write_file("option('b_anything', type: 'string')") + self.assertRaisesRegex(OptionException, 'Option name b_anything is reserved.', + interp.process, fname) + + fname = write_file("option('backend_anything', type: 'string')") + self.assertRaisesRegex(OptionException, 'Option name backend_anything is reserved.', + interp.process, fname) + + fname = write_file("option('foo.bar', type: 'string')") + self.assertRaisesRegex(OptionException, 'Option names can only contain letters, numbers or dashes.', + interp.process, fname) + + # platlib is allowed, only python.platlib is reserved. + fname = write_file("option('platlib', type: 'string')") + interp.process(fname) |