Loading android/filegroup.go +3 −20 Original line number Diff line number Diff line Loading @@ -15,9 +15,7 @@ package android import ( "io" "strings" "text/template" ) func init() { Loading Loading @@ -71,23 +69,8 @@ func (fg *fileGroup) Srcs() Paths { return append(Paths{}, fg.srcs...) } var androidMkTemplate = template.Must(template.New("filegroup").Parse(` ifdef {{.makeVar}} $(error variable {{.makeVar}} set by soong module is already set in make) endif {{.makeVar}} := {{.value}} .KATI_READONLY := {{.makeVar}} `)) func (fg *fileGroup) AndroidMk() AndroidMkData { return AndroidMkData{ Custom: func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) { func (fg *fileGroup) MakeVars(ctx MakeVarsModuleContext) { if makeVar := String(fg.properties.Export_to_make_var); makeVar != "" { androidMkTemplate.Execute(w, map[string]string{ "makeVar": makeVar, "value": strings.Join(fg.srcs.Strings(), " "), }) } }, ctx.StrictRaw(makeVar, strings.Join(fg.srcs.Strings(), " ")) } } android/makevars.go +90 −31 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android import ( "bytes" "fmt" "sort" "strconv" "strings" Loading @@ -34,43 +35,16 @@ func androidMakeVarsProvider(ctx MakeVarsContext) { } /////////////////////////////////////////////////////////////////////////////// // Interface for other packages to use to declare make variables type MakeVarsContext interface { // BaseMakeVarsContext contains the common functions for other packages to use // to declare make variables type BaseMakeVarsContext interface { Config() Config DeviceConfig() DeviceConfig AddNinjaFileDeps(deps ...string) ModuleName(module blueprint.Module) string ModuleDir(module blueprint.Module) string ModuleSubDir(module blueprint.Module) string ModuleType(module blueprint.Module) string BlueprintFile(module blueprint.Module) string ModuleErrorf(module blueprint.Module, format string, args ...interface{}) Errorf(format string, args ...interface{}) Failed() bool VisitAllModules(visit func(Module)) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) // Verify the make variable matches the Soong version, fail the build // if it does not. If the make variable is empty, just set it. Strict(name, ninjaStr string) // Check to see if the make variable matches the Soong version, warn if // it does not. If the make variable is empty, just set it. Check(name, ninjaStr string) // These are equivalent to the above, but sort the make and soong // variables before comparing them. They also show the unique entries // in each list when displaying the difference, instead of the entire // string. StrictSorted(name, ninjaStr string) CheckSorted(name, ninjaStr string) // Evaluates a ninja string and returns the result. Used if more // complicated modification needs to happen before giving it to Make. Eval(ninjaStr string) (string, error) // These are equivalent to Strict and Check, but do not attempt to // evaluate the values before writing them to the Makefile. They can // be used when all ninja variables have already been evaluated through Loading Loading @@ -108,6 +82,48 @@ type MakeVarsContext interface { DistForGoalsWithFilename(goals []string, path Path, filename string) } // MakeVarsContext contains the set of functions available for MakeVarsProvider // and SingletonMakeVarsProvider implementations. type MakeVarsContext interface { BaseMakeVarsContext ModuleName(module blueprint.Module) string ModuleDir(module blueprint.Module) string ModuleSubDir(module blueprint.Module) string ModuleType(module blueprint.Module) string BlueprintFile(module blueprint.Module) string ModuleErrorf(module blueprint.Module, format string, args ...interface{}) Errorf(format string, args ...interface{}) VisitAllModules(visit func(Module)) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) // Verify the make variable matches the Soong version, fail the build // if it does not. If the make variable is empty, just set it. Strict(name, ninjaStr string) // Check to see if the make variable matches the Soong version, warn if // it does not. If the make variable is empty, just set it. Check(name, ninjaStr string) // These are equivalent to the above, but sort the make and soong // variables before comparing them. They also show the unique entries // in each list when displaying the difference, instead of the entire // string. StrictSorted(name, ninjaStr string) CheckSorted(name, ninjaStr string) // Evaluates a ninja string and returns the result. Used if more // complicated modification needs to happen before giving it to Make. Eval(ninjaStr string) (string, error) } // MakeVarsModuleContext contains the set of functions available for modules // implementing the ModuleMakeVarsProvider interface. type MakeVarsModuleContext interface { BaseMakeVarsContext } var _ PathContext = MakeVarsContext(nil) type MakeVarsProvider func(ctx MakeVarsContext) Loading Loading @@ -135,6 +151,14 @@ func SingletonmakeVarsProviderAdapter(singleton SingletonMakeVarsProvider) MakeV return func(ctx MakeVarsContext) { singleton.MakeVars(ctx) } } // ModuleMakeVarsProvider is a Module with an extra method to provide extra values to be exported to Make. type ModuleMakeVarsProvider interface { Module // MakeVars uses a MakeVarsModuleContext to provide extra values to be exported to Make. MakeVars(ctx MakeVarsModuleContext) } /////////////////////////////////////////////////////////////////////////////// func makeVarsSingletonFunc() Singleton { Loading Loading @@ -209,10 +233,45 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { dists = append(dists, mctx.dists...) } ctx.VisitAllModules(func(m Module) { if provider, ok := m.(ModuleMakeVarsProvider); ok { mctx := &makeVarsContext{ SingletonContext: ctx, } provider.MakeVars(mctx) vars = append(vars, mctx.vars...) phonies = append(phonies, mctx.phonies...) dists = append(dists, mctx.dists...) } }) if ctx.Failed() { return } sort.Slice(vars, func(i, j int) bool { return vars[i].name < vars[j].name }) sort.Slice(phonies, func(i, j int) bool { return phonies[i].name < phonies[j].name }) lessArr := func(a, b []string) bool { if len(a) == len(b) { for i := range a { if a[i] < b[i] { return true } } return false } return len(a) < len(b) } sort.Slice(dists, func(i, j int) bool { return lessArr(dists[i].goals, dists[j].goals) || lessArr(dists[i].paths, dists[j].paths) }) outBytes := s.writeVars(vars) if err := pathtools.WriteFileIfChanged(outFile, outBytes, 0666); err != nil { Loading Loading
android/filegroup.go +3 −20 Original line number Diff line number Diff line Loading @@ -15,9 +15,7 @@ package android import ( "io" "strings" "text/template" ) func init() { Loading Loading @@ -71,23 +69,8 @@ func (fg *fileGroup) Srcs() Paths { return append(Paths{}, fg.srcs...) } var androidMkTemplate = template.Must(template.New("filegroup").Parse(` ifdef {{.makeVar}} $(error variable {{.makeVar}} set by soong module is already set in make) endif {{.makeVar}} := {{.value}} .KATI_READONLY := {{.makeVar}} `)) func (fg *fileGroup) AndroidMk() AndroidMkData { return AndroidMkData{ Custom: func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) { func (fg *fileGroup) MakeVars(ctx MakeVarsModuleContext) { if makeVar := String(fg.properties.Export_to_make_var); makeVar != "" { androidMkTemplate.Execute(w, map[string]string{ "makeVar": makeVar, "value": strings.Join(fg.srcs.Strings(), " "), }) } }, ctx.StrictRaw(makeVar, strings.Join(fg.srcs.Strings(), " ")) } }
android/makevars.go +90 −31 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android import ( "bytes" "fmt" "sort" "strconv" "strings" Loading @@ -34,43 +35,16 @@ func androidMakeVarsProvider(ctx MakeVarsContext) { } /////////////////////////////////////////////////////////////////////////////// // Interface for other packages to use to declare make variables type MakeVarsContext interface { // BaseMakeVarsContext contains the common functions for other packages to use // to declare make variables type BaseMakeVarsContext interface { Config() Config DeviceConfig() DeviceConfig AddNinjaFileDeps(deps ...string) ModuleName(module blueprint.Module) string ModuleDir(module blueprint.Module) string ModuleSubDir(module blueprint.Module) string ModuleType(module blueprint.Module) string BlueprintFile(module blueprint.Module) string ModuleErrorf(module blueprint.Module, format string, args ...interface{}) Errorf(format string, args ...interface{}) Failed() bool VisitAllModules(visit func(Module)) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) // Verify the make variable matches the Soong version, fail the build // if it does not. If the make variable is empty, just set it. Strict(name, ninjaStr string) // Check to see if the make variable matches the Soong version, warn if // it does not. If the make variable is empty, just set it. Check(name, ninjaStr string) // These are equivalent to the above, but sort the make and soong // variables before comparing them. They also show the unique entries // in each list when displaying the difference, instead of the entire // string. StrictSorted(name, ninjaStr string) CheckSorted(name, ninjaStr string) // Evaluates a ninja string and returns the result. Used if more // complicated modification needs to happen before giving it to Make. Eval(ninjaStr string) (string, error) // These are equivalent to Strict and Check, but do not attempt to // evaluate the values before writing them to the Makefile. They can // be used when all ninja variables have already been evaluated through Loading Loading @@ -108,6 +82,48 @@ type MakeVarsContext interface { DistForGoalsWithFilename(goals []string, path Path, filename string) } // MakeVarsContext contains the set of functions available for MakeVarsProvider // and SingletonMakeVarsProvider implementations. type MakeVarsContext interface { BaseMakeVarsContext ModuleName(module blueprint.Module) string ModuleDir(module blueprint.Module) string ModuleSubDir(module blueprint.Module) string ModuleType(module blueprint.Module) string BlueprintFile(module blueprint.Module) string ModuleErrorf(module blueprint.Module, format string, args ...interface{}) Errorf(format string, args ...interface{}) VisitAllModules(visit func(Module)) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) // Verify the make variable matches the Soong version, fail the build // if it does not. If the make variable is empty, just set it. Strict(name, ninjaStr string) // Check to see if the make variable matches the Soong version, warn if // it does not. If the make variable is empty, just set it. Check(name, ninjaStr string) // These are equivalent to the above, but sort the make and soong // variables before comparing them. They also show the unique entries // in each list when displaying the difference, instead of the entire // string. StrictSorted(name, ninjaStr string) CheckSorted(name, ninjaStr string) // Evaluates a ninja string and returns the result. Used if more // complicated modification needs to happen before giving it to Make. Eval(ninjaStr string) (string, error) } // MakeVarsModuleContext contains the set of functions available for modules // implementing the ModuleMakeVarsProvider interface. type MakeVarsModuleContext interface { BaseMakeVarsContext } var _ PathContext = MakeVarsContext(nil) type MakeVarsProvider func(ctx MakeVarsContext) Loading Loading @@ -135,6 +151,14 @@ func SingletonmakeVarsProviderAdapter(singleton SingletonMakeVarsProvider) MakeV return func(ctx MakeVarsContext) { singleton.MakeVars(ctx) } } // ModuleMakeVarsProvider is a Module with an extra method to provide extra values to be exported to Make. type ModuleMakeVarsProvider interface { Module // MakeVars uses a MakeVarsModuleContext to provide extra values to be exported to Make. MakeVars(ctx MakeVarsModuleContext) } /////////////////////////////////////////////////////////////////////////////// func makeVarsSingletonFunc() Singleton { Loading Loading @@ -209,10 +233,45 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { dists = append(dists, mctx.dists...) } ctx.VisitAllModules(func(m Module) { if provider, ok := m.(ModuleMakeVarsProvider); ok { mctx := &makeVarsContext{ SingletonContext: ctx, } provider.MakeVars(mctx) vars = append(vars, mctx.vars...) phonies = append(phonies, mctx.phonies...) dists = append(dists, mctx.dists...) } }) if ctx.Failed() { return } sort.Slice(vars, func(i, j int) bool { return vars[i].name < vars[j].name }) sort.Slice(phonies, func(i, j int) bool { return phonies[i].name < phonies[j].name }) lessArr := func(a, b []string) bool { if len(a) == len(b) { for i := range a { if a[i] < b[i] { return true } } return false } return len(a) < len(b) } sort.Slice(dists, func(i, j int) bool { return lessArr(dists[i].goals, dists[j].goals) || lessArr(dists[i].paths, dists[j].paths) }) outBytes := s.writeVars(vars) if err := pathtools.WriteFileIfChanged(outFile, outBytes, 0666); err != nil { Loading