diff options
author | 2020-04-28 10:10:23 -0400 | |
---|---|---|
committer | 2020-04-29 15:31:34 -0400 | |
commit | 9d1df10e2a7aacb4ada52000dc299ce8c187330a (patch) | |
tree | 46e467230778530d2ddac2cdcabccc33e1be757b | |
parent | 52c0b7b35b5c5b510bac0a0a98d493b7d953a10d (diff) |
Provide 32-bit and 64-bit Rust libs by default.
CC libraries which depend on Rust libraries get missing dependency
errors when building 32-bit variants dependent on Rust modules which
don't explicitly have "multilib: both" declared.
Because CC libraries use MultilibBoth by default, Rust should do the
same.
This also fixes a bug where the ARM32 toolchain incorrectly embedded
toolchain64Bit instead of toolchain32Bit.
Bug: 154730212
Test: Rust libraries provide both variants by default.
Change-Id: Ia545fe069d3c6b77c3d18f4f10267e2c72ee0bab
-rw-r--r-- | rust/builder.go | 4 | ||||
-rw-r--r-- | rust/compiler.go | 9 | ||||
-rw-r--r-- | rust/config/arm_device.go | 2 | ||||
-rw-r--r-- | rust/library.go | 2 | ||||
-rw-r--r-- | rust/rust_test.go | 15 | ||||
-rw-r--r-- | rust/testing.go | 5 |
6 files changed, 29 insertions, 8 deletions
diff --git a/rust/builder.go b/rust/builder.go index 27eeec23d..2d5e602ca 100644 --- a/rust/builder.go +++ b/rust/builder.go @@ -108,8 +108,8 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, deps Path } // TODO once we have static libraries in the host prebuilt .bp, this // should be unconditionally added. - if !ctx.Host() { - // If we're on a device build, do not use an implicit sysroot + if !(ctx.Host() && ctx.TargetPrimary()) { + // If we're not targeting the host primary arch, do not use an implicit sysroot rustcFlags = append(rustcFlags, "--sysroot=/dev/null") } // Collect linker flags diff --git a/rust/compiler.go b/rust/compiler.go index 81b258c1e..74997761b 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -183,8 +183,8 @@ func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps { if !Bool(compiler.Properties.No_stdlibs) { for _, stdlib := range config.Stdlibs { - // If we're building for host, use the compiler's stdlibs - if ctx.Host() { + // If we're building for the primary host target, use the compiler's stdlibs + if ctx.Host() && ctx.TargetPrimary() { stdlib = stdlib + "_" + ctx.toolchain().RustTriple() } @@ -192,9 +192,12 @@ func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps { // static linking is the default, if one of our static // dependencies uses a dynamic library, we need to dynamically // link the stdlib as well. - if (len(deps.Dylibs) > 0) || (!ctx.Host()) { + if (len(deps.Dylibs) > 0) || ctx.Device() { // Dynamically linked stdlib deps.Dylibs = append(deps.Dylibs, stdlib) + } else if ctx.Host() && !ctx.TargetPrimary() { + // Otherwise use the static in-tree stdlib for host secondary arch + deps.Rlibs = append(deps.Rlibs, stdlib+".static") } } } diff --git a/rust/config/arm_device.go b/rust/config/arm_device.go index aedb42b31..ac2580b81 100644 --- a/rust/config/arm_device.go +++ b/rust/config/arm_device.go @@ -50,7 +50,7 @@ func init() { } type toolchainArm struct { - toolchain64Bit + toolchain32Bit toolchainRustFlags string } diff --git a/rust/library.go b/rust/library.go index bf863bb67..87e816dba 100644 --- a/rust/library.go +++ b/rust/library.go @@ -281,7 +281,7 @@ func (library *libraryDecorator) BuildOnlyShared() { } func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { - module := newModule(hod, android.MultilibFirst) + module := newModule(hod, android.MultilibBoth) library := &libraryDecorator{ MutatedProperties: LibraryMutatedProperties{ diff --git a/rust/rust_test.go b/rust/rust_test.go index 02b190f0f..32eddc161 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -240,7 +240,7 @@ func TestNoStdlibs(t *testing.T) { rust_binary { name: "fizz-buzz", srcs: ["foo.rs"], - no_stdlibs: true, + no_stdlibs: true, }`) module := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a").Module().(*Module) @@ -248,3 +248,16 @@ func TestNoStdlibs(t *testing.T) { t.Errorf("no_stdlibs did not suppress dependency on libstd") } } + +// Test that libraries provide both 32-bit and 64-bit variants. +func TestMultilib(t *testing.T) { + ctx := testRust(t, ` + rust_library_rlib { + name: "libfoo", + srcs: ["foo.rs"], + crate_name: "foo", + }`) + + _ = ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib") + _ = ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_rlib") +} diff --git a/rust/testing.go b/rust/testing.go index c3a462553..aad4ffe35 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -46,24 +46,29 @@ func GatherRequiredDepsForTest() string { crate_name: "std", srcs: ["foo.rs"], no_stdlibs: true, + host_supported: true, } rust_library_rlib { name: "libstd.static", crate_name: "std", srcs: ["foo.rs"], no_stdlibs: true, + host_supported: true, } rust_library_dylib { name: "libtest", crate_name: "test", srcs: ["foo.rs"], no_stdlibs: true, + host_supported: true, + } rust_library_rlib { name: "libtest.static", crate_name: "test", srcs: ["foo.rs"], no_stdlibs: true, + host_supported: true, } ` + cc.GatherRequiredDepsForTest(android.NoOsType) |