diff options
| -rw-r--r-- | mesonbuild/backend/ninjabackend.py | 8 | ||||
| -rw-r--r-- | test cases/rust/29 rlib link subdir/cdep/f.c | 1 | ||||
| -rw-r--r-- | test cases/rust/29 rlib link subdir/cdep/meson.build | 1 | ||||
| -rw-r--r-- | test cases/rust/29 rlib link subdir/f-sys.rs | 3 | ||||
| -rw-r--r-- | test cases/rust/29 rlib link subdir/main.rs | 1 | ||||
| -rw-r--r-- | test cases/rust/29 rlib link subdir/meson.build | 21 |
6 files changed, 34 insertions, 1 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 3fd82a85b..50917aeef 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -2079,11 +2079,17 @@ class NinjaBackend(backends.Backend): external_deps = target.external_deps.copy() target_deps = target.get_dependencies() for d in target_deps: + # rlibs only store -l flags, not -L; help out rustc and always + # add the -L flag, in case it's needed to find non-bundled + # dependencies of an rlib. At this point we don't have + # information on whether this is a direct dependency (which + # might use -Clink-arg= below) or an indirect one, so always + # add to linkdirs. + linkdirs.add(d.subdir) deps.append(self.get_dependency_filename(d)) if isinstance(d, build.StaticLibrary): external_deps.extend(d.external_deps) if d.uses_rust_abi(): - linkdirs.add(d.subdir) if d not in itertools.chain(target.link_targets, target.link_whole_targets): # Indirect Rust ABI dependency, we only need its path in linkdirs. continue diff --git a/test cases/rust/29 rlib link subdir/cdep/f.c b/test cases/rust/29 rlib link subdir/cdep/f.c new file mode 100644 index 000000000..d64ff8ca2 --- /dev/null +++ b/test cases/rust/29 rlib link subdir/cdep/f.c @@ -0,0 +1 @@ +int f() { return 42; } diff --git a/test cases/rust/29 rlib link subdir/cdep/meson.build b/test cases/rust/29 rlib link subdir/cdep/meson.build new file mode 100644 index 000000000..b7fd7e28b --- /dev/null +++ b/test cases/rust/29 rlib link subdir/cdep/meson.build @@ -0,0 +1 @@ +cdep = static_library('f', 'f.c') diff --git a/test cases/rust/29 rlib link subdir/f-sys.rs b/test cases/rust/29 rlib link subdir/f-sys.rs new file mode 100644 index 000000000..88971208d --- /dev/null +++ b/test cases/rust/29 rlib link subdir/f-sys.rs @@ -0,0 +1,3 @@ +extern "C" { + pub fn f() -> ::std::os::raw::c_int; +} diff --git a/test cases/rust/29 rlib link subdir/main.rs b/test cases/rust/29 rlib link subdir/main.rs new file mode 100644 index 000000000..8ae3c3255 --- /dev/null +++ b/test cases/rust/29 rlib link subdir/main.rs @@ -0,0 +1 @@ +fn main() { assert_eq!(unsafe { ::f_sys::f() }, 42); } diff --git a/test cases/rust/29 rlib link subdir/meson.build b/test cases/rust/29 rlib link subdir/meson.build new file mode 100644 index 000000000..89acff26f --- /dev/null +++ b/test cases/rust/29 rlib link subdir/meson.build @@ -0,0 +1,21 @@ +project( + 'rlib-link-subdir', + ['c', 'rust'], + default_options: ['rust_std=2021'] +) + +subdir('cdep') +f_sys = static_library( + 'f_sys', + 'f-sys.rs', + link_with: cdep, + rust_abi: 'rust', +) + +exe = executable( + 'main', + 'main.rs', + link_with: f_sys, +) + +test('basic', exe) |
