diff --git a/rust/builder.go b/rust/builder.go index 654b1e6bf..3e082dc2f 100644 --- a/rust/builder.go +++ b/rust/builder.go @@ -22,6 +22,7 @@ import ( "android/soong/android" "android/soong/cc" + "android/soong/rust/config" ) var ( @@ -138,6 +139,13 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl crate_name := ctx.RustModule().CrateName() targetTriple := ctx.toolchain().RustTriple() + // libstd requires a specific environment variable to be set. This is + // not officially documented and may be removed in the future. See + // https://github.com/rust-lang/rust/blob/master/library/std/src/env.rs#L866. + if crate_name == "std" { + envVars = append(envVars, "STD_ENV_ARCH="+config.StdEnvArch[ctx.RustModule().Arch().ArchType]) + } + inputs = append(inputs, main) // Collect rustc flags diff --git a/rust/config/global.go b/rust/config/global.go index 71c424091..326b85fe0 100644 --- a/rust/config/global.go +++ b/rust/config/global.go @@ -32,6 +32,15 @@ var ( "libtest", } + // Mapping between Soong internal arch types and std::env constants. + // Required as Rust uses aarch64 when Soong uses arm64. + StdEnvArch = map[android.ArchType]string{ + android.Arm: "arm", + android.Arm64: "aarch64", + android.X86: "x86", + android.X86_64: "x86_64", + } + GlobalRustFlags = []string{ "--remap-path-prefix $$(pwd)=", "-C codegen-units=1",