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

Commit a8bd113a authored by Artur Satayev's avatar Artur Satayev
Browse files

Introduce flat deps info list.

Compared to full list, flat list drops dependency edges and simply
lists all transitive dependencies for a top-level apex bundle.

Bug: 149622332
Test: m, manually build flatlist

Change-Id: Ibd521c96b7aeab90b95965c1b524e0a0152aaf5a
parent 872a144d
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -419,28 +419,41 @@ type ApexModuleDepInfo struct {
type DepNameToDepInfoMap map[string]ApexModuleDepInfo

type ApexBundleDepsInfo struct {
	flatListPath OutputPath
	fullListPath OutputPath
}

type ApexDepsInfoIntf interface {
	FlatListPath() Path
	FullListPath() Path
}

func (d *ApexBundleDepsInfo) FlatListPath() Path {
	return d.flatListPath
}

func (d *ApexBundleDepsInfo) FullListPath() Path {
	return d.fullListPath
}

var _ ApexDepsInfoIntf = (*ApexBundleDepsInfo)(nil)

// Generate two module out files:
// 1. FullList with transitive deps and their parents in the dep graph
// 2. FlatList with a flat list of transitive deps
func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, depInfos DepNameToDepInfoMap) {
	var content strings.Builder
	var fullContent strings.Builder
	var flatContent strings.Builder

	fmt.Fprintf(&flatContent, "%s:\\n", ctx.ModuleName())
	for _, key := range FirstUniqueStrings(SortedStringKeys(depInfos)) {
		info := depInfos[key]
		toName := info.To
		if info.IsExternal {
			toName = toName + " (external)"
		}
		fmt.Fprintf(&content, "%s <- %s\\n", toName, strings.Join(SortedUniqueStrings(info.From), ", "))
		fmt.Fprintf(&fullContent, "%s <- %s\\n", toName, strings.Join(SortedUniqueStrings(info.From), ", "))
		fmt.Fprintf(&flatContent, "  %s\\n", toName)
	}

	d.fullListPath = PathForModuleOut(ctx, "depsinfo", "fulllist.txt").OutputPath
@@ -449,7 +462,17 @@ func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, depInfos DepN
		Description: "Full Dependency Info",
		Output:      d.fullListPath,
		Args: map[string]string{
			"content": content.String(),
			"content": fullContent.String(),
		},
	})

	d.flatListPath = PathForModuleOut(ctx, "depsinfo", "flatlist.txt").OutputPath
	ctx.Build(pctx, BuildParams{
		Rule:        WriteFile,
		Description: "Flat Dependency Info",
		Output:      d.flatListPath,
		Args: map[string]string{
			"content": flatContent.String(),
		},
	})
}
+21 −10
Original line number Diff line number Diff line
@@ -504,12 +504,19 @@ func TestBasicApex(t *testing.T) {
	ensureListContains(t, noticeInputs, "custom_notice")
	ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")

	depsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
	ensureListContains(t, depsInfo, "myjar <- myapex")
	ensureListContains(t, depsInfo, "mylib <- myapex")
	ensureListContains(t, depsInfo, "mylib2 <- mylib")
	ensureListContains(t, depsInfo, "myotherjar <- myjar")
	ensureListContains(t, depsInfo, "mysharedjar (external) <- myjar")
	fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
	ensureListContains(t, fullDepsInfo, "myjar <- myapex")
	ensureListContains(t, fullDepsInfo, "mylib <- myapex")
	ensureListContains(t, fullDepsInfo, "mylib2 <- mylib")
	ensureListContains(t, fullDepsInfo, "myotherjar <- myjar")
	ensureListContains(t, fullDepsInfo, "mysharedjar (external) <- myjar")

	flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
	ensureListContains(t, flatDepsInfo, "  myjar")
	ensureListContains(t, flatDepsInfo, "  mylib")
	ensureListContains(t, flatDepsInfo, "  mylib2")
	ensureListContains(t, flatDepsInfo, "  myotherjar")
	ensureListContains(t, flatDepsInfo, "  mysharedjar (external)")
}

func TestDefaults(t *testing.T) {
@@ -818,11 +825,15 @@ func TestApexWithExplicitStubsDependency(t *testing.T) {
	// Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
	ensureNotContains(t, libFooStubsLdFlags, "libbar.so")

	depsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
	fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
	ensureListContains(t, fullDepsInfo, "mylib <- myapex2")
	ensureListContains(t, fullDepsInfo, "libbaz <- mylib")
	ensureListContains(t, fullDepsInfo, "libfoo (external) <- mylib")

	ensureListContains(t, depsInfo, "mylib <- myapex2")
	ensureListContains(t, depsInfo, "libbaz <- mylib")
	ensureListContains(t, depsInfo, "libfoo (external) <- mylib")
	flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
	ensureListContains(t, flatDepsInfo, "  mylib")
	ensureListContains(t, flatDepsInfo, "  libbaz")
	ensureListContains(t, flatDepsInfo, "  libfoo (external)")
}

func TestApexWithRuntimeLibsDependency(t *testing.T) {
+4 −1
Original line number Diff line number Diff line
@@ -719,6 +719,9 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) {
	ctx.Build(pctx, android.BuildParams{
		Rule:   android.Phony,
		Output: android.PathForPhony(ctx, a.Name()+"-deps-info"),
		Inputs: []android.Path{a.ApexBundleDepsInfo.FullListPath()},
		Inputs: []android.Path{
			a.ApexBundleDepsInfo.FullListPath(),
			a.ApexBundleDepsInfo.FlatListPath(),
		},
	})
}