cmake: typed_kwargs for write_basic_package_version_file

This commit is contained in:
Andrea Pappacoda 2022-02-01 15:58:04 +01:00 committed by Eli Schwartz
parent a45446b6e5
commit a755750cae
1 changed files with 24 additions and 18 deletions

View File

@ -21,6 +21,7 @@ from . import ExtensionModule, ModuleReturnValue, ModuleObject
from .. import build, mesonlib, mlog, dependencies from .. import build, mesonlib, mlog, dependencies
from ..cmake import SingleTargetOptions, TargetOptions, cmake_defines_to_args from ..cmake import SingleTargetOptions, TargetOptions, cmake_defines_to_args
from ..interpreter import SubprojectHolder from ..interpreter import SubprojectHolder
from ..interpreter.type_checking import NoneType, in_set_validator
from ..interpreterbase import ( from ..interpreterbase import (
FeatureNew, FeatureNew,
FeatureNewKwargs, FeatureNewKwargs,
@ -33,8 +34,18 @@ from ..interpreterbase import (
InvalidArguments, InvalidArguments,
InterpreterException, InterpreterException,
typed_kwargs,
KwargInfo,
) )
if T.TYPE_CHECKING:
class WriteBasicPackageVersionFile(T.TypedDict):
compatibility: str
install_dir: T.Optional[str]
name: str
version: str
COMPATIBILITIES = ['AnyNewerVersion', 'SameMajorVersion', 'SameMinorVersion', 'ExactVersion'] COMPATIBILITIES = ['AnyNewerVersion', 'SameMajorVersion', 'SameMinorVersion', 'ExactVersion']
@ -256,31 +267,26 @@ class CmakeModule(ExtensionModule):
self.cmake_detected = True self.cmake_detected = True
return True return True
@permittedKwargs({'version', 'name', 'compatibility', 'install_dir'}) @noPosargs
def write_basic_package_version_file(self, state, _args, kwargs): @typed_kwargs(
version = kwargs.get('version', None) 'cmake.write_basic_package_version_file',
if not isinstance(version, str): KwargInfo('compatibility', str, default='AnyNewerVersion', validator=in_set_validator(set(COMPATIBILITIES))),
raise mesonlib.MesonException('Version must be specified.') KwargInfo('install_dir', (str, NoneType), default=None),
KwargInfo('name', str, required=True),
name = kwargs.get('name', None) KwargInfo('version', str, required=True),
if not isinstance(name, str): )
raise mesonlib.MesonException('Name not specified.') def write_basic_package_version_file(self, state, args, kwargs: 'WriteBasicPackageVersionFile'):
compatibility = kwargs['compatibility']
compatibility = kwargs.get('compatibility', 'AnyNewerVersion') name = kwargs['name']
if not isinstance(compatibility, str): version = kwargs['version']
raise mesonlib.MesonException('compatibility is not string.')
if compatibility not in COMPATIBILITIES:
raise mesonlib.MesonException('compatibility must be either AnyNewerVersion, SameMajorVersion or ExactVersion.')
if not self.detect_cmake(state): if not self.detect_cmake(state):
raise mesonlib.MesonException('Unable to find cmake') raise mesonlib.MesonException('Unable to find cmake')
pkgroot = pkgroot_name = kwargs.get('install_dir', None) pkgroot = pkgroot_name = kwargs['install_dir']
if pkgroot is None: if pkgroot is None:
pkgroot = os.path.join(state.environment.coredata.get_option(mesonlib.OptionKey('libdir')), 'cmake', name) pkgroot = os.path.join(state.environment.coredata.get_option(mesonlib.OptionKey('libdir')), 'cmake', name)
pkgroot_name = os.path.join('{libdir}', 'cmake', name) pkgroot_name = os.path.join('{libdir}', 'cmake', name)
if not isinstance(pkgroot, str):
raise mesonlib.MesonException('Install_dir must be a string.')
template_file = os.path.join(self.cmake_root, 'Modules', f'BasicConfigVersion-{compatibility}.cmake.in') template_file = os.path.join(self.cmake_root, 'Modules', f'BasicConfigVersion-{compatibility}.cmake.in')
if not os.path.exists(template_file): if not os.path.exists(template_file):