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
diff --git a/rust/builder.go b/rust/builder.go
index a5b3ab9..426a569 100644
--- a/rust/builder.go
+++ b/rust/builder.go
@@ -269,6 +269,17 @@
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 de59f39..6b3ccfc 100644
--- a/rust/compiler.go
+++ b/rust/compiler.go
@@ -154,6 +154,14 @@
// 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 @@
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 c331b4c..f589b69 100644
--- a/rust/compiler_test.go
+++ b/rust/compiler_test.go
@@ -98,6 +98,30 @@
}`)
}
+// 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 80be496..3ec550b 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -433,6 +433,12 @@
// 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