diff options
author | 2024-05-17 14:13:41 -0400 | |
---|---|---|
committer | 2024-06-26 01:35:41 +0000 | |
commit | fd47b1ab6a51ce3b148e2d4644b1d96b058c2064 (patch) | |
tree | 70d50006ec4333b14d8f47c4fc790283b92e87dc /rust/library_test.go | |
parent | 9c067f62d0b4d3e9c5a245f51f14dc51521c0e63 (diff) |
cc/rust: Alias ffi rlib variant for static_libs
Alias the rlib variant to "link: static". This allows declaring
rust_ffi_rlib modules in static_libs. This effectively removes any
distinction between rust_ffi_static and rust_ffi_rlib. Removing the
functionality for building Rust staticlib modules will be cleaned up in
a follow-on CL.
This should have the effect of changing the default linkage for all rust
modules in static_libs from linking individual staticlibs to building a
single staticlib that includes all rust_ffi rlib dependencies.
This removes the static_rlibs property, as we're now handling
the choice dynamically. This also makes rlibs only propagate through
cc_library_static modules if the rlib is included in
whole_static_lib. This both mirrors the expected behavior of
cc libraries and helps control which version of a crate ends up in the
final link (e.g. libdoh_ffi vs libdoh_ffi_for_test).
Bug: 254469782
Test: m
Test: m blueprint_tests
Change-Id: I2925f67f6dc9329dae3dcccafb8560900ac8a6fc
Diffstat (limited to 'rust/library_test.go')
-rw-r--r-- | rust/library_test.go | 72 |
1 files changed, 32 insertions, 40 deletions
diff --git a/rust/library_test.go b/rust/library_test.go index 1133c28ed..35a420cd5 100644 --- a/rust/library_test.go +++ b/rust/library_test.go @@ -34,10 +34,14 @@ func TestLibraryVariants(t *testing.T) { name: "libfoo.ffi", srcs: ["foo.rs"], crate_name: "foo" + } + rust_ffi_host_static { + name: "libfoo.ffi_static", + srcs: ["foo.rs"], + crate_name: "foo" }`) // Test all variants are being built. - libfooStatic := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_static").Rule("rustc") libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") libfooFFIRlib := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") @@ -46,7 +50,6 @@ func TestLibraryVariants(t *testing.T) { rlibCrateType := "rlib" dylibCrateType := "dylib" sharedCrateType := "cdylib" - staticCrateType := "staticlib" // Test crate type for rlib is correct. if !strings.Contains(libfooRlib.Args["rustcFlags"], "crate-type="+rlibCrateType) { @@ -58,11 +61,6 @@ func TestLibraryVariants(t *testing.T) { t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", dylibCrateType, libfooDylib.Args["rustcFlags"]) } - // Test crate type for C static libraries is correct. - if !strings.Contains(libfooStatic.Args["rustcFlags"], "crate-type="+staticCrateType) { - t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", staticCrateType, libfooStatic.Args["rustcFlags"]) - } - // Test crate type for FFI rlibs is correct if !strings.Contains(libfooFFIRlib.Args["rustcFlags"], "crate-type="+rlibCrateType) { t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", rlibCrateType, libfooFFIRlib.Args["rustcFlags"]) @@ -188,23 +186,18 @@ func TestSharedLibraryToc(t *testing.T) { func TestStaticLibraryLinkage(t *testing.T) { ctx := testRust(t, ` - rust_ffi { + rust_ffi_static { name: "libfoo", srcs: ["foo.rs"], crate_name: "foo", }`) libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_rlib-std") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static") if !android.InList("libstd", libfoo.Module().(*Module).Properties.AndroidMkRlibs) { t.Errorf("Static libstd rlib expected to be a dependency of Rust rlib libraries. Rlib deps are: %#v", libfoo.Module().(*Module).Properties.AndroidMkDylibs) } - if !android.InList("libstd", libfooStatic.Module().(*Module).Properties.AndroidMkRlibs) { - t.Errorf("Static libstd rlib expected to be a dependency of Rust static libraries. Rlib deps are: %#v", - libfoo.Module().(*Module).Properties.AndroidMkDylibs) - } } func TestNativeDependencyOfRlib(t *testing.T) { @@ -215,39 +208,31 @@ func TestNativeDependencyOfRlib(t *testing.T) { rlibs: ["librust_rlib"], srcs: ["foo.rs"], } - rust_ffi_static { - name: "libffi_static", - crate_name: "ffi_static", - rlibs: ["librust_rlib"], - srcs: ["foo.rs"], - } rust_library_rlib { name: "librust_rlib", crate_name: "rust_rlib", srcs: ["foo.rs"], - shared_libs: ["shared_cc_dep"], - static_libs: ["static_cc_dep"], + shared_libs: ["libshared_cc_dep"], + static_libs: ["libstatic_cc_dep"], } cc_library_shared { - name: "shared_cc_dep", + name: "libshared_cc_dep", srcs: ["foo.cpp"], } cc_library_static { - name: "static_cc_dep", + name: "libstatic_cc_dep", srcs: ["foo.cpp"], } `) rustRlibRlibStd := ctx.ModuleForTests("librust_rlib", "android_arm64_armv8-a_rlib_rlib-std") rustRlibDylibStd := ctx.ModuleForTests("librust_rlib", "android_arm64_armv8-a_rlib_dylib-std") - ffiStatic := ctx.ModuleForTests("libffi_static", "android_arm64_armv8-a_static") ffiRlib := ctx.ModuleForTests("libffi_rlib", "android_arm64_armv8-a_rlib_rlib-std") modules := []android.TestingModule{ rustRlibRlibStd, rustRlibDylibStd, ffiRlib, - ffiStatic, } // librust_rlib specifies -L flag to cc deps output directory on rustc command @@ -258,17 +243,17 @@ func TestNativeDependencyOfRlib(t *testing.T) { // TODO: We could consider removing these flags for _, module := range modules { if !strings.Contains(module.Rule("rustc").Args["libFlags"], - "-L out/soong/.intermediates/shared_cc_dep/android_arm64_armv8-a_shared/") { + "-L out/soong/.intermediates/libshared_cc_dep/android_arm64_armv8-a_shared/") { t.Errorf( - "missing -L flag for shared_cc_dep, rustcFlags: %#v", - rustRlibRlibStd.Rule("rustc").Args["libFlags"], + "missing -L flag for libshared_cc_dep of %s, rustcFlags: %#v", + module.Module().Name(), rustRlibRlibStd.Rule("rustc").Args["libFlags"], ) } if !strings.Contains(module.Rule("rustc").Args["libFlags"], - "-L out/soong/.intermediates/static_cc_dep/android_arm64_armv8-a_static/") { + "-L out/soong/.intermediates/libstatic_cc_dep/android_arm64_armv8-a_static/") { t.Errorf( - "missing -L flag for static_cc_dep, rustcFlags: %#v", - rustRlibRlibStd.Rule("rustc").Args["libFlags"], + "missing -L flag for libstatic_cc_dep of %s, rustcFlags: %#v", + module.Module().Name(), rustRlibRlibStd.Rule("rustc").Args["libFlags"], ) } } @@ -305,15 +290,23 @@ func TestAutoDeps(t *testing.T) { "libbar", "librlib_only", ], + } + rust_ffi_host_static { + name: "libfoo.ffi.static", + srcs: ["foo.rs"], + crate_name: "foo", + rustlibs: [ + "libbar", + "librlib_only", + ], }`) libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std") libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib") libfooFFIRlib := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_rlib_rlib-std") - libfooStatic := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_static") libfooShared := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_shared") - for _, static := range []android.TestingModule{libfooRlib, libfooStatic, libfooFFIRlib} { + for _, static := range []android.TestingModule{libfooRlib, libfooFFIRlib} { if !android.InList("libbar.rlib-std", static.Module().(*Module).Properties.AndroidMkRlibs) { t.Errorf("libbar not present as rlib dependency in static lib: %s", static.Module().Name()) } @@ -381,6 +374,12 @@ func TestLibstdLinkage(t *testing.T) { crate_name: "bar", rustlibs: ["libfoo"], } + rust_ffi_static { + name: "libbar_static", + srcs: ["foo.rs"], + crate_name: "bar", + rustlibs: ["libfoo"], + } rust_ffi { name: "libbar.prefer_rlib", srcs: ["foo.rs"], @@ -394,7 +393,6 @@ func TestLibstdLinkage(t *testing.T) { libfooRlibDynamic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module) libbarShared := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module().(*Module) - libbarStatic := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_static").Module().(*Module) libbarFFIRlib := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_rlib_rlib-std").Module().(*Module) // prefer_rlib works the same for both rust_library and rust_ffi, so a single check is sufficient here. @@ -413,12 +411,6 @@ func TestLibstdLinkage(t *testing.T) { if !android.InList("libstd", libbarShared.Properties.AndroidMkDylibs) { t.Errorf("Device rust_ffi_shared does not link libstd as an dylib") } - if !android.InList("libstd", libbarStatic.Properties.AndroidMkRlibs) { - t.Errorf("Device rust_ffi_static does not link libstd as an rlib") - } - if !android.InList("libfoo.rlib-std", libbarStatic.Properties.AndroidMkRlibs) { - t.Errorf("Device rust_ffi_static does not link dependent rustlib rlib-std variant") - } if !android.InList("libstd", libbarFFIRlib.Properties.AndroidMkRlibs) { t.Errorf("Device rust_ffi_rlib does not link libstd as an rlib") } |