1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2019 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage sdk 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "io" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 25*333d2b36SAndroid Build Coastguard Worker // This package doesn't depend on the apex package, but import it to make its mutators to be 26*333d2b36SAndroid Build Coastguard Worker // registered before mutators in this package. See RegisterPostDepsMutators for more details. 27*333d2b36SAndroid Build Coastguard Worker _ "android/soong/apex" 28*333d2b36SAndroid Build Coastguard Worker) 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workerfunc init() { 31*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/android") 32*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/java/config") 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker registerSdkBuildComponents(android.InitRegistrationContext) 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerfunc registerSdkBuildComponents(ctx android.RegistrationContext) { 38*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("sdk", SdkModuleFactory) 39*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory) 40*333d2b36SAndroid Build Coastguard Worker} 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workertype sdk struct { 43*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 44*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker // The dynamically generated information about the registered SdkMemberType 47*333d2b36SAndroid Build Coastguard Worker dynamicSdkMemberTypes *dynamicSdkMemberTypes 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker // The dynamically created instance of the properties struct containing the sdk member type 50*333d2b36SAndroid Build Coastguard Worker // list properties, e.g. java_libs. 51*333d2b36SAndroid Build Coastguard Worker dynamicMemberTypeListProperties interface{} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Worker // The dynamically generated information about the registered SdkMemberTrait 54*333d2b36SAndroid Build Coastguard Worker dynamicSdkMemberTraits *dynamicSdkMemberTraits 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker // The dynamically created instance of the properties struct containing the sdk member trait 57*333d2b36SAndroid Build Coastguard Worker // list properties. 58*333d2b36SAndroid Build Coastguard Worker dynamicMemberTraitListProperties interface{} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Worker // Information about the OsType specific member variants depended upon by this variant. 61*333d2b36SAndroid Build Coastguard Worker // 62*333d2b36SAndroid Build Coastguard Worker // Set by OsType specific variants in the collectMembers() method and used by the 63*333d2b36SAndroid Build Coastguard Worker // CommonOS variant when building the snapshot. That work is all done on separate 64*333d2b36SAndroid Build Coastguard Worker // calls to the sdk.GenerateAndroidBuildActions method which is guaranteed to be 65*333d2b36SAndroid Build Coastguard Worker // called for the OsType specific variants before the CommonOS variant (because 66*333d2b36SAndroid Build Coastguard Worker // the latter depends on the former). 67*333d2b36SAndroid Build Coastguard Worker memberVariantDeps []sdkMemberVariantDep 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // The multilib variants that are used by this sdk variant. 70*333d2b36SAndroid Build Coastguard Worker multilibUsages multilibUsage 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker properties sdkProperties 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker snapshotFile android.OptionalPath 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker infoFile android.OptionalPath 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Worker // The builder, preserved for testing. 79*333d2b36SAndroid Build Coastguard Worker builderForTests *snapshotBuilder 80*333d2b36SAndroid Build Coastguard Worker} 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Workertype sdkProperties struct { 83*333d2b36SAndroid Build Coastguard Worker Snapshot bool `blueprint:"mutated"` 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker // True if this is a module_exports (or module_exports_snapshot) module type. 86*333d2b36SAndroid Build Coastguard Worker Module_exports bool `blueprint:"mutated"` 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker// sdk defines an SDK which is a logical group of modules (e.g. native libs, headers, java libs, etc.) 90*333d2b36SAndroid Build Coastguard Worker// which Mainline modules like APEX can choose to build with. 91*333d2b36SAndroid Build Coastguard Workerfunc SdkModuleFactory() android.Module { 92*333d2b36SAndroid Build Coastguard Worker return newSdkModule(false) 93*333d2b36SAndroid Build Coastguard Worker} 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Workerfunc newSdkModule(moduleExports bool) *sdk { 96*333d2b36SAndroid Build Coastguard Worker s := &sdk{} 97*333d2b36SAndroid Build Coastguard Worker s.properties.Module_exports = moduleExports 98*333d2b36SAndroid Build Coastguard Worker // Get the dynamic sdk member type data for the currently registered sdk member types. 99*333d2b36SAndroid Build Coastguard Worker sdkMemberTypeKey, sdkMemberTypes := android.RegisteredSdkMemberTypes(moduleExports) 100*333d2b36SAndroid Build Coastguard Worker s.dynamicSdkMemberTypes = getDynamicSdkMemberTypes(sdkMemberTypeKey, sdkMemberTypes) 101*333d2b36SAndroid Build Coastguard Worker // Create an instance of the dynamically created struct that contains all the 102*333d2b36SAndroid Build Coastguard Worker // properties for the member type specific list properties. 103*333d2b36SAndroid Build Coastguard Worker s.dynamicMemberTypeListProperties = s.dynamicSdkMemberTypes.createMemberTypeListProperties() 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker sdkMemberTraitsKey, sdkMemberTraits := android.RegisteredSdkMemberTraits() 106*333d2b36SAndroid Build Coastguard Worker s.dynamicSdkMemberTraits = getDynamicSdkMemberTraits(sdkMemberTraitsKey, sdkMemberTraits) 107*333d2b36SAndroid Build Coastguard Worker // Create an instance of the dynamically created struct that contains all the properties for the 108*333d2b36SAndroid Build Coastguard Worker // member trait specific list properties. 109*333d2b36SAndroid Build Coastguard Worker s.dynamicMemberTraitListProperties = s.dynamicSdkMemberTraits.createMemberTraitListProperties() 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker // Create a wrapper around the dynamic trait specific properties so that they have to be 112*333d2b36SAndroid Build Coastguard Worker // specified within a traits:{} section in the .bp file. 113*333d2b36SAndroid Build Coastguard Worker traitsWrapper := struct { 114*333d2b36SAndroid Build Coastguard Worker Traits interface{} 115*333d2b36SAndroid Build Coastguard Worker }{s.dynamicMemberTraitListProperties} 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties, &traitsWrapper) 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker android.InitCommonOSAndroidMultiTargetsArchModule(s, android.HostAndDeviceSupported, android.MultilibCommon) 120*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(s) 121*333d2b36SAndroid Build Coastguard Worker android.AddLoadHook(s, func(ctx android.LoadHookContext) { 122*333d2b36SAndroid Build Coastguard Worker type props struct { 123*333d2b36SAndroid Build Coastguard Worker Compile_multilib *string 124*333d2b36SAndroid Build Coastguard Worker } 125*333d2b36SAndroid Build Coastguard Worker p := &props{Compile_multilib: proptools.StringPtr("both")} 126*333d2b36SAndroid Build Coastguard Worker ctx.PrependProperties(p) 127*333d2b36SAndroid Build Coastguard Worker }) 128*333d2b36SAndroid Build Coastguard Worker return s 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker// sdk_snapshot is a snapshot of an SDK. This is an auto-generated module. 132*333d2b36SAndroid Build Coastguard Workerfunc SnapshotModuleFactory() android.Module { 133*333d2b36SAndroid Build Coastguard Worker s := newSdkModule(false) 134*333d2b36SAndroid Build Coastguard Worker s.properties.Snapshot = true 135*333d2b36SAndroid Build Coastguard Worker return s 136*333d2b36SAndroid Build Coastguard Worker} 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) memberTypeListProperties() []*sdkMemberTypeListProperty { 139*333d2b36SAndroid Build Coastguard Worker return s.dynamicSdkMemberTypes.memberTypeListProperties 140*333d2b36SAndroid Build Coastguard Worker} 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) memberTypeListProperty(memberType android.SdkMemberType) *sdkMemberTypeListProperty { 143*333d2b36SAndroid Build Coastguard Worker return s.dynamicSdkMemberTypes.memberTypeToProperty[memberType] 144*333d2b36SAndroid Build Coastguard Worker} 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker// memberTraitListProperties returns the list of *sdkMemberTraitListProperty instances for this sdk. 147*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) memberTraitListProperties() []*sdkMemberTraitListProperty { 148*333d2b36SAndroid Build Coastguard Worker return s.dynamicSdkMemberTraits.memberTraitListProperties 149*333d2b36SAndroid Build Coastguard Worker} 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) snapshot() bool { 152*333d2b36SAndroid Build Coastguard Worker return s.properties.Snapshot 153*333d2b36SAndroid Build Coastguard Worker} 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) GenerateAndroidBuildActions(ctx android.ModuleContext) { 156*333d2b36SAndroid Build Coastguard Worker if s.snapshot() { 157*333d2b36SAndroid Build Coastguard Worker // We don't need to create a snapshot out of sdk_snapshot. 158*333d2b36SAndroid Build Coastguard Worker // That doesn't make sense. We need a snapshot to create sdk_snapshot. 159*333d2b36SAndroid Build Coastguard Worker return 160*333d2b36SAndroid Build Coastguard Worker } 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker // This method is guaranteed to be called on OsType specific variants before it is called 163*333d2b36SAndroid Build Coastguard Worker // on their corresponding CommonOS variant. 164*333d2b36SAndroid Build Coastguard Worker if !s.IsCommonOSVariant() { 165*333d2b36SAndroid Build Coastguard Worker // Update the OsType specific sdk variant with information about its members. 166*333d2b36SAndroid Build Coastguard Worker s.collectMembers(ctx) 167*333d2b36SAndroid Build Coastguard Worker } else { 168*333d2b36SAndroid Build Coastguard Worker // Get the OsType specific variants on which the CommonOS depends. 169*333d2b36SAndroid Build Coastguard Worker osSpecificVariants := android.GetOsSpecificVariantsOfCommonOSVariant(ctx) 170*333d2b36SAndroid Build Coastguard Worker var sdkVariants []*sdk 171*333d2b36SAndroid Build Coastguard Worker for _, m := range osSpecificVariants { 172*333d2b36SAndroid Build Coastguard Worker if sdkVariant, ok := m.(*sdk); ok { 173*333d2b36SAndroid Build Coastguard Worker sdkVariants = append(sdkVariants, sdkVariant) 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker // Generate the snapshot from the member info. 178*333d2b36SAndroid Build Coastguard Worker s.buildSnapshot(ctx, sdkVariants) 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker if s.snapshotFile.Valid() { 182*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles([]android.Path{s.snapshotFile.Path()}, "") 183*333d2b36SAndroid Build Coastguard Worker } 184*333d2b36SAndroid Build Coastguard Worker} 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) AndroidMkEntries() []android.AndroidMkEntries { 187*333d2b36SAndroid Build Coastguard Worker if !s.snapshotFile.Valid() != !s.infoFile.Valid() { 188*333d2b36SAndroid Build Coastguard Worker panic("Snapshot (%q) and info file (%q) should both be set or neither should be set.") 189*333d2b36SAndroid Build Coastguard Worker } else if !s.snapshotFile.Valid() { 190*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{} 191*333d2b36SAndroid Build Coastguard Worker } 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{android.AndroidMkEntries{ 194*333d2b36SAndroid Build Coastguard Worker Class: "FAKE", 195*333d2b36SAndroid Build Coastguard Worker OutputFile: s.snapshotFile, 196*333d2b36SAndroid Build Coastguard Worker DistFiles: android.MakeDefaultDistFiles(s.snapshotFile.Path(), s.infoFile.Path()), 197*333d2b36SAndroid Build Coastguard Worker Include: "$(BUILD_PHONY_PACKAGE)", 198*333d2b36SAndroid Build Coastguard Worker ExtraEntries: []android.AndroidMkExtraEntriesFunc{ 199*333d2b36SAndroid Build Coastguard Worker func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 200*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_DONT_CHECK_MODULE", true) 201*333d2b36SAndroid Build Coastguard Worker }, 202*333d2b36SAndroid Build Coastguard Worker }, 203*333d2b36SAndroid Build Coastguard Worker ExtraFooters: []android.AndroidMkExtraFootersFunc{ 204*333d2b36SAndroid Build Coastguard Worker func(w io.Writer, name, prefix, moduleDir string) { 205*333d2b36SAndroid Build Coastguard Worker // Allow the sdk to be built by simply passing its name on the command line. 206*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, ".PHONY:", s.Name()) 207*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, s.Name()+":", s.snapshotFile.String()) 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker // Allow the sdk info to be built by simply passing its name on the command line. 210*333d2b36SAndroid Build Coastguard Worker infoTarget := s.Name() + ".info" 211*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, ".PHONY:", infoTarget) 212*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, infoTarget+":", s.infoFile.String()) 213*333d2b36SAndroid Build Coastguard Worker }, 214*333d2b36SAndroid Build Coastguard Worker }, 215*333d2b36SAndroid Build Coastguard Worker }} 216*333d2b36SAndroid Build Coastguard Worker} 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker// gatherTraits gathers the traits from the dynamically generated trait specific properties. 219*333d2b36SAndroid Build Coastguard Worker// 220*333d2b36SAndroid Build Coastguard Worker// Returns a map from member name to the set of required traits. 221*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) gatherTraits() map[string]android.SdkMemberTraitSet { 222*333d2b36SAndroid Build Coastguard Worker traitListByMember := map[string][]android.SdkMemberTrait{} 223*333d2b36SAndroid Build Coastguard Worker for _, memberListProperty := range s.memberTraitListProperties() { 224*333d2b36SAndroid Build Coastguard Worker names := memberListProperty.getter(s.dynamicMemberTraitListProperties) 225*333d2b36SAndroid Build Coastguard Worker for _, name := range names { 226*333d2b36SAndroid Build Coastguard Worker traitListByMember[name] = append(traitListByMember[name], memberListProperty.memberTrait) 227*333d2b36SAndroid Build Coastguard Worker } 228*333d2b36SAndroid Build Coastguard Worker } 229*333d2b36SAndroid Build Coastguard Worker 230*333d2b36SAndroid Build Coastguard Worker traitSetByMember := map[string]android.SdkMemberTraitSet{} 231*333d2b36SAndroid Build Coastguard Worker for name, list := range traitListByMember { 232*333d2b36SAndroid Build Coastguard Worker traitSetByMember[name] = android.NewSdkMemberTraitSet(list) 233*333d2b36SAndroid Build Coastguard Worker } 234*333d2b36SAndroid Build Coastguard Worker 235*333d2b36SAndroid Build Coastguard Worker return traitSetByMember 236*333d2b36SAndroid Build Coastguard Worker} 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker// newDependencyContext creates a new SdkDependencyContext for this sdk. 239*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) newDependencyContext(mctx android.BottomUpMutatorContext) android.SdkDependencyContext { 240*333d2b36SAndroid Build Coastguard Worker traits := s.gatherTraits() 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker return &dependencyContext{ 243*333d2b36SAndroid Build Coastguard Worker BottomUpMutatorContext: mctx, 244*333d2b36SAndroid Build Coastguard Worker requiredTraits: traits, 245*333d2b36SAndroid Build Coastguard Worker } 246*333d2b36SAndroid Build Coastguard Worker} 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Workertype dependencyContext struct { 249*333d2b36SAndroid Build Coastguard Worker android.BottomUpMutatorContext 250*333d2b36SAndroid Build Coastguard Worker 251*333d2b36SAndroid Build Coastguard Worker // Map from member name to the set of traits that the sdk requires the member provides. 252*333d2b36SAndroid Build Coastguard Worker requiredTraits map[string]android.SdkMemberTraitSet 253*333d2b36SAndroid Build Coastguard Worker} 254*333d2b36SAndroid Build Coastguard Worker 255*333d2b36SAndroid Build Coastguard Workerfunc (d *dependencyContext) RequiredTraits(name string) android.SdkMemberTraitSet { 256*333d2b36SAndroid Build Coastguard Worker if s, ok := d.requiredTraits[name]; ok { 257*333d2b36SAndroid Build Coastguard Worker return s 258*333d2b36SAndroid Build Coastguard Worker } else { 259*333d2b36SAndroid Build Coastguard Worker return android.EmptySdkMemberTraitSet() 260*333d2b36SAndroid Build Coastguard Worker } 261*333d2b36SAndroid Build Coastguard Worker} 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Workerfunc (d *dependencyContext) RequiresTrait(name string, trait android.SdkMemberTrait) bool { 264*333d2b36SAndroid Build Coastguard Worker return d.RequiredTraits(name).Contains(trait) 265*333d2b36SAndroid Build Coastguard Worker} 266*333d2b36SAndroid Build Coastguard Worker 267*333d2b36SAndroid Build Coastguard Workervar _ android.SdkDependencyContext = (*dependencyContext)(nil) 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct { 270*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 271*333d2b36SAndroid Build Coastguard Worker} 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Worker// Mark this tag so dependencies that use it are excluded from APEX contents. 274*333d2b36SAndroid Build Coastguard Workerfunc (t dependencyTag) ExcludeFromApexContents() {} 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Workervar _ android.ExcludeFromApexContentsTag = dependencyTag{} 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Workerfunc (s *sdk) DepsMutator(mctx android.BottomUpMutatorContext) { 279*333d2b36SAndroid Build Coastguard Worker // Add dependencies from non CommonOS variants to the sdk member variants. 280*333d2b36SAndroid Build Coastguard Worker if s.IsCommonOSVariant() { 281*333d2b36SAndroid Build Coastguard Worker return 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker ctx := s.newDependencyContext(mctx) 285*333d2b36SAndroid Build Coastguard Worker for _, memberListProperty := range s.memberTypeListProperties() { 286*333d2b36SAndroid Build Coastguard Worker if memberListProperty.getter == nil { 287*333d2b36SAndroid Build Coastguard Worker continue 288*333d2b36SAndroid Build Coastguard Worker } 289*333d2b36SAndroid Build Coastguard Worker names := memberListProperty.getter(s.dynamicMemberTypeListProperties) 290*333d2b36SAndroid Build Coastguard Worker if len(names) > 0 { 291*333d2b36SAndroid Build Coastguard Worker memberType := memberListProperty.memberType 292*333d2b36SAndroid Build Coastguard Worker 293*333d2b36SAndroid Build Coastguard Worker // Verify that the member type supports the specified traits. 294*333d2b36SAndroid Build Coastguard Worker supportedTraits := memberType.SupportedTraits() 295*333d2b36SAndroid Build Coastguard Worker for _, name := range names { 296*333d2b36SAndroid Build Coastguard Worker requiredTraits := ctx.RequiredTraits(name) 297*333d2b36SAndroid Build Coastguard Worker unsupportedTraits := requiredTraits.Subtract(supportedTraits) 298*333d2b36SAndroid Build Coastguard Worker if !unsupportedTraits.Empty() { 299*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("sdk member %q has traits %s that are unsupported by its member type %q", 300*333d2b36SAndroid Build Coastguard Worker name, unsupportedTraits, memberType.SdkPropertyName()) 301*333d2b36SAndroid Build Coastguard Worker } 302*333d2b36SAndroid Build Coastguard Worker } 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker // Add dependencies using the appropriate tag. 305*333d2b36SAndroid Build Coastguard Worker tag := memberListProperty.dependencyTag 306*333d2b36SAndroid Build Coastguard Worker memberType.AddDependencies(ctx, tag, names) 307*333d2b36SAndroid Build Coastguard Worker } 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker} 310