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

Commit 6b3adfad authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "apexDepsMutator uses WalkDeps" am: e8bc2887

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1369776

Change-Id: I0dc292b51099f48af3a0834c88700d1d3b67ace8
parents e3f1644f e8bc2887
Loading
Loading
Loading
Loading
+14 −19
Original line number Diff line number Diff line
@@ -65,9 +65,9 @@ type ApexModule interface {

	apexModuleBase() *ApexModuleBase

	// Marks that this module should be built for the specified APEXes.
	// Marks that this module should be built for the specified APEX.
	// Call this before apex.apexMutator is run.
	BuildForApexes(apexes []ApexInfo)
	BuildForApex(apex ApexInfo)

	// Returns the APEXes that this module will be built for
	ApexVariations() []ApexInfo
@@ -96,7 +96,7 @@ type ApexModule interface {
	IsInstallableToApex() bool

	// Mutate this module into one or more variants each of which is built
	// for an APEX marked via BuildForApexes().
	// for an APEX marked via BuildForApex().
	CreateApexVariations(mctx BottomUpMutatorContext) []Module

	// Tests if this module is available for the specified APEX or ":platform"
@@ -178,19 +178,16 @@ func (m *ApexModuleBase) TestFor() []string {
	return nil
}

func (m *ApexModuleBase) BuildForApexes(apexes []ApexInfo) {
func (m *ApexModuleBase) BuildForApex(apex ApexInfo) {
	m.apexVariationsLock.Lock()
	defer m.apexVariationsLock.Unlock()
nextApex:
	for _, apex := range apexes {
	for _, v := range m.apexVariations {
		if v.ApexName == apex.ApexName {
				continue nextApex
			return
		}
	}
	m.apexVariations = append(m.apexVariations, apex)
}
}

func (m *ApexModuleBase) ApexVariations() []ApexInfo {
	return m.apexVariations
@@ -327,10 +324,9 @@ func apexNamesMap() map[string]map[string]bool {
// depended on by the specified APEXes. Directly depending means that a module
// is explicitly listed in the build definition of the APEX via properties like
// native_shared_libs, java_libs, etc.
func UpdateApexDependency(apexes []ApexInfo, moduleName string, directDep bool) {
func UpdateApexDependency(apex ApexInfo, moduleName string, directDep bool) {
	apexNamesMapMutex.Lock()
	defer apexNamesMapMutex.Unlock()
	for _, apex := range apexes {
	apexesForModule, ok := apexNamesMap()[moduleName]
	if !ok {
		apexesForModule = make(map[string]bool)
@@ -338,7 +334,6 @@ func UpdateApexDependency(apexes []ApexInfo, moduleName string, directDep bool)
	}
	apexesForModule[apex.ApexName] = apexesForModule[apex.ApexName] || directDep
}
}

// TODO(b/146393795): remove this when b/146393795 is fixed
func ClearApexDependency() {
+21 −24
Original line number Diff line number Diff line
@@ -669,7 +669,7 @@ func RegisterPreDepsMutators(ctx android.RegisterMutatorsContext) {
}

func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) {
	ctx.TopDown("apex_deps", apexDepsMutator)
	ctx.TopDown("apex_deps", apexDepsMutator).Parallel()
	ctx.BottomUp("apex", apexMutator).Parallel()
	ctx.BottomUp("apex_flattened", apexFlattenedMutator).Parallel()
	ctx.BottomUp("apex_uses", apexUsesMutator).Parallel()
@@ -682,33 +682,30 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
	if !mctx.Module().Enabled() {
		return
	}
	var apexBundles []android.ApexInfo
	var directDep bool
	if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex {
		apexBundles = []android.ApexInfo{{
	a, ok := mctx.Module().(*apexBundle)
	if !ok || a.vndkApex {
		return
	}
	apexInfo := android.ApexInfo{
		ApexName:      mctx.ModuleName(),
		MinSdkVersion: a.minSdkVersion(mctx),
		Updatable:     a.Updatable(),
		}}
		directDep = true
	} else if am, ok := mctx.Module().(android.ApexModule); ok {
		apexBundles = am.ApexVariations()
		directDep = false
	}

	if len(apexBundles) == 0 {
		return
	mctx.WalkDeps(func(child, parent android.Module) bool {
		am, ok := child.(android.ApexModule)
		if !ok || !am.CanHaveApexVariants() {
			return false
		}
		if !parent.(android.DepIsInSameApex).DepIsInSameApex(mctx, child) && !inAnySdk(child) {
			return false
		}

	cur := mctx.Module().(android.DepIsInSameApex)

	mctx.VisitDirectDeps(func(child android.Module) {
		depName := mctx.OtherModuleName(child)
		if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() &&
			(cur.DepIsInSameApex(mctx, child) || inAnySdk(child)) {
			android.UpdateApexDependency(apexBundles, depName, directDep)
			am.BuildForApexes(apexBundles)
		}
		// If the parent is apexBundle, this child is directly depended.
		_, directDep := parent.(*apexBundle)
		android.UpdateApexDependency(apexInfo, depName, directDep)
		am.BuildForApex(apexInfo)
		return true
	})
}