aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2022-07-14 13:12:25 -0700
committerEli Schwartz <eschwartz93@gmail.com>2022-08-17 16:25:36 -0400
commita78992dd81b4bd1673e4815ff26acd694ff77f68 (patch)
tree80c6dfddc3a1c8cfa45903d23c3ff01b3862051a /mesonbuild/interpreter
parentc32f83a829b6b10a0cbc191c1368b563d4582c28 (diff)
downloadmeson-a78992dd81b4bd1673e4815ff26acd694ff77f68.zip
meson-a78992dd81b4bd1673e4815ff26acd694ff77f68.tar.gz
meson-a78992dd81b4bd1673e4815ff26acd694ff77f68.tar.bz2
interpreter: move handling of module stability to interpreter
Thanks to `ModuleInfo`, all modules are just named `foo.py` instead of `unstable_foo.py`, which simplifies the import method a bit. This also allows for accurate FeatureNew/FeatureDeprecated use, as we know when the module was added and if/when it was stabilized.
Diffstat (limited to 'mesonbuild/interpreter')
-rw-r--r--mesonbuild/interpreter/interpreter.py81
1 files changed, 50 insertions, 31 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index fef8f4b..9cf88d7 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -599,26 +599,6 @@ class Interpreter(InterpreterBase, HoldableObject):
dep = df.lookup(kwargs, force_fallback=True)
self.build.stdlibs[for_machine][l] = dep
- def _import_module(self, modname: str, required: bool, node: mparser.BaseNode) -> NewExtensionModule:
- if modname in self.modules:
- return self.modules[modname]
- try:
- module = importlib.import_module('mesonbuild.modules.' + modname)
- except ImportError:
- if required:
- raise InvalidArguments(f'Module "{modname}" does not exist')
- ext_module = NotFoundExtensionModule(modname)
- else:
- ext_module = module.initialize(self)
- assert isinstance(ext_module, (ExtensionModule, NewExtensionModule))
- self.build.modules.append(modname)
- if ext_module.INFO.added:
- FeatureNew.single_use(f'module {ext_module.INFO.name}', ext_module.INFO.added, self.subproject, location=node)
- if ext_module.INFO.deprecated:
- FeatureDeprecated.single_use(f'module {ext_module.INFO.name}', ext_module.INFO.deprecated, self.subproject, location=node)
- self.modules[modname] = ext_module
- return ext_module
-
@typed_pos_args('import', str)
@typed_kwargs(
'import',
@@ -633,17 +613,56 @@ class Interpreter(InterpreterBase, HoldableObject):
if disabled:
return NotFoundExtensionModule(modname)
- if modname.startswith('unstable-'):
- plainname = modname.split('-', 1)[1]
- try:
- # check if stable module exists
- mod = self._import_module(plainname, required, node)
- mlog.warning(f'Module {modname} is now stable, please use the {plainname} module instead.')
- return mod
- except InvalidArguments:
- mlog.warning(f'Module {modname} has no backwards or forwards compatibility and might not exist in future releases.', location=node)
- modname = 'unstable_' + plainname
- return self._import_module(modname, required, node)
+ expect_unstable = False
+ # Some tests use "unstable_" instead of "unstable-", and that happens to work because
+ # of implementation details
+ if modname.startswith(('unstable-', 'unstable_')):
+ real_modname = modname[len('unstable') + 1:] # + 1 to handle the - or _
+ expect_unstable = True
+ else:
+ real_modname = modname
+
+ if real_modname in self.modules:
+ return self.modules[real_modname]
+ try:
+ module = importlib.import_module(f'mesonbuild.modules.{real_modname}')
+ except ImportError:
+ if required:
+ raise InvalidArguments(f'Module "{modname}" does not exist')
+ ext_module = NotFoundExtensionModule(real_modname)
+ else:
+ ext_module = module.initialize(self)
+ assert isinstance(ext_module, (ExtensionModule, NewExtensionModule))
+ self.build.modules.append(real_modname)
+ if ext_module.INFO.added:
+ FeatureNew.single_use(f'module {ext_module.INFO.name}', ext_module.INFO.added, self.subproject, location=node)
+ if ext_module.INFO.deprecated:
+ FeatureDeprecated.single_use(f'module {ext_module.INFO.name}', ext_module.INFO.deprecated, self.subproject, location=node)
+ if expect_unstable and not ext_module.INFO.unstable and ext_module.INFO.stabilized is None:
+ raise InvalidArguments(f'Module {ext_module.INFO.name} has never been unstable, remove "unstable-" prefix.')
+ if ext_module.INFO.stabilized is not None:
+ if expect_unstable:
+ FeatureDeprecated.single_use(
+ f'module {ext_module.INFO.name} has been stabilized',
+ ext_module.INFO.stabilized, self.subproject,
+ 'drop "unstable-" prefix from the module name',
+ location=node)
+ else:
+ FeatureNew.single_use(
+ f'module {ext_module.INFO.name} as stable module',
+ ext_module.INFO.stabilized, self.subproject,
+ f'Consider either adding "unstable-" to the module name, or updating the meson required version to ">= {ext_module.INFO.stabilized}"',
+ location=node)
+ elif ext_module.INFO.unstable:
+ if not expect_unstable:
+ if required:
+ raise InvalidArguments(f'Module "{ext_module.INFO.name}" has not been stabilized, and must be imported as unstable-{ext_module.INFO.name}')
+ ext_module = NotFoundExtensionModule(real_modname)
+ else:
+ mlog.warning(f'Module {ext_module.INFO.name} has no backwards or forwards compatibility and might not exist in future releases.', location=node)
+
+ self.modules[real_modname] = ext_module
+ return ext_module
@typed_pos_args('files', varargs=str)
@noKwargs