From a787b0cd5fdb0d0dce85148c4febde0806885085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 13 Apr 2023 18:58:24 +0300 Subject: [PATCH] rust: Don't prefer dynamic linking of Rust libraries for cdylibs cdylibs provide a plain C ABI to its consumers and should not be treated like dylib/proc-macro shared libraries that provide a Rust ABI. --- mesonbuild/backend/ninjabackend.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index d0c63f264..d55600971 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -2000,12 +2000,16 @@ class NinjaBackend(backends.Backend): if d == '': d = '.' args += ['-L', d] - has_shared_deps = any(isinstance(dep, build.SharedLibrary) for dep in target.get_dependencies()) + target_deps = target.get_dependencies() + has_shared_deps = any(isinstance(dep, build.SharedLibrary) for dep in target_deps) if isinstance(target, build.SharedLibrary) or has_shared_deps: - # add prefer-dynamic if any of the Rust libraries we link - # against are dynamic, otherwise we'll end up with - # multiple implementations of crates - args += ['-C', 'prefer-dynamic'] + has_rust_shared_deps = any(isinstance(dep, build.SharedLibrary) and dep.uses_rust() and dep.rust_crate_type != 'cdylib' + for dep in target_deps) + if cratetype != 'cdylib' or has_rust_shared_deps: + # add prefer-dynamic if any of the Rust libraries we link + # against are dynamic or this is a dynamic library itself, + # otherwise we'll end up with multiple implementations of crates + args += ['-C', 'prefer-dynamic'] # build the usual rpath arguments as well...