From a9a1fc07473ef512d3ae84f4c368d5e3752649e6 Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Wed, 11 Aug 2021 15:13:43 -0400 Subject: [PATCH] rust: Add support to emit certain Cargo env vars. Some crates expect Cargo to provide certain environment variables. This CL adds a compatability flag that emulates the behavior of Cargo by setting these environment variables when building. Bug: 171011485 Test: New soong tests pass Test: quiche no longer requires patch removing CARGO_PKG_VERSION Change-Id: I4c95c284846f6075428c6f61fe8c260f2e35fbd9 --- rust/builder.go | 11 +++++++++++ rust/compiler.go | 16 ++++++++++++++++ rust/compiler_test.go | 24 ++++++++++++++++++++++++ rust/rust.go | 6 ++++++ 4 files changed, 57 insertions(+) diff --git a/rust/builder.go b/rust/builder.go index a5b3ab9de..426a569bf 100644 --- a/rust/builder.go +++ b/rust/builder.go @@ -269,6 +269,17 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl envVars = append(envVars, "ANDROID_RUST_VERSION="+config.RustDefaultVersion) + if ctx.RustModule().compiler.CargoEnvCompat() { + if _, ok := ctx.RustModule().compiler.(*binaryDecorator); ok { + envVars = append(envVars, "CARGO_BIN_NAME="+strings.TrimSuffix(outputFile.Base(), outputFile.Ext())) + } + envVars = append(envVars, "CARGO_CRATE_NAME="+ctx.RustModule().CrateName()) + pkgVersion := ctx.RustModule().compiler.CargoPkgVersion() + if pkgVersion != "" { + envVars = append(envVars, "CARGO_PKG_VERSION="+pkgVersion) + } + } + if flags.Clippy { clippyFile := android.PathForModuleOut(ctx, outputFile.Base()+".clippy") ctx.Build(pctx, android.BuildParams{ diff --git a/rust/compiler.go b/rust/compiler.go index de59f39ac..6b3ccfcfa 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -154,6 +154,14 @@ type BaseCompilerProperties struct { // linkage if all dependencies of the root binary module do not link against libstd\ // the same way. Prefer_rlib *bool `android:"arch_variant"` + + // Enables emitting certain Cargo environment variables. Only intended to be used for compatibility purposes. + // Will set CARGO_CRATE_NAME to the crate_name property's value. + // Will set CARGO_BIN_NAME to the output filename value without the extension. + Cargo_env_compat *bool + + // If cargo_env_compat is true, sets the CARGO_PKG_VERSION env var to this value. + Cargo_pkg_version *string } type baseCompiler struct { @@ -309,6 +317,14 @@ func (compiler *baseCompiler) CargoOutDir() android.OptionalPath { return android.OptionalPathForPath(compiler.cargoOutDir) } +func (compiler *baseCompiler) CargoEnvCompat() bool { + return Bool(compiler.Properties.Cargo_env_compat) +} + +func (compiler *baseCompiler) CargoPkgVersion() string { + return String(compiler.Properties.Cargo_pkg_version) +} + func (compiler *baseCompiler) strippedOutputFilePath() android.OptionalPath { return compiler.strippedOutputFile } diff --git a/rust/compiler_test.go b/rust/compiler_test.go index c331b4caa..f589b691d 100644 --- a/rust/compiler_test.go +++ b/rust/compiler_test.go @@ -98,6 +98,30 @@ func TestEnforceSingleSourceFile(t *testing.T) { }`) } +// Test environment vars for Cargo compat are set. +func TestCargoCompat(t *testing.T) { + ctx := testRust(t, ` + rust_binary { + name: "fizz", + srcs: ["foo.rs"], + crate_name: "foo", + cargo_env_compat: true, + cargo_pkg_version: "1.0.0" + }`) + + fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Rule("rustc") + + if !strings.Contains(fizz.Args["envVars"], "CARGO_BIN_NAME=fizz") { + t.Fatalf("expected 'CARGO_BIN_NAME=fizz' in envVars, actual envVars: %#v", fizz.Args["envVars"]) + } + if !strings.Contains(fizz.Args["envVars"], "CARGO_CRATE_NAME=foo") { + t.Fatalf("expected 'CARGO_CRATE_NAME=foo' in envVars, actual envVars: %#v", fizz.Args["envVars"]) + } + if !strings.Contains(fizz.Args["envVars"], "CARGO_PKG_VERSION=1.0.0") { + t.Fatalf("expected 'CARGO_PKG_VERSION=1.0.0' in envVars, actual envVars: %#v", fizz.Args["envVars"]) + } +} + func TestInstallDir(t *testing.T) { ctx := testRust(t, ` rust_library_dylib { diff --git a/rust/rust.go b/rust/rust.go index 80be49638..3ec550b10 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -433,6 +433,12 @@ type compiler interface { // copied. This is equivalent to Cargo's OUT_DIR variable. CargoOutDir() android.OptionalPath + // CargoPkgVersion returns the value of the Cargo_pkg_version property. + CargoPkgVersion() string + + // CargoEnvCompat returns whether Cargo environment variables should be used. + CargoEnvCompat() bool + inData() bool install(ctx ModuleContext) relativeInstallPath() string