diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-10-13 10:45:23 -0400 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek@centricular.com> | 2021-10-19 15:34:52 +0530 |
commit | 5f49a3243ca19fa87fa7ca3156d01f6b05e256e9 (patch) | |
tree | bb294c12eab29cafe28a3e296331c7d84549d73f | |
parent | 222dcd8b391391308e50bd7c5153b1fd25ef5698 (diff) | |
download | meson-5f49a3243ca19fa87fa7ca3156d01f6b05e256e9.tar.gz |
optinterpreter: Fix builtin option names not being reserved anymore
-rw-r--r-- | mesonbuild/optinterpreter.py | 20 | ||||
-rwxr-xr-x | run_unittests.py | 33 |
2 files changed, 35 insertions, 18 deletions
diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py index 72bf86517..c91363df0 100644 --- a/mesonbuild/optinterpreter.py +++ b/mesonbuild/optinterpreter.py @@ -16,7 +16,6 @@ import re import functools import typing as T -from . import compilers from . import coredata from . import mesonlib from . import mparser @@ -26,21 +25,6 @@ from .interpreterbase import FeatureNew if T.TYPE_CHECKING: from .interpreterbase import TV_func -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 @@ -225,9 +209,9 @@ class OptionInterpreter: raise OptionException('Positional argument must be a string.') 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) - key = mesonlib.OptionKey(opt_name, self.subproject) if 'yield' in kwargs: FeatureNew.single_use('option yield', '0.45.0', self.subproject) diff --git a/run_unittests.py b/run_unittests.py index f0c5561b3..1c0e6f620 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -79,6 +79,7 @@ import mesonbuild.dependencies.base from mesonbuild.build import Target, ConfigurationData import mesonbuild.modules.pkgconfig from mesonbuild.scripts import destdir_join +from mesonbuild.optinterpreter import OptionInterpreter, OptionException from mesonbuild.mtest import TAPParser, TestResult from mesonbuild.mesonmain import setup_vsenv @@ -2445,6 +2446,38 @@ class AllPlatformTests(BasePlatformTests): raise self.fail('Did not find option "prefix"') self.assertEqual(prefix, '/absoluteprefix') + 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) + def test_do_conf_file_preserve_newlines(self): def conf_file(in_data, confdata): |