diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2022-07-14 13:12:25 -0700 |
---|---|---|
committer | Eli Schwartz <eschwartz93@gmail.com> | 2022-08-17 16:25:36 -0400 |
commit | a78992dd81b4bd1673e4815ff26acd694ff77f68 (patch) | |
tree | 80c6dfddc3a1c8cfa45903d23c3ff01b3862051a /mesonbuild/modules/unstable_wayland.py | |
parent | c32f83a829b6b10a0cbc191c1368b563d4582c28 (diff) | |
download | meson-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/modules/unstable_wayland.py')
-rw-r--r-- | mesonbuild/modules/unstable_wayland.py | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/mesonbuild/modules/unstable_wayland.py b/mesonbuild/modules/unstable_wayland.py deleted file mode 100644 index aab07d4..0000000 --- a/mesonbuild/modules/unstable_wayland.py +++ /dev/null @@ -1,154 +0,0 @@ -# Copyright 2022 Mark Bolhuis <mark@bolhuis.dev> - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations -import os -import typing as T - -from . import ExtensionModule, ModuleReturnValue, ModuleInfo -from ..build import CustomTarget -from ..interpreter.type_checking import NoneType, in_set_validator -from ..interpreterbase import typed_pos_args, typed_kwargs, KwargInfo -from ..mesonlib import File, MesonException - -if T.TYPE_CHECKING: - from typing_extensions import Literal,TypedDict - - from . import ModuleState - from ..build import Executable - from ..dependencies import Dependency - from ..interpreter import Interpreter - from ..programs import ExternalProgram - from ..mesonlib import FileOrString - - class ScanXML(TypedDict): - - public: bool - client: bool - server: bool - - class FindProtocol(TypedDict): - - state: Literal['stable', 'staging', 'unstable'] - version: T.Optional[int] - -class WaylandModule(ExtensionModule): - - INFO = ModuleInfo('wayland', '0.62.0', unstable=True) - - def __init__(self, interpreter: Interpreter) -> None: - super().__init__(interpreter) - - self.protocols_dep: T.Optional[Dependency] = None - self.pkgdatadir: T.Optional[str] = None - self.scanner_bin: T.Optional[T.Union[ExternalProgram, Executable]] = None - - self.methods.update({ - 'scan_xml': self.scan_xml, - 'find_protocol': self.find_protocol, - }) - - @typed_pos_args('wayland.scan_xml', varargs=(str, File), min_varargs=1) - @typed_kwargs( - 'wayland.scan_xml', - KwargInfo('public', bool, default=False), - KwargInfo('client', bool, default=True), - KwargInfo('server', bool, default=False), - ) - def scan_xml(self, state: ModuleState, args: T.Tuple[T.List[FileOrString]], kwargs: ScanXML) -> ModuleReturnValue: - if self.scanner_bin is None: - # wayland-scanner from BUILD machine must have same version as wayland - # libraries from HOST machine. - dep = state.dependency('wayland-client') - self.scanner_bin = state.find_tool('wayland-scanner', 'wayland-scanner', 'wayland_scanner', - wanted=dep.version) - - scope = 'public' if kwargs['public'] else 'private' - # We have to cast because mypy can't deduce these are literals - sides = [i for i in T.cast("T.List[Literal['client', 'server']]", ['client', 'server']) if kwargs[i]] - if not sides: - raise MesonException('At least one of client or server keyword argument must be set to true.') - - xml_files = self.interpreter.source_strings_to_files(args[0]) - targets: T.List[CustomTarget] = [] - for xml_file in xml_files: - name = os.path.splitext(os.path.basename(xml_file.fname))[0] - - code = CustomTarget( - f'{name}-protocol', - state.subdir, - state.subproject, - state.environment, - [self.scanner_bin, f'{scope}-code', '@INPUT@', '@OUTPUT@'], - [xml_file], - [f'{name}-protocol.c'], - backend=state.backend, - ) - targets.append(code) - - for side in sides: - header = CustomTarget( - f'{name}-{side}-protocol', - state.subdir, - state.subproject, - state.environment, - [self.scanner_bin, f'{side}-header', '@INPUT@', '@OUTPUT@'], - [xml_file], - [f'{name}-{side}-protocol.h'], - backend=state.backend, - ) - targets.append(header) - - return ModuleReturnValue(targets, targets) - - @typed_pos_args('wayland.find_protocol', str) - @typed_kwargs( - 'wayland.find_protocol', - KwargInfo('state', str, default='stable', validator=in_set_validator({'stable', 'staging', 'unstable'})), - KwargInfo('version', (int, NoneType)), - ) - def find_protocol(self, state: ModuleState, args: T.Tuple[str], kwargs: FindProtocol) -> File: - base_name = args[0] - xml_state = kwargs['state'] - version = kwargs['version'] - - if xml_state != 'stable' and version is None: - raise MesonException(f'{xml_state} protocols require a version number.') - - if xml_state == 'stable' and version is not None: - raise MesonException('stable protocols do not require a version number.') - - if self.protocols_dep is None: - self.protocols_dep = state.dependency('wayland-protocols') - - if self.pkgdatadir is None: - self.pkgdatadir = self.protocols_dep.get_variable(pkgconfig='pkgdatadir', internal='pkgdatadir') - - if xml_state == 'stable': - xml_name = f'{base_name}.xml' - elif xml_state == 'staging': - xml_name = f'{base_name}-v{version}.xml' - else: - xml_name = f'{base_name}-unstable-v{version}.xml' - - path = os.path.join(self.pkgdatadir, xml_state, base_name, xml_name) - - if not os.path.exists(path): - raise MesonException(f'The file {path} does not exist.') - - return File.from_absolute_file(path) - - -def initialize(interpreter: Interpreter) -> WaylandModule: - return WaylandModule(interpreter) |