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