aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-04-27 10:30:19 -0400
committerXavier Claessens <xavier.claessens@collabora.com>2023-05-01 12:57:45 -0400
commit2dadc3ae5befade53c38c314344b7bd6f2aca3f4 (patch)
tree76dc2b9f7c5751ab7867ff106577161c6c5eb24d
parenta78af236862008f284d84ab9327a38886e086d8c (diff)
downloadmeson-2dadc3ae5befade53c38c314344b7bd6f2aca3f4.zip
meson-2dadc3ae5befade53c38c314344b7bd6f2aca3f4.tar.gz
meson-2dadc3ae5befade53c38c314344b7bd6f2aca3f4.tar.bz2
Rust: C static library cannot link_whole Rust static library
-rw-r--r--mesonbuild/build.py23
-rw-r--r--test cases/rust/5 polyglot static/meson.build13
-rw-r--r--test cases/rust/5 polyglot static/test.json3
3 files changed, 24 insertions, 15 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index d48667f..1dcc998 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -1407,17 +1407,9 @@ You probably should put it in link_with instead.''')
mlog.warning(f'Try to link an installed static library target {self.name} with a'
'custom target that is not installed, this might cause problems'
'when you try to use this static library')
- elif t.is_internal() and not t.uses_rust():
+ elif t.is_internal():
# When we're a static library and we link_with to an
# internal/convenience library, promote to link_whole.
- #
- # There are cases we cannot do this, however. In Rust, for
- # example, this can't be done with Rust ABI libraries, though
- # it could be done with C ABI libraries, though there are
- # several meson issues that need to be fixed:
- # https://github.com/mesonbuild/meson/issues/10722
- # https://github.com/mesonbuild/meson/issues/10723
- # https://github.com/mesonbuild/meson/issues/10724
return self.link_whole(t)
if not isinstance(t, (Target, CustomTargetIndex)):
raise InvalidArguments(f'{t!r} is not a target.')
@@ -1442,9 +1434,6 @@ You probably should put it in link_with instead.''')
raise InvalidArguments(f'Custom target {t!r} is not linkable.')
if t.links_dynamically():
raise InvalidArguments('Can only link_whole custom targets that are static archives.')
- if isinstance(self, StaticLibrary):
- # FIXME: We could extract the .a archive to get object files
- raise InvalidArguments('Cannot link_whole a custom target into a static library')
elif not isinstance(t, StaticLibrary):
raise InvalidArguments(f'{t!r} is not a static library.')
elif isinstance(self, SharedLibrary) and not t.pic:
@@ -1458,6 +1447,16 @@ You probably should put it in link_with instead.''')
else:
mlog.warning(msg + ' This will fail in cross build.')
if isinstance(self, StaticLibrary):
+ if isinstance(t, (CustomTarget, CustomTargetIndex)) or t.uses_rust():
+ # There are cases we cannot do this, however. In Rust, for
+ # example, this can't be done with Rust ABI libraries, though
+ # it could be done with C ABI libraries, though there are
+ # several meson issues that need to be fixed:
+ # https://github.com/mesonbuild/meson/issues/10722
+ # https://github.com/mesonbuild/meson/issues/10723
+ # https://github.com/mesonbuild/meson/issues/10724
+ # FIXME: We could extract the .a archive to get object files
+ raise InvalidArguments('Cannot link_whole a custom or Rust target into a static library')
# When we're a static library and we link_whole: to another static
# library, we need to add that target's objects to ourselves.
self.objects += [t.extract_all_objects()]
diff --git a/test cases/rust/5 polyglot static/meson.build b/test cases/rust/5 polyglot static/meson.build
index bed7977..20cef38 100644
--- a/test cases/rust/5 polyglot static/meson.build
+++ b/test cases/rust/5 polyglot static/meson.build
@@ -9,7 +9,18 @@ deps = [
extra_winlibs = meson.get_compiler('c').get_id() in ['msvc', 'clang-cl'] ? ['userenv.lib', 'ws2_32.lib', 'bcrypt.lib'] : []
r = static_library('stuff', 'stuff.rs', rust_crate_type : 'staticlib')
-l = static_library('clib', 'clib.c', link_with : r, install : true)
+
+# clib is installed static library and stuff is not installed. That means that
+# to be usable clib must link_whole stuff. Meson automatically promote to link_whole,
+# as it would do with C libraries, but then cannot extract objects from stuff and
+# thus should error out.
+# FIXME: We should support this use-case in the future.
+testcase expect_error('Cannot link_whole a custom or Rust target into a static library')
+ l = static_library('clib', 'clib.c', link_with : r, install : true)
+endtestcase
+
+l = static_library('clib', 'clib.c', link_with : r)
+
e = executable('prog', 'prog.c',
dependencies: deps,
link_with : l,
diff --git a/test cases/rust/5 polyglot static/test.json b/test cases/rust/5 polyglot static/test.json
index cc0d2da..135300d 100644
--- a/test cases/rust/5 polyglot static/test.json
+++ b/test cases/rust/5 polyglot static/test.json
@@ -1,7 +1,6 @@
{
"installed": [
{"type": "exe", "file": "usr/bin/prog"},
- {"type": "pdb", "file": "usr/bin/prog"},
- {"type": "file", "file": "usr/lib/libclib.a"}
+ {"type": "pdb", "file": "usr/bin/prog"}
]
}