summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2023-07-13 10:26:14 -0700
committerEli Schwartz <eschwartz93@gmail.com>2023-10-09 17:33:48 -0400
commit013536fcb45dc40c4f592f5c5821ee6d38d331ed (patch)
treeee7cddf43778f63a5f102de1225ce62e1ff5f419 /mesonbuild
parente24f43051255d3978002f39d08149c3088cb67f9 (diff)
downloadmeson-013536fcb45dc40c4f592f5c5821ee6d38d331ed.tar.gz
interpreter: add <lang>_(static|shared)_args
Which allow passing arguments specifically to the static or shared libraries. For design, this is all handled in the interpreter, by the build layer the arguments are combined into the existing fields. This limits changes required in the mid and backend layers
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/interpreter/interpreter.py17
-rw-r--r--mesonbuild/interpreter/kwargs.py29
-rw-r--r--mesonbuild/interpreter/type_checking.py11
3 files changed, 55 insertions, 2 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 5ff5c0b50..23ce14620 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -216,7 +216,9 @@ class Summary:
known_library_kwargs = (
build.known_shlib_kwargs |
- build.known_stlib_kwargs
+ build.known_stlib_kwargs |
+ {f'{l}_shared_args' for l in compilers.all_languages - {'java'}} |
+ {f'{l}_static_args' for l in compilers.all_languages - {'java'}}
)
known_build_target_kwargs = (
@@ -3202,6 +3204,9 @@ class Interpreter(InterpreterBase, HoldableObject):
# FIXME: rustc supports generating both libraries in a single invocation,
# but for now compile twice.
reuse_object_files = False
+ elif any(k.endswith(('static_args', 'shared_args')) and v for k, v in kwargs.items()):
+ # Ensure not just the keyword arguments exist, but that they are non-empty.
+ reuse_object_files = False
else:
reuse_object_files = static_lib.pic
@@ -3336,6 +3341,16 @@ class Interpreter(InterpreterBase, HoldableObject):
raise RuntimeError('Unreachable code')
self.kwarg_strings_to_includedirs(kwargs)
self.__process_language_args(kwargs)
+ if targetclass is build.StaticLibrary:
+ for lang in compilers.all_languages - {'java'}:
+ deps, args = self.__convert_file_args(kwargs.get(f'{lang}_static_args', []))
+ kwargs['language_args'][lang].extend(args)
+ kwargs['depend_files'].extend(deps)
+ elif targetclass is build.SharedLibrary:
+ for lang in compilers.all_languages - {'java'}:
+ deps, args = self.__convert_file_args(kwargs.get(f'{lang}_shared_args', []))
+ kwargs['language_args'][lang].extend(args)
+ kwargs['depend_files'].extend(deps)
# Filter out kwargs from other target types. For example 'soversion'
# passed to library() when default_library == 'static'.
diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py
index 45cb07b3d..2f3f37f67 100644
--- a/mesonbuild/interpreter/kwargs.py
+++ b/mesonbuild/interpreter/kwargs.py
@@ -397,6 +397,35 @@ class Library(_BuildTarget, _SharedLibMixin, _StaticLibMixin, _LibraryMixin):
"""For library, both_library, and as a base for build_target"""
+ c_static_args: NotRequired[T.List[str]]
+ c_shared_args: NotRequired[T.List[str]]
+ cpp_static_args: NotRequired[T.List[str]]
+ cpp_shared_args: NotRequired[T.List[str]]
+ cuda_static_args: NotRequired[T.List[str]]
+ cuda_shared_args: NotRequired[T.List[str]]
+ fortran_static_args: NotRequired[T.List[str]]
+ fortran_shared_args: NotRequired[T.List[str]]
+ d_static_args: NotRequired[T.List[str]]
+ d_shared_args: NotRequired[T.List[str]]
+ objc_static_args: NotRequired[T.List[str]]
+ objc_shared_args: NotRequired[T.List[str]]
+ objcpp_static_args: NotRequired[T.List[str]]
+ objcpp_shared_args: NotRequired[T.List[str]]
+ rust_static_args: NotRequired[T.List[str]]
+ rust_shared_args: NotRequired[T.List[str]]
+ vala_static_args: NotRequired[T.List[T.Union[str, File]]] # Yes, Vala is really special
+ vala_shared_args: NotRequired[T.List[T.Union[str, File]]] # Yes, Vala is really special
+ cs_static_args: NotRequired[T.List[str]]
+ cs_shared_args: NotRequired[T.List[str]]
+ swift_static_args: NotRequired[T.List[str]]
+ swift_shared_args: NotRequired[T.List[str]]
+ cython_static_args: NotRequired[T.List[str]]
+ cython_shared_args: NotRequired[T.List[str]]
+ nasm_static_args: NotRequired[T.List[str]]
+ nasm_shared_args: NotRequired[T.List[str]]
+ masm_static_args: NotRequired[T.List[str]]
+ masm_shared_args: NotRequired[T.List[str]]
+
class BuildTarget(Library):
diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py
index 4b3a8a422..153a0d9e9 100644
--- a/mesonbuild/interpreter/type_checking.py
+++ b/mesonbuild/interpreter/type_checking.py
@@ -665,7 +665,7 @@ STATIC_LIB_KWS = [
_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)
+ KwargInfo('version', (str, NoneType), validator=_validate_shlib_version),
]
# The total list of arguments used by SharedLibrary
@@ -712,6 +712,13 @@ JAR_KWS = [
for a in _LANGUAGE_KWS],
]
+_SHARED_STATIC_ARGS: T.List[KwargInfo[T.List[str]]] = [
+ *[l.evolve(name=l.name.replace('_', '_static_'), since='1.3.0')
+ for l in _LANGUAGE_KWS],
+ *[l.evolve(name=l.name.replace('_', '_shared_'), since='1.3.0')
+ for l in _LANGUAGE_KWS],
+]
+
# Arguments used by both_library and library
LIBRARY_KWS = [
*_BUILD_TARGET_KWS,
@@ -719,6 +726,7 @@ LIBRARY_KWS = [
*_EXCLUSIVE_SHARED_LIB_KWS,
*_EXCLUSIVE_SHARED_MOD_KWS,
*_EXCLUSIVE_STATIC_LIB_KWS,
+ *_SHARED_STATIC_ARGS,
_VS_MODULE_DEFS_KW,
_JAVA_LANG_KW,
]
@@ -730,6 +738,7 @@ BUILD_TARGET_KWS = [
*_EXCLUSIVE_SHARED_MOD_KWS,
*_EXCLUSIVE_STATIC_LIB_KWS,
*_EXCLUSIVE_EXECUTABLE_KWS,
+ *_SHARED_STATIC_ARGS,
*[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()')
for a in _EXCLUSIVE_JAR_KWS],
KwargInfo(