diff options
Diffstat (limited to 'sdk/sdk.go')
-rw-r--r-- | sdk/sdk.go | 80 |
1 files changed, 78 insertions, 2 deletions
diff --git a/sdk/sdk.go b/sdk/sdk.go index 6dea752b3..949a4b4f8 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -53,6 +53,13 @@ type sdk struct { // list properties, e.g. java_libs. dynamicMemberTypeListProperties interface{} + // The dynamically generated information about the registered SdkMemberTrait + dynamicSdkMemberTraits *dynamicSdkMemberTraits + + // The dynamically created instance of the properties struct containing the sdk member trait + // list properties. + dynamicMemberTraitListProperties interface{} + // Information about the OsType specific member variants depended upon by this variant. // // Set by OsType specific variants in the collectMembers() method and used by the @@ -114,7 +121,20 @@ func newSdkModule(moduleExports bool) *sdk { // Create an instance of the dynamically created struct that contains all the // properties for the member type specific list properties. s.dynamicMemberTypeListProperties = s.dynamicSdkMemberTypes.createMemberTypeListProperties() - s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties) + + traitRegistry := android.RegisteredSdkMemberTraits + s.dynamicSdkMemberTraits = getDynamicSdkMemberTraits(traitRegistry) + // Create an instance of the dynamically created struct that contains all the properties for the + // member trait specific list properties. + s.dynamicMemberTraitListProperties = s.dynamicSdkMemberTraits.createMemberTraitListProperties() + + // Create a wrapper around the dynamic trait specific properties so that they have to be + // specified within a traits:{} section in the .bp file. + traitsWrapper := struct { + Traits interface{} + }{s.dynamicMemberTraitListProperties} + + s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties, &traitsWrapper) // Make sure that the prebuilt visibility property is verified for errors. android.AddVisibilityProperty(s, "prebuilt_visibility", &s.properties.Prebuilt_visibility) @@ -145,6 +165,11 @@ func (s *sdk) memberTypeListProperty(memberType android.SdkMemberType) *sdkMembe return s.dynamicSdkMemberTypes.memberTypeToProperty[memberType] } +// memberTraitListProperties returns the list of *sdkMemberTraitListProperty instances for this sdk. +func (s *sdk) memberTraitListProperties() []*sdkMemberTraitListProperty { + return s.dynamicSdkMemberTraits.memberTraitListProperties +} + func (s *sdk) snapshot() bool { return s.properties.Snapshot } @@ -198,15 +223,53 @@ func (s *sdk) AndroidMkEntries() []android.AndroidMkEntries { }} } +// gatherTraits gathers the traits from the dynamically generated trait specific properties. +// +// Returns a map from member name to the set of required traits. +func (s *sdk) gatherTraits() map[string]android.SdkMemberTraitSet { + traitListByMember := map[string][]android.SdkMemberTrait{} + for _, memberListProperty := range s.memberTraitListProperties() { + names := memberListProperty.getter(s.dynamicMemberTraitListProperties) + for _, name := range names { + traitListByMember[name] = append(traitListByMember[name], memberListProperty.memberTrait) + } + } + + traitSetByMember := map[string]android.SdkMemberTraitSet{} + for name, list := range traitListByMember { + traitSetByMember[name] = android.NewSdkMemberTraitSet(list) + } + + return traitSetByMember +} + // newDependencyContext creates a new SdkDependencyContext for this sdk. func (s *sdk) newDependencyContext(mctx android.BottomUpMutatorContext) android.SdkDependencyContext { + traits := s.gatherTraits() + return &dependencyContext{ BottomUpMutatorContext: mctx, + requiredTraits: traits, } } type dependencyContext struct { android.BottomUpMutatorContext + + // Map from member name to the set of traits that the sdk requires the member provides. + requiredTraits map[string]android.SdkMemberTraitSet +} + +func (d *dependencyContext) RequiredTraits(name string) android.SdkMemberTraitSet { + if s, ok := d.requiredTraits[name]; ok { + return s + } else { + return android.EmptySdkMemberTraitSet() + } +} + +func (d *dependencyContext) RequiresTrait(name string, trait android.SdkMemberTrait) bool { + return d.RequiredTraits(name).Contains(trait) } var _ android.SdkDependencyContext = (*dependencyContext)(nil) @@ -287,8 +350,21 @@ func memberMutator(mctx android.BottomUpMutatorContext) { } names := memberListProperty.getter(s.dynamicMemberTypeListProperties) if len(names) > 0 { + memberType := memberListProperty.memberType + + // Verify that the member type supports the specified traits. + supportedTraits := memberType.SupportedTraits() + for _, name := range names { + requiredTraits := ctx.RequiredTraits(name) + unsupportedTraits := requiredTraits.Subtract(supportedTraits) + if !unsupportedTraits.Empty() { + ctx.ModuleErrorf("sdk member %q has traits %s that are unsupported by its member type %q", name, unsupportedTraits, memberType.SdkPropertyName()) + } + } + + // Add dependencies using the appropriate tag. tag := memberListProperty.dependencyTag - memberListProperty.memberType.AddDependencies(ctx, tag, names) + memberType.AddDependencies(ctx, tag, names) } } } |