diff options
Diffstat (limited to 'android/override_module.go')
-rw-r--r-- | android/override_module.go | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/android/override_module.go b/android/override_module.go new file mode 100644 index 000000000..9fe5f2182 --- /dev/null +++ b/android/override_module.go @@ -0,0 +1,97 @@ +package android + +import ( + "github.com/google/blueprint/proptools" + "sync" +) + +func init() { + RegisterModuleType("override_module", OverrideModuleFactory) +} + +type OverrideModule struct { + ModuleBase + properties OverrideModuleProperties +} + +type OverrideModuleProperties struct { + // base module to override + Base *string + + // file path or module name (in the form ":module") of a certificate to override with + Certificate *string + + // manifest package name to override with + Manifest_package_name *string +} + +// TODO(jungjw): Work with the mainline team to see if we can deprecate all PRODUCT_*_OVERRIDES vars +// and hand over overriding values directly to base module code. +func processOverrides(ctx LoadHookContext, p *OverrideModuleProperties) { + base := proptools.String(p.Base) + if base == "" { + ctx.PropertyErrorf("base", "base module name must be provided") + } + + config := ctx.DeviceConfig() + if other, loaded := config.moduleNameOverrides().LoadOrStore(base, ctx.ModuleName()); loaded { + ctx.ModuleErrorf("multiple overriding modules for %q, the other: %q", base, other.(string)) + } + + if p.Certificate != nil { + config.certificateOverrides().Store(base, *p.Certificate) + } + + if p.Manifest_package_name != nil { + config.manifestPackageNameOverrides().Store(base, *p.Manifest_package_name) + } +} + +func (i *OverrideModule) DepsMutator(ctx BottomUpMutatorContext) { + base := *i.properties.Base + // Right now, we add a dependency only to check the base module exists, and so are not using a tag here. + // TODO(jungjw): Add a tag and check the base module type once we finalize supported base module types. + ctx.AddDependency(ctx.Module(), nil, base) +} + +func (i *OverrideModule) GenerateAndroidBuildActions(ctx ModuleContext) { + // All the overrides happen in the base module. + // TODO(jungjw): Check the base module type. +} + +// override_module overrides an existing module with the specified properties. +// +// Currently, only android_app is officially supported. +func OverrideModuleFactory() Module { + m := &OverrideModule{} + AddLoadHook(m, func(ctx LoadHookContext) { + processOverrides(ctx, &m.properties) + }) + m.AddProperties(&m.properties) + InitAndroidModule(m) + return m +} + +var moduleNameOverridesKey = NewOnceKey("moduleNameOverrides") + +func (c *deviceConfig) moduleNameOverrides() *sync.Map { + return c.Once(moduleNameOverridesKey, func() interface{} { + return &sync.Map{} + }).(*sync.Map) +} + +var certificateOverridesKey = NewOnceKey("certificateOverrides") + +func (c *deviceConfig) certificateOverrides() *sync.Map { + return c.Once(certificateOverridesKey, func() interface{} { + return &sync.Map{} + }).(*sync.Map) +} + +var manifestPackageNameOverridesKey = NewOnceKey("manifestPackageNameOverrides") + +func (c *deviceConfig) manifestPackageNameOverrides() *sync.Map { + return c.Once(manifestPackageNameOverridesKey, func() interface{} { + return &sync.Map{} + }).(*sync.Map) +} |