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
This commit is contained in:
Ivan Lozano
2021-08-11 15:13:43 -04:00
parent adffbe9166
commit a9a1fc0747
4 changed files with 57 additions and 0 deletions

View File

@@ -269,6 +269,17 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl
envVars = append(envVars, "ANDROID_RUST_VERSION="+config.RustDefaultVersion) 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 { if flags.Clippy {
clippyFile := android.PathForModuleOut(ctx, outputFile.Base()+".clippy") clippyFile := android.PathForModuleOut(ctx, outputFile.Base()+".clippy")
ctx.Build(pctx, android.BuildParams{ ctx.Build(pctx, android.BuildParams{

View File

@@ -154,6 +154,14 @@ type BaseCompilerProperties struct {
// linkage if all dependencies of the root binary module do not link against libstd\ // linkage if all dependencies of the root binary module do not link against libstd\
// the same way. // the same way.
Prefer_rlib *bool `android:"arch_variant"` 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 { type baseCompiler struct {
@@ -309,6 +317,14 @@ func (compiler *baseCompiler) CargoOutDir() android.OptionalPath {
return android.OptionalPathForPath(compiler.cargoOutDir) 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 { func (compiler *baseCompiler) strippedOutputFilePath() android.OptionalPath {
return compiler.strippedOutputFile return compiler.strippedOutputFile
} }

View File

@@ -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) { func TestInstallDir(t *testing.T) {
ctx := testRust(t, ` ctx := testRust(t, `
rust_library_dylib { rust_library_dylib {

View File

@@ -433,6 +433,12 @@ type compiler interface {
// copied. This is equivalent to Cargo's OUT_DIR variable. // copied. This is equivalent to Cargo's OUT_DIR variable.
CargoOutDir() android.OptionalPath 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 inData() bool
install(ctx ModuleContext) install(ctx ModuleContext)
relativeInstallPath() string relativeInstallPath() string