summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-10-13 10:45:23 -0400
committerNirbheek Chauhan <nirbheek@centricular.com>2021-10-19 15:34:52 +0530
commit5f49a3243ca19fa87fa7ca3156d01f6b05e256e9 (patch)
treebb294c12eab29cafe28a3e296331c7d84549d73f
parent222dcd8b391391308e50bd7c5153b1fd25ef5698 (diff)
downloadmeson-5f49a3243ca19fa87fa7ca3156d01f6b05e256e9.tar.gz
optinterpreter: Fix builtin option names not being reserved anymore
-rw-r--r--mesonbuild/optinterpreter.py20
-rwxr-xr-xrun_unittests.py33
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):