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

Commit a574d535 authored by Jiyong Park's avatar Jiyong Park
Browse files

Make overrides work in Soong

This change adds `overrides` property to all module types. It is used
to prevent another module (or modules) from being installed or packaged.

Bug: 330141242
Test: go test ./...

Change-Id: I4f05c603f0c5dbb699d00327882c7498472b59de
parent f2d6e500
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -499,6 +499,10 @@ type commonProperties struct {

	// vintf_fragment Modules required from this module.
	Vintf_fragment_modules proptools.Configurable[[]string] `android:"path"`

	// List of module names that are prevented from being installed when this module gets
	// installed.
	Overrides []string
}

type distProperties struct {
+9 −0
Original line number Diff line number Diff line
@@ -522,6 +522,7 @@ func (m *moduleContext) getAconfigPaths() *Paths {

func (m *moduleContext) packageFile(fullInstallPath InstallPath, srcPath Path, executable bool) PackagingSpec {
	licenseFiles := m.Module().EffectiveLicenseFiles()
	overrides := CopyOf(m.Module().base().commonProperties.Overrides)
	spec := PackagingSpec{
		relPathInPackage:      Rel(m, fullInstallPath.PartitionDir(), fullInstallPath.String()),
		srcPath:               srcPath,
@@ -532,6 +533,8 @@ func (m *moduleContext) packageFile(fullInstallPath InstallPath, srcPath Path, e
		skipInstall:           m.skipInstall(),
		aconfigPaths:          m.getAconfigPaths(),
		archType:              m.target.Arch.ArchType,
		overrides:             &overrides,
		owner:                 m.ModuleName(),
	}
	m.packagingSpecs = append(m.packagingSpecs, spec)
	return spec
@@ -649,6 +652,7 @@ func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, src
		m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
	}

	overrides := CopyOf(m.Module().base().commonProperties.Overrides)
	m.packagingSpecs = append(m.packagingSpecs, PackagingSpec{
		relPathInPackage: Rel(m, fullInstallPath.PartitionDir(), fullInstallPath.String()),
		srcPath:          nil,
@@ -658,6 +662,8 @@ func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, src
		skipInstall:      m.skipInstall(),
		aconfigPaths:     m.getAconfigPaths(),
		archType:         m.target.Arch.ArchType,
		overrides:        &overrides,
		owner:            m.ModuleName(),
	})

	return fullInstallPath
@@ -693,6 +699,7 @@ func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name str
		m.installFiles = append(m.installFiles, fullInstallPath)
	}

	overrides := CopyOf(m.Module().base().commonProperties.Overrides)
	m.packagingSpecs = append(m.packagingSpecs, PackagingSpec{
		relPathInPackage: Rel(m, fullInstallPath.PartitionDir(), fullInstallPath.String()),
		srcPath:          nil,
@@ -702,6 +709,8 @@ func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name str
		skipInstall:      m.skipInstall(),
		aconfigPaths:     m.getAconfigPaths(),
		archType:         m.target.Arch.ArchType,
		overrides:        &overrides,
		owner:            m.ModuleName(),
	})

	return fullInstallPath
+1 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ func createCcSdkVariantRules() []Rule {
		"packages/modules/SdkExtensions/derive_sdk",
		// These are for apps and shouldn't be used by non-SDK variant modules.
		"prebuilts/ndk",
		"frameworks/native/libs/binder/ndk",
		"tools/test/graphicsbenchmark/apps/sample_app",
		"tools/test/graphicsbenchmark/functional_tests/java",
		"vendor/xts/gts-tests/hostsidetests/gamedevicecert/apps/javatests",
+34 −9
Original line number Diff line number Diff line
@@ -56,6 +56,12 @@ type PackagingSpec struct {

	// ArchType of the module which produced this packaging spec
	archType ArchType

	// List of module names that this packaging spec overrides
	overrides *[]string

	// Name of the module where this packaging spec is output of
	owner string
}

func (p *PackagingSpec) Equals(other *PackagingSpec) bool {
@@ -325,7 +331,10 @@ func (p *PackagingBase) AddDeps(ctx BottomUpMutatorContext, depTag blueprint.Dep
}

func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec {
	m := make(map[string]PackagingSpec)
	// all packaging specs gathered from the dep.
	var all []PackagingSpec
	// list of module names overridden
	var overridden []string

	var arches []ArchType
	for _, target := range getSupportedTargets(ctx) {
@@ -357,6 +366,24 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter
					continue
				}
			}
			all = append(all, ps)
			if ps.overrides != nil {
				overridden = append(overridden, *ps.overrides...)
			}
		}
	})

	// all minus packaging specs that are overridden
	var filtered []PackagingSpec
	for _, ps := range all {
		if ps.owner != "" && InList(ps.owner, overridden) {
			continue
		}
		filtered = append(filtered, ps)
	}

	m := make(map[string]PackagingSpec)
	for _, ps := range filtered {
		dstPath := ps.relPathInPackage
		if existingPs, ok := m[dstPath]; ok {
			if !existingPs.Equals(&ps) {
@@ -364,10 +391,8 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter
			}
			continue
		}

		m[dstPath] = ps
	}
	})
	return m
}

+62 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ type componentTestModule struct {
	props struct {
		Deps         []string
		Skip_install *bool
		Overrides    []string
	}
}

@@ -650,3 +651,64 @@ func TestPrefer32Deps(t *testing.T) {
		runPackagingTest(t, config, bp, tc.expected)
	}
}

func TestOverrides(t *testing.T) {
	bpTemplate := `
		component {
			name: "foo",
			deps: ["bar"],
		}

		component {
			name: "bar",
		}

		component {
			name: "bar_override",
			overrides: ["bar"],
		}

		component {
			name: "baz",
			deps: ["bar_override"],
		}

		package_module {
			name: "package",
			deps: %DEPS%,
		}
	`
	testcases := []struct {
		deps     []string
		expected []string
	}{
		{
			deps:     []string{"foo"},
			expected: []string{"lib64/foo", "lib64/bar"},
		},
		{
			deps:     []string{"foo", "bar_override"},
			expected: []string{"lib64/foo", "lib64/bar_override"},
		},
		{
			deps:     []string{"foo", "bar", "bar_override"},
			expected: []string{"lib64/foo", "lib64/bar_override"},
		},
		{
			deps:     []string{"bar", "bar_override"},
			expected: []string{"lib64/bar_override"},
		},
		{
			deps:     []string{"foo", "baz"},
			expected: []string{"lib64/foo", "lib64/baz", "lib64/bar_override"},
		},
	}
	for _, tc := range testcases {
		config := testConfig{
			multiTarget:                true,
			depsCollectFirstTargetOnly: false,
		}
		bp := strings.Replace(bpTemplate, "%DEPS%", `["`+strings.Join(tc.deps, `", "`)+`"]`, -1)
		runPackagingTest(t, config, bp, tc.expected)
	}
}