Skip to content

Commit

Permalink
interpreter: handle build_target.darwin_versions being unset vs being…
Browse files Browse the repository at this point in the history
… explicitly []

Which has (perhaps unintentionally) different behavior. When unset the
value of darwin_versions will be `(so_version, so_version)`, when it's
set to `[]` then no values will be used even if so_version is set.

Fixes: #12604
  • Loading branch information
dcbaker committed Dec 12, 2023
1 parent fbb8030 commit a3f636e
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 8 deletions.
8 changes: 6 additions & 2 deletions mesonbuild/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion mesonbuild/interpreter/kwargs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]]
Expand Down
13 changes: 9 additions & 4 deletions mesonbuild/interpreter/type_checking.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion test cases/common/4 shared/meson.build
Original file line number Diff line number Diff line change
@@ -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)
Expand Down

0 comments on commit a3f636e

Please sign in to comment.