diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-03-03 09:02:49 -0500 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2021-05-28 15:17:10 -0400 |
commit | 723c5227a471aff3a1a5a3bc481984c99bf592aa (patch) | |
tree | 647154c14f8a8de4f58da4b1bd272a5dfaf30efa | |
parent | 495e76d10a65df9e19e96e5470d64644da0e8099 (diff) | |
download | meson-723c5227a471aff3a1a5a3bc481984c99bf592aa.zip meson-723c5227a471aff3a1a5a3bc481984c99bf592aa.tar.gz meson-723c5227a471aff3a1a5a3bc481984c99bf592aa.tar.bz2 |
modules: Remove snippet methods
The only advantage they have is they have the interpreter in arguments,
but it's already available as self.interpreter. We should discourage
usage of the interpreter API and rely on ModuleState object instead in
the future.
This also lift the restriction that a module method cannot add build
targets, but that was not enforced for snippet methods anyway (and some
modules were doing it) and it's really loose restriction as it should
check for many other things if we wanted to make it consistent.
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 21 | ||||
-rw-r--r-- | mesonbuild/interpreterbase.py | 7 | ||||
-rw-r--r-- | mesonbuild/modules/__init__.py | 2 | ||||
-rw-r--r-- | mesonbuild/modules/cmake.py | 14 | ||||
-rw-r--r-- | mesonbuild/modules/dlang.py | 3 | ||||
-rw-r--r-- | mesonbuild/modules/fs.py | 1 | ||||
-rw-r--r-- | mesonbuild/modules/keyval.py | 11 | ||||
-rw-r--r-- | mesonbuild/modules/python.py | 5 | ||||
-rw-r--r-- | mesonbuild/modules/python3.py | 5 | ||||
-rw-r--r-- | mesonbuild/modules/qt.py | 3 | ||||
-rw-r--r-- | mesonbuild/modules/sourceset.py | 5 | ||||
-rw-r--r-- | mesonbuild/modules/unstable_icestorm.py | 19 | ||||
-rw-r--r-- | mesonbuild/modules/unstable_simd.py | 7 |
13 files changed, 38 insertions, 65 deletions
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 10e681a..1c64f5b 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -10,7 +10,7 @@ from .. import coredata from .. import build from .. import mlog -from ..modules import ModuleReturnValue, ModuleObject, ModuleState +from ..modules import ModuleReturnValue, ModuleObject, ModuleState, ExtensionModule from ..backend.backends import TestProtocol from ..interpreterbase import (InterpreterObject, ObjectHolder, MutableInterpreterObject, FeatureNewKwargs, FeatureNew, FeatureDeprecated, @@ -802,19 +802,12 @@ class ModuleObjectHolder(InterpreterObject, ObjectHolder['ModuleObject']): # so we have to ensure they use the current interpreter and not the one # that first imported that module, otherwise it will use outdated # overrides. - modobj.interpreter = self.interpreter - if method_name in modobj.snippets: - ret = method(self.interpreter, state, args, kwargs) - else: - # This is not 100% reliable but we can't use hash() - # because the Build object contains dicts and lists. - num_targets = len(self.interpreter.build.targets) - ret = method(state, args, kwargs) - if num_targets != len(self.interpreter.build.targets): - raise InterpreterException('Extension module altered internal state illegally.') - if isinstance(ret, ModuleReturnValue): - self.interpreter.process_new_values(ret.new_objects) - ret = ret.return_value + if isinstance(modobj, ExtensionModule): + modobj.interpreter = self.interpreter + ret = method(state, args, kwargs) + if isinstance(ret, ModuleReturnValue): + self.interpreter.process_new_values(ret.new_objects) + ret = ret.return_value return self.interpreter.holderify(ret) _Target = T.TypeVar('_Target', bound=build.Target) diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py index a364510..41732d6 100644 --- a/mesonbuild/interpreterbase.py +++ b/mesonbuild/interpreterbase.py @@ -140,13 +140,6 @@ def _get_callee_args(wrapped_args: T.Sequence[T.Any], want_subproject: bool = Fa subproject = s.subproject else: subproject = wrapped_args[1].subproject - elif n == 5: - # Module snippets have 5 args: self, interpreter, state, args, kwargs - node = wrapped_args[2].current_node - args = wrapped_args[3] - kwargs = wrapped_args[4] - if want_subproject: - subproject = wrapped_args[2].subproject else: raise AssertionError(f'Unknown args: {wrapped_args!r}') # Sometimes interpreter methods are called internally with None instead of diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index c097029..f73a50b 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -91,8 +91,6 @@ class ModuleObject: # FIXME: Port all modules to stop using self.interpreter and use API on # ModuleState instead. self.interpreter = interpreter - # 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): diff --git a/mesonbuild/modules/cmake.py b/mesonbuild/modules/cmake.py index ee09359..bef7a00 100644 --- a/mesonbuild/modules/cmake.py +++ b/mesonbuild/modules/cmake.py @@ -216,8 +216,6 @@ class CmakeModule(ExtensionModule): def __init__(self, interpreter): super().__init__(interpreter) - self.snippets.add('configure_package_config_file') - self.snippets.add('subproject') def detect_voidp_size(self, env): compilers = env.coredata.compilers.host @@ -318,7 +316,7 @@ class CmakeModule(ExtensionModule): mesonlib.replace_if_different(outfile, outfile_tmp) @permittedKwargs({'input', 'name', 'install_dir', 'configuration'}) - def configure_package_config_file(self, interpreter, state, args, kwargs): + def configure_package_config_file(self, state, args, kwargs): if args: raise mesonlib.MesonException('configure_package_config_file takes only keyword arguments.') @@ -369,11 +367,11 @@ class CmakeModule(ExtensionModule): conf.mark_used() conffile = os.path.normpath(inputfile.relative_name()) - if conffile not in interpreter.build_def_files: - interpreter.build_def_files.append(conffile) + if conffile not in self.interpreter.build_def_files: + self.interpreter.build_def_files.append(conffile) res = build.Data([mesonlib.File(True, ofile_path, ofile_fname)], install_dir, None, state.subproject) - interpreter.build.data.append(res) + self.interpreter.build.data.append(res) return res @@ -382,13 +380,13 @@ class CmakeModule(ExtensionModule): @FeatureDeprecatedKwargs('subproject', '0.55.0', ['cmake_options']) @permittedKwargs({'cmake_options', 'required', 'options'}) @stringArgs - def subproject(self, interpreter, state, args, kwargs): + def subproject(self, state, args, kwargs): if len(args) != 1: raise InterpreterException('Subproject takes exactly one argument') if 'cmake_options' in kwargs and 'options' in kwargs: raise InterpreterException('"options" cannot be used together with "cmake_options"') dirname = args[0] - subp = interpreter.do_subproject(dirname, 'cmake', kwargs) + subp = self.interpreter.do_subproject(dirname, 'cmake', kwargs) if not subp.held_object: return subp return CMakeSubprojectHolder(subp, dirname) diff --git a/mesonbuild/modules/dlang.py b/mesonbuild/modules/dlang.py index f2633cb..1dcf5e2 100644 --- a/mesonbuild/modules/dlang.py +++ b/mesonbuild/modules/dlang.py @@ -36,7 +36,6 @@ class DlangModule(ExtensionModule): def __init__(self, interpreter): super().__init__(interpreter) - self.snippets.add('generate_dub_file') def _init_dub(self): if DlangModule.class_dubbin is None: @@ -55,7 +54,7 @@ class DlangModule(ExtensionModule): if not self.dubbin: raise MesonException('DUB not found.') - def generate_dub_file(self, interpreter, state, args, kwargs): + def generate_dub_file(self, state, args, kwargs): if not DlangModule.init_dub: self._init_dub() diff --git a/mesonbuild/modules/fs.py b/mesonbuild/modules/fs.py index 004fd13..d79b726 100644 --- a/mesonbuild/modules/fs.py +++ b/mesonbuild/modules/fs.py @@ -37,7 +37,6 @@ class FSModule(ExtensionModule): def __init__(self, interpreter: 'Interpreter') -> None: super().__init__(interpreter) - self.snippets.add('generate_dub_file') def _absolute_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path: """ diff --git a/mesonbuild/modules/keyval.py b/mesonbuild/modules/keyval.py index 5fc4d52..8e43491 100644 --- a/mesonbuild/modules/keyval.py +++ b/mesonbuild/modules/keyval.py @@ -25,7 +25,6 @@ class KeyvalModule(ExtensionModule): @FeatureNew('Keyval Module', '0.55.0') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.snippets.add('load') def _load_file(self, path_to_config): result = dict() @@ -47,7 +46,7 @@ class KeyvalModule(ExtensionModule): return result @noKwargs - def load(self, interpreter, state, args, kwargs): + def load(self, state, args, kwargs): sources = typeslistify(args, (str, mesonlib.File)) if len(sources) != 1: raise InvalidCode('load takes only one file input.') @@ -56,12 +55,12 @@ class KeyvalModule(ExtensionModule): is_built = False if isinstance(s, mesonlib.File): is_built = is_built or s.is_built - s = s.absolute_path(interpreter.environment.source_dir, interpreter.environment.build_dir) + s = s.absolute_path(self.interpreter.environment.source_dir, self.interpreter.environment.build_dir) else: - s = os.path.join(interpreter.environment.source_dir, s) + s = os.path.join(self.interpreter.environment.source_dir, s) - if s not in interpreter.build_def_files and not is_built: - interpreter.build_def_files.append(s) + if s not in self.interpreter.build_def_files and not is_built: + self.interpreter.build_def_files.append(s) return self._load_file(s) diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index 2bd354f..1efebf8 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -473,7 +473,6 @@ class PythonModule(ExtensionModule): @FeatureNew('Python Module', '0.46.0') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.snippets.add('find_installation') # https://www.python.org/dev/peps/pep-0397/ def _get_win_pythonpath(self, name_or_path): @@ -502,7 +501,7 @@ class PythonModule(ExtensionModule): @FeatureNewKwargs('python.find_installation', '0.51.0', ['modules']) @disablerIfNotFound @permittedKwargs({'required', 'modules'}) - def find_installation(self, interpreter, state, args, kwargs): + def find_installation(self, state, args, kwargs): feature_check = FeatureNew('Passing "feature" option to find_installation', '0.48.0') disabled, required, feature = extract_required_kwarg(kwargs, state.subproject, feature_check) want_modules = mesonlib.extract_as_list(kwargs, 'modules') # type: T.List[str] @@ -587,7 +586,7 @@ class PythonModule(ExtensionModule): mlog.debug(stderr) if isinstance(info, dict) and 'version' in info and self._check_version(name_or_path, info['version']): - res = PythonInstallation(interpreter, python, info) + res = PythonInstallation(self.interpreter, python, info) else: res = ExternalProgramHolder(NonExistingExternalProgram(), state.subproject) if required: diff --git a/mesonbuild/modules/python3.py b/mesonbuild/modules/python3.py index e7a2bb3..4dbb9b5 100644 --- a/mesonbuild/modules/python3.py +++ b/mesonbuild/modules/python3.py @@ -26,10 +26,9 @@ class Python3Module(ExtensionModule): @FeatureDeprecated('python3 module', '0.48.0') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.snippets.add('extension_module') @permittedKwargs(known_shmod_kwargs) - def extension_module(self, interpreter, state, args, kwargs): + def extension_module(self, state, args, kwargs): if 'name_prefix' in kwargs: raise mesonlib.MesonException('Name_prefix is set automatically, specifying it is forbidden.') if 'name_suffix' in kwargs: @@ -45,7 +44,7 @@ class Python3Module(ExtensionModule): suffix = [] kwargs['name_prefix'] = '' kwargs['name_suffix'] = suffix - return interpreter.func_shared_module(None, args, kwargs) + return self.interpreter.func_shared_module(None, args, kwargs) @noKwargs def find_python(self, state, args, kwargs): diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py index 1bf0099..7455e8e 100644 --- a/mesonbuild/modules/qt.py +++ b/mesonbuild/modules/qt.py @@ -41,7 +41,6 @@ class QtBaseModule(ExtensionModule): def __init__(self, interpreter: 'Interpreter', qt_version=5): ExtensionModule.__init__(self, interpreter) - self.snippets.add('has_tools') self.qt_version = qt_version self.moc: 'ExternalProgram' = NonExistingExternalProgram('moc') self.uic: 'ExternalProgram' = NonExistingExternalProgram('uic') @@ -170,7 +169,7 @@ class QtBaseModule(ExtensionModule): @noPosargs @permittedKwargs({'method', 'required'}) @FeatureNew('qt.has_tools', '0.54.0') - def has_tools(self, interpreter, state, args, kwargs): + def has_tools(self, state, args, kwargs): method = kwargs.get('method', 'auto') disabled, required, feature = extract_required_kwarg(kwargs, state.subproject, default=False) if disabled: diff --git a/mesonbuild/modules/sourceset.py b/mesonbuild/modules/sourceset.py index 15257e7..73cfbe1 100644 --- a/mesonbuild/modules/sourceset.py +++ b/mesonbuild/modules/sourceset.py @@ -189,12 +189,11 @@ class SourceSetModule(ExtensionModule): @FeatureNew('SourceSet module', '0.51.0') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.snippets.add('source_set') @noKwargs @noPosargs - def source_set(self, interpreter, state, args, kwargs): - return SourceSetHolder(interpreter) + def source_set(self, state, args, kwargs): + return SourceSetHolder(self.interpreter) def initialize(*args, **kwargs): return SourceSetModule(*args, **kwargs) diff --git a/mesonbuild/modules/unstable_icestorm.py b/mesonbuild/modules/unstable_icestorm.py index 268c394..8746870 100644 --- a/mesonbuild/modules/unstable_icestorm.py +++ b/mesonbuild/modules/unstable_icestorm.py @@ -23,7 +23,6 @@ class IceStormModule(ExtensionModule): @FeatureNew('FPGA/Icestorm Module', '0.45.0') def __init__(self, interpreter): super().__init__(interpreter) - self.snippets.add('project') self.yosys_bin = None def detect_binaries(self, interpreter): @@ -33,9 +32,9 @@ class IceStormModule(ExtensionModule): self.iceprog_bin = interpreter.find_program_impl(['iceprog']) self.icetime_bin = interpreter.find_program_impl(['icetime']) - def project(self, interpreter, state, args, kwargs): + def project(self, state, args, kwargs): if not self.yosys_bin: - self.detect_binaries(interpreter) + self.detect_binaries(self.interpreter) if not args: raise mesonlib.MesonException('Project requires at least one argument, which is the project name.') proj_name = args[0] @@ -45,11 +44,11 @@ class IceStormModule(ExtensionModule): kwarg_sources = kwargs.get('sources', []) if not isinstance(kwarg_sources, list): kwarg_sources = [kwarg_sources] - all_sources = interpreter.source_strings_to_files(flatten(arg_sources + kwarg_sources)) + all_sources = self.interpreter.source_strings_to_files(flatten(arg_sources + kwarg_sources)) if 'constraint_file' not in kwargs: raise mesonlib.MesonException('Constraint file not specified.') - constraint_file = interpreter.source_strings_to_files(kwargs['constraint_file']) + constraint_file = self.interpreter.source_strings_to_files(kwargs['constraint_file']) if len(constraint_file) != 1: raise mesonlib.MesonException('Constraint file must contain one and only one entry.') blif_name = proj_name + '_blif' @@ -61,26 +60,26 @@ class IceStormModule(ExtensionModule): time_name = proj_name + '-time' upload_name = proj_name + '-upload' - blif_target = interpreter.func_custom_target(None, [blif_name], { + blif_target = self.interpreter.func_custom_target(None, [blif_name], { 'input': all_sources, 'output': blif_fname, 'command': [self.yosys_bin, '-q', '-p', 'synth_ice40 -blif @OUTPUT@', '@INPUT@']}) - asc_target = interpreter.func_custom_target(None, [asc_name], { + asc_target = self.interpreter.func_custom_target(None, [asc_name], { 'input': blif_target, 'output': asc_fname, 'command': [self.arachne_bin, '-q', '-d', '1k', '-p', constraint_file, '@INPUT@', '-o', '@OUTPUT@']}) - bin_target = interpreter.func_custom_target(None, [bin_name], { + bin_target = self.interpreter.func_custom_target(None, [bin_name], { 'input': asc_target, 'output': bin_fname, 'command': [self.icepack_bin, '@INPUT@', '@OUTPUT@'], 'build_by_default': True}) - interpreter.func_run_target(None, [upload_name], { + self.interpreter.func_run_target(None, [upload_name], { 'command': [self.iceprog_bin, bin_target]}) - interpreter.func_run_target(None, [time_name], { + self.interpreter.func_run_target(None, [time_name], { 'command': [self.icetime_bin, bin_target]}) def initialize(*args, **kwargs): diff --git a/mesonbuild/modules/unstable_simd.py b/mesonbuild/modules/unstable_simd.py index 4c066fb..5f8edfd 100644 --- a/mesonbuild/modules/unstable_simd.py +++ b/mesonbuild/modules/unstable_simd.py @@ -23,7 +23,6 @@ class SimdModule(ExtensionModule): @FeatureNew('SIMD module', '0.42.0') def __init__(self, interpreter): super().__init__(interpreter) - self.snippets.add('check') # FIXME add Altivec and AVX512. self.isets = ('mmx', 'sse', @@ -37,7 +36,7 @@ class SimdModule(ExtensionModule): 'neon', ) - def check(self, interpreter, state, args, kwargs): + def check(self, state, args, kwargs): result = [] if len(args) != 1: raise mesonlib.MesonException('Check requires one argument, a name prefix for checks.') @@ -55,7 +54,7 @@ class SimdModule(ExtensionModule): compiler = kwargs['compiler'].compiler if not isinstance(compiler, compilers.compilers.Compiler): raise mesonlib.MesonException('Compiler argument must be a compiler object.') - cdata = interpreter.func_configuration_data(None, [], {}) + cdata = self.interpreter.func_configuration_data(None, [], {}) conf = cdata.held_object for iset in self.isets: if iset not in kwargs: @@ -79,7 +78,7 @@ class SimdModule(ExtensionModule): old_lang_args = mesonlib.extract_as_list(lib_kwargs, langarg_key) all_lang_args = old_lang_args + args lib_kwargs[langarg_key] = all_lang_args - result.append(interpreter.func_static_lib(None, [libname], lib_kwargs)) + result.append(self.interpreter.func_static_lib(None, [libname], lib_kwargs)) return [result, cdata] def initialize(*args, **kwargs): |