diff options
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | cc/cc.go | 65 | ||||
-rw-r--r-- | common/arch.go | 14 | ||||
-rw-r--r-- | common/module.go | 45 | ||||
-rw-r--r-- | common/mutator.go | 69 | ||||
-rw-r--r-- | common/variable.go | 9 | ||||
-rw-r--r-- | genrule/genrule.go | 13 | ||||
-rw-r--r-- | java/app.go | 4 | ||||
-rw-r--r-- | java/java.go | 12 | ||||
-rw-r--r-- | register.go | 26 |
10 files changed, 148 insertions, 110 deletions
@@ -95,6 +95,7 @@ bootstrap_go_package { "common/env.go", "common/glob.go", "common/module.go", + "common/mutator.go", "common/paths.go", "common/util.go", "common/variable.go", @@ -57,8 +57,9 @@ func init() { // LinkageMutator must be registered after common.ArchMutator, but that is guaranteed by // the Go initialization order because this package depends on common, so common's init // functions will run first. - soong.RegisterEarlyMutator("link", LinkageMutator) - soong.RegisterEarlyMutator("test_per_src", TestPerSrcMutator) + common.RegisterBottomUpMutator("link", linkageMutator) + common.RegisterBottomUpMutator("test_per_src", testPerSrcMutator) + common.RegisterBottomUpMutator("deps", depsMutator) } var ( @@ -140,20 +141,25 @@ func init() { pctx.StaticVariable("clangPath", "${SrcDir}/prebuilts/clang/${HostPrebuiltTag}/host/3.6/bin/") } +type CCModuleContext common.AndroidBaseContext + // Building C/C++ code is handled by objects that satisfy this interface via composition type CCModuleType interface { common.AndroidModule // Modify property values after parsing Blueprints file but before starting dependency // resolution or build rule generation - ModifyProperties(common.AndroidBaseContext) + ModifyProperties(CCModuleContext) // Modify the ccFlags flags(common.AndroidModuleContext, CCFlags) CCFlags - // Return list of dependency names for use in AndroidDynamicDependencies and in depsToPaths + // Return list of dependency names for use in depsMutator depNames(common.AndroidBaseContext, CCDeps) CCDeps + // Add dynamic dependencies + depsMutator(common.AndroidBottomUpMutatorContext) + // Compile objects into final module compileModule(common.AndroidModuleContext, CCFlags, CCDeps, []string) @@ -392,8 +398,6 @@ func (c *CCBase) ccModuleType() CCModuleType { return c.module } -var _ common.AndroidDynamicDepender = (*CCBase)(nil) - func (c *CCBase) findToolchain(ctx common.AndroidModuleContext) Toolchain { arch := ctx.Arch() hod := ctx.HostOrDevice() @@ -405,7 +409,7 @@ func (c *CCBase) findToolchain(ctx common.AndroidModuleContext) Toolchain { return factory(arch.ArchVariant, arch.CpuVariant) } -func (c *CCBase) ModifyProperties(ctx common.AndroidBaseContext) { +func (c *CCBase) ModifyProperties(ctx CCModuleContext) { } func (c *CCBase) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps { @@ -416,9 +420,7 @@ func (c *CCBase) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps return depNames } -func (c *CCBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { - c.module.ModifyProperties(ctx) - +func (c *CCBase) depsMutator(ctx common.AndroidBottomUpMutatorContext) { c.savedDepNames = c.module.depNames(ctx, CCDeps{}) c.savedDepNames.WholeStaticLibs = lastUniqueElements(c.savedDepNames.WholeStaticLibs) c.savedDepNames.StaticLibs = lastUniqueElements(c.savedDepNames.StaticLibs) @@ -431,15 +433,20 @@ func (c *CCBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerMod ctx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, c.savedDepNames.SharedLibs...) - ret := append([]string(nil), c.savedDepNames.ObjFiles...) + ctx.AddDependency(ctx.Module(), c.savedDepNames.ObjFiles...) if c.savedDepNames.CrtBegin != "" { - ret = append(ret, c.savedDepNames.CrtBegin) + ctx.AddDependency(ctx.Module(), c.savedDepNames.CrtBegin) } if c.savedDepNames.CrtEnd != "" { - ret = append(ret, c.savedDepNames.CrtEnd) + ctx.AddDependency(ctx.Module(), c.savedDepNames.CrtEnd) } +} - return ret +func depsMutator(ctx common.AndroidBottomUpMutatorContext) { + if c, ok := ctx.Module().(CCModuleType); ok { + c.ModifyProperties(ctx) + c.depsMutator(ctx) + } } // Create a ccFlags struct that collects the compile flags from global values, @@ -1285,11 +1292,6 @@ func CCObjectFactory() (blueprint.Module, []interface{}) { return newCCBase(&module.CCBase, module, common.DeviceSupported, common.MultilibBoth) } -func (*ccObject) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { - // object files can't have any dynamic dependencies - return nil -} - func (*ccObject) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps { // object files can't have any dynamic dependencies return CCDeps{} @@ -1418,7 +1420,7 @@ func CCBinaryFactory() (blueprint.Module, []interface{}) { return NewCCBinary(module, module, common.HostAndDeviceSupported) } -func (c *CCBinary) ModifyProperties(ctx common.AndroidBaseContext) { +func (c *CCBinary) ModifyProperties(ctx CCModuleContext) { if ctx.Darwin() { c.BinaryProperties.Static_executable = proptools.BoolPtr(false) } @@ -1519,7 +1521,7 @@ type testPerSrc interface { var _ testPerSrc = (*CCBinary)(nil) -func TestPerSrcMutator(mctx blueprint.EarlyMutatorContext) { +func testPerSrcMutator(mctx common.AndroidBottomUpMutatorContext) { if test, ok := mctx.Module().(testPerSrc); ok { if test.testPerSrc() { testNames := make([]string, len(test.binary().Properties.Srcs)) @@ -1691,11 +1693,6 @@ type toolchainLibrary struct { CCLibrary } -func (*toolchainLibrary) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { - // toolchain libraries can't have any dependencies - return nil -} - func (*toolchainLibrary) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps { // toolchain libraries can't have any dependencies return CCDeps{} @@ -1752,13 +1749,6 @@ type ndkPrebuiltObject struct { ccObject } -func (*ndkPrebuiltObject) AndroidDynamicDependencies( - ctx common.AndroidDynamicDependerModuleContext) []string { - - // NDK objects can't have any dependencies - return nil -} - func (*ndkPrebuiltObject) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps { // NDK objects can't have any dependencies return CCDeps{} @@ -1789,13 +1779,6 @@ type ndkPrebuiltLibrary struct { CCLibrary } -func (*ndkPrebuiltLibrary) AndroidDynamicDependencies( - ctx common.AndroidDynamicDependerModuleContext) []string { - - // NDK libraries can't have any dependencies - return nil -} - func (*ndkPrebuiltLibrary) depNames(ctx common.AndroidBaseContext, depNames CCDeps) CCDeps { // NDK libraries can't have any dependencies return CCDeps{} @@ -1896,7 +1879,7 @@ func (c *ndkPrebuiltStl) compileModule(ctx common.AndroidModuleContext, flags CC c.out = libDir + "/" + libName + libExt } -func LinkageMutator(mctx blueprint.EarlyMutatorContext) { +func linkageMutator(mctx common.AndroidBottomUpMutatorContext) { if c, ok := mctx.Module().(ccLinkedInterface); ok { var modules []blueprint.Module if c.buildStatic() && c.buildShared() { diff --git a/common/arch.go b/common/arch.go index 05945672..f0f44091 100644 --- a/common/arch.go +++ b/common/arch.go @@ -20,15 +20,13 @@ import ( "runtime" "strings" - "android/soong" - "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) func init() { - soong.RegisterEarlyMutator("host_or_device", HostOrDeviceMutator) - soong.RegisterEarlyMutator("arch", ArchMutator) + RegisterBottomUpMutator("host_or_device", HostOrDeviceMutator) + RegisterBottomUpMutator("arch", ArchMutator) } var ( @@ -303,7 +301,7 @@ var ( } ) -func HostOrDeviceMutator(mctx blueprint.EarlyMutatorContext) { +func HostOrDeviceMutator(mctx AndroidBottomUpMutatorContext) { var module AndroidModule var ok bool if module, ok = mctx.Module().(AndroidModule); !ok { @@ -335,7 +333,7 @@ func HostOrDeviceMutator(mctx blueprint.EarlyMutatorContext) { } } -func ArchMutator(mctx blueprint.EarlyMutatorContext) { +func ArchMutator(mctx AndroidBottomUpMutatorContext) { var module AndroidModule var ok bool if module, ok = mctx.Module().(AndroidModule); !ok { @@ -426,7 +424,7 @@ func InitArchModule(m AndroidModule, defaultMultilib Multilib, var dashToUnderscoreReplacer = strings.NewReplacer("-", "_") -func (a *AndroidModuleBase) appendProperties(ctx blueprint.EarlyMutatorContext, +func (a *AndroidModuleBase) appendProperties(ctx AndroidBottomUpMutatorContext, dst, src interface{}, field, srcPrefix string) { src = reflect.ValueOf(src).FieldByName(field).Elem().Interface() @@ -459,7 +457,7 @@ func (a *AndroidModuleBase) appendProperties(ctx blueprint.EarlyMutatorContext, } // Rewrite the module's properties structs to contain arch-specific values. -func (a *AndroidModuleBase) setArchProperties(ctx blueprint.EarlyMutatorContext) { +func (a *AndroidModuleBase) setArchProperties(ctx AndroidBottomUpMutatorContext) { arch := a.commonProperties.CompileArch hod := a.commonProperties.CompileHostOrDevice diff --git a/common/module.go b/common/module.go index d31a9fc2..1860ecb9 100644 --- a/common/module.go +++ b/common/module.go @@ -72,15 +72,6 @@ type AndroidModule interface { HostOrDevice() HostOrDevice } -type AndroidDynamicDepender interface { - AndroidDynamicDependencies(ctx AndroidDynamicDependerModuleContext) []string -} - -type AndroidDynamicDependerModuleContext interface { - blueprint.DynamicDependerModuleContext - androidBaseContext -} - type commonProperties struct { Name string Deps []string @@ -313,33 +304,20 @@ func (a *AndroidModuleBase) generateModuleTarget(ctx blueprint.ModuleContext) { } } -func (a *AndroidModuleBase) DynamicDependencies(ctx blueprint.DynamicDependerModuleContext) []string { - actx := &androidDynamicDependerContext{ - DynamicDependerModuleContext: ctx, - androidBaseContextImpl: androidBaseContextImpl{ - arch: a.commonProperties.CompileArch, - hod: a.commonProperties.CompileHostOrDevice, - config: ctx.Config().(Config), - }, +func (a *AndroidModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) androidBaseContextImpl { + return androidBaseContextImpl{ + arch: a.commonProperties.CompileArch, + hod: a.commonProperties.CompileHostOrDevice, + config: ctx.Config().(Config), } - - if dynamic, ok := a.module.(AndroidDynamicDepender); ok { - return dynamic.AndroidDynamicDependencies(actx) - } - - return nil } func (a *AndroidModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) { androidCtx := &androidModuleContext{ - ModuleContext: ctx, - androidBaseContextImpl: androidBaseContextImpl{ - arch: a.commonProperties.CompileArch, - hod: a.commonProperties.CompileHostOrDevice, - config: ctx.Config().(Config), - }, - installDeps: a.computeInstallDeps(ctx), - installFiles: a.installFiles, + ModuleContext: ctx, + androidBaseContextImpl: a.androidBaseContextFactory(ctx), + installDeps: a.computeInstallDeps(ctx), + installFiles: a.installFiles, } if a.commonProperties.Disabled { @@ -443,11 +421,6 @@ func (a *androidModuleContext) CheckbuildFile(srcPath string) { a.checkbuildFiles = append(a.checkbuildFiles, srcPath) } -type androidDynamicDependerContext struct { - blueprint.DynamicDependerModuleContext - androidBaseContextImpl -} - type fileInstaller interface { filesToInstall() []string } diff --git a/common/mutator.go b/common/mutator.go new file mode 100644 index 00000000..43721eef --- /dev/null +++ b/common/mutator.go @@ -0,0 +1,69 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "android/soong" + + "github.com/google/blueprint" +) + +type AndroidTopDownMutator func(AndroidTopDownMutatorContext) + +type AndroidTopDownMutatorContext interface { + blueprint.TopDownMutatorContext + androidBaseContext +} + +type androidTopDownMutatorContext struct { + blueprint.TopDownMutatorContext + androidBaseContextImpl +} + +type AndroidBottomUpMutator func(AndroidBottomUpMutatorContext) + +type AndroidBottomUpMutatorContext interface { + blueprint.BottomUpMutatorContext + androidBaseContext +} + +type androidBottomUpMutatorContext struct { + blueprint.BottomUpMutatorContext + androidBaseContextImpl +} + +func RegisterBottomUpMutator(name string, mutator AndroidBottomUpMutator) { + soong.RegisterBottomUpMutator(name, func(ctx blueprint.BottomUpMutatorContext) { + if a, ok := ctx.Module().(AndroidModule); ok { + actx := &androidBottomUpMutatorContext{ + BottomUpMutatorContext: ctx, + androidBaseContextImpl: a.base().androidBaseContextFactory(ctx), + } + mutator(actx) + } + }) +} + +func RegisterTopDownMutator(name string, mutator AndroidTopDownMutator) { + soong.RegisterTopDownMutator(name, func(ctx blueprint.TopDownMutatorContext) { + if a, ok := ctx.Module().(AndroidModule); ok { + actx := &androidTopDownMutatorContext{ + TopDownMutatorContext: ctx, + androidBaseContextImpl: a.base().androidBaseContextFactory(ctx), + } + mutator(actx) + } + }) +} diff --git a/common/variable.go b/common/variable.go index 39496810..9a5998f7 100644 --- a/common/variable.go +++ b/common/variable.go @@ -19,14 +19,11 @@ import ( "reflect" "strings" - "android/soong" - - "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) func init() { - soong.RegisterEarlyMutator("variable", VariableMutator) + RegisterBottomUpMutator("variable", variableMutator) } type variableProperties struct { @@ -104,7 +101,7 @@ func (v *productVariables) SetDefaultConfig() { } } -func VariableMutator(mctx blueprint.EarlyMutatorContext) { +func variableMutator(mctx AndroidBottomUpMutatorContext) { var module AndroidModule var ok bool if module, ok = mctx.Module().(AndroidModule); !ok { @@ -144,7 +141,7 @@ func VariableMutator(mctx blueprint.EarlyMutatorContext) { } } -func (a *AndroidModuleBase) setVariableProperties(ctx blueprint.EarlyMutatorContext, +func (a *AndroidModuleBase) setVariableProperties(ctx AndroidBottomUpMutatorContext, prefix string, productVariablePropertyValue reflect.Value, variableValue interface{}) { if variableValue != nil { diff --git a/genrule/genrule.go b/genrule/genrule.go index a5a4c71f..fb0dafcf 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -27,6 +27,8 @@ import ( func init() { soong.RegisterModuleType("gensrcs", GenSrcsFactory) soong.RegisterModuleType("genrule", GenRuleFactory) + + common.RegisterBottomUpMutator("genrule_deps", genruleDepsMutator) } var ( @@ -83,12 +85,13 @@ func (g *generator) GeneratedSourceFiles() []string { return g.outputFiles } -func (g *generator) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { - if g.properties.Tool != "" { - ctx.AddFarVariationDependencies([]blueprint.Variation{{"hostordevice", common.Host.String()}}, - g.properties.Tool) +func genruleDepsMutator(ctx common.AndroidBottomUpMutatorContext) { + if g, ok := ctx.Module().(*generator); ok { + if g.properties.Tool != "" { + ctx.AddFarVariationDependencies([]blueprint.Variation{{"hostordevice", common.Host.String()}}, + g.properties.Tool) + } } - return nil } func (g *generator) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) { diff --git a/java/app.go b/java/app.go index a6e651d8..74e32699 100644 --- a/java/app.go +++ b/java/app.go @@ -67,8 +67,8 @@ type AndroidApp struct { exportPackage string } -func (a *AndroidApp) JavaDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { - deps := a.javaBase.JavaDynamicDependencies(ctx) +func (a *AndroidApp) JavaDependencies(ctx AndroidJavaModuleContext) []string { + deps := a.javaBase.JavaDependencies(ctx) if !a.properties.No_standard_libraries { switch a.properties.Sdk_version { // TODO: Res_sdk_version? diff --git a/java/java.go b/java/java.go index 8b50eff4..2bd5bffa 100644 --- a/java/java.go +++ b/java/java.go @@ -145,9 +145,11 @@ type javaBase struct { installFile string } +type AndroidJavaModuleContext common.AndroidBaseContext + type JavaModuleType interface { GenerateJavaBuildActions(ctx common.AndroidModuleContext) - JavaDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string + JavaDependencies(ctx AndroidJavaModuleContext) []string } type JavaDependency interface { @@ -191,11 +193,13 @@ func (j *javaBase) BootClasspath(ctx common.AndroidBaseContext) string { var defaultJavaLibraries = []string{"core-libart", "core-junit", "ext", "framework"} -func (j *javaBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { - return j.module.JavaDynamicDependencies(ctx) +func javaDepsMutator(ctx common.AndroidBottomUpMutatorContext) { + if j, ok := ctx.Module().(JavaModuleType); ok { + ctx.AddDependency(ctx.Module(), j.JavaDependencies(ctx)...) + } } -func (j *javaBase) JavaDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string { +func (j *javaBase) JavaDependencies(ctx AndroidJavaModuleContext) []string { var deps []string if !j.properties.No_standard_libraries { diff --git a/register.go b/register.go index c35beae5..353094c0 100644 --- a/register.go +++ b/register.go @@ -30,12 +30,13 @@ type singleton struct { var singletons []singleton -type earlyMutator struct { - name string - mutator blueprint.EarlyMutator +type mutator struct { + name string + bottomUpMutator blueprint.BottomUpMutator + topDownMutator blueprint.TopDownMutator } -var earlyMutators []earlyMutator +var mutators []mutator func RegisterModuleType(name string, factory blueprint.ModuleFactory) { moduleTypes = append(moduleTypes, moduleType{name, factory}) @@ -45,8 +46,12 @@ func RegisterSingletonType(name string, factory blueprint.SingletonFactory) { singletons = append(singletons, singleton{name, factory}) } -func RegisterEarlyMutator(name string, mutator blueprint.EarlyMutator) { - earlyMutators = append(earlyMutators, earlyMutator{name, mutator}) +func RegisterBottomUpMutator(name string, m blueprint.BottomUpMutator) { + mutators = append(mutators, mutator{name: name, bottomUpMutator: m}) +} + +func RegisterTopDownMutator(name string, m blueprint.TopDownMutator) { + mutators = append(mutators, mutator{name: name, topDownMutator: m}) } func NewContext() *blueprint.Context { @@ -60,8 +65,13 @@ func NewContext() *blueprint.Context { ctx.RegisterSingletonType(t.name, t.factory) } - for _, t := range earlyMutators { - ctx.RegisterEarlyMutator(t.name, t.mutator) + for _, t := range mutators { + if t.bottomUpMutator != nil { + ctx.RegisterBottomUpMutator(t.name, t.bottomUpMutator) + } + if t.topDownMutator != nil { + ctx.RegisterTopDownMutator(t.name, t.topDownMutator) + } } return ctx |