diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 12e7cb5ef64b..25a57b8fc176 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -2364,10 +2364,14 @@ def process_kwargs(self, kwargs): # number of the version by default. self.soversion = self.ltversion.split('.')[0] # macOS, iOS and tvOS dylib compatibility_version and current_version - 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: + d = T.cast('T.Union[None, Literal[False], T.Tuple[str, str]]', kwargs.get('darwin_versions')) + if d is None and self.soversion is not None: # If unspecified, pick the soversion self.darwin_versions = (self.soversion, self.soversion) + elif d is False: + self.darwin_versions = None + else: + self.darwin_versions = d # Visual Studio module-definitions file self.process_vs_module_defs_kw(kwargs) diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py index 17f7876a04d0..f43f598e9dd0 100644 --- a/mesonbuild/interpreter/kwargs.py +++ b/mesonbuild/interpreter/kwargs.py @@ -397,7 +397,7 @@ class StaticLibrary(_BuildTarget, _StaticLibMixin, _LibraryMixin): class _SharedLibMixin(TypedDict): - darwin_versions: T.Optional[T.Tuple[str, str]] + darwin_versions: T.Union[None, Literal[False], T.Tuple[str, str]] soversion: T.Optional[str] version: T.Optional[str] vs_module_defs: T.Optional[T.Union[str, File, build.CustomTarget, build.CustomTargetIndex]] diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py index 616f4efbb58e..36b12247e0fb 100644 --- a/mesonbuild/interpreter/type_checking.py +++ b/mesonbuild/interpreter/type_checking.py @@ -680,9 +680,14 @@ def _validate_darwin_versions(darwin_versions: T.List[T.Union[str, int]]) -> T.O return None -def _convert_darwin_versions(val: T.List[T.Union[str, int]]) -> T.Optional[T.Tuple[str, str]]: - if not val: +def _convert_darwin_versions(val: T.List[T.Union[str, int]]) -> T.Union[None, Literal[False], T.Tuple[str, str]]: + # Returns None if unset, but False if an empty list is passed, which + # annoyingly have different behavior. False means do no use soversion, while + # None means do use it. + if None in val: return None + if not val: + return False elif len(val) == 1: v = str(val[0]) return (v, v) @@ -691,8 +696,8 @@ def _convert_darwin_versions(val: T.List[T.Union[str, int]]) -> T.Optional[T.Tup _DARWIN_VERSIONS_KW: KwargInfo[T.List[T.Union[str, int]]] = KwargInfo( 'darwin_versions', - ContainerTypeInfo(list, (str, int)), - default=[], + ContainerTypeInfo(list, (str, int, NoneType)), + default=[None], listify=True, validator=_validate_darwin_versions, convertor=_convert_darwin_versions, diff --git a/test cases/common/4 shared/meson.build b/test cases/common/4 shared/meson.build index 7f79ad6302f4..bcf4cc8b8d69 100644 --- a/test cases/common/4 shared/meson.build +++ b/test cases/common/4 shared/meson.build @@ -1,6 +1,6 @@ project('shared library test', 'c', default_options : ['default_library=shared']) lib = shared_library('mylib', 'libfile.c') -build_target('mylib2', 'libfile.c', target_type: 'shared_library') +build_target('mylib2', 'libfile.c', target_type: 'shared_library', soversion : 'invalid_darwin_version', darwin_versions: []) has_not_changed = false if is_disabler(lib)