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

Commit 6c2b01d2 authored by Spandan Das's avatar Spandan Das
Browse files

Do not install transitive packaging specs of overriden modules

e.g. if a cc_binary is overriden, its shared_libs should not be
installed.

To do, a new `depNames` array is introduced to track the top-level
module which requested the packaging spec. If the top-level module has
been overridden, the packaging spec will not be installed.

Test: go test ./filesystem
Test: vendor partition diffs for aosp cf https://diff.googleplex.com/#key=276Je74QO1VE
Change-Id: I1c8df831c696990bb0982e4537129b8e85abeda6
parent 1fcf379e
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -395,6 +395,11 @@ func (p *PackagingBase) AddDeps(ctx BottomUpMutatorContext, depTag blueprint.Dep
func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec {
	// all packaging specs gathered from the dep.
	var all []PackagingSpec
	// Name of the dependency which requested the packaging spec.
	// If this dep is overridden, the packaging spec will not be installed via this dependency chain.
	// (the packaging spec might still be installed if there are some other deps which depend on it).
	var depNames []string

	// list of module names overridden
	var overridden []string

@@ -429,6 +434,7 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter
				}
			}
			all = append(all, ps)
			depNames = append(depNames, child.Name())
			if ps.overrides != nil {
				overridden = append(overridden, *ps.overrides...)
			}
@@ -437,10 +443,14 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter

	// all minus packaging specs that are overridden
	var filtered []PackagingSpec
	for _, ps := range all {
	for index, ps := range all {
		if ps.owner != "" && InList(ps.owner, overridden) {
			continue
		}
		// The dependency which requested this packaging spec has been overridden.
		if InList(depNames[index], overridden) {
			continue
		}
		filtered = append(filtered, ps)
	}

+35 −0
Original line number Diff line number Diff line
@@ -629,3 +629,38 @@ func TestUseSharedVariationOfNativeLib(t *testing.T) {
	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
	android.AssertDeepEquals(t, "cc_library listed in deps", "lib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo.so\nlib64/libm.so\n", fileList)
}

// binfoo1 overrides binbar. transitive deps of binbar should not be installed.
func TestDoNotInstallTransitiveDepOfOverriddenModule(t *testing.T) {
	result := fixture.RunTestWithBp(t, `
android_filesystem {
    name: "myfilesystem",
    deps: ["binfoo1", "libfoo2", "binbar"],
}
cc_binary {
    name: "binfoo1",
    shared_libs: ["libfoo"],
    overrides: ["binbar"],
}
cc_library {
    name: "libfoo",
}
cc_library {
    name: "libfoo2",
    overrides: ["libfoo"],
}
// binbar gets overridden by binfoo1
// therefore, libbar should not be installed
cc_binary {
    name: "binbar",
    shared_libs: ["libbar"]
}
cc_library {
    name: "libbar",
}
	`)

	partition := result.ModuleForTests("myfilesystem", "android_common")
	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
	android.AssertDeepEquals(t, "Shared library dep of overridden binary should not be installed", fileList, "bin/binfoo1\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo2.so\nlib64/libm.so\n")
}