interpreter: use typed_kwargs for shared_library(darwin_versions)

pull/12125/head
Dylan Baker 2 years ago
parent 09bc028c71
commit 9d32302032
  1. 47
      mesonbuild/build.py
  2. 1
      mesonbuild/interpreter/kwargs.py
  3. 44
      mesonbuild/interpreter/type_checking.py

@ -2141,7 +2141,7 @@ class SharedLibrary(BuildTarget):
self.soversion: T.Optional[str] = None
self.ltversion: T.Optional[str] = None
# Max length 2, first element is compatibility_version, second is current_version
self.darwin_versions = []
self.darwin_versions: T.Optional[T.Tuple[str, str]] = None
self.vs_module_defs = None
# The import library this target will generate
self.import_filename = None
@ -2307,44 +2307,6 @@ class SharedLibrary(BuildTarget):
if create_debug_file:
self.debug_filename = os.path.splitext(self.filename)[0] + '.pdb'
@staticmethod
def _validate_darwin_versions(darwin_versions):
try:
if isinstance(darwin_versions, int):
darwin_versions = str(darwin_versions)
if isinstance(darwin_versions, str):
darwin_versions = 2 * [darwin_versions]
if not isinstance(darwin_versions, list):
raise InvalidArguments('Shared library darwin_versions: must be a string, integer,'
f'or a list, not {darwin_versions!r}')
if len(darwin_versions) > 2:
raise InvalidArguments('Shared library darwin_versions: list must contain 2 or fewer elements')
if len(darwin_versions) == 1:
darwin_versions = 2 * darwin_versions
for i, v in enumerate(darwin_versions[:]):
if isinstance(v, int):
v = str(v)
if not isinstance(v, str):
raise InvalidArguments('Shared library darwin_versions: list elements '
f'must be strings or integers, not {v!r}')
if not re.fullmatch(r'[0-9]+(\.[0-9]+){0,2}', v):
raise InvalidArguments('Shared library darwin_versions: must be X.Y.Z where '
'X, Y, Z are numbers, and Y and Z are optional')
parts = v.split('.')
if len(parts) in {1, 2, 3} and int(parts[0]) > 65535:
raise InvalidArguments('Shared library darwin_versions: must be X.Y.Z '
'where X is [0, 65535] and Y, Z are optional')
if len(parts) in {2, 3} and int(parts[1]) > 255:
raise InvalidArguments('Shared library darwin_versions: must be X.Y.Z '
'where Y is [0, 255] and Y, Z are optional')
if len(parts) == 3 and int(parts[2]) > 255:
raise InvalidArguments('Shared library darwin_versions: must be X.Y.Z '
'where Z is [0, 255] and Y, Z are optional')
darwin_versions[i] = v
except ValueError:
raise InvalidArguments('Shared library darwin_versions: value is invalid')
return darwin_versions
def process_kwargs(self, kwargs):
super().process_kwargs(kwargs)
@ -2358,11 +2320,10 @@ class SharedLibrary(BuildTarget):
# number of the version by default.
self.soversion = self.ltversion.split('.')[0]
# macOS, iOS and tvOS dylib compatibility_version and current_version
if 'darwin_versions' in kwargs:
self.darwin_versions = self._validate_darwin_versions(kwargs['darwin_versions'])
elif self.soversion:
self.darwin_versions = T.cast('T.Optional[T.Tuple[str, str]]', kwargs.get('darwin_versions'))
if self.darwin_versions is None and self.soversion is not None:
# If unspecified, pick the soversion
self.darwin_versions = 2 * [self.soversion]
self.darwin_versions = (self.soversion, self.soversion)
# Visual Studio module-definitions file
if 'vs_module_defs' in kwargs:

@ -340,6 +340,7 @@ class StaticLibrary(_BuildTarget):
class _SharedLibMixin(TypedDict):
darwin_versions: T.Optional[T.Tuple[str, str]]
soversion: T.Optional[str]
version: T.Optional[str]

@ -504,6 +504,49 @@ def _validate_win_subsystem(value: T.Optional[str]) -> T.Optional[str]:
return f'Invalid value for win_subsystem: {value}.'
return None
def _validate_darwin_versions(darwin_versions: T.List[T.Union[str, int]]) -> T.Optional[str]:
if len(darwin_versions) > 2:
return f"Must contain between 0 and 2 elements, not {len(darwin_versions)}"
if len(darwin_versions) == 1:
darwin_versions = 2 * darwin_versions
for v in darwin_versions:
if isinstance(v, int):
v = str(v)
if not re.fullmatch(r'[0-9]+(\.[0-9]+){0,2}', v):
return 'must be X.Y.Z where X, Y, Z are numbers, and Y and Z are optional'
try:
parts = v.split('.')
except ValueError:
return f'badly formed value: "{v}, not in X.Y.Z form'
if len(parts) in {1, 2, 3} and int(parts[0]) > 65535:
return 'must be X.Y.Z where X is [0, 65535] and Y, Z are optional'
if len(parts) in {2, 3} and int(parts[1]) > 255:
return 'must be X.Y.Z where Y is [0, 255] and Y, Z are optional'
if len(parts) == 3 and int(parts[2]) > 255:
return 'must be X.Y.Z where Z is [0, 255] and Y, Z are optional'
return None
def _convert_darwin_versions(val: T.List[T.Union[str, int]]) -> T.Optional[T.Tuple[str, str]]:
if not val:
return None
elif len(val) == 1:
v = str(val[0])
return (v, v)
return (str(val[0]), str(val[1]))
_DARWIN_VERSIONS_KW: KwargInfo[T.List[T.Union[str, int]]] = KwargInfo(
'darwin_versions',
ContainerTypeInfo(list, (str, int)),
default=[],
listify=True,
validator=_validate_darwin_versions,
convertor=_convert_darwin_versions,
since='0.48.0',
)
# Arguments exclusive to Executable. These are separated to make integrating
# them into build_target easier
_EXCLUSIVE_EXECUTABLE_KWS: T.List[KwargInfo] = [
@ -535,6 +578,7 @@ STATIC_LIB_KWS = [
# Arguments exclusive to SharedLibrary. These are separated to make integrating
# them into build_target easier
_EXCLUSIVE_SHARED_LIB_KWS: T.List[KwargInfo] = [
_DARWIN_VERSIONS_KW,
KwargInfo('soversion', (str, int, NoneType), convertor=lambda x: str(x) if x is not None else None),
KwargInfo('version', (str, NoneType), validator=_validate_shlib_version)
]

Loading…
Cancel
Save