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

Commit 29743c84 authored by Jingwen Chen's avatar Jingwen Chen
Browse files

Read ApexMkInfo for modules to be installed.

This piggybacks onto the ApexInfo cquery handler, so we're issuing a
single bazel query call that reads two providers in the starlark expr.

Also rename requiredDeps to makeModulesToInstall to differentiate it from
APEX's required/provided libs in the apex manifest.

Test: unit test
Test: mkdiff
Fixes: 263123189
Change-Id: Ib7e43f1586f29864eee8627dba3631bfaff27afa
parent 6cf5e0d9
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -461,11 +461,6 @@ func bp2buildModuleLabel(ctx BazelConversionContext, module blueprint.Module) st
	return fmt.Sprintf("//%s:%s", moduleDir, moduleName)
}

// ModuleFromBazelLabel reverses the logic in bp2buildModuleLabel
func ModuleFromBazelLabel(label string) string {
	return strings.Split(label, ":")[1]
}

// BazelOutPath is a Bazel output path compatible to be used for mixed builds within Soong/Ninja.
type BazelOutPath struct {
	OutputPath
+1 −1
Original line number Diff line number Diff line
@@ -309,7 +309,7 @@ func (a *apexBundle) writeRequiredModules(w io.Writer, moduleNames []string) {
		targetRequired = append(targetRequired, fi.targetRequiredModuleNames...)
		hostRequired = append(hostRequired, fi.hostRequiredModuleNames...)
	}
	android.AndroidMkEmitAssignList(w, "LOCAL_REQUIRED_MODULES", moduleNames, a.requiredDeps, required)
	android.AndroidMkEmitAssignList(w, "LOCAL_REQUIRED_MODULES", moduleNames, a.makeModulesToInstall, required)
	android.AndroidMkEmitAssignList(w, "LOCAL_TARGET_REQUIRED_MODULES", targetRequired)
	android.AndroidMkEmitAssignList(w, "LOCAL_HOST_REQUIRED_MODULES", hostRequired)
}
+9 −11
Original line number Diff line number Diff line
@@ -439,8 +439,8 @@ type apexBundle struct {
	// GenerateAndroidBuildActions.
	filesInfo []apexFile

	// List of other module names that should be installed when this APEX gets installed.
	requiredDeps []string
	// List of other module names that should be installed when this APEX gets installed (LOCAL_REQUIRED_MODULES).
	makeModulesToInstall []string

	///////////////////////////////////////////////////////////////////////////////////////////
	// Outputs (final and intermediates)
@@ -1922,11 +1922,9 @@ func (a *apexBundle) ProcessBazelQueryResponse(ctx android.ModuleContext) {
	a.containerCertificateFile = android.PathForBazelOut(ctx, outputs.ContainerKeyInfo[0])
	a.containerPrivateKeyFile = android.PathForBazelOut(ctx, outputs.ContainerKeyInfo[1])

	// Ensure ApexInfo.RequiresLibs are installed as part of a bundle build
	for _, bazelLabel := range outputs.RequiresLibs {
		// convert Bazel label back to Soong module name
		a.requiredDeps = append(a.requiredDeps, android.ModuleFromBazelLabel(bazelLabel))
	}
	// Ensure ApexMkInfo.install_to_system make module names are installed as
	// part of a bundled build.
	a.makeModulesToInstall = append(a.makeModulesToInstall, outputs.MakeModulesToInstall...)

	apexType := a.properties.ApexType
	switch apexType {
@@ -2025,7 +2023,7 @@ func (a *apexBundle) setApexTypeAndSuffix(ctx android.ModuleContext) {
			a.primaryApexType = true

			if ctx.Config().InstallExtraFlattenedApexes() {
				a.requiredDeps = append(a.requiredDeps, a.Name()+flattenedSuffix)
				a.makeModulesToInstall = append(a.makeModulesToInstall, a.Name()+flattenedSuffix)
			}
		}
	case zipApex:
@@ -2177,7 +2175,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext,

			vctx.filesInfo = append(vctx.filesInfo, apexBootclasspathFragmentFiles(ctx, child)...)
			for _, makeModuleName := range bcpfModule.BootImageDeviceInstallMakeModules() {
				a.requiredDeps = append(a.requiredDeps, makeModuleName)
				a.makeModulesToInstall = append(a.makeModulesToInstall, makeModuleName)
			}
			return true
		case sscpfTag:
@@ -2343,8 +2341,8 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext,
				if ch.IsStubsImplementationRequired() && !am.DirectlyInAnyApex() {
					// we need a module name for Make
					name := ch.ImplementationModuleNameForMake(ctx) + ch.Properties.SubName
					if !android.InList(name, a.requiredDeps) {
						a.requiredDeps = append(a.requiredDeps, name)
					if !android.InList(name, a.makeModulesToInstall) {
						a.makeModulesToInstall = append(a.makeModulesToInstall, name)
					}
				}
				vctx.requireNativeLibs = append(vctx.requireNativeLibs, af.stem())
+5 −5
Original line number Diff line number Diff line
@@ -5713,7 +5713,7 @@ func TestInstallExtraFlattenedApexes(t *testing.T) {
		}),
	)
	ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
	ensureListContains(t, ab.requiredDeps, "myapex.flattened")
	ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
	mk := android.AndroidMkDataForTest(t, ctx, ab)
	var builder strings.Builder
	mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
@@ -9290,7 +9290,7 @@ func TestAndroidMk_RequiredDeps(t *testing.T) {
	`)

	bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
	bundle.requiredDeps = append(bundle.requiredDeps, "foo")
	bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
	data := android.AndroidMkDataForTest(t, ctx, bundle)
	var builder strings.Builder
	data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
@@ -9298,7 +9298,7 @@ func TestAndroidMk_RequiredDeps(t *testing.T) {
	ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")

	flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
	flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
	flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
	flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
	var flattenedBuilder strings.Builder
	flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
@@ -9542,7 +9542,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
	a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
	for _, dep := range deps {
		android.AssertStringListContains(t, "", a.requiredDeps, dep)
		android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
	}
}

@@ -9550,7 +9550,7 @@ func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleNa
func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
	a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
	for _, dep := range deps {
		android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
		android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
	}
}

+24 −2
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ apex {
				OutputBaseDir: outputBaseDir,
				LabelToApexInfo: map[string]cquery.ApexInfo{
					"//:foo": cquery.ApexInfo{
						// ApexInfo Starlark provider.
						SignedOutput:           "signed_out.apex",
						SignedCompressedOutput: "signed_out.capex",
						UnsignedOutput:         "unsigned_out.apex",
@@ -56,6 +57,9 @@ apex {
						// unused
						PackageName:  "pkg_name",
						ProvidesLibs: []string{"a", "b"},

						// ApexMkInfo Starlark provider
						MakeModulesToInstall: []string{"c"}, // d deliberately omitted
					},
				},
			}
@@ -111,7 +115,12 @@ apex {
	if w := "$(call dist-for-goals,checkbuild,out/bazel/execroot/__main__/installed-files.txt:foo-installed-files.txt)"; !strings.Contains(data, w) {
		t.Errorf("Expected %q in androidmk data, but did not find %q", w, data)
	}
	if w := "LOCAL_REQUIRED_MODULES := c d"; !strings.Contains(data, w) {

	// make modules to be installed to system
	if len(ab.makeModulesToInstall) != 1 && ab.makeModulesToInstall[0] != "c" {
		t.Errorf("Expected makeModulesToInstall slice to only contain 'c', got %q", ab.makeModulesToInstall)
	}
	if w := "LOCAL_REQUIRED_MODULES := c"; !strings.Contains(data, w) {
		t.Errorf("Expected %q in androidmk data, but did not find it in %q", w, data)
	}
}
@@ -212,6 +221,7 @@ override_apex {
				OutputBaseDir: outputBaseDir,
				LabelToApexInfo: map[string]cquery.ApexInfo{
					"//:foo": cquery.ApexInfo{
						// ApexInfo Starlark provider
						SignedOutput:          "signed_out.apex",
						UnsignedOutput:        "unsigned_out.apex",
						BundleKeyInfo:         []string{"public_key", "private_key"},
@@ -225,8 +235,12 @@ override_apex {
						// unused
						PackageName:  "pkg_name",
						ProvidesLibs: []string{"a", "b"},

						// ApexMkInfo Starlark provider
						MakeModulesToInstall: []string{"c"}, // d deliberately omitted
					},
					"//:override_foo": cquery.ApexInfo{
						// ApexInfo Starlark provider
						SignedOutput:          "override_signed_out.apex",
						UnsignedOutput:        "override_unsigned_out.apex",
						BundleKeyInfo:         []string{"override_public_key", "override_private_key"},
@@ -240,6 +254,9 @@ override_apex {
						// unused
						PackageName:  "override_pkg_name",
						ProvidesLibs: []string{"a", "b"},

						// ApexMkInfo Starlark provider
						MakeModulesToInstall: []string{"c"}, // d deliberately omitted
					},
				},
			}
@@ -295,7 +312,12 @@ override_apex {
	if w := "$(call dist-for-goals,checkbuild,out/bazel/execroot/__main__/override_installed-files.txt:override_foo-installed-files.txt)"; !strings.Contains(data, w) {
		t.Errorf("Expected %q in androidmk data, but did not find %q", w, data)
	}
	if w := "LOCAL_REQUIRED_MODULES := c d"; !strings.Contains(data, w) {

	// make modules to be installed to system
	if len(ab.makeModulesToInstall) != 1 && ab.makeModulesToInstall[0] != "c" {
		t.Errorf("Expected makeModulestoInstall slice to only contain 'c', got %q", ab.makeModulesToInstall)
	}
	if w := "LOCAL_REQUIRED_MODULES := c"; !strings.Contains(data, w) {
		t.Errorf("Expected %q in androidmk data, but did not find it in %q", w, data)
	}
}
Loading