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

Commit 7d74e7be authored by Paul Duffin's avatar Paul Duffin
Browse files

Copy white listed apex available settings into snapshot

Makes sure that the module snapshots do not rely on the white list
of apex available settings so that when those lists are removed it is
not necessary to update any snapshots.

Bug: 142935992
Test: m nothing
Change-Id: Iedcff7dfc2646a4da77258d16e06657dd2f411f9
parent 0cb37b9c
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -168,7 +168,7 @@ func (m *ApexModuleBase) IsInstallableToApex() bool {

const (
	AvailableToPlatform = "//apex_available:platform"
	availableToAnyApex  = "//apex_available:anyapex"
	AvailableToAnyApex  = "//apex_available:anyapex"
)

func CheckAvailableForApex(what string, apex_available []string) bool {
@@ -178,7 +178,7 @@ func CheckAvailableForApex(what string, apex_available []string) bool {
		return what == AvailableToPlatform
	}
	return InList(what, apex_available) ||
		(what != AvailableToPlatform && InList(availableToAnyApex, apex_available))
		(what != AvailableToPlatform && InList(AvailableToAnyApex, apex_available))
}

func (m *ApexModuleBase) AvailableFor(what string) bool {
@@ -212,7 +212,7 @@ func (m *ApexModuleBase) ShouldSupportAndroid10() bool {

func (m *ApexModuleBase) checkApexAvailableProperty(mctx BaseModuleContext) {
	for _, n := range m.ApexProperties.Apex_available {
		if n == AvailableToPlatform || n == availableToAnyApex {
		if n == AvailableToPlatform || n == AvailableToAnyApex {
			continue
		}
		if !mctx.OtherModuleExists(n) && !mctx.Config().AllowMissingDependencies() {
+33 −10
Original line number Diff line number Diff line
@@ -63,8 +63,26 @@ var (
	usesTag        = dependencyTag{name: "uses"}
	androidAppTag  = dependencyTag{name: "androidApp", payload: true}
	apexAvailWl    = makeApexAvailableWhitelist()

	inverseApexAvailWl = invertApexWhiteList(apexAvailWl)
)

// Transform the map of apex -> modules to module -> apexes.
func invertApexWhiteList(m map[string][]string) map[string][]string {
	r := make(map[string][]string)
	for apex, modules := range m {
		for _, module := range modules {
			r[module] = append(r[module], apex)
		}
	}
	return r
}

// Retrieve the while list of apexes to which the supplied module belongs.
func WhitelistedApexAvailable(moduleName string) []string {
	return inverseApexAvailWl[normalizeModuleName(moduleName)]
}

// This is a map from apex to modules, which overrides the
// apex_available setting for that particular module to make
// it available for the apex regardless of its setting.
@@ -964,7 +982,7 @@ func makeApexAvailableWhitelist() map[string][]string {
	//
	// Module separator
	//
	m["//any"] = []string{
	m[android.AvailableToAnyApex] = []string{
		"crtbegin_dynamic",
		"crtbegin_dynamic1",
		"crtbegin_so",
@@ -2395,20 +2413,13 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {

func whitelistedApexAvailable(apex, moduleName string) bool {
	key := apex
	// Prebuilt modules (e.g. java_import, etc.) have "prebuilt_" prefix added by the build
	// system. Trim the prefix for the check since they are confusing
	moduleName = strings.TrimPrefix(moduleName, "prebuilt_")
	if strings.HasPrefix(moduleName, "libclang_rt.") {
		// This module has many arch variants that depend on the product being built.
		// We don't want to list them all
		moduleName = "libclang_rt"
	}
	moduleName = normalizeModuleName(moduleName)

	if val, ok := apexAvailWl[key]; ok && android.InList(moduleName, val) {
		return true
	}

	key = "//any"
	key = android.AvailableToAnyApex
	if val, ok := apexAvailWl[key]; ok && android.InList(moduleName, val) {
		return true
	}
@@ -2416,6 +2427,18 @@ func whitelistedApexAvailable(apex, moduleName string) bool {
	return false
}

func normalizeModuleName(moduleName string) string {
	// Prebuilt modules (e.g. java_import, etc.) have "prebuilt_" prefix added by the build
	// system. Trim the prefix for the check since they are confusing
	moduleName = strings.TrimPrefix(moduleName, "prebuilt_")
	if strings.HasPrefix(moduleName, "libclang_rt.") {
		// This module has many arch variants that depend on the product being built.
		// We don't want to list them all
		moduleName = "libclang_rt"
	}
	return moduleName
}

func newApexBundle() *apexBundle {
	module := &apexBundle{}
	module.AddProperties(&module.properties)
+9 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import (
	"sort"
	"strings"

	"android/soong/apex"
	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"

@@ -640,7 +641,15 @@ func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType
	// Where available copy apex_available properties from the member.
	if apexAware, ok := variant.(interface{ ApexAvailable() []string }); ok {
		apexAvailable := apexAware.ApexAvailable()

		// Add in any white listed apex available settings.
		apexAvailable = append(apexAvailable, apex.WhitelistedApexAvailable(member.Name())...)

		if len(apexAvailable) > 0 {
			// Remove duplicates and sort.
			apexAvailable = android.FirstUniqueStrings(apexAvailable)
			sort.Strings(apexAvailable)

			m.AddProperty("apex_available", apexAvailable)
		}
	}