Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f76cdf7c authored by Ivan Lozano's avatar Ivan Lozano
Browse files

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
parent 81314ff2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
}

+22 −3
Original line number Diff line number Diff line
@@ -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"],
+17 −0
Original line number Diff line number Diff line
@@ -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.