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) }