| 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"` | 
| Paul Duffin | 157f40f | 2020-09-29 16:01:08 +0100 | [diff] [blame] | 87 |  | 
|  | 88 | // The additional visibility to add to the prebuilt modules to allow them to | 
|  | 89 | // reference each other. | 
|  | 90 | // | 
|  | 91 | // This can only be used to widen the visibility of the members: | 
|  | 92 | // | 
|  | 93 | // * Specifying //visibility:public here will make all members visible and | 
|  | 94 | //   essentially ignore their own visibility. | 
|  | 95 | // * Specifying //visibility:private here is an error. | 
|  | 96 | // * Specifying any other rule here will add it to the members visibility and | 
|  | 97 | //   be output to the member prebuilt in the snapshot. Duplicates will be | 
|  | 98 | //   dropped. Adding a rule to members that have //visibility:private will | 
|  | 99 | //   cause the //visibility:private to be discarded. | 
|  | 100 | Prebuilt_visibility []string | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 101 | } | 
|  | 102 |  | 
|  | 103 | // sdk defines an SDK which is a logical group of modules (e.g. native libs, headers, java libs, etc.) | 
|  | 104 | // which Mainline modules like APEX can choose to build with. | 
| Paul Duffin | 8150da6 | 2019-12-16 17:21:27 +0000 | [diff] [blame] | 105 | func SdkModuleFactory() android.Module { | 
| Paul Duffin | e602918 | 2019-12-16 17:43:48 +0000 | [diff] [blame] | 106 | return newSdkModule(false) | 
| Paul Duffin | 8150da6 | 2019-12-16 17:21:27 +0000 | [diff] [blame] | 107 | } | 
| Paul Duffin | 255f18e | 2019-12-13 11:22:16 +0000 | [diff] [blame] | 108 |  | 
| Paul Duffin | e602918 | 2019-12-16 17:43:48 +0000 | [diff] [blame] | 109 | func newSdkModule(moduleExports bool) *sdk { | 
| Paul Duffin | 8150da6 | 2019-12-16 17:21:27 +0000 | [diff] [blame] | 110 | s := &sdk{} | 
| Paul Duffin | e602918 | 2019-12-16 17:43:48 +0000 | [diff] [blame] | 111 | s.properties.Module_exports = moduleExports | 
| Paul Duffin | 255f18e | 2019-12-13 11:22:16 +0000 | [diff] [blame] | 112 | // 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] | 113 | sdkMemberTypeKey, sdkMemberTypes := android.RegisteredSdkMemberTypes(moduleExports) | 
|  | 114 | s.dynamicSdkMemberTypes = getDynamicSdkMemberTypes(sdkMemberTypeKey, sdkMemberTypes) | 
| Paul Duffin | 255f18e | 2019-12-13 11:22:16 +0000 | [diff] [blame] | 115 | // Create an instance of the dynamically created struct that contains all the | 
|  | 116 | // properties for the member type specific list properties. | 
| Paul Duffin | 62782de | 2021-07-14 12:05:16 +0100 | [diff] [blame] | 117 | s.dynamicMemberTypeListProperties = s.dynamicSdkMemberTypes.createMemberTypeListProperties() | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 118 |  | 
| Paul Duffin | 30c830b | 2021-09-22 11:49:47 +0100 | [diff] [blame] | 119 | sdkMemberTraitsKey, sdkMemberTraits := android.RegisteredSdkMemberTraits() | 
|  | 120 | s.dynamicSdkMemberTraits = getDynamicSdkMemberTraits(sdkMemberTraitsKey, sdkMemberTraits) | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 121 | // Create an instance of the dynamically created struct that contains all the properties for the | 
|  | 122 | // member trait specific list properties. | 
|  | 123 | s.dynamicMemberTraitListProperties = s.dynamicSdkMemberTraits.createMemberTraitListProperties() | 
|  | 124 |  | 
|  | 125 | // Create a wrapper around the dynamic trait specific properties so that they have to be | 
|  | 126 | // specified within a traits:{} section in the .bp file. | 
|  | 127 | traitsWrapper := struct { | 
|  | 128 | Traits interface{} | 
|  | 129 | }{s.dynamicMemberTraitListProperties} | 
|  | 130 |  | 
|  | 131 | s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties, &traitsWrapper) | 
| Paul Duffin | 157f40f | 2020-09-29 16:01:08 +0100 | [diff] [blame] | 132 |  | 
|  | 133 | // Make sure that the prebuilt visibility property is verified for errors. | 
|  | 134 | android.AddVisibilityProperty(s, "prebuilt_visibility", &s.properties.Prebuilt_visibility) | 
| Paul Duffin | 1356d8c | 2020-02-25 19:26:33 +0000 | [diff] [blame] | 135 | android.InitCommonOSAndroidMultiTargetsArchModule(s, android.HostAndDeviceSupported, android.MultilibCommon) | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 136 | android.InitDefaultableModule(s) | 
| Jiyong Park | 100f3fd | 2019-11-06 16:03:32 +0900 | [diff] [blame] | 137 | android.AddLoadHook(s, func(ctx android.LoadHookContext) { | 
|  | 138 | type props struct { | 
|  | 139 | Compile_multilib *string | 
|  | 140 | } | 
|  | 141 | p := &props{Compile_multilib: proptools.StringPtr("both")} | 
| Martin Stjernholm | 26ab8e8 | 2020-06-30 20:34:00 +0100 | [diff] [blame] | 142 | ctx.PrependProperties(p) | 
| Jiyong Park | 100f3fd | 2019-11-06 16:03:32 +0900 | [diff] [blame] | 143 | }) | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 144 | return s | 
|  | 145 | } | 
|  | 146 |  | 
| Paul Duffin | b01ac4b | 2022-05-24 20:10:05 +0000 | [diff] [blame] | 147 | // 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] | 148 | func SnapshotModuleFactory() android.Module { | 
| Paul Duffin | e602918 | 2019-12-16 17:43:48 +0000 | [diff] [blame] | 149 | s := newSdkModule(false) | 
| Paul Duffin | 8150da6 | 2019-12-16 17:21:27 +0000 | [diff] [blame] | 150 | s.properties.Snapshot = true | 
| Jiyong Park | 9b409bc | 2019-10-11 14:59:13 +0900 | [diff] [blame] | 151 | return s | 
|  | 152 | } | 
|  | 153 |  | 
| Paul Duffin | 62782de | 2021-07-14 12:05:16 +0100 | [diff] [blame] | 154 | func (s *sdk) memberTypeListProperties() []*sdkMemberTypeListProperty { | 
|  | 155 | return s.dynamicSdkMemberTypes.memberTypeListProperties | 
| Paul Duffin | 7291095 | 2020-01-20 18:16:30 +0000 | [diff] [blame] | 156 | } | 
|  | 157 |  | 
| Paul Duffin | 62782de | 2021-07-14 12:05:16 +0100 | [diff] [blame] | 158 | func (s *sdk) memberTypeListProperty(memberType android.SdkMemberType) *sdkMemberTypeListProperty { | 
| Paul Duffin | cd06467 | 2021-04-24 00:47:29 +0100 | [diff] [blame] | 159 | return s.dynamicSdkMemberTypes.memberTypeToProperty[memberType] | 
|  | 160 | } | 
|  | 161 |  | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 162 | // memberTraitListProperties returns the list of *sdkMemberTraitListProperty instances for this sdk. | 
|  | 163 | func (s *sdk) memberTraitListProperties() []*sdkMemberTraitListProperty { | 
|  | 164 | return s.dynamicSdkMemberTraits.memberTraitListProperties | 
|  | 165 | } | 
|  | 166 |  | 
| Jiyong Park | 9b409bc | 2019-10-11 14:59:13 +0900 | [diff] [blame] | 167 | func (s *sdk) snapshot() bool { | 
|  | 168 | return s.properties.Snapshot | 
|  | 169 | } | 
|  | 170 |  | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 171 | func (s *sdk) GenerateAndroidBuildActions(ctx android.ModuleContext) { | 
| Paul Duffin | 1356d8c | 2020-02-25 19:26:33 +0000 | [diff] [blame] | 172 | if s.snapshot() { | 
| Jiyong Park | 232e785 | 2019-11-04 12:23:40 +0900 | [diff] [blame] | 173 | // We don't need to create a snapshot out of sdk_snapshot. | 
|  | 174 | // 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] | 175 | return | 
|  | 176 | } | 
|  | 177 |  | 
|  | 178 | // This method is guaranteed to be called on OsType specific variants before it is called | 
|  | 179 | // on their corresponding CommonOS variant. | 
|  | 180 | if !s.IsCommonOSVariant() { | 
| Paul Duffin | 6a7e953 | 2020-03-20 17:50:07 +0000 | [diff] [blame] | 181 | // Update the OsType specific sdk variant with information about its members. | 
|  | 182 | s.collectMembers(ctx) | 
| Paul Duffin | 1356d8c | 2020-02-25 19:26:33 +0000 | [diff] [blame] | 183 | } else { | 
|  | 184 | // Get the OsType specific variants on which the CommonOS depends. | 
|  | 185 | osSpecificVariants := android.GetOsSpecificVariantsOfCommonOSVariant(ctx) | 
|  | 186 | var sdkVariants []*sdk | 
|  | 187 | for _, m := range osSpecificVariants { | 
|  | 188 | if sdkVariant, ok := m.(*sdk); ok { | 
|  | 189 | sdkVariants = append(sdkVariants, sdkVariant) | 
|  | 190 | } | 
|  | 191 | } | 
|  | 192 |  | 
|  | 193 | // Generate the snapshot from the member info. | 
| Paul Duffin | c6ba182 | 2022-05-06 09:38:02 +0000 | [diff] [blame] | 194 | s.buildSnapshot(ctx, sdkVariants) | 
| Jiyong Park | 232e785 | 2019-11-04 12:23:40 +0900 | [diff] [blame] | 195 | } | 
| Jiyong Park | 9b409bc | 2019-10-11 14:59:13 +0900 | [diff] [blame] | 196 | } | 
|  | 197 |  | 
| Jiyong Park | 0b0e1b9 | 2019-12-03 13:24:29 +0900 | [diff] [blame] | 198 | func (s *sdk) AndroidMkEntries() []android.AndroidMkEntries { | 
| Paul Duffin | c6ba182 | 2022-05-06 09:38:02 +0000 | [diff] [blame] | 199 | if !s.snapshotFile.Valid() != !s.infoFile.Valid() { | 
|  | 200 | panic("Snapshot (%q) and info file (%q) should both be set or neither should be set.") | 
|  | 201 | } else if !s.snapshotFile.Valid() { | 
| Jiyong Park | 0b0e1b9 | 2019-12-03 13:24:29 +0900 | [diff] [blame] | 202 | return []android.AndroidMkEntries{} | 
| Jiyong Park | 232e785 | 2019-11-04 12:23:40 +0900 | [diff] [blame] | 203 | } | 
|  | 204 |  | 
| Jiyong Park | 0b0e1b9 | 2019-12-03 13:24:29 +0900 | [diff] [blame] | 205 | return []android.AndroidMkEntries{android.AndroidMkEntries{ | 
| Jiyong Park | 232e785 | 2019-11-04 12:23:40 +0900 | [diff] [blame] | 206 | Class:      "FAKE", | 
|  | 207 | OutputFile: s.snapshotFile, | 
| Paul Duffin | c6ba182 | 2022-05-06 09:38:02 +0000 | [diff] [blame] | 208 | DistFiles:  android.MakeDefaultDistFiles(s.snapshotFile.Path(), s.infoFile.Path()), | 
| Jiyong Park | 232e785 | 2019-11-04 12:23:40 +0900 | [diff] [blame] | 209 | Include:    "$(BUILD_PHONY_PACKAGE)", | 
| Paul Duffin | 504b461 | 2019-11-22 14:52:29 +0000 | [diff] [blame] | 210 | ExtraFooters: []android.AndroidMkExtraFootersFunc{ | 
| Jaewoong Jung | 02b11a6 | 2020-12-07 10:23:54 -0800 | [diff] [blame] | 211 | func(w io.Writer, name, prefix, moduleDir string) { | 
| Paul Duffin | 504b461 | 2019-11-22 14:52:29 +0000 | [diff] [blame] | 212 | // Allow the sdk to be built by simply passing its name on the command line. | 
|  | 213 | fmt.Fprintln(w, ".PHONY:", s.Name()) | 
|  | 214 | fmt.Fprintln(w, s.Name()+":", s.snapshotFile.String()) | 
| Paul Duffin | c6ba182 | 2022-05-06 09:38:02 +0000 | [diff] [blame] | 215 |  | 
|  | 216 | // Allow the sdk info to be built by simply passing its name on the command line. | 
|  | 217 | infoTarget := s.Name() + ".info" | 
|  | 218 | fmt.Fprintln(w, ".PHONY:", infoTarget) | 
|  | 219 | fmt.Fprintln(w, infoTarget+":", s.infoFile.String()) | 
| Paul Duffin | 504b461 | 2019-11-22 14:52:29 +0000 | [diff] [blame] | 220 | }, | 
|  | 221 | }, | 
| Jiyong Park | 0b0e1b9 | 2019-12-03 13:24:29 +0900 | [diff] [blame] | 222 | }} | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 223 | } | 
|  | 224 |  | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 225 | // gatherTraits gathers the traits from the dynamically generated trait specific properties. | 
|  | 226 | // | 
|  | 227 | // Returns a map from member name to the set of required traits. | 
|  | 228 | func (s *sdk) gatherTraits() map[string]android.SdkMemberTraitSet { | 
|  | 229 | traitListByMember := map[string][]android.SdkMemberTrait{} | 
|  | 230 | for _, memberListProperty := range s.memberTraitListProperties() { | 
|  | 231 | names := memberListProperty.getter(s.dynamicMemberTraitListProperties) | 
|  | 232 | for _, name := range names { | 
|  | 233 | traitListByMember[name] = append(traitListByMember[name], memberListProperty.memberTrait) | 
|  | 234 | } | 
|  | 235 | } | 
|  | 236 |  | 
|  | 237 | traitSetByMember := map[string]android.SdkMemberTraitSet{} | 
|  | 238 | for name, list := range traitListByMember { | 
|  | 239 | traitSetByMember[name] = android.NewSdkMemberTraitSet(list) | 
|  | 240 | } | 
|  | 241 |  | 
|  | 242 | return traitSetByMember | 
|  | 243 | } | 
|  | 244 |  | 
| Paul Duffin | 296701e | 2021-07-14 10:29:36 +0100 | [diff] [blame] | 245 | // newDependencyContext creates a new SdkDependencyContext for this sdk. | 
|  | 246 | func (s *sdk) newDependencyContext(mctx android.BottomUpMutatorContext) android.SdkDependencyContext { | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 247 | traits := s.gatherTraits() | 
|  | 248 |  | 
| Paul Duffin | 296701e | 2021-07-14 10:29:36 +0100 | [diff] [blame] | 249 | return &dependencyContext{ | 
|  | 250 | BottomUpMutatorContext: mctx, | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 251 | requiredTraits:         traits, | 
| Paul Duffin | 296701e | 2021-07-14 10:29:36 +0100 | [diff] [blame] | 252 | } | 
|  | 253 | } | 
|  | 254 |  | 
|  | 255 | type dependencyContext struct { | 
|  | 256 | android.BottomUpMutatorContext | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 257 |  | 
|  | 258 | // Map from member name to the set of traits that the sdk requires the member provides. | 
|  | 259 | requiredTraits map[string]android.SdkMemberTraitSet | 
|  | 260 | } | 
|  | 261 |  | 
|  | 262 | func (d *dependencyContext) RequiredTraits(name string) android.SdkMemberTraitSet { | 
|  | 263 | if s, ok := d.requiredTraits[name]; ok { | 
|  | 264 | return s | 
|  | 265 | } else { | 
|  | 266 | return android.EmptySdkMemberTraitSet() | 
|  | 267 | } | 
|  | 268 | } | 
|  | 269 |  | 
|  | 270 | func (d *dependencyContext) RequiresTrait(name string, trait android.SdkMemberTrait) bool { | 
|  | 271 | return d.RequiredTraits(name).Contains(trait) | 
| Paul Duffin | 296701e | 2021-07-14 10:29:36 +0100 | [diff] [blame] | 272 | } | 
|  | 273 |  | 
|  | 274 | var _ android.SdkDependencyContext = (*dependencyContext)(nil) | 
|  | 275 |  | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 276 | type dependencyTag struct { | 
|  | 277 | blueprint.BaseDependencyTag | 
|  | 278 | } | 
|  | 279 |  | 
| Martin Stjernholm | cc77601 | 2020-07-07 03:22:21 +0100 | [diff] [blame] | 280 | // Mark this tag so dependencies that use it are excluded from APEX contents. | 
|  | 281 | func (t dependencyTag) ExcludeFromApexContents() {} | 
|  | 282 |  | 
|  | 283 | var _ android.ExcludeFromApexContentsTag = dependencyTag{} | 
|  | 284 |  | 
| Paul Duffin | 2156abe | 2022-11-23 17:59:00 +0000 | [diff] [blame] | 285 | func (s *sdk) DepsMutator(mctx android.BottomUpMutatorContext) { | 
|  | 286 | // Add dependencies from non CommonOS variants to the sdk member variants. | 
|  | 287 | if s.IsCommonOSVariant() { | 
|  | 288 | return | 
|  | 289 | } | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 290 |  | 
| Paul Duffin | 2156abe | 2022-11-23 17:59:00 +0000 | [diff] [blame] | 291 | ctx := s.newDependencyContext(mctx) | 
|  | 292 | for _, memberListProperty := range s.memberTypeListProperties() { | 
|  | 293 | if memberListProperty.getter == nil { | 
|  | 294 | continue | 
|  | 295 | } | 
|  | 296 | names := memberListProperty.getter(s.dynamicMemberTypeListProperties) | 
|  | 297 | if len(names) > 0 { | 
|  | 298 | memberType := memberListProperty.memberType | 
| Paul Duffin | d19f894 | 2021-07-14 12:08:37 +0100 | [diff] [blame] | 299 |  | 
| Paul Duffin | 2156abe | 2022-11-23 17:59:00 +0000 | [diff] [blame] | 300 | // Verify that the member type supports the specified traits. | 
|  | 301 | supportedTraits := memberType.SupportedTraits() | 
|  | 302 | for _, name := range names { | 
|  | 303 | requiredTraits := ctx.RequiredTraits(name) | 
|  | 304 | unsupportedTraits := requiredTraits.Subtract(supportedTraits) | 
|  | 305 | if !unsupportedTraits.Empty() { | 
|  | 306 | ctx.ModuleErrorf("sdk member %q has traits %s that are unsupported by its member type %q", | 
|  | 307 | name, unsupportedTraits, memberType.SdkPropertyName()) | 
| Paul Duffin | cc1b3da | 2020-02-27 13:29:56 +0000 | [diff] [blame] | 308 | } | 
| Paul Duffin | 583bf7e | 2020-02-20 13:39:41 +0000 | [diff] [blame] | 309 | } | 
| Paul Duffin | 2156abe | 2022-11-23 17:59:00 +0000 | [diff] [blame] | 310 |  | 
|  | 311 | // Add dependencies using the appropriate tag. | 
|  | 312 | tag := memberListProperty.dependencyTag | 
|  | 313 | memberType.AddDependencies(ctx, tag, names) | 
| Jiyong Park | d1063c1 | 2019-07-17 20:08:41 +0900 | [diff] [blame] | 314 | } | 
|  | 315 | } | 
|  | 316 | } |