aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r--mesonbuild/modules/__init__.py51
-rw-r--r--mesonbuild/modules/fs.py3
-rw-r--r--mesonbuild/modules/python.py13
-rw-r--r--mesonbuild/modules/unstable_rust.py3
4 files changed, 54 insertions, 16 deletions
diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py
index ff27a11..1cf7c1c 100644
--- a/mesonbuild/modules/__init__.py
+++ b/mesonbuild/modules/__init__.py
@@ -18,21 +18,58 @@
import os
from .. import build
-from ..mesonlib import unholder
+from ..mesonlib import unholder, relpath
import typing as T
if T.TYPE_CHECKING:
from ..interpreter import Interpreter
- from ..interpreterbase import TYPE_var
+ from ..interpreterbase import TYPE_var, TYPE_nvar, TYPE_nkwargs
+
+class ModuleState:
+ """Object passed to all module methods.
+
+ This is a WIP API provided to modules, it should be extended to have everything
+ needed so modules does not touch any other part of Meson internal APIs.
+ """
-class ExtensionModule:
def __init__(self, interpreter: 'Interpreter') -> None:
+ self.source_root = interpreter.environment.get_source_dir()
+ self.build_to_src = relpath(interpreter.environment.get_source_dir(),
+ interpreter.environment.get_build_dir())
+ self.subproject = interpreter.subproject
+ self.subdir = interpreter.subdir
+ self.current_lineno = interpreter.current_lineno
+ self.environment = interpreter.environment
+ self.project_name = interpreter.build.project_name
+ self.project_version = interpreter.build.dep_manifest[interpreter.active_projectname]
+ # The backend object is under-used right now, but we will need it:
+ # https://github.com/mesonbuild/meson/issues/1419
+ self.backend = interpreter.backend
+ self.targets = interpreter.build.targets
+ self.data = interpreter.build.data
+ self.headers = interpreter.build.get_headers()
+ self.man = interpreter.build.get_man()
+ self.global_args = interpreter.build.global_args.host
+ self.project_args = interpreter.build.projects_args.host.get(interpreter.subproject, {})
+ self.build_machine = interpreter.builtin['build_machine'].held_object
+ self.host_machine = interpreter.builtin['host_machine'].held_object
+ self.target_machine = interpreter.builtin['target_machine'].held_object
+ self.current_node = interpreter.current_node
+
+class ModuleObject:
+ """Base class for all objects returned by modules
+ """
+ def __init__(self, interpreter: T.Optional['Interpreter'] = None) -> None:
+ self.methods = {} # type: T.Dict[str, T.Callable[[T.List[TYPE_nvar], TYPE_nkwargs], TYPE_var]]
+ # FIXME: Port all modules to stop using self.interpreter and use API on
+ # ModuleState instead.
self.interpreter = interpreter
- self.snippets = set() # type: T.Set[str] # List of methods that operate only on the interpreter.
-
- def is_snippet(self, funcname: str) -> bool:
- return funcname in self.snippets
+ # FIXME: Port all modules to remove snippets methods.
+ self.snippets: T.Set[str] = set()
+# FIXME: Port all modules to use ModuleObject directly.
+class ExtensionModule(ModuleObject):
+ pass
def get_include_args(include_dirs, prefix='-I'):
'''
diff --git a/mesonbuild/modules/fs.py b/mesonbuild/modules/fs.py
index d0b5e97..7de8cf7 100644
--- a/mesonbuild/modules/fs.py
+++ b/mesonbuild/modules/fs.py
@@ -29,7 +29,8 @@ from ..mesonlib import (
from ..interpreterbase import FeatureNew, typed_pos_args, noKwargs, permittedKwargs
if T.TYPE_CHECKING:
- from ..interpreter import Interpreter, ModuleState
+ from . import ModuleState
+ from ..interpreter import Interpreter
class FSModule(ExtensionModule):
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
index 564d181..cfe2244 100644
--- a/mesonbuild/modules/python.py
+++ b/mesonbuild/modules/python.py
@@ -21,7 +21,6 @@ from pathlib import Path
from .. import mesonlib
from ..mesonlib import MachineChoice, MesonException
from . import ExtensionModule
-from mesonbuild.modules import ModuleReturnValue
from ..interpreterbase import (
noPosargs, noKwargs, permittedKwargs,
InvalidArguments,
@@ -399,12 +398,12 @@ class PythonInstallation(ExternalProgramHolder):
else:
res = os.path.join(self.platlib_install_path, subdir)
- return self.interpreter.module_method_callback(ModuleReturnValue(res, []))
+ return res
@noPosargs
@noKwargs
def language_version_method(self, args, kwargs):
- return self.interpreter.module_method_callback(ModuleReturnValue(self.version, []))
+ return self.version
@noKwargs
def has_path_method(self, args, kwargs):
@@ -414,7 +413,7 @@ class PythonInstallation(ExternalProgramHolder):
if not isinstance(path_name, str):
raise InvalidArguments('has_path argument must be a string.')
- return self.interpreter.module_method_callback(ModuleReturnValue(path_name in self.paths, []))
+ return path_name in self.paths
@noKwargs
def get_path_method(self, args, kwargs):
@@ -432,7 +431,7 @@ class PythonInstallation(ExternalProgramHolder):
else:
raise InvalidArguments('{} is not a valid path name'.format(path_name))
- return self.interpreter.module_method_callback(ModuleReturnValue(path, []))
+ return path
@noKwargs
def has_variable_method(self, args, kwargs):
@@ -442,7 +441,7 @@ class PythonInstallation(ExternalProgramHolder):
if not isinstance(var_name, str):
raise InvalidArguments('has_variable argument must be a string.')
- return self.interpreter.module_method_callback(ModuleReturnValue(var_name in self.variables, []))
+ return var_name in self.variables
@noKwargs
def get_variable_method(self, args, kwargs):
@@ -460,7 +459,7 @@ class PythonInstallation(ExternalProgramHolder):
else:
raise InvalidArguments('{} is not a valid variable name'.format(var_name))
- return self.interpreter.module_method_callback(ModuleReturnValue(var, []))
+ return var
@noPosargs
@noKwargs
diff --git a/mesonbuild/modules/unstable_rust.py b/mesonbuild/modules/unstable_rust.py
index c4d7d41..11b4365 100644
--- a/mesonbuild/modules/unstable_rust.py
+++ b/mesonbuild/modules/unstable_rust.py
@@ -24,7 +24,8 @@ from ..interpreterbase import InterpreterException, permittedKwargs, FeatureNew,
from ..mesonlib import stringlistify, unholder, listify, typeslistify, File
if T.TYPE_CHECKING:
- from ..interpreter import ModuleState, Interpreter
+ from . import ModuleState
+ from ..interpreter import Interpreter
from ..dependencies import ExternalProgram