diff options
author | 2024-11-05 18:22:20 +0000 | |
---|---|---|
committer | 2024-11-06 01:06:24 +0000 | |
commit | ec7043df13f376cc52c3c35f42d9955f4f11c3d6 (patch) | |
tree | 28acd1cae0d7ec53f2f3f483b312e264807d0de5 | |
parent | 42f9ff8606680079489e8812095a5acc86cdd2fd (diff) |
Collect kythe, obj and tidy files using ModuleProxy.
Bug: 358427516
Test: Manually compare the generated mk and ninja files.
Change-Id: Ibee605372b1fae48ee9fbd8872b4ea0f6b1d5a7d
-rw-r--r-- | android/init.go | 1 | ||||
-rw-r--r-- | android/module.go | 3 | ||||
-rw-r--r-- | android/singleton.go | 23 | ||||
-rw-r--r-- | cc/cc.go | 49 | ||||
-rw-r--r-- | cc/tidy.go | 14 |
5 files changed, 60 insertions, 30 deletions
diff --git a/android/init.go b/android/init.go index 1ace34494..d3a13d0ed 100644 --- a/android/init.go +++ b/android/init.go @@ -20,6 +20,7 @@ func init() { gob.Register(extraFilesZip{}) gob.Register(InstallPath{}) gob.Register(ModuleGenPath{}) + gob.Register(ModuleObjPath{}) gob.Register(ModuleOutPath{}) gob.Register(OutputPath{}) gob.Register(PhonyPath{}) diff --git a/android/module.go b/android/module.go index a918d6ea3..72c8b94c2 100644 --- a/android/module.go +++ b/android/module.go @@ -1822,6 +1822,8 @@ type CommonPropertiesProviderData struct { Enabled bool // Whether the module has been replaced by a prebuilt ReplacedByPrebuilt bool + // The Target of artifacts that this module variant is responsible for creating. + CompileTarget Target } var CommonPropertiesProviderKey = blueprint.NewProvider[CommonPropertiesProviderData]() @@ -2086,6 +2088,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) commonData := CommonPropertiesProviderData{ ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt, + CompileTarget: m.commonProperties.CompileTarget, } if m.commonProperties.ForcedDisabled { commonData.Enabled = false diff --git a/android/singleton.go b/android/singleton.go index 913bf6a56..64381828a 100644 --- a/android/singleton.go +++ b/android/singleton.go @@ -64,6 +64,7 @@ type SingletonContext interface { VisitAllModulesBlueprint(visit func(blueprint.Module)) VisitAllModules(visit func(Module)) + VisitAllModuleProxies(visit func(proxy ModuleProxy)) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) VisitDirectDeps(module Module, visit func(Module)) @@ -77,6 +78,8 @@ type SingletonContext interface { VisitAllModuleVariants(module Module, visit func(Module)) + VisitAllModuleVariantProxies(module Module, visit func(proxy ModuleProxy)) + PrimaryModule(module Module) Module FinalModule(module Module) Module @@ -193,7 +196,7 @@ func (s *singletonContextAdaptor) Eval(pctx PackageContext, ninjaStr string) (st } // visitAdaptor wraps a visit function that takes an android.Module parameter into -// a function that takes an blueprint.Module parameter and only calls the visit function if the +// a function that takes a blueprint.Module parameter and only calls the visit function if the // blueprint.Module is an android.Module. func visitAdaptor(visit func(Module)) func(blueprint.Module) { return func(module blueprint.Module) { @@ -203,6 +206,16 @@ func visitAdaptor(visit func(Module)) func(blueprint.Module) { } } +// visitProxyAdaptor wraps a visit function that takes an android.ModuleProxy parameter into +// a function that takes a blueprint.ModuleProxy parameter. +func visitProxyAdaptor(visit func(proxy ModuleProxy)) func(proxy blueprint.ModuleProxy) { + return func(module blueprint.ModuleProxy) { + visit(ModuleProxy{ + module: module, + }) + } +} + // predAdaptor wraps a pred function that takes an android.Module parameter // into a function that takes an blueprint.Module parameter and only calls the visit function if the // blueprint.Module is an android.Module, otherwise returns false. @@ -224,6 +237,10 @@ func (s *singletonContextAdaptor) VisitAllModules(visit func(Module)) { s.SingletonContext.VisitAllModules(visitAdaptor(visit)) } +func (s *singletonContextAdaptor) VisitAllModuleProxies(visit func(proxy ModuleProxy)) { + s.SingletonContext.VisitAllModuleProxies(visitProxyAdaptor(visit)) +} + func (s *singletonContextAdaptor) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) { s.SingletonContext.VisitAllModulesIf(predAdaptor(pred), visitAdaptor(visit)) } @@ -248,6 +265,10 @@ func (s *singletonContextAdaptor) VisitAllModuleVariants(module Module, visit fu s.SingletonContext.VisitAllModuleVariants(module, visitAdaptor(visit)) } +func (s *singletonContextAdaptor) VisitAllModuleVariantProxies(module Module, visit func(proxy ModuleProxy)) { + s.SingletonContext.VisitAllModuleVariantProxies(module, visitProxyAdaptor(visit)) +} + func (s *singletonContextAdaptor) PrimaryModule(module Module) Module { return s.SingletonContext.PrimaryModule(module).(Module) } @@ -43,6 +43,14 @@ type CcMakeVarsInfo struct { var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]() +type CcObjectInfo struct { + objFiles android.Paths + tidyFiles android.Paths + kytheFiles android.Paths +} + +var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]() + func init() { RegisterCCBuildComponents(android.InitRegistrationContext) @@ -648,10 +656,6 @@ type installer interface { installInRoot() bool } -type xref interface { - XrefCcFiles() android.Paths -} - type overridable interface { overriddenModules() []string } @@ -900,12 +904,6 @@ type Module struct { staticAnalogue *StaticLibraryInfo makeLinkType string - // Kythe (source file indexer) paths for this compilation module - kytheFiles android.Paths - // Object .o file output paths for this compilation module - objFiles android.Paths - // Tidy .tidy file output paths for this compilation module - tidyFiles android.Paths // For apex variants, this is set as apex.min_sdk_version apexSdkVersion android.ApiLevel @@ -1473,10 +1471,6 @@ func InstallToBootstrap(name string, config android.Config) bool { return isBionic(name) } -func (c *Module) XrefCcFiles() android.Paths { - return c.kytheFiles -} - func (c *Module) isCfiAssemblySupportEnabled() bool { return c.sanitize != nil && Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support) @@ -2048,9 +2042,6 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { if ctx.Failed() { return } - c.kytheFiles = objs.kytheFiles - c.objFiles = objs.objFiles - c.tidyFiles = objs.tidyFiles } if c.linker != nil { @@ -2115,6 +2106,17 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy") } + ccObjectInfo := CcObjectInfo{ + kytheFiles: objs.kytheFiles, + } + if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) { + ccObjectInfo.objFiles = objs.objFiles + ccObjectInfo.tidyFiles = objs.tidyFiles + } + if len(ccObjectInfo.kytheFiles)+len(ccObjectInfo.objFiles)+len(ccObjectInfo.tidyFiles) > 0 { + android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo) + } + c.setOutputFiles(ctx) if c.makeVarsInfo != nil { @@ -2122,6 +2124,12 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { } } +func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) { + if len(files) > 0 { + ctx.SetOutputFiles(files, tag) + } +} + func (c *Module) setOutputFiles(ctx ModuleContext) { if c.outputFile.Valid() { ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "") @@ -3958,9 +3966,10 @@ type kytheExtractAllSingleton struct { func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) { var xrefTargets android.Paths - ctx.VisitAllModules(func(module android.Module) { - if ccModule, ok := module.(xref); ok { - xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...) + ctx.VisitAllModuleProxies(func(module android.ModuleProxy) { + files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).kytheFiles + if len(files) > 0 { + xrefTargets = append(xrefTargets, files...) } }) // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets diff --git a/cc/tidy.go b/cc/tidy.go index ec1e8a206..89bae1780 100644 --- a/cc/tidy.go +++ b/cc/tidy.go @@ -219,15 +219,11 @@ func collectTidyObjModuleTargets(ctx android.SingletonContext, module android.Mo subsetTidyFileGroups := make(map[string]android.Paths) // subset group name => tidy file Paths // (1) Collect all obj/tidy files into OS-specific groups. - ctx.VisitAllModuleVariants(module, func(variant android.Module) { - if ctx.Config().KatiEnabled() && android.ShouldSkipAndroidMkProcessing(ctx, variant) { - return - } - if m, ok := variant.(*Module); ok { - osName := variant.Target().Os.Name - addToOSGroup(osName, m.objFiles, allObjFileGroups, subsetObjFileGroups) - addToOSGroup(osName, m.tidyFiles, allTidyFileGroups, subsetTidyFileGroups) - } + ctx.VisitAllModuleVariantProxies(module, func(variant android.ModuleProxy) { + osName := android.OtherModuleProviderOrDefault(ctx, variant, android.CommonPropertiesProviderKey).CompileTarget.Os.Name + info := android.OtherModuleProviderOrDefault(ctx, variant, CcObjectInfoProvider) + addToOSGroup(osName, info.objFiles, allObjFileGroups, subsetObjFileGroups) + addToOSGroup(osName, info.tidyFiles, allTidyFileGroups, subsetTidyFileGroups) }) // (2) Add an all-OS group, with "" or "subset" name, to include all os-specific phony targets. |