1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2024 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 fsgen 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "slices" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker "sync" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 26*333d2b36SAndroid Build Coastguard Worker) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerfunc RegisterCollectFileSystemDepsMutators(ctx android.RegisterMutatorsContext) { 29*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("fs_collect_deps", collectDepsMutator).MutatesGlobalState() 30*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("fs_set_deps", setDepsMutator) 31*333d2b36SAndroid Build Coastguard Worker} 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workervar fsGenStateOnceKey = android.NewOnceKey("FsGenState") 34*333d2b36SAndroid Build Coastguard Workervar fsGenRemoveOverridesOnceKey = android.NewOnceKey("FsGenRemoveOverrides") 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker// Map of partition module name to its partition that may be generated by Soong. 37*333d2b36SAndroid Build Coastguard Worker// Note that it is not guaranteed that all modules returned by this function are successfully 38*333d2b36SAndroid Build Coastguard Worker// created. 39*333d2b36SAndroid Build Coastguard Workerfunc getAllSoongGeneratedPartitionNames(config android.Config, partitions []string) map[string]string { 40*333d2b36SAndroid Build Coastguard Worker ret := map[string]string{} 41*333d2b36SAndroid Build Coastguard Worker for _, partition := range partitions { 42*333d2b36SAndroid Build Coastguard Worker ret[generatedModuleNameForPartition(config, partition)] = partition 43*333d2b36SAndroid Build Coastguard Worker } 44*333d2b36SAndroid Build Coastguard Worker return ret 45*333d2b36SAndroid Build Coastguard Worker} 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Workertype depCandidateProps struct { 48*333d2b36SAndroid Build Coastguard Worker Namespace string 49*333d2b36SAndroid Build Coastguard Worker Multilib string 50*333d2b36SAndroid Build Coastguard Worker Arch []android.ArchType 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Worker// Map of module name to depCandidateProps 54*333d2b36SAndroid Build Coastguard Workertype multilibDeps map[string]*depCandidateProps 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker// Information necessary to generate the filesystem modules, including details about their 57*333d2b36SAndroid Build Coastguard Worker// dependencies 58*333d2b36SAndroid Build Coastguard Workertype FsGenState struct { 59*333d2b36SAndroid Build Coastguard Worker // List of modules in `PRODUCT_PACKAGES` and `PRODUCT_PACKAGES_DEBUG` 60*333d2b36SAndroid Build Coastguard Worker depCandidates []string 61*333d2b36SAndroid Build Coastguard Worker // Map of names of partition to the information of modules to be added as deps 62*333d2b36SAndroid Build Coastguard Worker fsDeps map[string]*multilibDeps 63*333d2b36SAndroid Build Coastguard Worker // List of name of partitions to be generated by the filesystem_creator module 64*333d2b36SAndroid Build Coastguard Worker soongGeneratedPartitions []string 65*333d2b36SAndroid Build Coastguard Worker // Mutex to protect the fsDeps 66*333d2b36SAndroid Build Coastguard Worker fsDepsMutex sync.Mutex 67*333d2b36SAndroid Build Coastguard Worker // Map of _all_ soong module names to their corresponding installation properties 68*333d2b36SAndroid Build Coastguard Worker moduleToInstallationProps map[string]installationProperties 69*333d2b36SAndroid Build Coastguard Worker // List of prebuilt_* modules that are autogenerated. 70*333d2b36SAndroid Build Coastguard Worker generatedPrebuiltEtcModuleNames []string 71*333d2b36SAndroid Build Coastguard Worker // Mapping from a path to an avb key to the name of a filegroup module that contains it 72*333d2b36SAndroid Build Coastguard Worker avbKeyFilegroups map[string]string 73*333d2b36SAndroid Build Coastguard Worker} 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workertype installationProperties struct { 76*333d2b36SAndroid Build Coastguard Worker Required []string 77*333d2b36SAndroid Build Coastguard Worker Overrides []string 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc defaultDepCandidateProps(config android.Config) *depCandidateProps { 81*333d2b36SAndroid Build Coastguard Worker return &depCandidateProps{ 82*333d2b36SAndroid Build Coastguard Worker Namespace: ".", 83*333d2b36SAndroid Build Coastguard Worker Arch: []android.ArchType{config.BuildArch}, 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Workerfunc createFsGenState(ctx android.LoadHookContext, generatedPrebuiltEtcModuleNames []string, avbpubkeyGenerated bool) *FsGenState { 88*333d2b36SAndroid Build Coastguard Worker return ctx.Config().Once(fsGenStateOnceKey, func() interface{} { 89*333d2b36SAndroid Build Coastguard Worker partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse 90*333d2b36SAndroid Build Coastguard Worker candidates := android.FirstUniqueStrings(android.Concat(partitionVars.ProductPackages, partitionVars.ProductPackagesDebug)) 91*333d2b36SAndroid Build Coastguard Worker candidates = android.Concat(candidates, generatedPrebuiltEtcModuleNames) 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker fsGenState := FsGenState{ 94*333d2b36SAndroid Build Coastguard Worker depCandidates: candidates, 95*333d2b36SAndroid Build Coastguard Worker fsDeps: map[string]*multilibDeps{ 96*333d2b36SAndroid Build Coastguard Worker // These additional deps are added according to the cuttlefish system image bp. 97*333d2b36SAndroid Build Coastguard Worker "system": { 98*333d2b36SAndroid Build Coastguard Worker // keep-sorted start 99*333d2b36SAndroid Build Coastguard Worker "com.android.apex.cts.shim.v1_prebuilt": defaultDepCandidateProps(ctx.Config()), 100*333d2b36SAndroid Build Coastguard Worker "dex_bootjars": defaultDepCandidateProps(ctx.Config()), 101*333d2b36SAndroid Build Coastguard Worker "framework_compatibility_matrix.device.xml": defaultDepCandidateProps(ctx.Config()), 102*333d2b36SAndroid Build Coastguard Worker "init.environ.rc-soong": defaultDepCandidateProps(ctx.Config()), 103*333d2b36SAndroid Build Coastguard Worker "libcompiler_rt": defaultDepCandidateProps(ctx.Config()), 104*333d2b36SAndroid Build Coastguard Worker "libdmabufheap": defaultDepCandidateProps(ctx.Config()), 105*333d2b36SAndroid Build Coastguard Worker "libgsi": defaultDepCandidateProps(ctx.Config()), 106*333d2b36SAndroid Build Coastguard Worker "llndk.libraries.txt": defaultDepCandidateProps(ctx.Config()), 107*333d2b36SAndroid Build Coastguard Worker "logpersist.start": defaultDepCandidateProps(ctx.Config()), 108*333d2b36SAndroid Build Coastguard Worker "update_engine_sideload": defaultDepCandidateProps(ctx.Config()), 109*333d2b36SAndroid Build Coastguard Worker // keep-sorted end 110*333d2b36SAndroid Build Coastguard Worker }, 111*333d2b36SAndroid Build Coastguard Worker "vendor": { 112*333d2b36SAndroid Build Coastguard Worker "fs_config_files_vendor": defaultDepCandidateProps(ctx.Config()), 113*333d2b36SAndroid Build Coastguard Worker "fs_config_dirs_vendor": defaultDepCandidateProps(ctx.Config()), 114*333d2b36SAndroid Build Coastguard Worker generatedModuleName(ctx.Config(), "vendor-build.prop"): defaultDepCandidateProps(ctx.Config()), 115*333d2b36SAndroid Build Coastguard Worker }, 116*333d2b36SAndroid Build Coastguard Worker "odm": { 117*333d2b36SAndroid Build Coastguard Worker // fs_config_* files are automatically installed for all products with odm partitions. 118*333d2b36SAndroid Build Coastguard Worker // https://cs.android.com/android/_/android/platform/build/+/e4849e87ab660b59a6501b3928693db065ee873b:tools/fs_config/Android.mk;l=34;drc=8d6481b92c4b4e9b9f31a61545b6862090fcc14b;bpv=1;bpt=0 119*333d2b36SAndroid Build Coastguard Worker "fs_config_files_odm": defaultDepCandidateProps(ctx.Config()), 120*333d2b36SAndroid Build Coastguard Worker "fs_config_dirs_odm": defaultDepCandidateProps(ctx.Config()), 121*333d2b36SAndroid Build Coastguard Worker }, 122*333d2b36SAndroid Build Coastguard Worker "product": {}, 123*333d2b36SAndroid Build Coastguard Worker "system_ext": { 124*333d2b36SAndroid Build Coastguard Worker // VNDK apexes are automatically included. 125*333d2b36SAndroid Build Coastguard Worker // This hardcoded list will need to be updated if `PRODUCT_EXTRA_VNDK_VERSIONS` is updated. 126*333d2b36SAndroid Build Coastguard Worker // https://cs.android.com/android/_/android/platform/build/+/adba533072b00c53ac0f198c550a3cbd7a00e4cd:core/main.mk;l=984;bpv=1;bpt=0;drc=174db7b179592cf07cbfd2adb0119486fda911e7 127*333d2b36SAndroid Build Coastguard Worker "com.android.vndk.v30": defaultDepCandidateProps(ctx.Config()), 128*333d2b36SAndroid Build Coastguard Worker "com.android.vndk.v31": defaultDepCandidateProps(ctx.Config()), 129*333d2b36SAndroid Build Coastguard Worker "com.android.vndk.v32": defaultDepCandidateProps(ctx.Config()), 130*333d2b36SAndroid Build Coastguard Worker "com.android.vndk.v33": defaultDepCandidateProps(ctx.Config()), 131*333d2b36SAndroid Build Coastguard Worker "com.android.vndk.v34": defaultDepCandidateProps(ctx.Config()), 132*333d2b36SAndroid Build Coastguard Worker }, 133*333d2b36SAndroid Build Coastguard Worker "userdata": {}, 134*333d2b36SAndroid Build Coastguard Worker "system_dlkm": { 135*333d2b36SAndroid Build Coastguard Worker // these are phony required deps of the phony fs_config_dirs_nonsystem 136*333d2b36SAndroid Build Coastguard Worker "fs_config_dirs_system_dlkm": defaultDepCandidateProps(ctx.Config()), 137*333d2b36SAndroid Build Coastguard Worker "fs_config_files_system_dlkm": defaultDepCandidateProps(ctx.Config()), 138*333d2b36SAndroid Build Coastguard Worker // build props are automatically added to `ALL_DEFAULT_INSTALLED_MODULES` 139*333d2b36SAndroid Build Coastguard Worker "system_dlkm-build.prop": defaultDepCandidateProps(ctx.Config()), 140*333d2b36SAndroid Build Coastguard Worker }, 141*333d2b36SAndroid Build Coastguard Worker "vendor_dlkm": { 142*333d2b36SAndroid Build Coastguard Worker "fs_config_dirs_vendor_dlkm": defaultDepCandidateProps(ctx.Config()), 143*333d2b36SAndroid Build Coastguard Worker "fs_config_files_vendor_dlkm": defaultDepCandidateProps(ctx.Config()), 144*333d2b36SAndroid Build Coastguard Worker "vendor_dlkm-build.prop": defaultDepCandidateProps(ctx.Config()), 145*333d2b36SAndroid Build Coastguard Worker }, 146*333d2b36SAndroid Build Coastguard Worker "odm_dlkm": { 147*333d2b36SAndroid Build Coastguard Worker "fs_config_dirs_odm_dlkm": defaultDepCandidateProps(ctx.Config()), 148*333d2b36SAndroid Build Coastguard Worker "fs_config_files_odm_dlkm": defaultDepCandidateProps(ctx.Config()), 149*333d2b36SAndroid Build Coastguard Worker "odm_dlkm-build.prop": defaultDepCandidateProps(ctx.Config()), 150*333d2b36SAndroid Build Coastguard Worker }, 151*333d2b36SAndroid Build Coastguard Worker "ramdisk": {}, 152*333d2b36SAndroid Build Coastguard Worker "vendor_ramdisk": {}, 153*333d2b36SAndroid Build Coastguard Worker "recovery": {}, 154*333d2b36SAndroid Build Coastguard Worker }, 155*333d2b36SAndroid Build Coastguard Worker fsDepsMutex: sync.Mutex{}, 156*333d2b36SAndroid Build Coastguard Worker moduleToInstallationProps: map[string]installationProperties{}, 157*333d2b36SAndroid Build Coastguard Worker generatedPrebuiltEtcModuleNames: generatedPrebuiltEtcModuleNames, 158*333d2b36SAndroid Build Coastguard Worker avbKeyFilegroups: map[string]string{}, 159*333d2b36SAndroid Build Coastguard Worker } 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Worker if avbpubkeyGenerated { 162*333d2b36SAndroid Build Coastguard Worker (*fsGenState.fsDeps["product"])["system_other_avbpubkey"] = defaultDepCandidateProps(ctx.Config()) 163*333d2b36SAndroid Build Coastguard Worker } 164*333d2b36SAndroid Build Coastguard Worker 165*333d2b36SAndroid Build Coastguard Worker // Add common resources `prebuilt_res` module as dep of recovery partition 166*333d2b36SAndroid Build Coastguard Worker (*fsGenState.fsDeps["recovery"])[fmt.Sprintf("recovery-resources-common-%s", getDpi(ctx))] = defaultDepCandidateProps(ctx.Config()) 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Worker return &fsGenState 169*333d2b36SAndroid Build Coastguard Worker }).(*FsGenState) 170*333d2b36SAndroid Build Coastguard Worker} 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Workerfunc checkDepModuleInMultipleNamespaces(mctx android.BottomUpMutatorContext, foundDeps multilibDeps, module string, partitionName string) { 173*333d2b36SAndroid Build Coastguard Worker otherNamespace := mctx.Namespace().Path 174*333d2b36SAndroid Build Coastguard Worker if val, found := foundDeps[module]; found && otherNamespace != "." && !android.InList(val.Namespace, []string{".", otherNamespace}) { 175*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf("found in multiple namespaces(%s and %s) when including in %s partition", val.Namespace, otherNamespace, partitionName) 176*333d2b36SAndroid Build Coastguard Worker } 177*333d2b36SAndroid Build Coastguard Worker} 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Workerfunc appendDepIfAppropriate(mctx android.BottomUpMutatorContext, deps *multilibDeps, installPartition string) { 180*333d2b36SAndroid Build Coastguard Worker moduleName := mctx.ModuleName() 181*333d2b36SAndroid Build Coastguard Worker checkDepModuleInMultipleNamespaces(mctx, *deps, moduleName, installPartition) 182*333d2b36SAndroid Build Coastguard Worker if _, ok := (*deps)[moduleName]; ok { 183*333d2b36SAndroid Build Coastguard Worker // Prefer the namespace-specific module over the platform module 184*333d2b36SAndroid Build Coastguard Worker if mctx.Namespace().Path != "." { 185*333d2b36SAndroid Build Coastguard Worker (*deps)[moduleName].Namespace = mctx.Namespace().Path 186*333d2b36SAndroid Build Coastguard Worker } 187*333d2b36SAndroid Build Coastguard Worker (*deps)[moduleName].Arch = append((*deps)[moduleName].Arch, mctx.Module().Target().Arch.ArchType) 188*333d2b36SAndroid Build Coastguard Worker } else { 189*333d2b36SAndroid Build Coastguard Worker multilib, _ := mctx.Module().DecodeMultilib(mctx) 190*333d2b36SAndroid Build Coastguard Worker (*deps)[moduleName] = &depCandidateProps{ 191*333d2b36SAndroid Build Coastguard Worker Namespace: mctx.Namespace().Path, 192*333d2b36SAndroid Build Coastguard Worker Multilib: multilib, 193*333d2b36SAndroid Build Coastguard Worker Arch: []android.ArchType{mctx.Module().Target().Arch.ArchType}, 194*333d2b36SAndroid Build Coastguard Worker } 195*333d2b36SAndroid Build Coastguard Worker } 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc collectDepsMutator(mctx android.BottomUpMutatorContext) { 199*333d2b36SAndroid Build Coastguard Worker m := mctx.Module() 200*333d2b36SAndroid Build Coastguard Worker if m.Target().Os.Class != android.Device { 201*333d2b36SAndroid Build Coastguard Worker return 202*333d2b36SAndroid Build Coastguard Worker } 203*333d2b36SAndroid Build Coastguard Worker fsGenState := mctx.Config().Get(fsGenStateOnceKey).(*FsGenState) 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker fsGenState.fsDepsMutex.Lock() 206*333d2b36SAndroid Build Coastguard Worker defer fsGenState.fsDepsMutex.Unlock() 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker if slices.Contains(fsGenState.depCandidates, mctx.ModuleName()) { 209*333d2b36SAndroid Build Coastguard Worker installPartition := m.PartitionTag(mctx.DeviceConfig()) 210*333d2b36SAndroid Build Coastguard Worker // Only add the module as dependency when: 211*333d2b36SAndroid Build Coastguard Worker // - its enabled 212*333d2b36SAndroid Build Coastguard Worker // - its namespace is included in PRODUCT_SOONG_NAMESPACES 213*333d2b36SAndroid Build Coastguard Worker if m.Enabled(mctx) && m.ExportedToMake() { 214*333d2b36SAndroid Build Coastguard Worker appendDepIfAppropriate(mctx, fsGenState.fsDeps[installPartition], installPartition) 215*333d2b36SAndroid Build Coastguard Worker } 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker // store the map of module to (required,overrides) even if the module is not in PRODUCT_PACKAGES. 218*333d2b36SAndroid Build Coastguard Worker // the module might be installed transitively. 219*333d2b36SAndroid Build Coastguard Worker if m.Enabled(mctx) && m.ExportedToMake() { 220*333d2b36SAndroid Build Coastguard Worker fsGenState.moduleToInstallationProps[m.Name()] = installationProperties{ 221*333d2b36SAndroid Build Coastguard Worker Required: m.RequiredModuleNames(mctx), 222*333d2b36SAndroid Build Coastguard Worker Overrides: m.Overrides(), 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker } 225*333d2b36SAndroid Build Coastguard Worker} 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Workertype depsStruct struct { 228*333d2b36SAndroid Build Coastguard Worker Deps []string 229*333d2b36SAndroid Build Coastguard Worker} 230*333d2b36SAndroid Build Coastguard Worker 231*333d2b36SAndroid Build Coastguard Workertype multilibDepsStruct struct { 232*333d2b36SAndroid Build Coastguard Worker Common depsStruct 233*333d2b36SAndroid Build Coastguard Worker Lib32 depsStruct 234*333d2b36SAndroid Build Coastguard Worker Lib64 depsStruct 235*333d2b36SAndroid Build Coastguard Worker Both depsStruct 236*333d2b36SAndroid Build Coastguard Worker Prefer32 depsStruct 237*333d2b36SAndroid Build Coastguard Worker} 238*333d2b36SAndroid Build Coastguard Worker 239*333d2b36SAndroid Build Coastguard Workertype packagingPropsStruct struct { 240*333d2b36SAndroid Build Coastguard Worker High_priority_deps []string 241*333d2b36SAndroid Build Coastguard Worker Deps []string 242*333d2b36SAndroid Build Coastguard Worker Multilib multilibDepsStruct 243*333d2b36SAndroid Build Coastguard Worker} 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Workerfunc fullyQualifiedModuleName(moduleName, namespace string) string { 246*333d2b36SAndroid Build Coastguard Worker if namespace == "." { 247*333d2b36SAndroid Build Coastguard Worker return moduleName 248*333d2b36SAndroid Build Coastguard Worker } 249*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf("//%s:%s", namespace, moduleName) 250*333d2b36SAndroid Build Coastguard Worker} 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Workerfunc getBitness(archTypes []android.ArchType) (ret []string) { 253*333d2b36SAndroid Build Coastguard Worker for _, archType := range archTypes { 254*333d2b36SAndroid Build Coastguard Worker if archType.Multilib == "" { 255*333d2b36SAndroid Build Coastguard Worker ret = append(ret, android.COMMON_VARIANT) 256*333d2b36SAndroid Build Coastguard Worker } else { 257*333d2b36SAndroid Build Coastguard Worker ret = append(ret, archType.Bitness()) 258*333d2b36SAndroid Build Coastguard Worker } 259*333d2b36SAndroid Build Coastguard Worker } 260*333d2b36SAndroid Build Coastguard Worker return ret 261*333d2b36SAndroid Build Coastguard Worker} 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Workerfunc setDepsMutator(mctx android.BottomUpMutatorContext) { 264*333d2b36SAndroid Build Coastguard Worker removeOverriddenDeps(mctx) 265*333d2b36SAndroid Build Coastguard Worker fsGenState := mctx.Config().Get(fsGenStateOnceKey).(*FsGenState) 266*333d2b36SAndroid Build Coastguard Worker fsDeps := fsGenState.fsDeps 267*333d2b36SAndroid Build Coastguard Worker soongGeneratedPartitionMap := getAllSoongGeneratedPartitionNames(mctx.Config(), fsGenState.soongGeneratedPartitions) 268*333d2b36SAndroid Build Coastguard Worker m := mctx.Module() 269*333d2b36SAndroid Build Coastguard Worker if partition, ok := soongGeneratedPartitionMap[m.Name()]; ok { 270*333d2b36SAndroid Build Coastguard Worker depsStruct := generateDepStruct(*fsDeps[partition], fsGenState.generatedPrebuiltEtcModuleNames) 271*333d2b36SAndroid Build Coastguard Worker if err := proptools.AppendMatchingProperties(m.GetProperties(), depsStruct, nil); err != nil { 272*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf(err.Error()) 273*333d2b36SAndroid Build Coastguard Worker } 274*333d2b36SAndroid Build Coastguard Worker } 275*333d2b36SAndroid Build Coastguard Worker} 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker// removeOverriddenDeps collects PRODUCT_PACKAGES and (transitive) required deps. 278*333d2b36SAndroid Build Coastguard Worker// it then removes any modules which appear in `overrides` of the above list. 279*333d2b36SAndroid Build Coastguard Workerfunc removeOverriddenDeps(mctx android.BottomUpMutatorContext) { 280*333d2b36SAndroid Build Coastguard Worker mctx.Config().Once(fsGenRemoveOverridesOnceKey, func() interface{} { 281*333d2b36SAndroid Build Coastguard Worker fsGenState := mctx.Config().Get(fsGenStateOnceKey).(*FsGenState) 282*333d2b36SAndroid Build Coastguard Worker fsDeps := fsGenState.fsDeps 283*333d2b36SAndroid Build Coastguard Worker overridden := map[string]bool{} 284*333d2b36SAndroid Build Coastguard Worker allDeps := []string{} 285*333d2b36SAndroid Build Coastguard Worker 286*333d2b36SAndroid Build Coastguard Worker // Step 1: Initialization: Append PRODUCT_PACKAGES to the queue 287*333d2b36SAndroid Build Coastguard Worker for _, fsDep := range fsDeps { 288*333d2b36SAndroid Build Coastguard Worker for depName, _ := range *fsDep { 289*333d2b36SAndroid Build Coastguard Worker allDeps = append(allDeps, depName) 290*333d2b36SAndroid Build Coastguard Worker } 291*333d2b36SAndroid Build Coastguard Worker } 292*333d2b36SAndroid Build Coastguard Worker 293*333d2b36SAndroid Build Coastguard Worker // Step 2: Process the queue, and add required modules to the queue. 294*333d2b36SAndroid Build Coastguard Worker i := 0 295*333d2b36SAndroid Build Coastguard Worker for { 296*333d2b36SAndroid Build Coastguard Worker if i == len(allDeps) { 297*333d2b36SAndroid Build Coastguard Worker break 298*333d2b36SAndroid Build Coastguard Worker } 299*333d2b36SAndroid Build Coastguard Worker depName := allDeps[i] 300*333d2b36SAndroid Build Coastguard Worker for _, overrides := range fsGenState.moduleToInstallationProps[depName].Overrides { 301*333d2b36SAndroid Build Coastguard Worker overridden[overrides] = true 302*333d2b36SAndroid Build Coastguard Worker } 303*333d2b36SAndroid Build Coastguard Worker // add required dep to the queue. 304*333d2b36SAndroid Build Coastguard Worker allDeps = append(allDeps, fsGenState.moduleToInstallationProps[depName].Required...) 305*333d2b36SAndroid Build Coastguard Worker i += 1 306*333d2b36SAndroid Build Coastguard Worker } 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker // Step 3: Delete all the overridden modules. 309*333d2b36SAndroid Build Coastguard Worker for overridden, _ := range overridden { 310*333d2b36SAndroid Build Coastguard Worker for partition, _ := range fsDeps { 311*333d2b36SAndroid Build Coastguard Worker delete(*fsDeps[partition], overridden) 312*333d2b36SAndroid Build Coastguard Worker } 313*333d2b36SAndroid Build Coastguard Worker } 314*333d2b36SAndroid Build Coastguard Worker return nil 315*333d2b36SAndroid Build Coastguard Worker }) 316*333d2b36SAndroid Build Coastguard Worker} 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Workervar HighPriorityDeps = []string{} 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Workerfunc isHighPriorityDep(depName string) bool { 321*333d2b36SAndroid Build Coastguard Worker for _, highPriorityDeps := range HighPriorityDeps { 322*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(depName, highPriorityDeps) { 323*333d2b36SAndroid Build Coastguard Worker return true 324*333d2b36SAndroid Build Coastguard Worker } 325*333d2b36SAndroid Build Coastguard Worker } 326*333d2b36SAndroid Build Coastguard Worker return false 327*333d2b36SAndroid Build Coastguard Worker} 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Workerfunc generateDepStruct(deps map[string]*depCandidateProps, highPriorityDeps []string) *packagingPropsStruct { 330*333d2b36SAndroid Build Coastguard Worker depsStruct := packagingPropsStruct{} 331*333d2b36SAndroid Build Coastguard Worker for depName, depProps := range deps { 332*333d2b36SAndroid Build Coastguard Worker bitness := getBitness(depProps.Arch) 333*333d2b36SAndroid Build Coastguard Worker fullyQualifiedDepName := fullyQualifiedModuleName(depName, depProps.Namespace) 334*333d2b36SAndroid Build Coastguard Worker if android.InList(depName, highPriorityDeps) { 335*333d2b36SAndroid Build Coastguard Worker depsStruct.High_priority_deps = append(depsStruct.High_priority_deps, fullyQualifiedDepName) 336*333d2b36SAndroid Build Coastguard Worker } else if android.InList("32", bitness) && android.InList("64", bitness) { 337*333d2b36SAndroid Build Coastguard Worker // If both 32 and 64 bit variants are enabled for this module 338*333d2b36SAndroid Build Coastguard Worker switch depProps.Multilib { 339*333d2b36SAndroid Build Coastguard Worker case string(android.MultilibBoth): 340*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Both.Deps = append(depsStruct.Multilib.Both.Deps, fullyQualifiedDepName) 341*333d2b36SAndroid Build Coastguard Worker case string(android.MultilibCommon), string(android.MultilibFirst): 342*333d2b36SAndroid Build Coastguard Worker depsStruct.Deps = append(depsStruct.Deps, fullyQualifiedDepName) 343*333d2b36SAndroid Build Coastguard Worker case "32": 344*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Lib32.Deps = append(depsStruct.Multilib.Lib32.Deps, fullyQualifiedDepName) 345*333d2b36SAndroid Build Coastguard Worker case "64", "darwin_universal": 346*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Lib64.Deps = append(depsStruct.Multilib.Lib64.Deps, fullyQualifiedDepName) 347*333d2b36SAndroid Build Coastguard Worker case "prefer32", "first_prefer32": 348*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Prefer32.Deps = append(depsStruct.Multilib.Prefer32.Deps, fullyQualifiedDepName) 349*333d2b36SAndroid Build Coastguard Worker default: 350*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Both.Deps = append(depsStruct.Multilib.Both.Deps, fullyQualifiedDepName) 351*333d2b36SAndroid Build Coastguard Worker } 352*333d2b36SAndroid Build Coastguard Worker } else if android.InList("64", bitness) { 353*333d2b36SAndroid Build Coastguard Worker // If only 64 bit variant is enabled 354*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Lib64.Deps = append(depsStruct.Multilib.Lib64.Deps, fullyQualifiedDepName) 355*333d2b36SAndroid Build Coastguard Worker } else if android.InList("32", bitness) { 356*333d2b36SAndroid Build Coastguard Worker // If only 32 bit variant is enabled 357*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Lib32.Deps = append(depsStruct.Multilib.Lib32.Deps, fullyQualifiedDepName) 358*333d2b36SAndroid Build Coastguard Worker } else { 359*333d2b36SAndroid Build Coastguard Worker // If only common variant is enabled 360*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Common.Deps = append(depsStruct.Multilib.Common.Deps, fullyQualifiedDepName) 361*333d2b36SAndroid Build Coastguard Worker } 362*333d2b36SAndroid Build Coastguard Worker } 363*333d2b36SAndroid Build Coastguard Worker depsStruct.Deps = android.SortedUniqueStrings(depsStruct.Deps) 364*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Lib32.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Lib32.Deps) 365*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Lib64.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Lib64.Deps) 366*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Prefer32.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Prefer32.Deps) 367*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Both.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Both.Deps) 368*333d2b36SAndroid Build Coastguard Worker depsStruct.Multilib.Common.Deps = android.SortedUniqueStrings(depsStruct.Multilib.Common.Deps) 369*333d2b36SAndroid Build Coastguard Worker depsStruct.High_priority_deps = android.SortedUniqueStrings(depsStruct.High_priority_deps) 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker return &depsStruct 372*333d2b36SAndroid Build Coastguard Worker} 373