From a2f296f054b52df9580c83c1290d7354ebadb472 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 29 Nov 2016 15:16:18 -0800 Subject: [PATCH] Fall back to prebuilts if source modules are disabled In lieu of having an environment variable to override prebuilts preferences (for now), fall back to prebuilts whenever the source module is disabled. Complicated source modules (like LLVM) that already have Go logic can then use an environment variariable to disable their source module whenever they want to use prebuilts. Computes UsePrebuilt once using information from both the source and prebuilt modules, and stores the result in the prebuilt module. Test: m -j libLLVM Test: m -j libLLVM FORCE_BUILD_LLVM_COMPONENTS=true Change-Id: Ib0819a03e9492e55f55de3402e05b3a043644a39 --- android/module.go | 1 + android/mutator.go | 2 +- android/prebuilt.go | 64 ++++++++++++++++++++------------------------- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/android/module.go b/android/module.go index 110f04c73..c0b9c474e 100644 --- a/android/module.go +++ b/android/module.go @@ -100,6 +100,7 @@ type Module interface { Enabled() bool Target() Target InstallInData() bool + SkipInstall() } type nameProperties struct { diff --git a/android/mutator.go b/android/mutator.go index 8114b3e7d..34202807d 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -46,8 +46,8 @@ func registerMutators() { ctx.BottomUp("deps", depsMutator).Parallel() + ctx.TopDown("prebuilt_select", PrebuiltSelectModuleMutator).Parallel() ctx.BottomUp("prebuilt_replace", PrebuiltReplaceMutator).Parallel() - ctx.TopDown("prebuilt_disable", PrebuiltDisableMutator).Parallel() register(postDeps) } diff --git a/android/prebuilt.go b/android/prebuilt.go index 76524291e..5f9b4b094 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -21,20 +21,6 @@ import "github.com/google/blueprint" var prebuiltDependencyTag blueprint.BaseDependencyTag -func SourceModuleHasPrebuilt(ctx ModuleContext) OptionalPath { - var path Path - ctx.VisitDirectDeps(func(m blueprint.Module) { - if ctx.OtherModuleDependencyTag(m) == prebuiltDependencyTag { - p := m.(PrebuiltInterface).Prebuilt() - if p.usePrebuilt(ctx) { - path = p.Path(ctx) - } - } - }) - - return OptionalPathForPath(path) -} - type Prebuilt struct { Properties struct { Srcs []string `android:"arch_variant"` @@ -43,6 +29,7 @@ type Prebuilt struct { Prefer bool `android:"arch_variant"` SourceExists bool `blueprint:"mutated"` + UsePrebuilt bool `blueprint:"mutated"` } module Module } @@ -68,11 +55,6 @@ func (p *Prebuilt) Path(ctx ModuleContext) Path { type PrebuiltInterface interface { Module Prebuilt() *Prebuilt - SkipInstall() -} - -type PrebuiltSourceInterface interface { - SkipInstall() } // prebuiltMutator ensures that there is always a module with an undecorated name, and marks @@ -90,6 +72,22 @@ func prebuiltMutator(ctx BottomUpMutatorContext) { } } +// PrebuiltSelectModuleMutator marks prebuilts that are overriding source modules, and disables +// installing the source module. +func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) { + if s, ok := ctx.Module().(Module); ok { + ctx.VisitDirectDeps(func(m blueprint.Module) { + if ctx.OtherModuleDependencyTag(m) == prebuiltDependencyTag { + p := m.(PrebuiltInterface).Prebuilt() + if p.usePrebuilt(ctx, s) { + p.Properties.UsePrebuilt = true + s.SkipInstall() + } + } + }) + } +} + // PrebuiltReplaceMutator replaces dependencies on the source module with dependencies on the // prebuilt when both modules exist and the prebuilt should be used. When the prebuilt should not // be used, disable installing it. @@ -97,7 +95,7 @@ func PrebuiltReplaceMutator(ctx BottomUpMutatorContext) { if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil { p := m.Prebuilt() name := m.base().BaseModuleName() - if p.usePrebuilt(ctx) { + if p.Properties.UsePrebuilt { if p.Properties.SourceExists { ctx.ReplaceDependencies(name) } @@ -107,21 +105,17 @@ func PrebuiltReplaceMutator(ctx BottomUpMutatorContext) { } } -// PrebuiltDisableMutator disables source modules that have prebuilts that should be used instead. -func PrebuiltDisableMutator(ctx TopDownMutatorContext) { - if s, ok := ctx.Module().(PrebuiltSourceInterface); ok { - ctx.VisitDirectDeps(func(m blueprint.Module) { - if ctx.OtherModuleDependencyTag(m) == prebuiltDependencyTag { - p := m.(PrebuiltInterface).Prebuilt() - if p.usePrebuilt(ctx) { - s.SkipInstall() - } - } - }) +// usePrebuilt returns true if a prebuilt should be used instead of the source module. The prebuilt +// will be used if it is marked "prefer" or if the source module is disabled. +func (p *Prebuilt) usePrebuilt(ctx TopDownMutatorContext, source Module) bool { + if len(p.Properties.Srcs) == 0 { + return false } -} -func (p *Prebuilt) usePrebuilt(ctx BaseContext) bool { - // TODO: use p.Properties.Name and ctx.ModuleDir to override prefer - return p.Properties.Prefer && len(p.Properties.Srcs) > 0 + // TODO: use p.Properties.Name and ctx.ModuleDir to override preference + if p.Properties.Prefer { + return true + } + + return !source.Enabled() }