xref: /aosp_15_r20/build/soong/fsgen/fsgen_mutators.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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