Allow deferred module build action generation.

Provide a means to generate build actions for modules from within the
later singleton context. Allows modules to depend on the metadata for
arbitrary modules without causing dependency cycles.

Care needs to be taken to establish all metadata during the normal
module GenerateBuildAction to avoid synchronization issues and only
use read-only access to modules from the singleton context.

Bug: 213388645
Bug: 240342946

Test: m droid dist

Change-Id: I82ed218926b1d8fbe2edde6d55c4bf40ea0d8618
Merged-in: I82ed218926b1d8fbe2edde6d55c4bf40ea0d8618
This commit is contained in:
Bob Badour 2022-05-16 12:28:06 -07:00
parent 67cd98578a
commit bb076fdcc3

View file

@ -157,6 +157,10 @@ type SingletonContext interface {
// Fs returns a pathtools.Filesystem that can be used to interact with files. Using the Filesystem interface allows
// the singleton to be used in build system tests that run against a mock filesystem.
Fs() pathtools.FileSystem
// ModuleVariantsFromName returns the list of module variants named `name` in the same namespace as `referer`.
// Allows generating build actions for `referer` based on the metadata for `name` deferred until the singleton context.
ModuleVariantsFromName(referer Module, name string) []Module
}
var _ SingletonContext = (*singletonContext)(nil)
@ -369,3 +373,26 @@ func (s *singletonContext) GlobWithDeps(pattern string,
func (s *singletonContext) Fs() pathtools.FileSystem {
return s.context.fs
}
func (s *singletonContext) ModuleVariantsFromName(referer Module, name string) []Module {
c := s.context
refererInfo := c.moduleInfo[referer]
if refererInfo == nil {
s.ModuleErrorf(referer, "could not find module %q", referer.Name())
return nil
}
moduleGroup, exists := c.nameInterface.ModuleFromName(name, refererInfo.namespace())
if !exists {
return nil
}
result := make([]Module, 0, len(moduleGroup.modules))
for _, module := range moduleGroup.modules {
moduleInfo := module.module()
if moduleInfo != nil {
result = append(result, moduleInfo.logicModule)
}
}
return result
}