diff --git a/android/prebuilt.go b/android/prebuilt.go index 006b66f15..772df7af4 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -76,10 +76,15 @@ func prebuiltMutator(ctx BottomUpMutatorContext) { } } -// PrebuiltSelectModuleMutator marks prebuilts that are overriding source modules, and disables -// installing the source module. +// 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 s, ok := ctx.Module().(Module); ok { + if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil { + p := m.Prebuilt() + if !p.Properties.SourceExists { + p.Properties.UsePrebuilt = p.usePrebuilt(ctx, nil) + } + } else if s, ok := ctx.Module().(Module); ok { ctx.VisitDirectDeps(func(m blueprint.Module) { if ctx.OtherModuleDependencyTag(m) == prebuiltDepTag { p := m.(PrebuiltInterface).Prebuilt() @@ -121,5 +126,5 @@ func (p *Prebuilt) usePrebuilt(ctx TopDownMutatorContext, source Module) bool { return true } - return !source.Enabled() + return source == nil || !source.Enabled() } diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go index 311f821a3..d09518b44 100644 --- a/android/prebuilt_test.go +++ b/android/prebuilt_test.go @@ -144,20 +144,33 @@ func TestPrebuilts(t *testing.T) { t.Fatalf("failed to find module foo") } + var dependsOnSourceModule, dependsOnPrebuiltModule bool + ctx.VisitDirectDeps(foo, func(m blueprint.Module) { + if _, ok := m.(*sourceModule); ok { + dependsOnSourceModule = true + } + if p, ok := m.(*prebuiltModule); ok { + dependsOnPrebuiltModule = true + if !p.Prebuilt().Properties.UsePrebuilt { + t.Errorf("dependency on prebuilt module not marked used") + } + } + }) + if test.prebuilt { - if !foo.(*sourceModule).dependsOnPrebuiltModule { + if !dependsOnPrebuiltModule { t.Errorf("doesn't depend on prebuilt module") } - if foo.(*sourceModule).dependsOnSourceModule { + if dependsOnSourceModule { t.Errorf("depends on source module") } } else { - if foo.(*sourceModule).dependsOnPrebuiltModule { + if dependsOnPrebuiltModule { t.Errorf("depends on prebuilt module") } - if !foo.(*sourceModule).dependsOnSourceModule { + if !dependsOnSourceModule { t.Errorf("doens't depend on source module") } } @@ -209,14 +222,6 @@ func (s *sourceModule) DepsMutator(ctx BottomUpMutatorContext) { } func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) { - ctx.VisitDirectDeps(func(m blueprint.Module) { - if _, ok := m.(*sourceModule); ok { - s.dependsOnSourceModule = true - } - if _, ok := m.(*prebuiltModule); ok { - s.dependsOnPrebuiltModule = true - } - }) } func findModule(ctx *blueprint.Context, name string) blueprint.Module {