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