blob: 4f3d2a750c1ccde44ef0ac6d54e46b058cd8b61e [file] [log] [blame]
Jihoon Kangadd2bb22024-11-05 22:29:34 +00001// Copyright (C) 2024 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
15package fsgen
16
17import (
Jihoon Kangadd2bb22024-11-05 22:29:34 +000018 "fmt"
19 "slices"
Jihoon Kang3a8759c2024-11-08 19:35:09 +000020 "strings"
Jihoon Kangadd2bb22024-11-05 22:29:34 +000021 "sync"
22
mrziwange5b1bb32024-11-05 15:51:40 -080023 "android/soong/android"
24
Jihoon Kangadd2bb22024-11-05 22:29:34 +000025 "github.com/google/blueprint/proptools"
26)
27
28func RegisterCollectFileSystemDepsMutators(ctx android.RegisterMutatorsContext) {
29 ctx.BottomUp("fs_collect_deps", collectDepsMutator).MutatesGlobalState()
30 ctx.BottomUp("fs_set_deps", setDepsMutator)
31}
32
33var fsGenStateOnceKey = android.NewOnceKey("FsGenState")
34var fsGenRemoveOverridesOnceKey = android.NewOnceKey("FsGenRemoveOverrides")
35
36// Map of partition module name to its partition that may be generated by Soong.
37// Note that it is not guaranteed that all modules returned by this function are successfully
38// created.
39func getAllSoongGeneratedPartitionNames(config android.Config, partitions []string) map[string]string {
40 ret := map[string]string{}
41 for _, partition := range partitions {
42 ret[generatedModuleNameForPartition(config, partition)] = partition
43 }
44 return ret
45}
46
47type depCandidateProps struct {
48 Namespace string
49 Multilib string
50 Arch []android.ArchType
51}
52
53// Map of module name to depCandidateProps
54type multilibDeps map[string]*depCandidateProps
55
56// Information necessary to generate the filesystem modules, including details about their
57// dependencies
58type FsGenState struct {
59 // List of modules in `PRODUCT_PACKAGES` and `PRODUCT_PACKAGES_DEBUG`
60 depCandidates []string
61 // Map of names of partition to the information of modules to be added as deps
62 fsDeps map[string]*multilibDeps
Cole Faust76e8aa12025-01-27 18:21:31 -080063 // Information about the main soong-generated partitions
64 soongGeneratedPartitions allGeneratedPartitionData
Jihoon Kangadd2bb22024-11-05 22:29:34 +000065 // Mutex to protect the fsDeps
66 fsDepsMutex sync.Mutex
67 // Map of _all_ soong module names to their corresponding installation properties
68 moduleToInstallationProps map[string]installationProperties
Jihoon Kang0d7b0112024-11-13 20:44:05 +000069 // List of prebuilt_* modules that are autogenerated.
70 generatedPrebuiltEtcModuleNames []string
Cole Faust953476f2024-11-14 14:11:29 -080071 // Mapping from a path to an avb key to the name of a filegroup module that contains it
72 avbKeyFilegroups map[string]string
Jihoon Kangadd2bb22024-11-05 22:29:34 +000073}
74
75type installationProperties struct {
76 Required []string
77 Overrides []string
78}
79
80func defaultDepCandidateProps(config android.Config) *depCandidateProps {
81 return &depCandidateProps{
82 Namespace: ".",
83 Arch: []android.ArchType{config.BuildArch},
84 }
85}
86
Jihoon Kang04f12c92024-11-12 23:03:08 +000087func createFsGenState(ctx android.LoadHookContext, generatedPrebuiltEtcModuleNames []string, avbpubkeyGenerated bool) *FsGenState {
Jihoon Kangadd2bb22024-11-05 22:29:34 +000088 return ctx.Config().Once(fsGenStateOnceKey, func() interface{} {
89 partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
90 candidates := android.FirstUniqueStrings(android.Concat(partitionVars.ProductPackages, partitionVars.ProductPackagesDebug))
91 candidates = android.Concat(candidates, generatedPrebuiltEtcModuleNames)
92
Jihoon Kang04f12c92024-11-12 23:03:08 +000093 fsGenState := FsGenState{
Jihoon Kangadd2bb22024-11-05 22:29:34 +000094 depCandidates: candidates,
95 fsDeps: map[string]*multilibDeps{
96 // These additional deps are added according to the cuttlefish system image bp.
97 "system": {
Cole Faust1d4e76c2024-11-26 14:15:29 -080098 // keep-sorted start
Jihoon Kangadd2bb22024-11-05 22:29:34 +000099 "com.android.apex.cts.shim.v1_prebuilt": defaultDepCandidateProps(ctx.Config()),
100 "dex_bootjars": defaultDepCandidateProps(ctx.Config()),
101 "framework_compatibility_matrix.device.xml": defaultDepCandidateProps(ctx.Config()),
Cole Faust1d4e76c2024-11-26 14:15:29 -0800102 "init.environ.rc-soong": defaultDepCandidateProps(ctx.Config()),
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000103 "libcompiler_rt": defaultDepCandidateProps(ctx.Config()),
104 "libdmabufheap": defaultDepCandidateProps(ctx.Config()),
105 "libgsi": defaultDepCandidateProps(ctx.Config()),
106 "llndk.libraries.txt": defaultDepCandidateProps(ctx.Config()),
107 "logpersist.start": defaultDepCandidateProps(ctx.Config()),
Wei Li7b8455f2025-03-05 16:05:51 -0800108 "notice_xml_system": defaultDepCandidateProps(ctx.Config()),
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000109 "update_engine_sideload": defaultDepCandidateProps(ctx.Config()),
Cole Faust1d4e76c2024-11-26 14:15:29 -0800110 // keep-sorted end
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000111 },
112 "vendor": {
113 "fs_config_files_vendor": defaultDepCandidateProps(ctx.Config()),
114 "fs_config_dirs_vendor": defaultDepCandidateProps(ctx.Config()),
Wei Li7b8455f2025-03-05 16:05:51 -0800115 "notice_xml_vendor": defaultDepCandidateProps(ctx.Config()),
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000116 generatedModuleName(ctx.Config(), "vendor-build.prop"): defaultDepCandidateProps(ctx.Config()),
117 },
118 "odm": {
119 // fs_config_* files are automatically installed for all products with odm partitions.
120 // https://cs.android.com/android/_/android/platform/build/+/e4849e87ab660b59a6501b3928693db065ee873b:tools/fs_config/Android.mk;l=34;drc=8d6481b92c4b4e9b9f31a61545b6862090fcc14b;bpv=1;bpt=0
121 "fs_config_files_odm": defaultDepCandidateProps(ctx.Config()),
122 "fs_config_dirs_odm": defaultDepCandidateProps(ctx.Config()),
Wei Li7b8455f2025-03-05 16:05:51 -0800123 "notice_xml_odm": defaultDepCandidateProps(ctx.Config()),
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000124 },
Wei Li7b8455f2025-03-05 16:05:51 -0800125 "product": {
126 "notice_xml_product": defaultDepCandidateProps(ctx.Config()),
127 },
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000128 "system_ext": {
129 // VNDK apexes are automatically included.
130 // This hardcoded list will need to be updated if `PRODUCT_EXTRA_VNDK_VERSIONS` is updated.
131 // https://cs.android.com/android/_/android/platform/build/+/adba533072b00c53ac0f198c550a3cbd7a00e4cd:core/main.mk;l=984;bpv=1;bpt=0;drc=174db7b179592cf07cbfd2adb0119486fda911e7
Wei Li7b8455f2025-03-05 16:05:51 -0800132 "com.android.vndk.v30": defaultDepCandidateProps(ctx.Config()),
133 "com.android.vndk.v31": defaultDepCandidateProps(ctx.Config()),
134 "com.android.vndk.v32": defaultDepCandidateProps(ctx.Config()),
135 "com.android.vndk.v33": defaultDepCandidateProps(ctx.Config()),
136 "com.android.vndk.v34": defaultDepCandidateProps(ctx.Config()),
137 "notice_xml_system_ext": defaultDepCandidateProps(ctx.Config()),
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000138 },
Spandan Das912d26b2024-11-06 19:35:17 +0000139 "userdata": {},
140 "system_dlkm": {
141 // these are phony required deps of the phony fs_config_dirs_nonsystem
142 "fs_config_dirs_system_dlkm": defaultDepCandidateProps(ctx.Config()),
143 "fs_config_files_system_dlkm": defaultDepCandidateProps(ctx.Config()),
Wei Li7b8455f2025-03-05 16:05:51 -0800144 "notice_xml_system_dlkm": defaultDepCandidateProps(ctx.Config()),
Spandan Das912d26b2024-11-06 19:35:17 +0000145 // build props are automatically added to `ALL_DEFAULT_INSTALLED_MODULES`
146 "system_dlkm-build.prop": defaultDepCandidateProps(ctx.Config()),
147 },
Spandan Das5b493cd2024-11-07 20:55:56 +0000148 "vendor_dlkm": {
149 "fs_config_dirs_vendor_dlkm": defaultDepCandidateProps(ctx.Config()),
150 "fs_config_files_vendor_dlkm": defaultDepCandidateProps(ctx.Config()),
Wei Li7b8455f2025-03-05 16:05:51 -0800151 "notice_xml_vendor_dlkm": defaultDepCandidateProps(ctx.Config()),
Spandan Das5b493cd2024-11-07 20:55:56 +0000152 "vendor_dlkm-build.prop": defaultDepCandidateProps(ctx.Config()),
153 },
154 "odm_dlkm": {
155 "fs_config_dirs_odm_dlkm": defaultDepCandidateProps(ctx.Config()),
156 "fs_config_files_odm_dlkm": defaultDepCandidateProps(ctx.Config()),
Wei Li7b8455f2025-03-05 16:05:51 -0800157 "notice_xml_odm_dlkm": defaultDepCandidateProps(ctx.Config()),
Spandan Das5b493cd2024-11-07 20:55:56 +0000158 "odm_dlkm-build.prop": defaultDepCandidateProps(ctx.Config()),
159 },
Cole Faust24938e22024-11-18 14:01:58 -0800160 "ramdisk": {},
161 "vendor_ramdisk": {},
Jihoon Kangc44172e2024-12-23 21:30:08 +0000162 "recovery": {
163 "sepolicy.recovery": defaultDepCandidateProps(ctx.Config()),
164 "plat_file_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
165 "plat_service_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
166 "plat_property_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
167 "system_ext_file_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
168 "system_ext_service_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
169 "system_ext_property_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
170 "vendor_file_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
171 "vendor_service_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
172 "vendor_property_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
173 "odm_file_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
174 "odm_property_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
175 "product_file_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
176 "product_service_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
177 "product_property_contexts.recovery": defaultDepCandidateProps(ctx.Config()),
178 },
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000179 },
Jihoon Kang0d7b0112024-11-13 20:44:05 +0000180 fsDepsMutex: sync.Mutex{},
181 moduleToInstallationProps: map[string]installationProperties{},
182 generatedPrebuiltEtcModuleNames: generatedPrebuiltEtcModuleNames,
Cole Faust953476f2024-11-14 14:11:29 -0800183 avbKeyFilegroups: map[string]string{},
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000184 }
Jihoon Kang04f12c92024-11-12 23:03:08 +0000185
186 if avbpubkeyGenerated {
187 (*fsGenState.fsDeps["product"])["system_other_avbpubkey"] = defaultDepCandidateProps(ctx.Config())
188 }
189
Jihoon Kang2f7efc02025-03-12 22:35:21 +0000190 if len(ctx.Config().DeviceManifestFiles()) > 0 {
191 (*fsGenState.fsDeps["vendor"])["vendor_manifest.xml"] = defaultDepCandidateProps(ctx.Config())
192 }
193
Jihoon Kang45893372024-12-04 00:15:36 +0000194 // Add common resources `prebuilt_res` module as dep of recovery partition
195 (*fsGenState.fsDeps["recovery"])[fmt.Sprintf("recovery-resources-common-%s", getDpi(ctx))] = defaultDepCandidateProps(ctx.Config())
Jihoon Kangd5244352024-12-10 00:06:51 +0000196 (*fsGenState.fsDeps["recovery"])[getRecoveryFontModuleName(ctx)] = defaultDepCandidateProps(ctx.Config())
Jihoon Kangefd04b92024-12-10 23:35:09 +0000197 (*fsGenState.fsDeps["recovery"])[createRecoveryBuildProp(ctx)] = defaultDepCandidateProps(ctx.Config())
Jihoon Kang45893372024-12-04 00:15:36 +0000198
Jihoon Kang04f12c92024-11-12 23:03:08 +0000199 return &fsGenState
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000200 }).(*FsGenState)
201}
202
203func checkDepModuleInMultipleNamespaces(mctx android.BottomUpMutatorContext, foundDeps multilibDeps, module string, partitionName string) {
204 otherNamespace := mctx.Namespace().Path
205 if val, found := foundDeps[module]; found && otherNamespace != "." && !android.InList(val.Namespace, []string{".", otherNamespace}) {
206 mctx.ModuleErrorf("found in multiple namespaces(%s and %s) when including in %s partition", val.Namespace, otherNamespace, partitionName)
207 }
208}
209
210func appendDepIfAppropriate(mctx android.BottomUpMutatorContext, deps *multilibDeps, installPartition string) {
Jihoon Kang81aeb9e2024-11-05 00:22:35 +0000211 moduleName := mctx.ModuleName()
212 checkDepModuleInMultipleNamespaces(mctx, *deps, moduleName, installPartition)
213 if _, ok := (*deps)[moduleName]; ok {
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000214 // Prefer the namespace-specific module over the platform module
215 if mctx.Namespace().Path != "." {
Jihoon Kang81aeb9e2024-11-05 00:22:35 +0000216 (*deps)[moduleName].Namespace = mctx.Namespace().Path
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000217 }
Jihoon Kang81aeb9e2024-11-05 00:22:35 +0000218 (*deps)[moduleName].Arch = append((*deps)[moduleName].Arch, mctx.Module().Target().Arch.ArchType)
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000219 } else {
220 multilib, _ := mctx.Module().DecodeMultilib(mctx)
Jihoon Kang81aeb9e2024-11-05 00:22:35 +0000221 (*deps)[moduleName] = &depCandidateProps{
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000222 Namespace: mctx.Namespace().Path,
223 Multilib: multilib,
224 Arch: []android.ArchType{mctx.Module().Target().Arch.ArchType},
225 }
226 }
227}
228
229func collectDepsMutator(mctx android.BottomUpMutatorContext) {
Cole Faust76a6e952024-11-07 16:56:45 -0800230 m := mctx.Module()
231 if m.Target().Os.Class != android.Device {
232 return
233 }
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000234 fsGenState := mctx.Config().Get(fsGenStateOnceKey).(*FsGenState)
235
Cole Faust76a6e952024-11-07 16:56:45 -0800236 fsGenState.fsDepsMutex.Lock()
237 defer fsGenState.fsDepsMutex.Unlock()
238
239 if slices.Contains(fsGenState.depCandidates, mctx.ModuleName()) {
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000240 installPartition := m.PartitionTag(mctx.DeviceConfig())
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000241 // Only add the module as dependency when:
242 // - its enabled
243 // - its namespace is included in PRODUCT_SOONG_NAMESPACES
244 if m.Enabled(mctx) && m.ExportedToMake() {
245 appendDepIfAppropriate(mctx, fsGenState.fsDeps[installPartition], installPartition)
246 }
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000247 }
248 // store the map of module to (required,overrides) even if the module is not in PRODUCT_PACKAGES.
249 // the module might be installed transitively.
Cole Faust76a6e952024-11-07 16:56:45 -0800250 if m.Enabled(mctx) && m.ExportedToMake() {
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000251 fsGenState.moduleToInstallationProps[m.Name()] = installationProperties{
252 Required: m.RequiredModuleNames(mctx),
253 Overrides: m.Overrides(),
254 }
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000255 }
256}
257
258type depsStruct struct {
259 Deps []string
260}
261
262type multilibDepsStruct struct {
263 Common depsStruct
264 Lib32 depsStruct
265 Lib64 depsStruct
266 Both depsStruct
267 Prefer32 depsStruct
268}
269
270type packagingPropsStruct struct {
271 High_priority_deps []string
272 Deps []string
273 Multilib multilibDepsStruct
274}
275
276func fullyQualifiedModuleName(moduleName, namespace string) string {
277 if namespace == "." {
278 return moduleName
279 }
280 return fmt.Sprintf("//%s:%s", namespace, moduleName)
281}
282
283func getBitness(archTypes []android.ArchType) (ret []string) {
284 for _, archType := range archTypes {
285 if archType.Multilib == "" {
286 ret = append(ret, android.COMMON_VARIANT)
287 } else {
288 ret = append(ret, archType.Bitness())
289 }
290 }
291 return ret
292}
293
294func setDepsMutator(mctx android.BottomUpMutatorContext) {
295 removeOverriddenDeps(mctx)
296 fsGenState := mctx.Config().Get(fsGenStateOnceKey).(*FsGenState)
297 fsDeps := fsGenState.fsDeps
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000298 m := mctx.Module()
Cole Faust76e8aa12025-01-27 18:21:31 -0800299 if partition := fsGenState.soongGeneratedPartitions.typeForName(m.Name()); partition != "" {
300 if fsGenState.soongGeneratedPartitions.isHandwritten(m.Name()) {
301 // Handwritten image, don't modify it
302 return
303 }
Jihoon Kang0d7b0112024-11-13 20:44:05 +0000304 depsStruct := generateDepStruct(*fsDeps[partition], fsGenState.generatedPrebuiltEtcModuleNames)
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000305 if err := proptools.AppendMatchingProperties(m.GetProperties(), depsStruct, nil); err != nil {
306 mctx.ModuleErrorf(err.Error())
307 }
308 }
309}
310
311// removeOverriddenDeps collects PRODUCT_PACKAGES and (transitive) required deps.
312// it then removes any modules which appear in `overrides` of the above list.
313func removeOverriddenDeps(mctx android.BottomUpMutatorContext) {
314 mctx.Config().Once(fsGenRemoveOverridesOnceKey, func() interface{} {
315 fsGenState := mctx.Config().Get(fsGenStateOnceKey).(*FsGenState)
316 fsDeps := fsGenState.fsDeps
317 overridden := map[string]bool{}
318 allDeps := []string{}
319
320 // Step 1: Initialization: Append PRODUCT_PACKAGES to the queue
321 for _, fsDep := range fsDeps {
322 for depName, _ := range *fsDep {
323 allDeps = append(allDeps, depName)
324 }
325 }
326
327 // Step 2: Process the queue, and add required modules to the queue.
328 i := 0
329 for {
330 if i == len(allDeps) {
331 break
332 }
333 depName := allDeps[i]
334 for _, overrides := range fsGenState.moduleToInstallationProps[depName].Overrides {
335 overridden[overrides] = true
336 }
337 // add required dep to the queue.
338 allDeps = append(allDeps, fsGenState.moduleToInstallationProps[depName].Required...)
339 i += 1
340 }
341
342 // Step 3: Delete all the overridden modules.
343 for overridden, _ := range overridden {
344 for partition, _ := range fsDeps {
345 delete(*fsDeps[partition], overridden)
346 }
347 }
348 return nil
349 })
350}
351
352var HighPriorityDeps = []string{}
353
Jihoon Kang3a8759c2024-11-08 19:35:09 +0000354func isHighPriorityDep(depName string) bool {
355 for _, highPriorityDeps := range HighPriorityDeps {
356 if strings.HasPrefix(depName, highPriorityDeps) {
357 return true
358 }
359 }
360 return false
361}
362
Jihoon Kang0d7b0112024-11-13 20:44:05 +0000363func generateDepStruct(deps map[string]*depCandidateProps, highPriorityDeps []string) *packagingPropsStruct {
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000364 depsStruct := packagingPropsStruct{}
365 for depName, depProps := range deps {
366 bitness := getBitness(depProps.Arch)
367 fullyQualifiedDepName := fullyQualifiedModuleName(depName, depProps.Namespace)
Jihoon Kang0d7b0112024-11-13 20:44:05 +0000368 if android.InList(depName, highPriorityDeps) {
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000369 depsStruct.High_priority_deps = append(depsStruct.High_priority_deps, fullyQualifiedDepName)
370 } else if android.InList("32", bitness) && android.InList("64", bitness) {
371 // If both 32 and 64 bit variants are enabled for this module
372 switch depProps.Multilib {
373 case string(android.MultilibBoth):
374 depsStruct.Multilib.Both.Deps = append(depsStruct.Multilib.Both.Deps, fullyQualifiedDepName)
375 case string(android.MultilibCommon), string(android.MultilibFirst):
376 depsStruct.Deps = append(depsStruct.Deps, fullyQualifiedDepName)
377 case "32":
378 depsStruct.Multilib.Lib32.Deps = append(depsStruct.Multilib.Lib32.Deps, fullyQualifiedDepName)
379 case "64", "darwin_universal":
380 depsStruct.Multilib.Lib64.Deps = append(depsStruct.Multilib.Lib64.Deps, fullyQualifiedDepName)
381 case "prefer32", "first_prefer32":
382 depsStruct.Multilib.Prefer32.Deps = append(depsStruct.Multilib.Prefer32.Deps, fullyQualifiedDepName)
383 default:
384 depsStruct.Multilib.Both.Deps = append(depsStruct.Multilib.Both.Deps, fullyQualifiedDepName)
385 }
386 } else if android.InList("64", bitness) {
387 // If only 64 bit variant is enabled
388 depsStruct.Multilib.Lib64.Deps = append(depsStruct.Multilib.Lib64.Deps, fullyQualifiedDepName)
389 } else if android.InList("32", bitness) {
390 // If only 32 bit variant is enabled
391 depsStruct.Multilib.Lib32.Deps = append(depsStruct.Multilib.Lib32.Deps, fullyQualifiedDepName)
392 } else {
393 // If only common variant is enabled
394 depsStruct.Multilib.Common.Deps = append(depsStruct.Multilib.Common.Deps, fullyQualifiedDepName)
395 }
396 }
397 depsStruct.Deps = android.SortedUniqueStrings(depsStruct.Deps)
398 depsStruct.Multilib.Lib32.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Lib32.Deps)
399 depsStruct.Multilib.Lib64.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Lib64.Deps)
400 depsStruct.Multilib.Prefer32.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Prefer32.Deps)
401 depsStruct.Multilib.Both.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Both.Deps)
402 depsStruct.Multilib.Common.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Common.Deps)
Cole Faust866c6032024-11-13 16:17:48 -0800403 depsStruct.High_priority_deps = android.SortedUniqueStrings(depsStruct.High_priority_deps)
Jihoon Kangadd2bb22024-11-05 22:29:34 +0000404
405 return &depsStruct
406}