Make override modules compatible with prebuilts.

Prebuilt's prefer flag doesn't work against override modules because
override modules are sort of virtual modules that delegate all the work
to their base modules. Therefore, even if a prebuilt module suppresses
installation of its src-counterpart override module, the actual build
actions are still performed in the base module.

This change fixes it by filtering out override modules that are being
replaced by prebuilts.

Test: prebuilt_test.go
Bug: 152155285
Change-Id: I859b35c0629b2b6258dd1ec5e020ba2c77ff9612
This commit is contained in:
Jaewoong Jung
2020-06-11 10:37:51 -07:00
parent 9e90e61ffd
commit fb25a64fdd
2 changed files with 81 additions and 5 deletions

View File

@@ -208,7 +208,21 @@ var overrideBaseDepTag overrideBaseDependencyTag
// next phase. // next phase.
func overrideModuleDepsMutator(ctx BottomUpMutatorContext) { func overrideModuleDepsMutator(ctx BottomUpMutatorContext) {
if module, ok := ctx.Module().(OverrideModule); ok { if module, ok := ctx.Module().(OverrideModule); ok {
ctx.AddDependency(ctx.Module(), overrideBaseDepTag, *module.getOverrideModuleProperties().Base) // Skip this overriding module if there's a prebuilt module that overrides it with prefer flag.
overriddenByPrebuilt := false
ctx.VisitDirectDepsWithTag(PrebuiltDepTag, func(dep Module) {
prebuilt, ok := dep.(PrebuiltInterface)
if !ok {
panic("PrebuiltDepTag leads to a non-prebuilt module " + dep.Name())
}
if prebuilt.Prebuilt().UsePrebuilt() {
overriddenByPrebuilt = true
return
}
})
if !overriddenByPrebuilt {
ctx.AddDependency(ctx.Module(), overrideBaseDepTag, *module.getOverrideModuleProperties().Base)
}
} }
} }

View File

@@ -155,6 +155,44 @@ var prebuiltsTests = []struct {
}`, }`,
prebuilt: []OsClass{Host}, prebuilt: []OsClass{Host},
}, },
{
name: "prebuilt override not preferred",
modules: `
source {
name: "baz",
}
override_source {
name: "bar",
base: "baz",
}
prebuilt {
name: "bar",
prefer: false,
srcs: ["prebuilt_file"],
}`,
prebuilt: nil,
},
{
name: "prebuilt override preferred",
modules: `
source {
name: "baz",
}
override_source {
name: "bar",
base: "baz",
}
prebuilt {
name: "bar",
prefer: true,
srcs: ["prebuilt_file"],
}`,
prebuilt: []OsClass{Device, Host},
},
} }
func TestPrebuilts(t *testing.T) { func TestPrebuilts(t *testing.T) {
@@ -256,8 +294,10 @@ func TestPrebuilts(t *testing.T) {
func registerTestPrebuiltBuildComponents(ctx RegistrationContext) { func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
ctx.RegisterModuleType("prebuilt", newPrebuiltModule) ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
ctx.RegisterModuleType("source", newSourceModule) ctx.RegisterModuleType("source", newSourceModule)
ctx.RegisterModuleType("override_source", newOverrideSourceModule)
RegisterPrebuiltMutators(ctx) RegisterPrebuiltMutators(ctx)
ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
} }
type prebuiltModule struct { type prebuiltModule struct {
@@ -300,11 +340,15 @@ func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
} }
} }
type sourceModuleProperties struct {
Deps []string `android:"path,arch_variant"`
}
type sourceModule struct { type sourceModule struct {
ModuleBase ModuleBase
properties struct { OverridableModuleBase
Deps []string `android:"path,arch_variant"`
} properties sourceModuleProperties
dependsOnSourceModule, dependsOnPrebuiltModule bool dependsOnSourceModule, dependsOnPrebuiltModule bool
deps Paths deps Paths
src Path src Path
@@ -314,10 +358,11 @@ func newSourceModule() Module {
m := &sourceModule{} m := &sourceModule{}
m.AddProperties(&m.properties) m.AddProperties(&m.properties)
InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon) InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
InitOverridableModule(m, nil)
return m return m
} }
func (s *sourceModule) DepsMutator(ctx BottomUpMutatorContext) { func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
// s.properties.Deps are annotated with android:path, so they are // s.properties.Deps are annotated with android:path, so they are
// automatically added to the dependency by pathDeps mutator // automatically added to the dependency by pathDeps mutator
} }
@@ -330,3 +375,20 @@ func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
func (s *sourceModule) Srcs() Paths { func (s *sourceModule) Srcs() Paths {
return Paths{s.src} return Paths{s.src}
} }
type overrideSourceModule struct {
ModuleBase
OverrideModuleBase
}
func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
}
func newOverrideSourceModule() Module {
m := &overrideSourceModule{}
m.AddProperties(&sourceModuleProperties{})
InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
InitOverrideModule(m)
return m
}