From f76cdf7c20d87796324d935e5d5f23605cf2af4f Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Fri, 12 Feb 2021 09:55:06 -0500 Subject: [PATCH] rust: Emit android vndk cfg flag. Pass an "android_vndk" cfg flag that indicates this code targets the vndk. This can be useful in instances where code might need to behave differently. This also includes a fix to make sure our vendor Soong tests are correctly configured. Bug: 179907868 Test: Soong tests pass. Test: Example module emits new cfg flags. Change-Id: I01cdf91f6f9d42cd8a759266d5170479664bf4bc --- rust/compiler.go | 4 ++++ rust/image_test.go | 25 ++++++++++++++++++++++--- rust/rust_test.go | 17 +++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/rust/compiler.go b/rust/compiler.go index 586063e91..e4120d035 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -232,6 +232,10 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag flags.LinkFlags = append(flags.LinkFlags, "-Wl,-rpath,"+rpathPrefix+"../"+rpath) } + if ctx.RustModule().UseVndk() { + flags.RustFlags = append(flags.RustFlags, "--cfg 'android_vndk'") + } + return flags } diff --git a/rust/image_test.go b/rust/image_test.go index 1515aa264..e40599c3a 100644 --- a/rust/image_test.go +++ b/rust/image_test.go @@ -15,6 +15,7 @@ package rust import ( + "strings" "testing" "android/soong/android" @@ -23,7 +24,7 @@ import ( // Test that cc modules can link against vendor_available rust_ffi_static libraries. func TestVendorLinkage(t *testing.T) { - ctx := testRust(t, ` + ctx := testRustVndk(t, ` cc_binary { name: "fizz_vendor", static_libs: ["libfoo_vendor"], @@ -37,16 +38,34 @@ func TestVendorLinkage(t *testing.T) { } `) - vendorBinary := ctx.ModuleForTests("fizz_vendor", "android_arm64_armv8-a").Module().(*cc.Module) + vendorBinary := ctx.ModuleForTests("fizz_vendor", "android_vendor.VER_arm64_armv8-a").Module().(*cc.Module) if !android.InList("libfoo_vendor", vendorBinary.Properties.AndroidMkStaticLibs) { t.Errorf("vendorBinary should have a dependency on libfoo_vendor") } } +// Test that variants which use the vndk emit the appropriate cfg flag. +func TestImageVndkCfgFlag(t *testing.T) { + ctx := testRustVndk(t, ` + rust_ffi_static { + name: "libfoo", + crate_name: "foo", + srcs: ["foo.rs"], + vendor_available: true, + } + `) + + vendor := ctx.ModuleForTests("libfoo", "android_vendor.VER_arm64_armv8-a_static").Rule("rustc") + + if !strings.Contains(vendor.Args["rustcFlags"], "--cfg 'android_vndk'") { + t.Errorf("missing \"--cfg 'android_vndk'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) + } +} + // Test that cc modules can link against vendor_ramdisk_available rust_ffi_static libraries. func TestVendorRamdiskLinkage(t *testing.T) { - ctx := testRust(t, ` + ctx := testRustVndk(t, ` cc_library_static { name: "libcc_vendor_ramdisk", static_libs: ["libfoo_vendor_ramdisk"], diff --git a/rust/rust_test.go b/rust/rust_test.go index 88d964300..a0ed5345f 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -64,6 +64,14 @@ func testRust(t *testing.T, bp string) *android.TestContext { return tctx.parse(t) } +func testRustVndk(t *testing.T, bp string) *android.TestContext { + tctx := newTestRustCtx(t, bp) + tctx.useMockedFs() + tctx.generateConfig() + tctx.setVndk(t) + return tctx.parse(t) +} + // testRustCov returns a TestContext in which a basic environment has been // setup. This environment explicitly enables coverage. func testRustCov(t *testing.T, bp string) *android.TestContext { @@ -140,6 +148,15 @@ func (tctx *testRustCtx) enableCoverage(t *testing.T) { tctx.config.TestProductVariables.NativeCoveragePaths = []string{"*"} } +func (tctx *testRustCtx) setVndk(t *testing.T) { + if tctx.config == nil { + t.Fatalf("tctx.config not been generated yet. Please call generateConfig first.") + } + tctx.config.TestProductVariables.DeviceVndkVersion = StringPtr("current") + tctx.config.TestProductVariables.ProductVndkVersion = StringPtr("current") + tctx.config.TestProductVariables.Platform_vndk_version = StringPtr("VER") +} + // parse validates the configuration and parses the Blueprint file. It returns // a TestContext which can be used to retrieve the generated modules via // ModuleForTests.