Merge changes from topic "rust-sysroot"
* changes:
Enable x86_64 device support
Build Rust Device Sysroots in Soong
diff --git a/rust/binary.go b/rust/binary.go
index a909ea6..d4b6614 100644
--- a/rust/binary.go
+++ b/rust/binary.go
@@ -16,7 +16,6 @@
import (
"android/soong/android"
- "android/soong/rust/config"
)
func init() {
@@ -91,12 +90,6 @@
func (binary *binaryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
deps = binary.baseCompiler.compilerDeps(ctx, deps)
- if binary.preferDynamic() || len(deps.Dylibs) > 0 {
- for _, stdlib := range config.Stdlibs {
- deps.Dylibs = append(deps.Dylibs, stdlib+"_"+ctx.toolchain().RustTriple())
- }
- }
-
if ctx.toolchain().Bionic() {
deps = binary.baseCompiler.bionicDeps(ctx, deps)
deps.CrtBegin = "crtbegin_dynamic"
diff --git a/rust/builder.go b/rust/builder.go
index 11510e1..9109651 100644
--- a/rust/builder.go
+++ b/rust/builder.go
@@ -102,6 +102,12 @@
rustcFlags = append(rustcFlags, "--target="+targetTriple)
linkFlags = append(linkFlags, "-target "+targetTriple)
}
+ // 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
+ rustcFlags = append(rustcFlags, "--sysroot=/dev/null")
+ }
// Collect linker flags
linkFlags = append(linkFlags, flags.GlobalLinkFlags...)
linkFlags = append(linkFlags, flags.LinkFlags...)
diff --git a/rust/compiler.go b/rust/compiler.go
index 85e8ba6..88e3fb2 100644
--- a/rust/compiler.go
+++ b/rust/compiler.go
@@ -32,6 +32,10 @@
return BoolDefault(compiler.Properties.Deny_warnings, config.DefaultDenyWarnings)
}
+func (compiler *baseCompiler) setNoStdlibs() {
+ compiler.Properties.No_stdlibs = proptools.BoolPtr(true)
+}
+
func NewBaseCompiler(dir, dir64 string) *baseCompiler {
return &baseCompiler{
Properties: BaseCompilerProperties{},
@@ -82,6 +86,9 @@
// install to a subdirectory of the default install path for the module
Relative_install_path *string `android:"arch_variant"`
+
+ // whether to suppress inclusion of standard crates - defaults to false
+ No_stdlibs *bool
}
type baseCompiler struct {
@@ -161,6 +168,23 @@
deps.StaticLibs = append(deps.StaticLibs, compiler.Properties.Static_libs...)
deps.SharedLibs = append(deps.SharedLibs, compiler.Properties.Shared_libs...)
+ 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() {
+ stdlib = stdlib + "_" + ctx.toolchain().RustTriple()
+ }
+
+ // This check is technically insufficient - on the host, where
+ // 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()) {
+ // Dynamically linked stdlib
+ deps.Dylibs = append(deps.Dylibs, stdlib)
+ }
+ }
+ }
return deps
}
diff --git a/rust/config/whitelist.go b/rust/config/whitelist.go
index 8025bcf..1a7b81f 100644
--- a/rust/config/whitelist.go
+++ b/rust/config/whitelist.go
@@ -5,6 +5,7 @@
"external/rust",
"external/crosvm",
"external/adhd",
+ "prebuilts/rust",
}
RustModuleTypes = []string{
diff --git a/rust/config/x86_64_device.go b/rust/config/x86_64_device.go
index 2aca56a..9a6c00b 100644
--- a/rust/config/x86_64_device.go
+++ b/rust/config/x86_64_device.go
@@ -41,8 +41,8 @@
func init() {
registerToolchainFactory(android.Android, android.X86_64, x86_64ToolchainFactory)
- pctx.StaticVariable("x86_64ToolchainRustFlags", strings.Join(x86_64RustFlags, " "))
- pctx.StaticVariable("x86_64ToolchainLinkFlags", strings.Join(x86_64LinkFlags, " "))
+ pctx.StaticVariable("X86_64ToolchainRustFlags", strings.Join(x86_64RustFlags, " "))
+ pctx.StaticVariable("X86_64ToolchainLinkFlags", strings.Join(x86_64LinkFlags, " "))
for variant, rustFlags := range x86_64ArchVariantRustFlags {
pctx.StaticVariable("X86_64"+variant+"VariantRustFlags",
@@ -57,11 +57,11 @@
}
func (t *toolchainX86_64) RustTriple() string {
- return "x86_64-unknown-linux-gnu"
+ return "x86_64-linux-android"
}
func (t *toolchainX86_64) ToolchainLinkFlags() string {
- return "${config.x86_64ToolchainLinkFlags}"
+ return "${config.DeviceGlobalLinkFlags} ${config.X86_64ToolchainLinkFlags}"
}
func (t *toolchainX86_64) ToolchainRustFlags() string {
@@ -69,15 +69,21 @@
}
func (t *toolchainX86_64) RustFlags() string {
- return "${config.x86_64ToolchainRustFlags}"
+ return "${config.X86_64ToolchainRustFlags}"
+}
+
+func (t *toolchainX86_64) Supported() bool {
+ return true
}
func x86_64ToolchainFactory(arch android.Arch) Toolchain {
toolchainRustFlags := []string{
- "${config.x86_64ToolchainRustFlags}",
+ "${config.X86_64ToolchainRustFlags}",
"${config.X86_64" + arch.ArchVariant + "VariantRustFlags}",
}
+ toolchainRustFlags = append(toolchainRustFlags, deviceGlobalRustFlags...)
+
for _, feature := range arch.ArchFeatures {
toolchainRustFlags = append(toolchainRustFlags, x86_64ArchFeatureRustFlags[feature]...)
}
diff --git a/rust/prebuilt.go b/rust/prebuilt.go
index fa69fbb..45bef9e 100644
--- a/rust/prebuilt.go
+++ b/rust/prebuilt.go
@@ -42,6 +42,7 @@
func NewPrebuiltDylib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) {
module, library := NewRustLibrary(hod)
library.BuildOnlyDylib()
+ library.setNoStdlibs()
library.setDylib()
prebuilt := &prebuiltLibraryDecorator{
libraryDecorator: library,
diff --git a/rust/rust_test.go b/rust/rust_test.go
index 599af09..91c2f09 100644
--- a/rust/rust_test.go
+++ b/rust/rust_test.go
@@ -199,6 +199,25 @@
srcs: ["foo.rs"],
crate_name: "bar",
}
+ // Make a dummy libstd to let resolution go through
+ rust_library_dylib {
+ name: "libstd",
+ crate_name: "std",
+ srcs: ["foo.rs"],
+ no_stdlibs: true,
+ }
+ rust_library_dylib {
+ name: "libterm",
+ crate_name: "term",
+ srcs: ["foo.rs"],
+ no_stdlibs: true,
+ }
+ rust_library_dylib {
+ name: "libtest",
+ crate_name: "test",
+ srcs: ["foo.rs"],
+ no_stdlibs: true,
+ }
rust_proc_macro {
name: "libpm",
rlibs: ["libbar"],
@@ -217,3 +236,18 @@
t.Errorf("Proc_macro is not using host variant of dependent modules.")
}
}
+
+// Test that no_stdlibs suppresses dependencies on rust standard libraries
+func TestNoStdlibs(t *testing.T) {
+ ctx := testRust(t, `
+ rust_binary {
+ name: "fizz-buzz",
+ srcs: ["foo.rs"],
+ no_stdlibs: true,
+ }`)
+ module := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a_core").Module().(*Module)
+
+ if android.InList("libstd", module.Properties.AndroidMkDylibs) {
+ t.Errorf("no_stdlibs did not suppress dependency on libstd")
+ }
+}