Add a few module visiting methods that return ModuleProxy. am: df5d17e27c Original change: https://android-review.googlesource.com/c/platform/external/wayland-protocols/+/3303715 Change-Id: I306766ad2db5d51b3e7293b1bb5d8c72d819f0be Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/wayland_protocol_codegen.go b/wayland_protocol_codegen.go index 2b95f98..37cef7f 100644 --- a/wayland_protocol_codegen.go +++ b/wayland_protocol_codegen.go
@@ -125,6 +125,12 @@ return target.IsReplacedByPrebuilt() } +func (t hostToolDependencyTag) AllowDisabledModuleDependencyProxy( + ctx android.OtherModuleProviderContext, target android.ModuleProxy) bool { + return android.OtherModuleProviderOrDefault( + ctx, target, android.CommonPropertiesProviderKey).ReplacedByPrebuilt +} + var _ android.AllowDisabledModuleDependency = (*hostToolDependencyTag)(nil) type generatorProperties struct { @@ -293,17 +299,18 @@ if len(g.properties.Tools) > 0 { seenTools := make(map[string]bool) - ctx.VisitDirectDepsAllowDisabled(func(module android.Module) { - switch tag := ctx.OtherModuleDependencyTag(module).(type) { + ctx.VisitDirectDepsProxyAllowDisabled(func(proxy android.ModuleProxy) { + switch tag := ctx.OtherModuleDependencyTag(proxy).(type) { case hostToolDependencyTag: + // Necessary to retrieve any prebuilt replacement for the tool, since + // toolDepsMutator runs too late for the prebuilt mutators to have + // replaced the dependency. + module := android.PrebuiltGetPreferred(ctx, proxy) tool := ctx.OtherModuleName(module) - module = android.PrebuiltGetPreferred(ctx, module) - - switch t := module.(type) { - case android.HostToolProvider: + if h, ok := android.OtherModuleProvider(ctx, module, android.HostToolProviderKey); ok { // A HostToolProvider provides the path to a tool, which will be copied // into the sandbox. - if !t.(android.Module).Enabled(ctx) { + if !android.OtherModuleProviderOrDefault(ctx, module, android.CommonPropertiesProviderKey).Enabled { if ctx.Config().AllowMissingDependencies() { ctx.AddMissingDependencies([]string{tool}) } else { @@ -311,25 +318,35 @@ } return } - path := t.HostToolPath() + path := h.HostToolPath if !path.Valid() { ctx.ModuleErrorf("host tool %q missing output file", tool) return } if specs := android.OtherModuleProviderOrDefault( - ctx, t, android.InstallFilesProvider).TransitivePackagingSpecs.ToList(); specs != nil { + ctx, module, android.InstallFilesProvider).TransitivePackagingSpecs.ToList(); specs != nil { // If the HostToolProvider has PackgingSpecs, which are definitions of the // required relative locations of the tool and its dependencies, use those // instead. They will be copied to those relative locations in the sbox // sandbox. - packagedTools = append(packagedTools, specs...) + // Care must be taken since TransitivePackagingSpec may return device-side + // paths via the required property. Filter them out. + for i, ps := range specs { + if ps.Partition() != "" { + if i == 0 { + panic("first PackagingSpec is assumed to be the host-side tool") + } + continue + } + packagedTools = append(packagedTools, ps) + } // Assume that the first PackagingSpec of the module is the tool. addLocationLabel(tag.label, packagedToolLocation{specs[0]}) } else { tools = append(tools, path.Path()) addLocationLabel(tag.label, toolLocation{android.Paths{path.Path()}}) } - default: + } else { ctx.ModuleErrorf("%q is not a host tool provider", tool) return }