xref: /aosp_15_r20/build/soong/etc/prebuilt_etc.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1// Copyright 2016 Google Inc. All rights reserved.
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 etc
16
17// This file implements module types that install prebuilt artifacts.
18//
19// There exist two classes of prebuilt modules in the Android tree. The first class are the ones
20// based on `android.Prebuilt`, such as `cc_prebuilt_library` and `java_import`. This kind of
21// modules may exist both as prebuilts and source at the same time, though only one would be
22// installed and the other would be marked disabled. The `prebuilt_postdeps` mutator would select
23// the actual modules to be installed. More details in android/prebuilt.go.
24//
25// The second class is described in this file. Unlike `android.Prebuilt` based module types,
26// `prebuilt_etc` exist only as prebuilts and cannot have a same-named source module counterpart.
27// This makes the logic of `prebuilt_etc` to be much simpler as they don't need to go through the
28// various `prebuilt_*` mutators.
29
30import (
31	"fmt"
32	"path/filepath"
33	"strings"
34
35	"github.com/google/blueprint/proptools"
36
37	"android/soong/android"
38)
39
40var pctx = android.NewPackageContext("android/soong/etc")
41
42// TODO(jungw): Now that it handles more than the ones in etc/, consider renaming this file.
43
44func init() {
45	pctx.Import("android/soong/android")
46	RegisterPrebuiltEtcBuildComponents(android.InitRegistrationContext)
47}
48
49func RegisterPrebuiltEtcBuildComponents(ctx android.RegistrationContext) {
50	ctx.RegisterModuleType("prebuilt_etc", PrebuiltEtcFactory)
51	ctx.RegisterModuleType("prebuilt_etc_host", PrebuiltEtcHostFactory)
52	ctx.RegisterModuleType("prebuilt_etc_cacerts", PrebuiltEtcCaCertsFactory)
53	ctx.RegisterModuleType("prebuilt_avb", PrebuiltAvbFactory)
54	ctx.RegisterModuleType("prebuilt_root", PrebuiltRootFactory)
55	ctx.RegisterModuleType("prebuilt_root_host", PrebuiltRootHostFactory)
56	ctx.RegisterModuleType("prebuilt_usr_share", PrebuiltUserShareFactory)
57	ctx.RegisterModuleType("prebuilt_usr_share_host", PrebuiltUserShareHostFactory)
58	ctx.RegisterModuleType("prebuilt_usr_hyphendata", PrebuiltUserHyphenDataFactory)
59	ctx.RegisterModuleType("prebuilt_usr_keylayout", PrebuiltUserKeyLayoutFactory)
60	ctx.RegisterModuleType("prebuilt_usr_keychars", PrebuiltUserKeyCharsFactory)
61	ctx.RegisterModuleType("prebuilt_usr_idc", PrebuiltUserIdcFactory)
62	ctx.RegisterModuleType("prebuilt_usr_srec", PrebuiltUserSrecFactory)
63	ctx.RegisterModuleType("prebuilt_font", PrebuiltFontFactory)
64	ctx.RegisterModuleType("prebuilt_overlay", PrebuiltOverlayFactory)
65	ctx.RegisterModuleType("prebuilt_firmware", PrebuiltFirmwareFactory)
66	ctx.RegisterModuleType("prebuilt_dsp", PrebuiltDSPFactory)
67	ctx.RegisterModuleType("prebuilt_rfsa", PrebuiltRFSAFactory)
68	ctx.RegisterModuleType("prebuilt_renderscript_bitcode", PrebuiltRenderScriptBitcodeFactory)
69	ctx.RegisterModuleType("prebuilt_media", PrebuiltMediaFactory)
70	ctx.RegisterModuleType("prebuilt_voicepack", PrebuiltVoicepackFactory)
71	ctx.RegisterModuleType("prebuilt_bin", PrebuiltBinaryFactory)
72	ctx.RegisterModuleType("prebuilt_wallpaper", PrebuiltWallpaperFactory)
73	ctx.RegisterModuleType("prebuilt_priv_app", PrebuiltPrivAppFactory)
74	ctx.RegisterModuleType("prebuilt_rfs", PrebuiltRfsFactory)
75	ctx.RegisterModuleType("prebuilt_framework", PrebuiltFrameworkFactory)
76	ctx.RegisterModuleType("prebuilt_res", PrebuiltResFactory)
77	ctx.RegisterModuleType("prebuilt_wlc_upt", PrebuiltWlcUptFactory)
78	ctx.RegisterModuleType("prebuilt_odm", PrebuiltOdmFactory)
79	ctx.RegisterModuleType("prebuilt_vendor_dlkm", PrebuiltVendorDlkmFactory)
80	ctx.RegisterModuleType("prebuilt_bt_firmware", PrebuiltBtFirmwareFactory)
81	ctx.RegisterModuleType("prebuilt_tvservice", PrebuiltTvServiceFactory)
82	ctx.RegisterModuleType("prebuilt_optee", PrebuiltOpteeFactory)
83	ctx.RegisterModuleType("prebuilt_tvconfig", PrebuiltTvConfigFactory)
84	ctx.RegisterModuleType("prebuilt_vendor", PrebuiltVendorFactory)
85	ctx.RegisterModuleType("prebuilt_sbin", PrebuiltSbinFactory)
86	ctx.RegisterModuleType("prebuilt_system", PrebuiltSystemFactory)
87	ctx.RegisterModuleType("prebuilt_first_stage_ramdisk", PrebuiltFirstStageRamdiskFactory)
88
89	ctx.RegisterModuleType("prebuilt_defaults", defaultsFactory)
90
91}
92
93var PrepareForTestWithPrebuiltEtc = android.FixtureRegisterWithContext(RegisterPrebuiltEtcBuildComponents)
94
95type PrebuiltEtcProperties struct {
96	// Source file of this prebuilt. Can reference a genrule type module with the ":module" syntax.
97	// Mutually exclusive with srcs.
98	Src proptools.Configurable[string] `android:"path,arch_variant,replace_instead_of_append"`
99
100	// Source files of this prebuilt. Can reference a genrule type module with the ":module" syntax.
101	// Mutually exclusive with src. When used, filename_from_src is set to true unless dsts is also
102	// set. May use globs in filenames.
103	Srcs proptools.Configurable[[]string] `android:"path,arch_variant"`
104
105	// Destination files of this prebuilt. Requires srcs to be used and causes srcs not to implicitly
106	// set filename_from_src. This can be used to install each source file to a different directory
107	// and/or change filenames when files are installed. Must be exactly one entry per source file,
108	// which means care must be taken if srcs has globs.
109	Dsts proptools.Configurable[[]string] `android:"path,arch_variant"`
110
111	// Optional name for the installed file. If unspecified, name of the module is used as the file
112	// name. Only available when using a single source (src).
113	Filename *string `android:"arch_variant"`
114
115	// When set to true, and filename property is not set, the name for the installed file
116	// is the same as the file name of the source file.
117	Filename_from_src *bool `android:"arch_variant"`
118
119	// Make this module available when building for ramdisk.
120	// On device without a dedicated recovery partition, the module is only
121	// available after switching root into
122	// /first_stage_ramdisk. To expose the module before switching root, install
123	// the recovery variant instead.
124	Ramdisk_available *bool
125
126	// Make this module available when building for vendor ramdisk.
127	// On device without a dedicated recovery partition, the module is only
128	// available after switching root into
129	// /first_stage_ramdisk. To expose the module before switching root, install
130	// the recovery variant instead.
131	Vendor_ramdisk_available *bool
132
133	// Make this module available when building for debug ramdisk.
134	Debug_ramdisk_available *bool
135
136	// Make this module available when building for recovery.
137	Recovery_available *bool
138
139	// Whether this module is directly installable to one of the partitions. Default: true.
140	Installable *bool
141
142	// Install symlinks to the installed file.
143	Symlinks []string `android:"arch_variant"`
144
145	// Install to partition oem when set to true.
146	Oem_specific *bool `android:"arch_variant"`
147}
148
149type prebuiltSubdirProperties struct {
150	// Optional subdirectory under which this file is installed into, cannot be specified with
151	// relative_install_path, prefer relative_install_path.
152	Sub_dir *string `android:"arch_variant"`
153
154	// Optional subdirectory under which this file is installed into, cannot be specified with
155	// sub_dir.
156	Relative_install_path *string `android:"arch_variant"`
157}
158
159type prebuiltRootProperties struct {
160	// Install this module to the root directory, without partition subdirs.  When this module is
161	// added to PRODUCT_PACKAGES, this module will be installed to $PRODUCT_OUT/root, which will
162	// then be copied to the root of system.img. When this module is packaged by other modules like
163	// android_filesystem, this module will be installed to the root ("/"), unlike normal
164	// prebuilt_root modules which are installed to the partition subdir (e.g. "/system/").
165	Install_in_root *bool
166}
167
168type PrebuiltEtcModule interface {
169	android.Module
170
171	// Returns the base install directory, such as "etc", "usr/share".
172	BaseDir() string
173
174	// Returns the sub install directory relative to BaseDir().
175	SubDir() string
176}
177
178type PrebuiltEtc struct {
179	android.ModuleBase
180	android.DefaultableModuleBase
181
182	properties PrebuiltEtcProperties
183
184	// rootProperties is used to return the value of the InstallInRoot() method. Currently, only
185	// prebuilt_avb and prebuilt_root modules use this.
186	rootProperties prebuiltRootProperties
187
188	subdirProperties prebuiltSubdirProperties
189
190	sourceFilePaths android.Paths
191	outputFilePaths android.WritablePaths
192	// The base install location, e.g. "etc" for prebuilt_etc, "usr/share" for prebuilt_usr_share.
193	installDirBase               string
194	installDirBase64             string
195	installAvoidMultilibConflict bool
196	// The base install location when soc_specific property is set to true, e.g. "firmware" for
197	// prebuilt_firmware.
198	socInstallDirBase      string
199	installDirPaths        []android.InstallPath
200	additionalDependencies *android.Paths
201
202	usedSrcsProperty bool
203
204	makeClass string
205}
206
207type Defaults struct {
208	android.ModuleBase
209	android.DefaultsModuleBase
210}
211
212func (p *PrebuiltEtc) inRamdisk() bool {
213	return p.ModuleBase.InRamdisk() || p.ModuleBase.InstallInRamdisk()
214}
215
216func (p *PrebuiltEtc) onlyInRamdisk() bool {
217	return p.ModuleBase.InstallInRamdisk()
218}
219
220func (p *PrebuiltEtc) InstallInRamdisk() bool {
221	return p.inRamdisk()
222}
223
224func (p *PrebuiltEtc) inVendorRamdisk() bool {
225	return p.ModuleBase.InVendorRamdisk() || p.ModuleBase.InstallInVendorRamdisk()
226}
227
228func (p *PrebuiltEtc) onlyInVendorRamdisk() bool {
229	return p.ModuleBase.InstallInVendorRamdisk()
230}
231
232func (p *PrebuiltEtc) InstallInVendorRamdisk() bool {
233	return p.inVendorRamdisk()
234}
235
236func (p *PrebuiltEtc) inDebugRamdisk() bool {
237	return p.ModuleBase.InDebugRamdisk() || p.ModuleBase.InstallInDebugRamdisk()
238}
239
240func (p *PrebuiltEtc) onlyInDebugRamdisk() bool {
241	return p.ModuleBase.InstallInDebugRamdisk()
242}
243
244func (p *PrebuiltEtc) InstallInDebugRamdisk() bool {
245	return p.inDebugRamdisk()
246}
247
248func (p *PrebuiltEtc) InRecovery() bool {
249	return p.ModuleBase.InRecovery() || p.ModuleBase.InstallInRecovery()
250}
251
252func (p *PrebuiltEtc) onlyInRecovery() bool {
253	return p.ModuleBase.InstallInRecovery()
254}
255
256func (p *PrebuiltEtc) InstallInRecovery() bool {
257	return p.InRecovery()
258}
259
260var _ android.ImageInterface = (*PrebuiltEtc)(nil)
261
262func (p *PrebuiltEtc) ImageMutatorBegin(ctx android.ImageInterfaceContext) {}
263
264func (p *PrebuiltEtc) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool {
265	return false
266}
267
268func (p *PrebuiltEtc) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool {
269	return false
270}
271
272func (p *PrebuiltEtc) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool {
273	return !p.ModuleBase.InstallInRecovery() && !p.ModuleBase.InstallInRamdisk() &&
274		!p.ModuleBase.InstallInVendorRamdisk() && !p.ModuleBase.InstallInDebugRamdisk()
275}
276
277func (p *PrebuiltEtc) RamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool {
278	return proptools.Bool(p.properties.Ramdisk_available) || p.ModuleBase.InstallInRamdisk()
279}
280
281func (p *PrebuiltEtc) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool {
282	return proptools.Bool(p.properties.Vendor_ramdisk_available) || p.ModuleBase.InstallInVendorRamdisk()
283}
284
285func (p *PrebuiltEtc) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool {
286	return proptools.Bool(p.properties.Debug_ramdisk_available) || p.ModuleBase.InstallInDebugRamdisk()
287}
288
289func (p *PrebuiltEtc) InstallInRoot() bool {
290	return proptools.Bool(p.rootProperties.Install_in_root)
291}
292
293func (p *PrebuiltEtc) RecoveryVariantNeeded(ctx android.ImageInterfaceContext) bool {
294	return proptools.Bool(p.properties.Recovery_available) || p.ModuleBase.InstallInRecovery()
295}
296
297func (p *PrebuiltEtc) ExtraImageVariations(ctx android.ImageInterfaceContext) []string {
298	return nil
299}
300
301func (p *PrebuiltEtc) SetImageVariation(ctx android.ImageInterfaceContext, variation string) {
302}
303
304func (p *PrebuiltEtc) SourceFilePath(ctx android.ModuleContext) android.Path {
305	if len(p.properties.Srcs.GetOrDefault(ctx, nil)) > 0 {
306		panic(fmt.Errorf("SourceFilePath not available on multi-source prebuilt %q", p.Name()))
307	}
308	return android.PathForModuleSrc(ctx, p.properties.Src.GetOrDefault(ctx, ""))
309}
310
311func (p *PrebuiltEtc) InstallDirPath() android.InstallPath {
312	if len(p.installDirPaths) != 1 {
313		panic(fmt.Errorf("InstallDirPath not available on multi-source prebuilt %q", p.Name()))
314	}
315	return p.installDirPaths[0]
316}
317
318// This allows other derivative modules (e.g. prebuilt_etc_xml) to perform
319// additional steps (like validating the src) before the file is installed.
320func (p *PrebuiltEtc) SetAdditionalDependencies(paths android.Paths) {
321	p.additionalDependencies = &paths
322}
323
324func (p *PrebuiltEtc) OutputFile() android.Path {
325	if p.usedSrcsProperty {
326		panic(fmt.Errorf("OutputFile not available on multi-source prebuilt %q", p.Name()))
327	}
328	return p.outputFilePaths[0]
329}
330
331func (p *PrebuiltEtc) SubDir() string {
332	if subDir := proptools.String(p.subdirProperties.Sub_dir); subDir != "" {
333		return subDir
334	}
335	return proptools.String(p.subdirProperties.Relative_install_path)
336}
337
338func (p *PrebuiltEtc) BaseDir() string {
339	return p.installDirBase
340}
341
342func (p *PrebuiltEtc) Installable() bool {
343	return p.properties.Installable == nil || proptools.Bool(p.properties.Installable)
344}
345
346func (p *PrebuiltEtc) InVendor() bool {
347	return p.ModuleBase.InstallInVendor()
348}
349
350func (p *PrebuiltEtc) installBaseDir(ctx android.ModuleContext) string {
351	// If soc install dir was specified and SOC specific is set, set the installDirPath to the
352	// specified socInstallDirBase.
353	installBaseDir := p.installDirBase
354	if p.Target().Arch.ArchType.Multilib == "lib64" && p.installDirBase64 != "" {
355		installBaseDir = p.installDirBase64
356	}
357	if p.SocSpecific() && p.socInstallDirBase != "" {
358		installBaseDir = p.socInstallDirBase
359	}
360	if p.installAvoidMultilibConflict && !ctx.Host() && ctx.Config().HasMultilibConflict(ctx.Arch().ArchType) {
361		installBaseDir = filepath.Join(installBaseDir, ctx.Arch().ArchType.String())
362	}
363	return installBaseDir
364}
365
366func (p *PrebuiltEtc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
367	var installs []installProperties
368
369	srcProperty := p.properties.Src.Get(ctx)
370	srcsProperty := p.properties.Srcs.GetOrDefault(ctx, nil)
371	if srcProperty.IsPresent() && len(srcsProperty) > 0 {
372		ctx.PropertyErrorf("src", "src is set. Cannot set srcs")
373	}
374	dstsProperty := p.properties.Dsts.GetOrDefault(ctx, nil)
375	if len(dstsProperty) > 0 && len(srcsProperty) == 0 {
376		ctx.PropertyErrorf("dsts", "dsts is set. Must use srcs")
377	}
378
379	// Check that `sub_dir` and `relative_install_path` are not set at the same time.
380	if p.subdirProperties.Sub_dir != nil && p.subdirProperties.Relative_install_path != nil {
381		ctx.PropertyErrorf("sub_dir", "relative_install_path is set. Cannot set sub_dir")
382	}
383	baseInstallDirPath := android.PathForModuleInstall(ctx, p.installBaseDir(ctx), p.SubDir())
384	// TODO(b/377304441)
385	if android.Bool(p.properties.Oem_specific) {
386		baseInstallDirPath = android.PathForModuleInPartitionInstall(ctx, ctx.DeviceConfig().OemPath(), p.installBaseDir(ctx), p.SubDir())
387	}
388
389	filename := proptools.String(p.properties.Filename)
390	filenameFromSrc := proptools.Bool(p.properties.Filename_from_src)
391	if srcProperty.IsPresent() {
392		p.sourceFilePaths = android.PathsForModuleSrc(ctx, []string{srcProperty.Get()})
393		// If the source was not found, set a fake source path to
394		// support AllowMissingDependencies executions.
395		if len(p.sourceFilePaths) == 0 {
396			p.sourceFilePaths = android.Paths{android.PathForModuleSrc(ctx)}
397		}
398
399		// Determine the output file basename.
400		// If Filename is set, use the name specified by the property.
401		// If Filename_from_src is set, use the source file name.
402		// Otherwise use the module name.
403		if filename != "" {
404			if filenameFromSrc {
405				ctx.PropertyErrorf("filename_from_src", "filename is set. filename_from_src can't be true")
406				return
407			}
408		} else if filenameFromSrc {
409			filename = p.sourceFilePaths[0].Base()
410		} else {
411			filename = ctx.ModuleName()
412		}
413		if strings.Contains(filename, "/") {
414			ctx.PropertyErrorf("filename", "filename cannot contain separator '/'")
415			return
416		}
417		p.outputFilePaths = android.WritablePaths{android.PathForModuleOut(ctx, filename)}
418
419		ip := installProperties{
420			filename:       filename,
421			sourceFilePath: p.sourceFilePaths[0],
422			outputFilePath: p.outputFilePaths[0],
423			installDirPath: baseInstallDirPath,
424			symlinks:       p.properties.Symlinks,
425		}
426		installs = append(installs, ip)
427		p.installDirPaths = append(p.installDirPaths, baseInstallDirPath)
428	} else if len(srcsProperty) > 0 {
429		p.usedSrcsProperty = true
430		if filename != "" {
431			ctx.PropertyErrorf("filename", "filename cannot be set when using srcs")
432		}
433		if len(p.properties.Symlinks) > 0 {
434			ctx.PropertyErrorf("symlinks", "symlinks cannot be set when using srcs")
435		}
436		if p.properties.Filename_from_src != nil {
437			if len(dstsProperty) > 0 {
438				ctx.PropertyErrorf("filename_from_src", "dsts is set. Cannot set filename_from_src")
439			} else {
440				ctx.PropertyErrorf("filename_from_src", "filename_from_src is implicitly set to true when using srcs")
441			}
442		}
443		p.sourceFilePaths = android.PathsForModuleSrc(ctx, srcsProperty)
444		if len(dstsProperty) > 0 && len(p.sourceFilePaths) != len(dstsProperty) {
445			ctx.PropertyErrorf("dsts", "Must have one entry in dsts per source file")
446		}
447		for i, src := range p.sourceFilePaths {
448			var filename string
449			var installDirPath android.InstallPath
450
451			if len(dstsProperty) > 0 {
452				var dstdir string
453
454				dstdir, filename = filepath.Split(dstsProperty[i])
455				installDirPath = baseInstallDirPath.Join(ctx, dstdir)
456			} else {
457				filename = src.Base()
458				installDirPath = baseInstallDirPath
459			}
460			output := android.PathForModuleOut(ctx, filename)
461			ip := installProperties{
462				filename:       filename,
463				sourceFilePath: src,
464				outputFilePath: output,
465				installDirPath: installDirPath,
466			}
467			p.outputFilePaths = append(p.outputFilePaths, output)
468			installs = append(installs, ip)
469			p.installDirPaths = append(p.installDirPaths, installDirPath)
470		}
471	} else if ctx.Config().AllowMissingDependencies() {
472		// If no srcs was set and AllowMissingDependencies is enabled then
473		// mark the module as missing dependencies and set a fake source path
474		// and file name.
475		ctx.AddMissingDependencies([]string{"MISSING_PREBUILT_SRC_FILE"})
476		p.sourceFilePaths = android.Paths{android.PathForModuleSrc(ctx)}
477		if filename == "" {
478			filename = ctx.ModuleName()
479		}
480		p.outputFilePaths = android.WritablePaths{android.PathForModuleOut(ctx, filename)}
481		ip := installProperties{
482			filename:       filename,
483			sourceFilePath: p.sourceFilePaths[0],
484			outputFilePath: p.outputFilePaths[0],
485			installDirPath: baseInstallDirPath,
486		}
487		installs = append(installs, ip)
488		p.installDirPaths = append(p.installDirPaths, baseInstallDirPath)
489	} else {
490		ctx.PropertyErrorf("src", "missing prebuilt source file")
491		return
492	}
493
494	// Call InstallFile even when uninstallable to make the module included in the package.
495	if !p.Installable() {
496		p.SkipInstall()
497	}
498	for _, ip := range installs {
499		ip.addInstallRules(ctx)
500	}
501
502	ctx.SetOutputFiles(p.outputFilePaths.Paths(), "")
503}
504
505type installProperties struct {
506	filename       string
507	sourceFilePath android.Path
508	outputFilePath android.WritablePath
509	installDirPath android.InstallPath
510	symlinks       []string
511}
512
513// utility function to add install rules to the build graph.
514// Reduces code duplication between Soong and Mixed build analysis
515func (ip *installProperties) addInstallRules(ctx android.ModuleContext) {
516	// Copy the file from src to a location in out/ with the correct `filename`
517	// This ensures that outputFilePath has the correct name for others to
518	// use, as the source file may have a different name.
519	ctx.Build(pctx, android.BuildParams{
520		Rule:   android.Cp,
521		Output: ip.outputFilePath,
522		Input:  ip.sourceFilePath,
523	})
524
525	installPath := ctx.InstallFile(ip.installDirPath, ip.filename, ip.outputFilePath)
526	for _, sl := range ip.symlinks {
527		ctx.InstallSymlink(ip.installDirPath, sl, installPath)
528	}
529}
530
531func (p *PrebuiltEtc) AndroidMkEntries() []android.AndroidMkEntries {
532	nameSuffix := ""
533	if p.inRamdisk() && !p.onlyInRamdisk() {
534		nameSuffix = ".ramdisk"
535	}
536	if p.inVendorRamdisk() && !p.onlyInVendorRamdisk() {
537		nameSuffix = ".vendor_ramdisk"
538	}
539	if p.inDebugRamdisk() && !p.onlyInDebugRamdisk() {
540		nameSuffix = ".debug_ramdisk"
541	}
542	if p.InRecovery() && !p.onlyInRecovery() {
543		nameSuffix = ".recovery"
544	}
545
546	class := p.makeClass
547	if class == "" {
548		class = "ETC"
549	}
550
551	return []android.AndroidMkEntries{{
552		Class:      class,
553		SubName:    nameSuffix,
554		OutputFile: android.OptionalPathForPath(p.outputFilePaths[0]),
555		ExtraEntries: []android.AndroidMkExtraEntriesFunc{
556			func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
557				entries.SetString("LOCAL_MODULE_TAGS", "optional")
558				entries.SetString("LOCAL_MODULE_PATH", p.installDirPaths[0].String())
559				entries.SetString("LOCAL_INSTALLED_MODULE_STEM", p.outputFilePaths[0].Base())
560				if len(p.properties.Symlinks) > 0 {
561					entries.AddStrings("LOCAL_MODULE_SYMLINKS", p.properties.Symlinks...)
562				}
563				entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !p.Installable())
564				if p.additionalDependencies != nil {
565					entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", p.additionalDependencies.Strings()...)
566				}
567			},
568		},
569	}}
570}
571
572func (p *PrebuiltEtc) AndroidModuleBase() *android.ModuleBase {
573	return &p.ModuleBase
574}
575
576func InitPrebuiltEtcModule(p *PrebuiltEtc, dirBase string) {
577	p.installDirBase = dirBase
578	p.AddProperties(&p.properties)
579	p.AddProperties(&p.subdirProperties)
580	p.AddProperties(&p.rootProperties)
581}
582
583func InitPrebuiltRootModule(p *PrebuiltEtc) {
584	p.installDirBase = "."
585	p.AddProperties(&p.properties)
586	p.AddProperties(&p.rootProperties)
587}
588
589func InitPrebuiltAvbModule(p *PrebuiltEtc) {
590	p.installDirBase = "avb"
591	p.AddProperties(&p.properties)
592	p.rootProperties.Install_in_root = proptools.BoolPtr(true)
593}
594
595// prebuilt_etc is for a prebuilt artifact that is installed in
596// <partition>/etc/<sub_dir> directory.
597func PrebuiltEtcFactory() android.Module {
598	module := &PrebuiltEtc{}
599	InitPrebuiltEtcModule(module, "etc")
600	// This module is device-only
601	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
602	android.InitDefaultableModule(module)
603	return module
604}
605
606func defaultsFactory() android.Module {
607	return DefaultsFactory()
608}
609
610func DefaultsFactory(props ...interface{}) android.Module {
611	module := &Defaults{}
612
613	module.AddProperties(props...)
614	module.AddProperties(
615		&PrebuiltEtcProperties{},
616		&prebuiltSubdirProperties{},
617	)
618
619	android.InitDefaultsModule(module)
620
621	return module
622}
623
624// prebuilt_etc_host is for a host prebuilt artifact that is installed in
625// $(HOST_OUT)/etc/<sub_dir> directory.
626func PrebuiltEtcHostFactory() android.Module {
627	module := &PrebuiltEtc{}
628	InitPrebuiltEtcModule(module, "etc")
629	// This module is host-only
630	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon)
631	android.InitDefaultableModule(module)
632	return module
633}
634
635// prebuilt_etc_host is for a host prebuilt artifact that is installed in
636// <partition>/etc/<sub_dir> directory.
637func PrebuiltEtcCaCertsFactory() android.Module {
638	module := &PrebuiltEtc{}
639	InitPrebuiltEtcModule(module, "cacerts")
640	// This module is device-only
641	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
642	return module
643}
644
645// Generally, a <partition> directory will contain a `system` subdirectory, but the <partition> of
646// `prebuilt_avb` will not have a `system` subdirectory.
647// Ultimately, prebuilt_avb will install the prebuilt artifact to the `avb` subdirectory under the
648// root directory of the partition: <partition_root>/avb.
649// prebuilt_avb does not allow adding any other subdirectories.
650func PrebuiltAvbFactory() android.Module {
651	module := &PrebuiltEtc{}
652	InitPrebuiltAvbModule(module)
653	// This module is device-only
654	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
655	android.InitDefaultableModule(module)
656	return module
657}
658
659// prebuilt_root is for a prebuilt artifact that is installed in
660// <partition>/ directory. Can't have any sub directories.
661func PrebuiltRootFactory() android.Module {
662	module := &PrebuiltEtc{}
663	InitPrebuiltRootModule(module)
664	// This module is device-only
665	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
666	android.InitDefaultableModule(module)
667	return module
668}
669
670// prebuilt_root_host is for a host prebuilt artifact that is installed in $(HOST_OUT)/<sub_dir>
671// directory.
672func PrebuiltRootHostFactory() android.Module {
673	module := &PrebuiltEtc{}
674	InitPrebuiltEtcModule(module, ".")
675	// This module is host-only
676	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon)
677	android.InitDefaultableModule(module)
678	return module
679}
680
681// prebuilt_usr_share is for a prebuilt artifact that is installed in
682// <partition>/usr/share/<sub_dir> directory.
683func PrebuiltUserShareFactory() android.Module {
684	module := &PrebuiltEtc{}
685	InitPrebuiltEtcModule(module, "usr/share")
686	// This module is device-only
687	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
688	android.InitDefaultableModule(module)
689	return module
690}
691
692// prebuild_usr_share_host is for a host prebuilt artifact that is installed in
693// $(HOST_OUT)/usr/share/<sub_dir> directory.
694func PrebuiltUserShareHostFactory() android.Module {
695	module := &PrebuiltEtc{}
696	InitPrebuiltEtcModule(module, "usr/share")
697	// This module is host-only
698	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon)
699	android.InitDefaultableModule(module)
700	return module
701}
702
703// prebuilt_usr_hyphendata is for a prebuilt artifact that is installed in
704// <partition>/usr/hyphen-data/<sub_dir> directory.
705func PrebuiltUserHyphenDataFactory() android.Module {
706	module := &PrebuiltEtc{}
707	InitPrebuiltEtcModule(module, "usr/hyphen-data")
708	// This module is device-only
709	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
710	android.InitDefaultableModule(module)
711	return module
712}
713
714// prebuilt_usr_keylayout is for a prebuilt artifact that is installed in
715// <partition>/usr/keylayout/<sub_dir> directory.
716func PrebuiltUserKeyLayoutFactory() android.Module {
717	module := &PrebuiltEtc{}
718	InitPrebuiltEtcModule(module, "usr/keylayout")
719	// This module is device-only
720	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
721	android.InitDefaultableModule(module)
722	return module
723}
724
725// prebuilt_usr_keychars is for a prebuilt artifact that is installed in
726// <partition>/usr/keychars/<sub_dir> directory.
727func PrebuiltUserKeyCharsFactory() android.Module {
728	module := &PrebuiltEtc{}
729	InitPrebuiltEtcModule(module, "usr/keychars")
730	// This module is device-only
731	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
732	android.InitDefaultableModule(module)
733	return module
734}
735
736// prebuilt_usr_idc is for a prebuilt artifact that is installed in
737// <partition>/usr/idc/<sub_dir> directory.
738func PrebuiltUserIdcFactory() android.Module {
739	module := &PrebuiltEtc{}
740	InitPrebuiltEtcModule(module, "usr/idc")
741	// This module is device-only
742	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
743	android.InitDefaultableModule(module)
744	return module
745}
746
747// prebuilt_usr_srec is for a prebuilt artifact that is installed in
748// <partition>/usr/srec/<sub_dir> directory.
749func PrebuiltUserSrecFactory() android.Module {
750	module := &PrebuiltEtc{}
751	InitPrebuiltEtcModule(module, "usr/srec")
752	// This module is device-only
753	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
754	android.InitDefaultableModule(module)
755	return module
756}
757
758// prebuilt_font installs a font in <partition>/fonts directory.
759func PrebuiltFontFactory() android.Module {
760	module := &PrebuiltEtc{}
761	InitPrebuiltEtcModule(module, "fonts")
762	// This module is device-only
763	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
764	android.InitDefaultableModule(module)
765	return module
766}
767
768// prebuilt_overlay is for a prebuilt artifact in <partition>/overlay directory.
769func PrebuiltOverlayFactory() android.Module {
770	module := &PrebuiltEtc{}
771	InitPrebuiltEtcModule(module, "overlay")
772	// This module is device-only
773	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
774	return module
775}
776
777// prebuilt_firmware installs a firmware file to <partition>/etc/firmware directory for system
778// image.
779// If soc_specific property is set to true, the firmware file is installed to the
780// vendor <partition>/firmware directory for vendor image.
781func PrebuiltFirmwareFactory() android.Module {
782	module := &PrebuiltEtc{}
783	module.socInstallDirBase = "firmware"
784	InitPrebuiltEtcModule(module, "etc/firmware")
785	// This module is device-only
786	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
787	android.InitDefaultableModule(module)
788	return module
789}
790
791// prebuilt_dsp installs a DSP related file to <partition>/etc/dsp directory for system image.
792// If soc_specific property is set to true, the DSP related file is installed to the
793// vendor <partition>/dsp directory for vendor image.
794func PrebuiltDSPFactory() android.Module {
795	module := &PrebuiltEtc{}
796	module.socInstallDirBase = "dsp"
797	InitPrebuiltEtcModule(module, "etc/dsp")
798	// This module is device-only
799	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
800	android.InitDefaultableModule(module)
801	return module
802}
803
804// prebuilt_renderscript_bitcode installs a *.bc file into /system/lib or /system/lib64.
805func PrebuiltRenderScriptBitcodeFactory() android.Module {
806	module := &PrebuiltEtc{}
807	module.makeClass = "RENDERSCRIPT_BITCODE"
808	module.installDirBase64 = "lib64"
809	module.installAvoidMultilibConflict = true
810	InitPrebuiltEtcModule(module, "lib")
811	// This module is device-only
812	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
813	android.InitDefaultableModule(module)
814	return module
815}
816
817// prebuilt_rfsa installs a firmware file that will be available through Qualcomm's RFSA
818// to the <partition>/lib/rfsa directory.
819func PrebuiltRFSAFactory() android.Module {
820	module := &PrebuiltEtc{}
821	// Ideally these would go in /vendor/dsp, but the /vendor/lib/rfsa paths are hardcoded in too
822	// many places outside of the application processor.  They could be moved to /vendor/dsp once
823	// that is cleaned up.
824	InitPrebuiltEtcModule(module, "lib/rfsa")
825	// This module is device-only
826	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
827	android.InitDefaultableModule(module)
828	return module
829}
830
831// prebuilt_media installs media files in <partition>/media directory.
832func PrebuiltMediaFactory() android.Module {
833	module := &PrebuiltEtc{}
834	InitPrebuiltEtcModule(module, "media")
835	// This module is device-only
836	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
837	android.InitDefaultableModule(module)
838	return module
839}
840
841// prebuilt_voicepack installs voice pack files in <partition>/tts directory.
842func PrebuiltVoicepackFactory() android.Module {
843	module := &PrebuiltEtc{}
844	InitPrebuiltEtcModule(module, "tts")
845	// This module is device-only
846	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
847	android.InitDefaultableModule(module)
848	return module
849}
850
851// prebuilt_bin installs files in <partition>/bin directory.
852func PrebuiltBinaryFactory() android.Module {
853	module := &PrebuiltEtc{}
854	InitPrebuiltEtcModule(module, "bin")
855	// This module is device-only
856	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
857	android.InitDefaultableModule(module)
858	return module
859}
860
861// prebuilt_wallpaper installs image files in <partition>/wallpaper directory.
862func PrebuiltWallpaperFactory() android.Module {
863	module := &PrebuiltEtc{}
864	InitPrebuiltEtcModule(module, "wallpaper")
865	// This module is device-only
866	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
867	android.InitDefaultableModule(module)
868	return module
869}
870
871// prebuilt_priv_app installs files in <partition>/priv-app directory.
872func PrebuiltPrivAppFactory() android.Module {
873	module := &PrebuiltEtc{}
874	InitPrebuiltEtcModule(module, "priv-app")
875	// This module is device-only
876	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
877	android.InitDefaultableModule(module)
878	return module
879}
880
881// prebuilt_rfs installs files in <partition>/rfs directory.
882func PrebuiltRfsFactory() android.Module {
883	module := &PrebuiltEtc{}
884	InitPrebuiltEtcModule(module, "rfs")
885	// This module is device-only
886	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
887	android.InitDefaultableModule(module)
888	return module
889}
890
891// prebuilt_framework installs files in <partition>/framework directory.
892func PrebuiltFrameworkFactory() android.Module {
893	module := &PrebuiltEtc{}
894	InitPrebuiltEtcModule(module, "framework")
895	// This module is device-only
896	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
897	android.InitDefaultableModule(module)
898	return module
899}
900
901// prebuilt_res installs files in <partition>/res directory.
902func PrebuiltResFactory() android.Module {
903	module := &PrebuiltEtc{}
904	InitPrebuiltEtcModule(module, "res")
905	// This module is device-only
906	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
907	android.InitDefaultableModule(module)
908	return module
909}
910
911// prebuilt_wlc_upt installs files in <partition>/wlc_upt directory.
912func PrebuiltWlcUptFactory() android.Module {
913	module := &PrebuiltEtc{}
914	InitPrebuiltEtcModule(module, "wlc_upt")
915	// This module is device-only
916	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
917	android.InitDefaultableModule(module)
918	return module
919}
920
921// prebuilt_odm installs files in <partition>/odm directory.
922func PrebuiltOdmFactory() android.Module {
923	module := &PrebuiltEtc{}
924	InitPrebuiltEtcModule(module, "odm")
925	// This module is device-only
926	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
927	android.InitDefaultableModule(module)
928	return module
929}
930
931// prebuilt_vendor_dlkm installs files in <partition>/vendor_dlkm directory.
932func PrebuiltVendorDlkmFactory() android.Module {
933	module := &PrebuiltEtc{}
934	InitPrebuiltEtcModule(module, "vendor_dlkm")
935	// This module is device-only
936	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
937	android.InitDefaultableModule(module)
938	return module
939}
940
941// prebuilt_bt_firmware installs files in <partition>/bt_firmware directory.
942func PrebuiltBtFirmwareFactory() android.Module {
943	module := &PrebuiltEtc{}
944	InitPrebuiltEtcModule(module, "bt_firmware")
945	// This module is device-only
946	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
947	android.InitDefaultableModule(module)
948	return module
949}
950
951// prebuilt_tvservice installs files in <partition>/tvservice directory.
952func PrebuiltTvServiceFactory() android.Module {
953	module := &PrebuiltEtc{}
954	InitPrebuiltEtcModule(module, "tvservice")
955	// This module is device-only
956	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
957	android.InitDefaultableModule(module)
958	return module
959}
960
961// prebuilt_optee installs files in <partition>/optee directory.
962func PrebuiltOpteeFactory() android.Module {
963	module := &PrebuiltEtc{}
964	InitPrebuiltEtcModule(module, "optee")
965	// This module is device-only
966	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
967	android.InitDefaultableModule(module)
968	return module
969}
970
971// prebuilt_tvconfig installs files in <partition>/tvconfig directory.
972func PrebuiltTvConfigFactory() android.Module {
973	module := &PrebuiltEtc{}
974	InitPrebuiltEtcModule(module, "tvconfig")
975	// This module is device-only
976	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
977	android.InitDefaultableModule(module)
978	return module
979}
980
981// prebuilt_vendor installs files in <partition>/vendor directory.
982func PrebuiltVendorFactory() android.Module {
983	module := &PrebuiltEtc{}
984	InitPrebuiltEtcModule(module, "vendor")
985	// This module is device-only
986	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
987	android.InitDefaultableModule(module)
988	return module
989}
990
991// prebuilt_sbin installs files in <partition>/sbin directory.
992func PrebuiltSbinFactory() android.Module {
993	module := &PrebuiltEtc{}
994	InitPrebuiltEtcModule(module, "sbin")
995	// This module is device-only
996	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
997	android.InitDefaultableModule(module)
998	return module
999}
1000
1001// prebuilt_system installs files in <partition>/system directory.
1002func PrebuiltSystemFactory() android.Module {
1003	module := &PrebuiltEtc{}
1004	InitPrebuiltEtcModule(module, "system")
1005	// This module is device-only
1006	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
1007	android.InitDefaultableModule(module)
1008	return module
1009}
1010
1011// prebuilt_first_stage_ramdisk installs files in <partition>/first_stage_ramdisk directory.
1012func PrebuiltFirstStageRamdiskFactory() android.Module {
1013	module := &PrebuiltEtc{}
1014	InitPrebuiltEtcModule(module, "first_stage_ramdisk")
1015	// This module is device-only
1016	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
1017	android.InitDefaultableModule(module)
1018	return module
1019}
1020