diff options
Diffstat (limited to 'android/module.go')
-rw-r--r-- | android/module.go | 215 |
1 files changed, 124 insertions, 91 deletions
diff --git a/android/module.go b/android/module.go index 66859fa5..0eb48203 100644 --- a/android/module.go +++ b/android/module.go @@ -17,6 +17,7 @@ package android import ( "fmt" "path/filepath" + "sort" "strings" "github.com/google/blueprint" @@ -78,7 +79,7 @@ type ModuleContext interface { blueprint.BaseModuleContext // Deprecated: use ModuleContext.Build instead. - ModuleBuild(pctx blueprint.PackageContext, params ModuleBuildParams) + ModuleBuild(pctx PackageContext, params ModuleBuildParams) ExpandSources(srcFiles, excludes []string) Paths ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths @@ -115,15 +116,15 @@ type ModuleContext interface { VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) WalkDeps(visit func(Module, Module) bool) - Variable(pctx blueprint.PackageContext, name, value string) - Rule(pctx blueprint.PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule + Variable(pctx PackageContext, name, value string) + Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule // Similar to blueprint.ModuleContext.Build, but takes Paths instead of []string, // and performs more verification. - Build(pctx blueprint.PackageContext, params BuildParams) + Build(pctx PackageContext, params BuildParams) - PrimaryModule() blueprint.Module - FinalModule() blueprint.Module - VisitAllModuleVariants(visit func(blueprint.Module)) + PrimaryModule() Module + FinalModule() Module + VisitAllModuleVariants(visit func(Module)) GetMissingDependencies() []string } @@ -325,8 +326,8 @@ type ModuleBase struct { // Used by buildTargetSingleton to create checkbuild and per-directory build targets // Only set on the final variant of each module - installTarget string - checkbuildTarget string + installTarget WritablePath + checkbuildTarget WritablePath blueprintDir string hooks hooks @@ -464,36 +465,35 @@ func (p *ModuleBase) InstallInSanitizerDir() bool { return false } -func (a *ModuleBase) generateModuleTarget(ctx blueprint.ModuleContext) { +func (a *ModuleBase) generateModuleTarget(ctx ModuleContext) { allInstalledFiles := Paths{} allCheckbuildFiles := Paths{} - ctx.VisitAllModuleVariants(func(module blueprint.Module) { - a := module.(Module).base() + ctx.VisitAllModuleVariants(func(module Module) { + a := module.base() allInstalledFiles = append(allInstalledFiles, a.installFiles...) allCheckbuildFiles = append(allCheckbuildFiles, a.checkbuildFiles...) }) - deps := []string{} + var deps Paths if len(allInstalledFiles) > 0 { - name := ctx.ModuleName() + "-install" - ctx.Build(pctx, blueprint.BuildParams{ + name := PathForPhony(ctx, ctx.ModuleName()+"-install") + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{name}, - Implicits: allInstalledFiles.Strings(), - Optional: ctx.Config().(Config).EmbeddedInMake(), + Output: name, + Implicits: allInstalledFiles, + Default: !ctx.Config().(Config).EmbeddedInMake(), }) deps = append(deps, name) a.installTarget = name } if len(allCheckbuildFiles) > 0 { - name := ctx.ModuleName() + "-checkbuild" - ctx.Build(pctx, blueprint.BuildParams{ + name := PathForPhony(ctx, ctx.ModuleName()+"-checkbuild") + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{name}, - Implicits: allCheckbuildFiles.Strings(), - Optional: true, + Output: name, + Implicits: allCheckbuildFiles, }) deps = append(deps, name) a.checkbuildTarget = name @@ -505,11 +505,10 @@ func (a *ModuleBase) generateModuleTarget(ctx blueprint.ModuleContext) { suffix = "-soong" } - ctx.Build(pctx, blueprint.BuildParams{ + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{ctx.ModuleName() + suffix}, + Output: PathForPhony(ctx, ctx.ModuleName()+suffix), Implicits: deps, - Optional: true, }) a.blueprintDir = ctx.ModuleDir() @@ -525,23 +524,23 @@ func (a *ModuleBase) androidBaseContextFactory(ctx blueprint.BaseModuleContext) } } -func (a *ModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) { - androidCtx := &androidModuleContext{ +func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) { + ctx := &androidModuleContext{ module: a.module, - ModuleContext: ctx, - androidBaseContextImpl: a.androidBaseContextFactory(ctx), - installDeps: a.computeInstallDeps(ctx), + ModuleContext: blueprintCtx, + androidBaseContextImpl: a.androidBaseContextFactory(blueprintCtx), + installDeps: a.computeInstallDeps(blueprintCtx), installFiles: a.installFiles, - missingDeps: ctx.GetMissingDependencies(), + missingDeps: blueprintCtx.GetMissingDependencies(), } desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " " var suffix []string - if androidCtx.Os().Class != Device && androidCtx.Os().Class != Generic { - suffix = append(suffix, androidCtx.Os().String()) + if ctx.Os().Class != Device && ctx.Os().Class != Generic { + suffix = append(suffix, ctx.Os().String()) } - if !androidCtx.PrimaryArch() { - suffix = append(suffix, androidCtx.Arch().ArchType.String()) + if !ctx.PrimaryArch() { + suffix = append(suffix, ctx.Arch().ArchType.String()) } ctx.Variable(pctx, "moduleDesc", desc) @@ -553,13 +552,13 @@ func (a *ModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) { ctx.Variable(pctx, "moduleDescSuffix", s) if a.Enabled() { - a.module.GenerateAndroidBuildActions(androidCtx) + a.module.GenerateAndroidBuildActions(ctx) if ctx.Failed() { return } - a.installFiles = append(a.installFiles, androidCtx.installFiles...) - a.checkbuildFiles = append(a.checkbuildFiles, androidCtx.checkbuildFiles...) + a.installFiles = append(a.installFiles, ctx.installFiles...) + a.checkbuildFiles = append(a.checkbuildFiles, ctx.checkbuildFiles...) } if a == ctx.FinalModule().(Module).base() { @@ -569,7 +568,7 @@ func (a *ModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) { } } - a.buildParams = androidCtx.buildParams + a.buildParams = ctx.buildParams } type androidBaseContextImpl struct { @@ -594,7 +593,7 @@ type androidModuleContext struct { } func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) { - a.ModuleContext.Build(pctx, blueprint.BuildParams{ + a.ModuleContext.Build(pctx.PackageContext, blueprint.BuildParams{ Rule: ErrorRule, Description: desc, Outputs: outputs, @@ -606,17 +605,14 @@ func (a *androidModuleContext) ninjaError(desc string, outputs []string, err err return } -func (a *androidModuleContext) ModuleBuild(pctx blueprint.PackageContext, params ModuleBuildParams) { +func (a *androidModuleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParams) { a.Build(pctx, BuildParams(params)) } -func (a *androidModuleContext) Build(pctx blueprint.PackageContext, params BuildParams) { - if a.config.captureBuild { - a.buildParams = append(a.buildParams, params) - } - +func convertBuildParams(params BuildParams) blueprint.BuildParams { bparams := blueprint.BuildParams{ Rule: params.Rule, + Description: params.Description, Deps: params.Deps, Outputs: params.Outputs.Strings(), ImplicitOutputs: params.ImplicitOutputs.Strings(), @@ -627,10 +623,6 @@ func (a *androidModuleContext) Build(pctx blueprint.PackageContext, params Build Optional: !params.Default, } - if params.Description != "" { - bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}" - } - if params.Depfile != nil { bparams.Depfile = params.Depfile.String() } @@ -647,6 +639,30 @@ func (a *androidModuleContext) Build(pctx blueprint.PackageContext, params Build bparams.Implicits = append(bparams.Implicits, params.Implicit.String()) } + return bparams +} + +func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) { + a.ModuleContext.Variable(pctx.PackageContext, name, value) +} + +func (a *androidModuleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams, + argNames ...string) blueprint.Rule { + + return a.ModuleContext.Rule(pctx.PackageContext, name, params, argNames...) +} + +func (a *androidModuleContext) Build(pctx PackageContext, params BuildParams) { + if a.config.captureBuild { + a.buildParams = append(a.buildParams, params) + } + + bparams := convertBuildParams(params) + + if bparams.Description != "" { + bparams.Description = "${moduleDesc}" + params.Description + "${moduleDescSuffix}" + } + if a.missingDeps != nil { a.ninjaError(bparams.Description, bparams.Outputs, fmt.Errorf("module %s missing dependencies: %s\n", @@ -654,7 +670,7 @@ func (a *androidModuleContext) Build(pctx blueprint.PackageContext, params Build return } - a.ModuleContext.Build(pctx, bparams) + a.ModuleContext.Build(pctx.PackageContext, bparams) } func (a *androidModuleContext) GetMissingDependencies() []string { @@ -751,6 +767,20 @@ func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) { }) } +func (a *androidModuleContext) VisitAllModuleVariants(visit func(Module)) { + a.ModuleContext.VisitAllModuleVariants(func(module blueprint.Module) { + visit(module.(Module)) + }) +} + +func (a *androidModuleContext) PrimaryModule() Module { + return a.ModuleContext.PrimaryModule().(Module) +} + +func (a *androidModuleContext) FinalModule() Module { + return a.ModuleContext.FinalModule().(Module) +} + func (a *androidBaseContextImpl) Target() Target { return a.target } @@ -1027,7 +1057,7 @@ func init() { RegisterSingletonType("buildtarget", BuildTargetSingleton) } -func BuildTargetSingleton() blueprint.Singleton { +func BuildTargetSingleton() Singleton { return &buildTargetSingleton{} } @@ -1038,29 +1068,28 @@ func parentDir(dir string) string { type buildTargetSingleton struct{} -func (c *buildTargetSingleton) GenerateBuildActions(ctx blueprint.SingletonContext) { - checkbuildDeps := []string{} +func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) { + var checkbuildDeps Paths - mmTarget := func(dir string) string { - return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1) + mmTarget := func(dir string) WritablePath { + return PathForPhony(ctx, + "MODULES-IN-"+strings.Replace(filepath.Clean(dir), "/", "-", -1)) } - modulesInDir := make(map[string][]string) + modulesInDir := make(map[string]Paths) - ctx.VisitAllModules(func(module blueprint.Module) { - if a, ok := module.(Module); ok { - blueprintDir := a.base().blueprintDir - installTarget := a.base().installTarget - checkbuildTarget := a.base().checkbuildTarget + ctx.VisitAllModules(func(module Module) { + blueprintDir := module.base().blueprintDir + installTarget := module.base().installTarget + checkbuildTarget := module.base().checkbuildTarget - if checkbuildTarget != "" { - checkbuildDeps = append(checkbuildDeps, checkbuildTarget) - modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget) - } + if checkbuildTarget != nil { + checkbuildDeps = append(checkbuildDeps, checkbuildTarget) + modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], checkbuildTarget) + } - if installTarget != "" { - modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget) - } + if installTarget != nil { + modulesInDir[blueprintDir] = append(modulesInDir[blueprintDir], installTarget) } }) @@ -1070,11 +1099,10 @@ func (c *buildTargetSingleton) GenerateBuildActions(ctx blueprint.SingletonConte } // Create a top-level checkbuild target that depends on all modules - ctx.Build(pctx, blueprint.BuildParams{ + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{"checkbuild" + suffix}, + Output: PathForPhony(ctx, "checkbuild"+suffix), Implicits: checkbuildDeps, - Optional: true, }) // Make will generate the MODULES-IN-* targets @@ -1082,6 +1110,15 @@ func (c *buildTargetSingleton) GenerateBuildActions(ctx blueprint.SingletonConte return } + sortedKeys := func(m map[string]Paths) []string { + s := make([]string, 0, len(m)) + for k := range m { + s = append(s, k) + } + sort.Strings(s) + return s + } + // Ensure ancestor directories are in modulesInDir dirs := sortedKeys(modulesInDir) for _, dir := range dirs { @@ -1108,28 +1145,26 @@ func (c *buildTargetSingleton) GenerateBuildActions(ctx blueprint.SingletonConte // depends on the MODULES-IN-* targets of all of its subdirectories that contain Android.bp // files. for _, dir := range dirs { - ctx.Build(pctx, blueprint.BuildParams{ + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{mmTarget(dir)}, + Output: mmTarget(dir), Implicits: modulesInDir[dir], // HACK: checkbuild should be an optional build, but force it // enabled for now in standalone builds - Optional: ctx.Config().(Config).EmbeddedInMake(), + Default: !ctx.Config().(Config).EmbeddedInMake(), }) } // Create (host|host-cross|target)-<OS> phony rules to build a reduced checkbuild. osDeps := map[OsType]Paths{} - ctx.VisitAllModules(func(module blueprint.Module) { - if a, ok := module.(Module); ok { - if a.Enabled() { - os := a.Target().Os - osDeps[os] = append(osDeps[os], a.base().checkbuildFiles...) - } + ctx.VisitAllModules(func(module Module) { + if module.Enabled() { + os := module.Target().Os + osDeps[os] = append(osDeps[os], module.base().checkbuildFiles...) } }) - osClass := make(map[string][]string) + osClass := make(map[string]Paths) for os, deps := range osDeps { var className string @@ -1144,25 +1179,23 @@ func (c *buildTargetSingleton) GenerateBuildActions(ctx blueprint.SingletonConte continue } - name := className + "-" + os.Name + name := PathForPhony(ctx, className+"-"+os.Name) osClass[className] = append(osClass[className], name) - ctx.Build(pctx, blueprint.BuildParams{ + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{name}, - Implicits: deps.Strings(), - Optional: true, + Output: name, + Implicits: deps, }) } // Wrap those into host|host-cross|target phony rules osClasses := sortedKeys(osClass) for _, class := range osClasses { - ctx.Build(pctx, blueprint.BuildParams{ + ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, - Outputs: []string{class}, + Output: PathForPhony(ctx, class), Implicits: osClass[class], - Optional: true, }) } } |