diff options
author | 2024-10-07 17:07:44 +0000 | |
---|---|---|
committer | 2024-10-07 17:07:44 +0000 | |
commit | dd9ccb4234dfc88a004e36b2c0500769a5f50ad3 (patch) | |
tree | 8873af61c144d2f15b325cb526df9d0aba5f0c07 | |
parent | 467d7c5c3ef919760db78ad2cec014582a095b6b (diff) |
Add ModuleProxy that should be used when visiting deps.
Bug: 358427516
Test: local manual tests to compare the generated mk and ninja files.
Change-Id: I2bbe2e679e404a46947f3895943dad749be38446
-rw-r--r-- | android/Android.bp | 1 | ||||
-rw-r--r-- | android/base_module_context.go | 60 | ||||
-rw-r--r-- | android/module.go | 37 | ||||
-rw-r--r-- | android/module_proxy.go | 203 | ||||
-rw-r--r-- | android/provider.go | 2 |
5 files changed, 300 insertions, 3 deletions
diff --git a/android/Android.bp b/android/Android.bp index c2bef0bfe..eb8c64d85 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -71,6 +71,7 @@ bootstrap_go_package { "module.go", "module_context.go", "module_info_json.go", + "module_proxy.go", "mutator.go", "namespace.go", "neverallow.go", diff --git a/android/base_module_context.go b/android/base_module_context.go index c7d7573f1..670537fb5 100644 --- a/android/base_module_context.go +++ b/android/base_module_context.go @@ -33,6 +33,8 @@ type BaseModuleContext interface { blueprintBaseModuleContext() blueprint.BaseModuleContext + EqualModules(m1, m2 Module) bool + // OtherModuleName returns the name of another Module. See BaseModuleContext.ModuleName for more information. // It is intended for use inside the visit functions of Visit* and WalkDeps. OtherModuleName(m blueprint.Module) string @@ -130,6 +132,14 @@ type BaseModuleContext interface { // function, it may be invalidated by future mutators. VisitDirectDepsAllowDisabled(visit func(Module)) + // VisitDirectDepsProxyAllowDisabled calls visit for each direct dependency. If there are + // multiple direct dependencies on the same module visit will be called multiple times on + // that module and OtherModuleDependencyTag will return a different tag for each. + // + // The Module passed to the visit function should not be retained outside of the visit function, it may be + // invalidated by future mutators. + VisitDirectDepsProxyAllowDisabled(visit func(proxy Module)) + VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) // VisitDirectDepsIf calls pred for each direct dependency, and if pred returns true calls visit. If there are @@ -155,6 +165,16 @@ type BaseModuleContext interface { // invalidated by future mutators. WalkDeps(visit func(child, parent Module) bool) + // WalkDeps calls visit for each transitive dependency, traversing the dependency tree in top down order. visit may + // be called multiple times for the same (child, parent) pair if there are multiple direct dependencies between the + // child and parent with different tags. OtherModuleDependencyTag will return the tag for the currently visited + // (child, parent) pair. If visit returns false WalkDeps will not continue recursing down to child. It skips + // any dependencies that are not an android.Module. + // + // The Modules passed to the visit function should not be retained outside of the visit function, they may be + // invalidated by future mutators. + WalkDepsProxy(visit func(child, parent Module) bool) + // GetWalkPath is supposed to be called in visit function passed in WalkDeps() // and returns a top-down dependency path from a start module to current child module. GetWalkPath() []Module @@ -214,15 +234,26 @@ type baseModuleContext struct { } +func getWrappedModule(module blueprint.Module) blueprint.Module { + if mp, isProxy := module.(ModuleProxy); isProxy { + return mp.module + } + return module +} + +func (b *baseModuleContext) EqualModules(m1, m2 Module) bool { + return b.bp.EqualModules(getWrappedModule(m1), getWrappedModule(m2)) +} + func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string { - return b.bp.OtherModuleName(m) + return b.bp.OtherModuleName(getWrappedModule(m)) } func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) } func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) { b.bp.OtherModuleErrorf(m, fmt, args...) } func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag { - return b.bp.OtherModuleDependencyTag(m) + return b.bp.OtherModuleDependencyTag(getWrappedModule(m)) } func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) } func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool { @@ -395,6 +426,14 @@ func (b *baseModuleContext) VisitDirectDepsAllowDisabled(visit func(Module)) { }) } +func (b *baseModuleContext) VisitDirectDepsProxyAllowDisabled(visit func(proxy Module)) { + b.bp.VisitDirectDepsProxy(func(module blueprint.ModuleProxy) { + visit(ModuleProxy{ + module: module, + }) + }) +} + func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) { b.bp.VisitDirectDeps(func(module blueprint.Module) { if b.bp.OtherModuleDependencyTag(module) == tag { @@ -466,6 +505,23 @@ func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) { }) } +func (b *baseModuleContext) WalkDepsProxy(visit func(Module, Module) bool) { + b.walkPath = []Module{ModuleProxy{blueprint.CreateModuleProxy(b.Module())}} + b.tagPath = []blueprint.DependencyTag{} + b.bp.WalkDepsProxy(func(child, parent blueprint.ModuleProxy) bool { + childAndroidModule := ModuleProxy{child} + parentAndroidModule := ModuleProxy{parent} + // record walkPath before visit + for b.walkPath[len(b.walkPath)-1] != parentAndroidModule { + b.walkPath = b.walkPath[0 : len(b.walkPath)-1] + b.tagPath = b.tagPath[0 : len(b.tagPath)-1] + } + b.walkPath = append(b.walkPath, childAndroidModule) + b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule)) + return visit(childAndroidModule, parentAndroidModule) + }) +} + func (b *baseModuleContext) GetWalkPath() []Module { return b.walkPath } diff --git a/android/module.go b/android/module.go index 82b37818e..e3682fa30 100644 --- a/android/module.go +++ b/android/module.go @@ -1803,6 +1803,26 @@ type FinalModuleBuildTargetsInfo struct { var FinalModuleBuildTargetsProvider = blueprint.NewProvider[FinalModuleBuildTargetsInfo]() +type CommonPropertiesProviderData struct { + Enabled bool + // Whether the module has been replaced by a prebuilt + ReplacedByPrebuilt bool +} + +var CommonPropertiesProviderKey = blueprint.NewProvider[CommonPropertiesProviderData]() + +type PrebuiltModuleProviderData struct { + // Empty for now +} + +var PrebuiltModuleProviderKey = blueprint.NewProvider[PrebuiltModuleProviderData]() + +type HostToolProviderData struct { + HostToolPath OptionalPath +} + +var HostToolProviderKey = blueprint.NewProvider[HostToolProviderData]() + func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) { ctx := &moduleContext{ module: m.module, @@ -2048,6 +2068,23 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) }) } buildComplianceMetadataProvider(ctx, m) + + commonData := CommonPropertiesProviderData{ + ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt, + } + if m.commonProperties.ForcedDisabled { + commonData.Enabled = false + } else { + commonData.Enabled = m.commonProperties.Enabled.GetOrDefault(m.ConfigurableEvaluator(ctx), !m.Os().DefaultDisabled) + } + SetProvider(ctx, CommonPropertiesProviderKey, commonData) + if p, ok := m.module.(PrebuiltInterface); ok && p.Prebuilt() != nil { + SetProvider(ctx, PrebuiltModuleProviderKey, PrebuiltModuleProviderData{}) + } + if h, ok := m.module.(HostToolProvider); ok { + SetProvider(ctx, HostToolProviderKey, HostToolProviderData{ + HostToolPath: h.HostToolPath()}) + } } func SetJarJarPrefixHandler(handler func(ModuleContext)) { diff --git a/android/module_proxy.go b/android/module_proxy.go new file mode 100644 index 000000000..bc5090ecb --- /dev/null +++ b/android/module_proxy.go @@ -0,0 +1,203 @@ +package android + +import ( + "github.com/google/blueprint" + "github.com/google/blueprint/proptools" +) + +type ModuleProxy struct { + module blueprint.ModuleProxy +} + +func (m ModuleProxy) Name() string { + return m.module.Name() +} + +func (m ModuleProxy) GenerateBuildActions(context blueprint.ModuleContext) { + m.module.GenerateBuildActions(context) +} + +func (m ModuleProxy) GenerateAndroidBuildActions(context ModuleContext) { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) ComponentDepsMutator(ctx BottomUpMutatorContext) { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) DepsMutator(context BottomUpMutatorContext) { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) base() *ModuleBase { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) Disable() { + + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) Enabled(ctx ConfigurableEvaluatorContext) bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) Target() Target { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) MultiTargets() []Target { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) ImageVariation() blueprint.Variation { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) Owner() string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInData() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInTestcases() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInSanitizerDir() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInRamdisk() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInVendorRamdisk() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInDebugRamdisk() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInRecovery() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInRoot() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInOdm() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInProduct() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInVendor() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallInSystemExt() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) InstallForceOS() (*OsType, *ArchType) { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) PartitionTag(d DeviceConfig) string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) HideFromMake() { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) IsHideFromMake() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) IsSkipInstall() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) MakeUninstallable() { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) ReplacedByPrebuilt() { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) IsReplacedByPrebuilt() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) ExportedToMake() bool { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) EffectiveLicenseKinds() []string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) EffectiveLicenseFiles() Paths { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) AddProperties(props ...interface{}) { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) GetProperties() []interface{} { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) BuildParamsForTests() []BuildParams { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) VariablesForTests() map[string]string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) String() string { + return m.module.Name() +} + +func (m ModuleProxy) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) visibilityProperties() []visibilityProperty { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) HostRequiredModuleNames() []string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) TargetRequiredModuleNames() []string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) VintfFragmentModuleNames(ctx ConfigurableEvaluatorContext) []string { + panic("method is not implemented on ModuleProxy") +} + +func (m ModuleProxy) ConfigurableEvaluator(ctx ConfigurableEvaluatorContext) proptools.ConfigurableEvaluator { + panic("method is not implemented on ModuleProxy") +} diff --git a/android/provider.go b/android/provider.go index 5ded4cc14..81d17a175 100644 --- a/android/provider.go +++ b/android/provider.go @@ -24,7 +24,7 @@ var _ OtherModuleProviderContext = (*TestContext)(nil) // OtherModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or // TopDownMutatorContext. func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) { - value, ok := ctx.otherModuleProvider(module, provider) + value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider) if !ok { var k K return k, false |