summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2025-11-12 08:37:58 -0800
committerDylan Baker <dylan@pnwbakers.com>2025-11-14 08:17:19 -0800
commitf5d81d071e411618ca0c1ec270565aa6f4b12dbc (patch)
tree83dfe3e76016a60f47a72c1ff15a9b80ea91cf84 /mesonbuild
parentee76b3c23607596c24584bd63c7b41ee55c33dec (diff)
downloadmeson-f5d81d071e411618ca0c1ec270565aa6f4b12dbc.tar.gz
interpreter: Robustly covert executable arguments to shared_library arguments
This extends the code that strips executable keyword arguments to also default populate shared_library exclusive arguments. Fixes: #15238
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/interpreter/interpreter.py20
-rw-r--r--mesonbuild/interpreter/type_checking.py8
2 files changed, 16 insertions, 12 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index a3cdde04a..f3382d20e 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -54,7 +54,7 @@ from .type_checking import (
CT_BUILD_BY_DEFAULT,
CT_INPUT_KW,
CT_INSTALL_DIR_KW,
- _EXCLUSIVE_EXECUTABLE_KWS,
+ EXCLUSIVE_EXECUTABLE_KWS,
EXECUTABLE_KWS,
JAR_KWS,
LIBRARY_KWS,
@@ -1813,22 +1813,26 @@ class Interpreter(InterpreterBase, HoldableObject):
def func_disabler(self, node, args, kwargs):
return Disabler()
- def _strip_exe_specific_kwargs(self, kwargs: kwtypes.Executable) -> kwtypes._BuildTarget:
- kwargs = kwargs.copy()
- for exe_kwarg in _EXCLUSIVE_EXECUTABLE_KWS:
- del kwargs[exe_kwarg.name]
- return kwargs
+ def _exe_to_shlib_kwargs(self, kwargs: kwtypes.Executable) -> kwtypes.SharedLibrary:
+ nkwargs = T.cast('kwtypes.SharedLibrary', kwargs.copy())
+ for exe_kwarg in EXCLUSIVE_EXECUTABLE_KWS:
+ del nkwargs[exe_kwarg.name] # type: ignore[misc]
+ for sh_kwarg in SHARED_LIB_KWS:
+ nkwargs.setdefault(sh_kwarg.name, sh_kwarg.default) # type: ignore[misc]
+ nkwargs['rust_abi'] = None
+ nkwargs['rust_crate_type'] = 'cdylib'
+ return nkwargs
@permittedKwargs(build.known_exe_kwargs)
@typed_pos_args('executable', str, varargs=SOURCES_VARARGS)
@typed_kwargs('executable', *EXECUTABLE_KWS, allow_unknown=True)
def func_executable(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
- kwargs: kwtypes.Executable) -> build.Executable:
+ kwargs: kwtypes.Executable) -> T.Union[build.Executable, build.SharedLibrary]:
for_machine = kwargs['native']
m = self.environment.machines[for_machine]
if m.is_android() and kwargs.get('android_exe_type') == 'application':
- holder = self.build_target(node, args, self._strip_exe_specific_kwargs(kwargs), build.SharedLibrary)
+ holder = self.build_target(node, args, self._exe_to_shlib_kwargs(kwargs), build.SharedLibrary)
holder.shared_library_only = True
return holder
return self.build_target(node, args, kwargs, build.Executable)
diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py
index d0a57f2c9..28280a996 100644
--- a/mesonbuild/interpreter/type_checking.py
+++ b/mesonbuild/interpreter/type_checking.py
@@ -808,7 +808,7 @@ _DARWIN_VERSIONS_KW: KwargInfo[T.List[T.Union[str, int]]] = KwargInfo(
# Arguments exclusive to Executable. These are separated to make integrating
# them into build_target easier
-_EXCLUSIVE_EXECUTABLE_KWS: T.List[KwargInfo] = [
+EXCLUSIVE_EXECUTABLE_KWS: T.List[KwargInfo] = [
KwargInfo('export_dynamic', (bool, NoneType), since='0.45.0'),
KwargInfo('gui_app', (bool, NoneType), deprecated='0.56.0', deprecated_message="Use 'win_subsystem' instead"),
KwargInfo(
@@ -837,7 +837,7 @@ _EXCLUSIVE_EXECUTABLE_KWS: T.List[KwargInfo] = [
# The total list of arguments used by Executable
EXECUTABLE_KWS = [
*_BUILD_TARGET_KWS,
- *_EXCLUSIVE_EXECUTABLE_KWS,
+ *EXCLUSIVE_EXECUTABLE_KWS,
_VS_MODULE_DEFS_KW.evolve(since='1.3.0', since_values=None),
_JAVA_LANG_KW,
]
@@ -877,7 +877,7 @@ _EXCLUSIVE_SHARED_LIB_KWS: T.List[KwargInfo] = [
]
# The total list of arguments used by SharedLibrary
-SHARED_LIB_KWS = [
+SHARED_LIB_KWS: T.List[KwargInfo] = [
*_BUILD_TARGET_KWS,
*_EXCLUSIVE_SHARED_LIB_KWS,
*_EXCLUSIVE_LIB_KWS,
@@ -945,7 +945,7 @@ BUILD_TARGET_KWS = [
*_EXCLUSIVE_SHARED_LIB_KWS,
*_EXCLUSIVE_SHARED_MOD_KWS,
*_EXCLUSIVE_STATIC_LIB_KWS,
- *_EXCLUSIVE_EXECUTABLE_KWS,
+ *EXCLUSIVE_EXECUTABLE_KWS,
*_SHARED_STATIC_ARGS,
RUST_ABI_KW.evolve(since='1.10.0'),
*[a.evolve(deprecated='1.3.0', deprecated_message='The use of "jar" in "build_target()" is deprecated, and this argument is only used by jar()')