diff --git a/android/override_module.go b/android/override_module.go index 97acc5c36..0a7e29491 100644 --- a/android/override_module.go +++ b/android/override_module.go @@ -244,11 +244,11 @@ func overrideModuleDepsMutator(ctx BottomUpMutatorContext) { // See if there's a prebuilt module that overrides this override module with prefer flag, // in which case we call HideFromMake on the corresponding variant later. ctx.VisitDirectDepsWithTag(PrebuiltDepTag, func(dep Module) { - prebuilt, ok := dep.(PrebuiltInterface) - if !ok { + prebuilt := GetEmbeddedPrebuilt(dep) + if prebuilt == nil { panic("PrebuiltDepTag leads to a non-prebuilt module " + dep.Name()) } - if prebuilt.Prebuilt().UsePrebuilt() { + if prebuilt.UsePrebuilt() { module.setOverriddenByPrebuilt(true) return } diff --git a/android/prebuilt.go b/android/prebuilt.go index 40bcdfd8c..43b7cbefd 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -242,14 +242,30 @@ func IsModulePreferred(module Module) bool { // A source module that has been replaced by a prebuilt counterpart. return false } - if prebuilt, ok := module.(PrebuiltInterface); ok { - if p := prebuilt.Prebuilt(); p != nil { - return p.UsePrebuilt() - } + if p := GetEmbeddedPrebuilt(module); p != nil { + return p.UsePrebuilt() } return true } +// IsModulePrebuilt returns true if the module implements PrebuiltInterface and +// has been initialized as a prebuilt and so returns a non-nil value from the +// PrebuiltInterface.Prebuilt() method. +func IsModulePrebuilt(module Module) bool { + return GetEmbeddedPrebuilt(module) != nil +} + +// GetEmbeddedPrebuilt returns a pointer to the embedded Prebuilt structure or +// nil if the module does not implement PrebuiltInterface or has not been +// initialized as a prebuilt module. +func GetEmbeddedPrebuilt(module Module) *Prebuilt { + if p, ok := module.(PrebuiltInterface); ok { + return p.Prebuilt() + } + + return nil +} + func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_rename", PrebuiltRenameMutator).Parallel() } @@ -263,11 +279,12 @@ func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) { // PrebuiltRenameMutator ensures that there always is a module with an // undecorated name. func PrebuiltRenameMutator(ctx BottomUpMutatorContext) { - if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil { + m := ctx.Module() + if p := GetEmbeddedPrebuilt(m); p != nil { name := m.base().BaseModuleName() if !ctx.OtherModuleExists(name) { ctx.Rename(name) - m.Prebuilt().properties.PrebuiltRenamedToSource = true + p.properties.PrebuiltRenamedToSource = true } } } @@ -275,14 +292,14 @@ func PrebuiltRenameMutator(ctx BottomUpMutatorContext) { // PrebuiltSourceDepsMutator adds dependencies to the prebuilt module from the // corresponding source module, if one exists for the same variant. func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) { - if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Enabled() && m.Prebuilt() != nil { - p := m.Prebuilt() - if !p.properties.PrebuiltRenamedToSource { - name := m.base().BaseModuleName() - if ctx.OtherModuleReverseDependencyVariantExists(name) { - ctx.AddReverseDependency(ctx.Module(), PrebuiltDepTag, name) - p.properties.SourceExists = true - } + m := ctx.Module() + // If this module is a prebuilt, is enabled and has not been renamed to source then add a + // dependency onto the source if it is present. + if p := GetEmbeddedPrebuilt(m); p != nil && m.Enabled() && !p.properties.PrebuiltRenamedToSource { + name := m.base().BaseModuleName() + if ctx.OtherModuleReverseDependencyVariantExists(name) { + ctx.AddReverseDependency(ctx.Module(), PrebuiltDepTag, name) + p.properties.SourceExists = true } } } @@ -290,8 +307,8 @@ func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) { // PrebuiltSelectModuleMutator marks prebuilts that are used, either overriding source modules or // because the source module doesn't exist. It also disables installing overridden source modules. func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) { - if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil { - p := m.Prebuilt() + m := ctx.Module() + if p := GetEmbeddedPrebuilt(m); p != nil { if p.srcsSupplier == nil { panic(fmt.Errorf("prebuilt module did not have InitPrebuiltModule called on it")) } @@ -299,9 +316,9 @@ func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) { p.properties.UsePrebuilt = p.usePrebuilt(ctx, nil, m) } } else if s, ok := ctx.Module().(Module); ok { - ctx.VisitDirectDepsWithTag(PrebuiltDepTag, func(m Module) { - p := m.(PrebuiltInterface).Prebuilt() - if p.usePrebuilt(ctx, s, m) { + ctx.VisitDirectDepsWithTag(PrebuiltDepTag, func(prebuiltModule Module) { + p := GetEmbeddedPrebuilt(prebuiltModule) + if p.usePrebuilt(ctx, s, prebuiltModule) { p.properties.UsePrebuilt = true s.ReplacedByPrebuilt() } @@ -313,8 +330,8 @@ func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) { // prebuilt when both modules exist and the prebuilt should be used. When the prebuilt should not // be used, disable installing it. func PrebuiltPostDepsMutator(ctx BottomUpMutatorContext) { - if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil { - p := m.Prebuilt() + m := ctx.Module() + if p := GetEmbeddedPrebuilt(m); p != nil { name := m.base().BaseModuleName() if p.properties.UsePrebuilt { if p.properties.SourceExists { diff --git a/cc/fuzz.go b/cc/fuzz.go index 5219ebc04..c780b6f97 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -221,8 +221,7 @@ func isValidSharedDependency(dependency android.Module) bool { // If the same library is present both as source and a prebuilt we must pick // only one to avoid a conflict. Always prefer the source since the prebuilt // probably won't be built with sanitizers enabled. - if prebuilt, ok := dependency.(android.PrebuiltInterface); ok && - prebuilt.Prebuilt() != nil && prebuilt.Prebuilt().SourceExists() { + if prebuilt := android.GetEmbeddedPrebuilt(dependency); prebuilt != nil && prebuilt.SourceExists() { return false } diff --git a/dexpreopt/config.go b/dexpreopt/config.go index 8a656ed51..739791968 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -404,14 +404,14 @@ func dex2oatPathFromDep(ctx android.ModuleContext) android.Path { if parent == ctx.Module() && ctx.OtherModuleDependencyTag(child) == Dex2oatDepTag { // Found the source module, or prebuilt module that has replaced the source. dex2oatModule = child - if p, ok := child.(android.PrebuiltInterface); ok && p.Prebuilt() != nil { + if android.IsModulePrebuilt(child) { return false // If it's the prebuilt we're done. } else { return true // Recurse to check if the source has a prebuilt dependency. } } if parent == dex2oatModule && ctx.OtherModuleDependencyTag(child) == android.PrebuiltDepTag { - if p, ok := child.(android.PrebuiltInterface); ok && p.Prebuilt() != nil && p.Prebuilt().UsePrebuilt() { + if p := android.GetEmbeddedPrebuilt(child); p != nil && p.UsePrebuilt() { dex2oatModule = child // Found a prebuilt that should be used. } }