diff options
Diffstat (limited to 'rust/rust_test.go')
-rw-r--r-- | rust/rust_test.go | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/rust/rust_test.go b/rust/rust_test.go index 4390f556e..2e016f0c7 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -449,12 +449,26 @@ func TestRustFFIRlibs(t *testing.T) { } rust_ffi_static { + name: "libfoo_from_rlib", + crate_name: "foo_from_rlib", + srcs: ["src/lib.rs"], + export_include_dirs: ["foo_includes"] + } + + rust_ffi_static { name: "libbuzz", crate_name: "buzz", srcs: ["src/lib.rs"], export_include_dirs: ["buzz_includes"] } + rust_ffi_static { + name: "libbuzz_from_rlib", + crate_name: "buzz_from_rlib", + srcs: ["src/lib.rs"], + export_include_dirs: ["buzz_includes"] + } + cc_library_shared { name: "libcc_shared", srcs:["foo.c"], @@ -468,12 +482,34 @@ func TestRustFFIRlibs(t *testing.T) { whole_static_libs: ["libfoo"], } + cc_library_static { + name: "libcc_static_from_rlib", + srcs:["foo.c"], + static_libs: ["libbuzz_from_rlib"], + whole_static_libs: ["libfoo_from_rlib"], + } + cc_binary { name: "ccBin", srcs:["foo.c"], static_libs: ["libcc_static", "libbar"], } - `) + + rust_library { + name: "librs", + srcs:["src/foo.rs"], + crate_name: "rs", + static_libs: ["libcc_static_from_rlib"], + } + + rust_binary { + name: "rsBin", + srcs:["src/foo.rs"], + crate_name: "rsBin", + rlibs: ["librs", "libbar"], + static_libs: ["libcc_static"], + } + `) libbar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_rlib_rlib-std").Rule("rustc") libcc_shared_rustc := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("rustc") @@ -482,6 +518,9 @@ func TestRustFFIRlibs(t *testing.T) { ccbin_rustc := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("rustc") ccbin_ld := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("ld") ccbin_cc := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("cc") + rustbin_genlib := ctx.ModuleForTests("rsBin", "android_arm64_armv8-a").Output("generated_rust_staticlib/librustlibs.a") + rustbin := ctx.ModuleForTests("rsBin", "android_arm64_armv8-a").Output("unstripped/rsBin") + librs_rlib := ctx.ModuleForTests("librs", "android_arm64_armv8-a_rlib_dylib-std").MaybeOutput("generated_rust_staticlib/librustlibs.a") if !strings.Contains(libbar.Args["rustcFlags"], "crate-type=rlib") { t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", "rlib", libbar.Args["rustcFlags"]) @@ -513,7 +552,7 @@ func TestRustFFIRlibs(t *testing.T) { // Make sure the static lib is included in the cc command if !strings.Contains(ccbin_ld.Args["libFlags"], "generated_rust_staticlib/librustlibs.a") { t.Errorf("missing generated static library in linker step libFlags, expecting %#v, libFlags: %#v", - "ccBin.generated_rust_staticlib.a", ccbin_ld.Args["libFlags"]) + "generated_rust_staticlib/librustlibs.a", ccbin_ld.Args["libFlags"]) } // Make sure the static lib includes are in the ld command @@ -534,11 +573,43 @@ func TestRustFFIRlibs(t *testing.T) { t.Errorf("Missing direct dependency libbar when writing generated Rust staticlib: %#v", ccbin_rustc.Args["libFlags"]) } + // Make sure the static lib is included in the rustc command + if !strings.Contains(rustbin.Args["linkFlags"], "generated_rust_staticlib/librustlibs.a") { + t.Errorf("missing generated static library in linker step libFlags in Rust module, expecting %#v, libFlags: %#v", + "generated_rust_staticlib/librustlibs.a", rustbin.Args["libFlags"]) + } + + // Make sure that direct dependencies and indirect whole static dependencies are + // propagating correctly for the rlib -> cc_library_static -> rust_* generated library example. + if !strings.Contains(rustbin_genlib.Args["libFlags"], "--extern foo=") { + t.Errorf("Missing indirect whole_static_lib dependency libfoo from cc static_lib when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if strings.Contains(rustbin_genlib.Args["libFlags"], "--extern buzz=") { + t.Errorf("Indirect rlib dependency libbuzz from cc static_lib found when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if strings.Contains(rustbin_genlib.Args["libFlags"], "--extern bar=") { + t.Errorf("Direct rlib dependency libbar getting included in the generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if !strings.Contains(rustbin_genlib.Args["libFlags"], "--extern foo_from_rlib=") { + t.Errorf("Missing indirect whole_static_lib dependency libfoo_from_rlib from cc static_lib when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if strings.Contains(rustbin_genlib.Args["libFlags"], "--extern buzz_from_rlib=") { + // While static-libs propagate for rust modules, this is not the + // expected behavior for cc modules. Thus, libbuzz_from_rlib would + // be expected to have to be re-declared as a direct rlib dependency. + t.Errorf("Indirect rlib dependency libbuzz_from_rlib from cc static_lib found when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + // Test indirect includes propagation if !strings.Contains(ccbin_cc.Args["cFlags"], "-Ifoo_includes") { t.Errorf("missing rlibs includes, expecting %#v, cFlags: %#v", "-Ifoo_includes", ccbin_cc.Args) } + + // Make sure we're not generating superfluous mto staticlibs. + if librs_rlib.Rule != nil { + t.Error("rlibs should not be generating mto staticlibs", "rlib", libbar.Args["rustcFlags"]) + } } func assertString(t *testing.T, got, expected string) { |