| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 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 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 15 | package etc | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 16 |  | 
| Yo Chiang | 803c40d | 2020-11-16 20:32:51 +0800 | [diff] [blame] | 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. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 29 |  | 
| Yo Chiang | 803c40d | 2020-11-16 20:32:51 +0800 | [diff] [blame] | 30 | import ( | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 31 | "encoding/json" | 
| Jiyong Park | 76a42f5 | 2021-02-16 06:50:37 +0900 | [diff] [blame] | 32 | "fmt" | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 33 | "path/filepath" | 
| Alix | bbfd538 | 2022-06-09 18:52:05 +0000 | [diff] [blame] | 34 | "reflect" | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 35 | "strings" | 
| Jiyong Park | 76a42f5 | 2021-02-16 06:50:37 +0900 | [diff] [blame] | 36 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 37 | "github.com/google/blueprint/proptools" | 
|  | 38 |  | 
|  | 39 | "android/soong/android" | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 40 | "android/soong/bazel" | 
| Spandan Das | 756d340 | 2023-06-05 22:49:50 +0000 | [diff] [blame^] | 41 | "android/soong/bazel/cquery" | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 42 | "android/soong/snapshot" | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 43 | ) | 
|  | 44 |  | 
|  | 45 | var pctx = android.NewPackageContext("android/soong/etc") | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 46 |  | 
| Jaewoong Jung | c3fcdb4 | 2019-02-13 05:50:33 -0800 | [diff] [blame] | 47 | // TODO(jungw): Now that it handles more than the ones in etc/, consider renaming this file. | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 48 |  | 
|  | 49 | func init() { | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 50 | pctx.Import("android/soong/android") | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 51 | RegisterPrebuiltEtcBuildComponents(android.InitRegistrationContext) | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 52 | snapshot.RegisterSnapshotAction(generatePrebuiltSnapshot) | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 53 | } | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 54 |  | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 55 | func RegisterPrebuiltEtcBuildComponents(ctx android.RegistrationContext) { | 
|  | 56 | ctx.RegisterModuleType("prebuilt_etc", PrebuiltEtcFactory) | 
|  | 57 | ctx.RegisterModuleType("prebuilt_etc_host", PrebuiltEtcHostFactory) | 
| Miguel | 32b0280 | 2022-12-01 18:38:26 +0000 | [diff] [blame] | 58 | ctx.RegisterModuleType("prebuilt_etc_cacerts", PrebuiltEtcCaCertsFactory) | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 59 | ctx.RegisterModuleType("prebuilt_root", PrebuiltRootFactory) | 
| Liz Kammer | e9ecddc | 2022-01-04 17:27:52 -0500 | [diff] [blame] | 60 | ctx.RegisterModuleType("prebuilt_root_host", PrebuiltRootHostFactory) | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 61 | ctx.RegisterModuleType("prebuilt_usr_share", PrebuiltUserShareFactory) | 
|  | 62 | ctx.RegisterModuleType("prebuilt_usr_share_host", PrebuiltUserShareHostFactory) | 
|  | 63 | ctx.RegisterModuleType("prebuilt_font", PrebuiltFontFactory) | 
|  | 64 | ctx.RegisterModuleType("prebuilt_firmware", PrebuiltFirmwareFactory) | 
|  | 65 | ctx.RegisterModuleType("prebuilt_dsp", PrebuiltDSPFactory) | 
| Colin Cross | 83ebf23 | 2021-04-09 09:41:23 -0700 | [diff] [blame] | 66 | ctx.RegisterModuleType("prebuilt_rfsa", PrebuiltRFSAFactory) | 
| Inseob Kim | 1e27a14 | 2021-05-06 11:46:11 +0000 | [diff] [blame] | 67 |  | 
|  | 68 | ctx.RegisterModuleType("prebuilt_defaults", defaultsFactory) | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 69 |  | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 70 | } | 
|  | 71 |  | 
| Paul Duffin | 1172fed | 2021-03-08 11:28:18 +0000 | [diff] [blame] | 72 | var PrepareForTestWithPrebuiltEtc = android.FixtureRegisterWithContext(RegisterPrebuiltEtcBuildComponents) | 
|  | 73 |  | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 74 | type prebuiltEtcProperties struct { | 
| Yo Chiang | 803c40d | 2020-11-16 20:32:51 +0800 | [diff] [blame] | 75 | // Source file of this prebuilt. Can reference a genrule type module with the ":module" syntax. | 
| Colin Cross | 27b922f | 2019-03-04 22:35:41 -0800 | [diff] [blame] | 76 | Src *string `android:"path,arch_variant"` | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 77 |  | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 78 | // Optional name for the installed file. If unspecified, name of the module is used as the file | 
|  | 79 | // name. | 
| Jiyong Park | 139a2e6 | 2018-10-26 21:49:39 +0900 | [diff] [blame] | 80 | Filename *string `android:"arch_variant"` | 
|  | 81 |  | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 82 | // When set to true, and filename property is not set, the name for the installed file | 
| Jiyong Park | 1a7cf08 | 2018-11-13 11:59:12 +0900 | [diff] [blame] | 83 | // is the same as the file name of the source file. | 
|  | 84 | Filename_from_src *bool `android:"arch_variant"` | 
|  | 85 |  | 
| Yifan Hong | 1b3348d | 2020-01-21 15:53:22 -0800 | [diff] [blame] | 86 | // Make this module available when building for ramdisk. | 
| Yifan Hong | 39143a9 | 2020-10-26 12:43:12 -0700 | [diff] [blame] | 87 | // On device without a dedicated recovery partition, the module is only | 
|  | 88 | // available after switching root into | 
|  | 89 | // /first_stage_ramdisk. To expose the module before switching root, install | 
|  | 90 | // the recovery variant instead. | 
| Yifan Hong | 1b3348d | 2020-01-21 15:53:22 -0800 | [diff] [blame] | 91 | Ramdisk_available *bool | 
|  | 92 |  | 
| Yifan Hong | 60e0cfb | 2020-10-21 15:17:56 -0700 | [diff] [blame] | 93 | // Make this module available when building for vendor ramdisk. | 
| Yifan Hong | 39143a9 | 2020-10-26 12:43:12 -0700 | [diff] [blame] | 94 | // On device without a dedicated recovery partition, the module is only | 
|  | 95 | // available after switching root into | 
|  | 96 | // /first_stage_ramdisk. To expose the module before switching root, install | 
|  | 97 | // the recovery variant instead. | 
| Yifan Hong | 60e0cfb | 2020-10-21 15:17:56 -0700 | [diff] [blame] | 98 | Vendor_ramdisk_available *bool | 
|  | 99 |  | 
| Inseob Kim | 08758f0 | 2021-04-08 21:13:22 +0900 | [diff] [blame] | 100 | // Make this module available when building for debug ramdisk. | 
|  | 101 | Debug_ramdisk_available *bool | 
|  | 102 |  | 
| Tao Bao | 0ba5c94 | 2018-08-14 22:20:22 -0700 | [diff] [blame] | 103 | // Make this module available when building for recovery. | 
|  | 104 | Recovery_available *bool | 
|  | 105 |  | 
| Jiyong Park | ad9ce04 | 2018-10-31 22:49:57 +0900 | [diff] [blame] | 106 | // Whether this module is directly installable to one of the partitions. Default: true. | 
|  | 107 | Installable *bool | 
| Yo Chiang | 3d64d49 | 2020-05-27 17:56:39 +0800 | [diff] [blame] | 108 |  | 
|  | 109 | // Install symlinks to the installed file. | 
|  | 110 | Symlinks []string `android:"arch_variant"` | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 111 | } | 
|  | 112 |  | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 113 | type prebuiltSubdirProperties struct { | 
|  | 114 | // Optional subdirectory under which this file is installed into, cannot be specified with | 
|  | 115 | // relative_install_path, prefer relative_install_path. | 
|  | 116 | Sub_dir *string `android:"arch_variant"` | 
|  | 117 |  | 
|  | 118 | // Optional subdirectory under which this file is installed into, cannot be specified with | 
|  | 119 | // sub_dir. | 
|  | 120 | Relative_install_path *string `android:"arch_variant"` | 
|  | 121 | } | 
|  | 122 |  | 
| Jooyung Han | 39edb6c | 2019-11-06 16:53:07 +0900 | [diff] [blame] | 123 | type PrebuiltEtcModule interface { | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 124 | android.Module | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 125 |  | 
|  | 126 | // Returns the base install directory, such as "etc", "usr/share". | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 127 | BaseDir() string | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 128 |  | 
|  | 129 | // Returns the sub install directory relative to BaseDir(). | 
| Jooyung Han | 39edb6c | 2019-11-06 16:53:07 +0900 | [diff] [blame] | 130 | SubDir() string | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 131 |  | 
|  | 132 | // Returns an android.OutputPath to the intermeidate file, which is the renamed prebuilt source | 
|  | 133 | // file. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 134 | OutputFile() android.OutputPath | 
| Jooyung Han | 39edb6c | 2019-11-06 16:53:07 +0900 | [diff] [blame] | 135 | } | 
|  | 136 |  | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 137 | type PrebuiltEtc struct { | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 138 | android.ModuleBase | 
| Inseob Kim | 1e27a14 | 2021-05-06 11:46:11 +0000 | [diff] [blame] | 139 | android.DefaultableModuleBase | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 140 | android.BazelModuleBase | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 141 |  | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 142 | snapshot.VendorSnapshotModuleInterface | 
|  | 143 | snapshot.RecoverySnapshotModuleInterface | 
|  | 144 |  | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 145 | properties       prebuiltEtcProperties | 
|  | 146 | subdirProperties prebuiltSubdirProperties | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 147 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 148 | sourceFilePath android.Path | 
|  | 149 | outputFilePath android.OutputPath | 
| Jaewoong Jung | c3fcdb4 | 2019-02-13 05:50:33 -0800 | [diff] [blame] | 150 | // The base install location, e.g. "etc" for prebuilt_etc, "usr/share" for prebuilt_usr_share. | 
| Patrice Arruda | 057a8b1 | 2019-06-03 15:29:27 -0700 | [diff] [blame] | 151 | installDirBase string | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 152 | // The base install location when soc_specific property is set to true, e.g. "firmware" for | 
|  | 153 | // prebuilt_firmware. | 
| Patrice Arruda | 057a8b1 | 2019-06-03 15:29:27 -0700 | [diff] [blame] | 154 | socInstallDirBase      string | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 155 | installDirPath         android.InstallPath | 
|  | 156 | additionalDependencies *android.Paths | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 157 | } | 
|  | 158 |  | 
| Inseob Kim | 1e27a14 | 2021-05-06 11:46:11 +0000 | [diff] [blame] | 159 | type Defaults struct { | 
|  | 160 | android.ModuleBase | 
|  | 161 | android.DefaultsModuleBase | 
|  | 162 | } | 
|  | 163 |  | 
| Yifan Hong | 1b3348d | 2020-01-21 15:53:22 -0800 | [diff] [blame] | 164 | func (p *PrebuiltEtc) inRamdisk() bool { | 
|  | 165 | return p.ModuleBase.InRamdisk() || p.ModuleBase.InstallInRamdisk() | 
|  | 166 | } | 
|  | 167 |  | 
|  | 168 | func (p *PrebuiltEtc) onlyInRamdisk() bool { | 
|  | 169 | return p.ModuleBase.InstallInRamdisk() | 
|  | 170 | } | 
|  | 171 |  | 
|  | 172 | func (p *PrebuiltEtc) InstallInRamdisk() bool { | 
|  | 173 | return p.inRamdisk() | 
|  | 174 | } | 
|  | 175 |  | 
| Yifan Hong | 60e0cfb | 2020-10-21 15:17:56 -0700 | [diff] [blame] | 176 | func (p *PrebuiltEtc) inVendorRamdisk() bool { | 
|  | 177 | return p.ModuleBase.InVendorRamdisk() || p.ModuleBase.InstallInVendorRamdisk() | 
|  | 178 | } | 
|  | 179 |  | 
|  | 180 | func (p *PrebuiltEtc) onlyInVendorRamdisk() bool { | 
|  | 181 | return p.ModuleBase.InstallInVendorRamdisk() | 
|  | 182 | } | 
|  | 183 |  | 
|  | 184 | func (p *PrebuiltEtc) InstallInVendorRamdisk() bool { | 
|  | 185 | return p.inVendorRamdisk() | 
|  | 186 | } | 
|  | 187 |  | 
| Inseob Kim | 08758f0 | 2021-04-08 21:13:22 +0900 | [diff] [blame] | 188 | func (p *PrebuiltEtc) inDebugRamdisk() bool { | 
|  | 189 | return p.ModuleBase.InDebugRamdisk() || p.ModuleBase.InstallInDebugRamdisk() | 
|  | 190 | } | 
|  | 191 |  | 
|  | 192 | func (p *PrebuiltEtc) onlyInDebugRamdisk() bool { | 
|  | 193 | return p.ModuleBase.InstallInDebugRamdisk() | 
|  | 194 | } | 
|  | 195 |  | 
|  | 196 | func (p *PrebuiltEtc) InstallInDebugRamdisk() bool { | 
|  | 197 | return p.inDebugRamdisk() | 
|  | 198 | } | 
|  | 199 |  | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 200 | func (p *PrebuiltEtc) InRecovery() bool { | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 201 | return p.ModuleBase.InRecovery() || p.ModuleBase.InstallInRecovery() | 
| Tao Bao | 0ba5c94 | 2018-08-14 22:20:22 -0700 | [diff] [blame] | 202 | } | 
|  | 203 |  | 
|  | 204 | func (p *PrebuiltEtc) onlyInRecovery() bool { | 
|  | 205 | return p.ModuleBase.InstallInRecovery() | 
|  | 206 | } | 
|  | 207 |  | 
|  | 208 | func (p *PrebuiltEtc) InstallInRecovery() bool { | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 209 | return p.InRecovery() | 
| Tao Bao | 0ba5c94 | 2018-08-14 22:20:22 -0700 | [diff] [blame] | 210 | } | 
|  | 211 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 212 | var _ android.ImageInterface = (*PrebuiltEtc)(nil) | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 213 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 214 | func (p *PrebuiltEtc) ImageMutatorBegin(ctx android.BaseModuleContext) {} | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 215 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 216 | func (p *PrebuiltEtc) CoreVariantNeeded(ctx android.BaseModuleContext) bool { | 
| Yifan Hong | 60e0cfb | 2020-10-21 15:17:56 -0700 | [diff] [blame] | 217 | return !p.ModuleBase.InstallInRecovery() && !p.ModuleBase.InstallInRamdisk() && | 
| Inseob Kim | 08758f0 | 2021-04-08 21:13:22 +0900 | [diff] [blame] | 218 | !p.ModuleBase.InstallInVendorRamdisk() && !p.ModuleBase.InstallInDebugRamdisk() | 
| Yifan Hong | 1b3348d | 2020-01-21 15:53:22 -0800 | [diff] [blame] | 219 | } | 
|  | 220 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 221 | func (p *PrebuiltEtc) RamdiskVariantNeeded(ctx android.BaseModuleContext) bool { | 
|  | 222 | return proptools.Bool(p.properties.Ramdisk_available) || p.ModuleBase.InstallInRamdisk() | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 223 | } | 
|  | 224 |  | 
| Yifan Hong | 60e0cfb | 2020-10-21 15:17:56 -0700 | [diff] [blame] | 225 | func (p *PrebuiltEtc) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { | 
|  | 226 | return proptools.Bool(p.properties.Vendor_ramdisk_available) || p.ModuleBase.InstallInVendorRamdisk() | 
|  | 227 | } | 
|  | 228 |  | 
| Inseob Kim | 08758f0 | 2021-04-08 21:13:22 +0900 | [diff] [blame] | 229 | func (p *PrebuiltEtc) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { | 
|  | 230 | return proptools.Bool(p.properties.Debug_ramdisk_available) || p.ModuleBase.InstallInDebugRamdisk() | 
|  | 231 | } | 
|  | 232 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 233 | func (p *PrebuiltEtc) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { | 
|  | 234 | return proptools.Bool(p.properties.Recovery_available) || p.ModuleBase.InstallInRecovery() | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 235 | } | 
|  | 236 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 237 | func (p *PrebuiltEtc) ExtraImageVariations(ctx android.BaseModuleContext) []string { | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 238 | return nil | 
|  | 239 | } | 
|  | 240 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 241 | func (p *PrebuiltEtc) SetImageVariation(ctx android.BaseModuleContext, variation string, module android.Module) { | 
| Colin Cross | 7228ecd | 2019-11-18 16:00:16 -0800 | [diff] [blame] | 242 | } | 
|  | 243 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 244 | func (p *PrebuiltEtc) SourceFilePath(ctx android.ModuleContext) android.Path { | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 245 | return android.PathForModuleSrc(ctx, proptools.String(p.properties.Src)) | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 246 | } | 
|  | 247 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 248 | func (p *PrebuiltEtc) InstallDirPath() android.InstallPath { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 249 | return p.installDirPath | 
|  | 250 | } | 
|  | 251 |  | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 252 | // This allows other derivative modules (e.g. prebuilt_etc_xml) to perform | 
|  | 253 | // additional steps (like validating the src) before the file is installed. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 254 | func (p *PrebuiltEtc) SetAdditionalDependencies(paths android.Paths) { | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 255 | p.additionalDependencies = &paths | 
|  | 256 | } | 
|  | 257 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 258 | func (p *PrebuiltEtc) OutputFile() android.OutputPath { | 
| Jiyong Park | c43e0ac | 2018-10-04 20:27:15 +0900 | [diff] [blame] | 259 | return p.outputFilePath | 
|  | 260 | } | 
|  | 261 |  | 
| Jiyong Park | 76a42f5 | 2021-02-16 06:50:37 +0900 | [diff] [blame] | 262 | var _ android.OutputFileProducer = (*PrebuiltEtc)(nil) | 
|  | 263 |  | 
|  | 264 | func (p *PrebuiltEtc) OutputFiles(tag string) (android.Paths, error) { | 
|  | 265 | switch tag { | 
|  | 266 | case "": | 
|  | 267 | return android.Paths{p.outputFilePath}, nil | 
|  | 268 | default: | 
|  | 269 | return nil, fmt.Errorf("unsupported module reference tag %q", tag) | 
|  | 270 | } | 
|  | 271 | } | 
|  | 272 |  | 
| Jiyong Park | c43e0ac | 2018-10-04 20:27:15 +0900 | [diff] [blame] | 273 | func (p *PrebuiltEtc) SubDir() string { | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 274 | if subDir := proptools.String(p.subdirProperties.Sub_dir); subDir != "" { | 
| Liz Kammer | 0449a63 | 2020-06-26 10:12:36 -0700 | [diff] [blame] | 275 | return subDir | 
|  | 276 | } | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 277 | return proptools.String(p.subdirProperties.Relative_install_path) | 
| Jiyong Park | c43e0ac | 2018-10-04 20:27:15 +0900 | [diff] [blame] | 278 | } | 
|  | 279 |  | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 280 | func (p *PrebuiltEtc) BaseDir() string { | 
| Jooyung Han | 8e5685d | 2020-09-21 11:02:57 +0900 | [diff] [blame] | 281 | return p.installDirBase | 
| Jooyung Han | 0703fd8 | 2020-08-26 22:11:53 +0900 | [diff] [blame] | 282 | } | 
|  | 283 |  | 
| Jiyong Park | ad9ce04 | 2018-10-31 22:49:57 +0900 | [diff] [blame] | 284 | func (p *PrebuiltEtc) Installable() bool { | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 285 | return p.properties.Installable == nil || proptools.Bool(p.properties.Installable) | 
| Jiyong Park | ad9ce04 | 2018-10-31 22:49:57 +0900 | [diff] [blame] | 286 | } | 
|  | 287 |  | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 288 | func (p *PrebuiltEtc) InVendor() bool { | 
|  | 289 | return p.ModuleBase.InstallInVendor() | 
|  | 290 | } | 
|  | 291 |  | 
|  | 292 | func (p *PrebuiltEtc) ExcludeFromVendorSnapshot() bool { | 
|  | 293 | return false | 
|  | 294 | } | 
|  | 295 |  | 
|  | 296 | func (p *PrebuiltEtc) ExcludeFromRecoverySnapshot() bool { | 
|  | 297 | return false | 
|  | 298 | } | 
|  | 299 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 300 | func (p *PrebuiltEtc) GenerateAndroidBuildActions(ctx android.ModuleContext) { | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 301 | filename := proptools.String(p.properties.Filename) | 
|  | 302 | filenameFromSrc := proptools.Bool(p.properties.Filename_from_src) | 
| Colin Cross | 725eac6 | 2022-10-03 15:31:29 -0700 | [diff] [blame] | 303 | if p.properties.Src != nil { | 
|  | 304 | p.sourceFilePath = android.PathForModuleSrc(ctx, proptools.String(p.properties.Src)) | 
|  | 305 |  | 
|  | 306 | // Determine the output file basename. | 
|  | 307 | // If Filename is set, use the name specified by the property. | 
|  | 308 | // If Filename_from_src is set, use the source file name. | 
|  | 309 | // Otherwise use the module name. | 
|  | 310 | if filename != "" { | 
|  | 311 | if filenameFromSrc { | 
|  | 312 | ctx.PropertyErrorf("filename_from_src", "filename is set. filename_from_src can't be true") | 
|  | 313 | return | 
|  | 314 | } | 
|  | 315 | } else if filenameFromSrc { | 
|  | 316 | filename = p.sourceFilePath.Base() | 
|  | 317 | } else { | 
|  | 318 | filename = ctx.ModuleName() | 
| Jiyong Park | 1a7cf08 | 2018-11-13 11:59:12 +0900 | [diff] [blame] | 319 | } | 
| Colin Cross | 725eac6 | 2022-10-03 15:31:29 -0700 | [diff] [blame] | 320 | } else if ctx.Config().AllowMissingDependencies() { | 
|  | 321 | // If no srcs was set and AllowMissingDependencies is enabled then | 
|  | 322 | // mark the module as missing dependencies and set a fake source path | 
|  | 323 | // and file name. | 
|  | 324 | ctx.AddMissingDependencies([]string{"MISSING_PREBUILT_SRC_FILE"}) | 
|  | 325 | p.sourceFilePath = android.PathForModuleSrc(ctx) | 
|  | 326 | if filename == "" { | 
|  | 327 | filename = ctx.ModuleName() | 
|  | 328 | } | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 329 | } else { | 
| Colin Cross | 725eac6 | 2022-10-03 15:31:29 -0700 | [diff] [blame] | 330 | ctx.PropertyErrorf("src", "missing prebuilt source file") | 
|  | 331 | return | 
| Jiyong Park | 139a2e6 | 2018-10-26 21:49:39 +0900 | [diff] [blame] | 332 | } | 
| Patrice Arruda | 057a8b1 | 2019-06-03 15:29:27 -0700 | [diff] [blame] | 333 |  | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 334 | if strings.Contains(filename, "/") { | 
|  | 335 | ctx.PropertyErrorf("filename", "filename cannot contain separator '/'") | 
|  | 336 | return | 
|  | 337 | } | 
|  | 338 |  | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 339 | // Check that `sub_dir` and `relative_install_path` are not set at the same time. | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 340 | if p.subdirProperties.Sub_dir != nil && p.subdirProperties.Relative_install_path != nil { | 
| Liz Kammer | 0449a63 | 2020-06-26 10:12:36 -0700 | [diff] [blame] | 341 | ctx.PropertyErrorf("sub_dir", "relative_install_path is set. Cannot set sub_dir") | 
|  | 342 | } | 
|  | 343 |  | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 344 | // If soc install dir was specified and SOC specific is set, set the installDirPath to the | 
|  | 345 | // specified socInstallDirBase. | 
| Jooyung Han | 8e5685d | 2020-09-21 11:02:57 +0900 | [diff] [blame] | 346 | installBaseDir := p.installDirBase | 
|  | 347 | if p.SocSpecific() && p.socInstallDirBase != "" { | 
|  | 348 | installBaseDir = p.socInstallDirBase | 
|  | 349 | } | 
|  | 350 | p.installDirPath = android.PathForModuleInstall(ctx, installBaseDir, p.SubDir()) | 
| Jiyong Park | c43e0ac | 2018-10-04 20:27:15 +0900 | [diff] [blame] | 351 |  | 
| Spandan Das | 756d340 | 2023-06-05 22:49:50 +0000 | [diff] [blame^] | 352 | // Call InstallFile even when uninstallable to make the module included in the package | 
|  | 353 | ip := installProperties{ | 
|  | 354 | installable:    p.Installable(), | 
|  | 355 | filename:       filename, | 
|  | 356 | sourceFilePath: p.sourceFilePath, | 
|  | 357 | symlinks:       p.properties.Symlinks, | 
|  | 358 | } | 
|  | 359 | p.addInstallRules(ctx, ip) | 
|  | 360 | } | 
| Jiyong Park | f9f6805 | 2020-09-29 20:15:08 +0900 | [diff] [blame] | 361 |  | 
| Spandan Das | 756d340 | 2023-06-05 22:49:50 +0000 | [diff] [blame^] | 362 | type installProperties struct { | 
|  | 363 | installable    bool | 
|  | 364 | filename       string | 
|  | 365 | sourceFilePath android.Path | 
|  | 366 | symlinks       []string | 
|  | 367 | } | 
|  | 368 |  | 
|  | 369 | // utility function to add install rules to the build graph. | 
|  | 370 | // Reduces code duplication between Soong and Mixed build analysis | 
|  | 371 | func (p *PrebuiltEtc) addInstallRules(ctx android.ModuleContext, ip installProperties) { | 
|  | 372 | if !ip.installable { | 
| Inseob Kim | 916901e | 2021-02-17 15:48:53 +0900 | [diff] [blame] | 373 | p.SkipInstall() | 
|  | 374 | } | 
|  | 375 |  | 
| Spandan Das | 756d340 | 2023-06-05 22:49:50 +0000 | [diff] [blame^] | 376 | // Copy the file from src to a location in out/ with the correct `filename` | 
|  | 377 | // This ensures that outputFilePath has the correct name for others to | 
|  | 378 | // use, as the source file may have a different name. | 
|  | 379 | p.outputFilePath = android.PathForModuleOut(ctx, ip.filename).OutputPath | 
|  | 380 | ctx.Build(pctx, android.BuildParams{ | 
|  | 381 | Rule:   android.Cp, | 
|  | 382 | Output: p.outputFilePath, | 
|  | 383 | Input:  ip.sourceFilePath, | 
|  | 384 | }) | 
|  | 385 |  | 
|  | 386 | installPath := ctx.InstallFile(p.installDirPath, ip.filename, p.outputFilePath) | 
|  | 387 | for _, sl := range ip.symlinks { | 
| Inseob Kim | 916901e | 2021-02-17 15:48:53 +0900 | [diff] [blame] | 388 | ctx.InstallSymlink(p.installDirPath, sl, installPath) | 
| Jiyong Park | f9f6805 | 2020-09-29 20:15:08 +0900 | [diff] [blame] | 389 | } | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 390 | } | 
|  | 391 |  | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 392 | func (p *PrebuiltEtc) AndroidMkEntries() []android.AndroidMkEntries { | 
| Jaewoong Jung | 9aa3ab1 | 2019-04-03 15:47:29 -0700 | [diff] [blame] | 393 | nameSuffix := "" | 
| Yifan Hong | 1b3348d | 2020-01-21 15:53:22 -0800 | [diff] [blame] | 394 | if p.inRamdisk() && !p.onlyInRamdisk() { | 
|  | 395 | nameSuffix = ".ramdisk" | 
|  | 396 | } | 
| Yifan Hong | 60e0cfb | 2020-10-21 15:17:56 -0700 | [diff] [blame] | 397 | if p.inVendorRamdisk() && !p.onlyInVendorRamdisk() { | 
|  | 398 | nameSuffix = ".vendor_ramdisk" | 
|  | 399 | } | 
| Inseob Kim | 08758f0 | 2021-04-08 21:13:22 +0900 | [diff] [blame] | 400 | if p.inDebugRamdisk() && !p.onlyInDebugRamdisk() { | 
|  | 401 | nameSuffix = ".debug_ramdisk" | 
|  | 402 | } | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 403 | if p.InRecovery() && !p.onlyInRecovery() { | 
| Jaewoong Jung | 9aa3ab1 | 2019-04-03 15:47:29 -0700 | [diff] [blame] | 404 | nameSuffix = ".recovery" | 
|  | 405 | } | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 406 | return []android.AndroidMkEntries{android.AndroidMkEntries{ | 
| Jaewoong Jung | 9aa3ab1 | 2019-04-03 15:47:29 -0700 | [diff] [blame] | 407 | Class:      "ETC", | 
|  | 408 | SubName:    nameSuffix, | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 409 | OutputFile: android.OptionalPathForPath(p.outputFilePath), | 
|  | 410 | ExtraEntries: []android.AndroidMkExtraEntriesFunc{ | 
| Colin Cross | aa25553 | 2020-07-03 13:18:24 -0700 | [diff] [blame] | 411 | func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { | 
| Jaewoong Jung | e0dc8df | 2019-08-27 17:33:16 -0700 | [diff] [blame] | 412 | entries.SetString("LOCAL_MODULE_TAGS", "optional") | 
| Colin Cross | c68db4b | 2021-11-11 18:59:15 -0800 | [diff] [blame] | 413 | entries.SetString("LOCAL_MODULE_PATH", p.installDirPath.String()) | 
| Jaewoong Jung | e0dc8df | 2019-08-27 17:33:16 -0700 | [diff] [blame] | 414 | entries.SetString("LOCAL_INSTALLED_MODULE_STEM", p.outputFilePath.Base()) | 
| Yo Chiang | 3d64d49 | 2020-05-27 17:56:39 +0800 | [diff] [blame] | 415 | if len(p.properties.Symlinks) > 0 { | 
|  | 416 | entries.AddStrings("LOCAL_MODULE_SYMLINKS", p.properties.Symlinks...) | 
|  | 417 | } | 
| Yo Chiang | 803c40d | 2020-11-16 20:32:51 +0800 | [diff] [blame] | 418 | entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !p.Installable()) | 
| Jaewoong Jung | e0dc8df | 2019-08-27 17:33:16 -0700 | [diff] [blame] | 419 | if p.additionalDependencies != nil { | 
| Yo Chiang | 803c40d | 2020-11-16 20:32:51 +0800 | [diff] [blame] | 420 | entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", p.additionalDependencies.Strings()...) | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 421 | } | 
| Jaewoong Jung | e0dc8df | 2019-08-27 17:33:16 -0700 | [diff] [blame] | 422 | }, | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 423 | }, | 
| Jiyong Park | 0b0e1b9 | 2019-12-03 13:24:29 +0900 | [diff] [blame] | 424 | }} | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 425 | } | 
|  | 426 |  | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 427 | func InitPrebuiltEtcModule(p *PrebuiltEtc, dirBase string) { | 
|  | 428 | p.installDirBase = dirBase | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 429 | p.AddProperties(&p.properties) | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 430 | p.AddProperties(&p.subdirProperties) | 
|  | 431 | } | 
|  | 432 |  | 
|  | 433 | func InitPrebuiltRootModule(p *PrebuiltEtc) { | 
|  | 434 | p.installDirBase = "." | 
|  | 435 | p.AddProperties(&p.properties) | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 436 | } | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 437 |  | 
| Patrice Arruda | 9e14b96 | 2019-03-11 15:58:50 -0700 | [diff] [blame] | 438 | // prebuilt_etc is for a prebuilt artifact that is installed in | 
|  | 439 | // <partition>/etc/<sub_dir> directory. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 440 | func PrebuiltEtcFactory() android.Module { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 441 | module := &PrebuiltEtc{} | 
|  | 442 | InitPrebuiltEtcModule(module, "etc") | 
| Jiyong Park | 5a8d1be | 2018-04-25 22:57:34 +0900 | [diff] [blame] | 443 | // This module is device-only | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 444 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Inseob Kim | 1e27a14 | 2021-05-06 11:46:11 +0000 | [diff] [blame] | 445 | android.InitDefaultableModule(module) | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 446 | android.InitBazelModule(module) | 
| Inseob Kim | 1e27a14 | 2021-05-06 11:46:11 +0000 | [diff] [blame] | 447 | return module | 
|  | 448 | } | 
|  | 449 |  | 
|  | 450 | func defaultsFactory() android.Module { | 
|  | 451 | return DefaultsFactory() | 
|  | 452 | } | 
|  | 453 |  | 
|  | 454 | func DefaultsFactory(props ...interface{}) android.Module { | 
|  | 455 | module := &Defaults{} | 
|  | 456 |  | 
|  | 457 | module.AddProperties(props...) | 
|  | 458 | module.AddProperties( | 
|  | 459 | &prebuiltEtcProperties{}, | 
|  | 460 | &prebuiltSubdirProperties{}, | 
|  | 461 | ) | 
|  | 462 |  | 
|  | 463 | android.InitDefaultsModule(module) | 
|  | 464 |  | 
| Jiyong Park | c678ad3 | 2018-04-10 13:07:10 +0900 | [diff] [blame] | 465 | return module | 
|  | 466 | } | 
| Tao Bao | 0ba5c94 | 2018-08-14 22:20:22 -0700 | [diff] [blame] | 467 |  | 
| Patrice Arruda | 9e14b96 | 2019-03-11 15:58:50 -0700 | [diff] [blame] | 468 | // prebuilt_etc_host is for a host prebuilt artifact that is installed in | 
|  | 469 | // $(HOST_OUT)/etc/<sub_dir> directory. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 470 | func PrebuiltEtcHostFactory() android.Module { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 471 | module := &PrebuiltEtc{} | 
|  | 472 | InitPrebuiltEtcModule(module, "etc") | 
| Jaewoong Jung | 2478818 | 2019-02-04 14:34:10 -0800 | [diff] [blame] | 473 | // This module is host-only | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 474 | android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 475 | android.InitDefaultableModule(module) | 
| Liz Kammer | a923442 | 2021-12-22 15:32:18 -0500 | [diff] [blame] | 476 | android.InitBazelModule(module) | 
| Jaewoong Jung | 2478818 | 2019-02-04 14:34:10 -0800 | [diff] [blame] | 477 | return module | 
|  | 478 | } | 
|  | 479 |  | 
| Miguel | 32b0280 | 2022-12-01 18:38:26 +0000 | [diff] [blame] | 480 | // prebuilt_etc_host is for a host prebuilt artifact that is installed in | 
|  | 481 | // <partition>/etc/<sub_dir> directory. | 
|  | 482 | func PrebuiltEtcCaCertsFactory() android.Module { | 
|  | 483 | module := &PrebuiltEtc{} | 
|  | 484 | InitPrebuiltEtcModule(module, "cacerts") | 
|  | 485 | // This module is device-only | 
|  | 486 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
|  | 487 | android.InitBazelModule(module) | 
|  | 488 | return module | 
|  | 489 | } | 
|  | 490 |  | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 491 | // prebuilt_root is for a prebuilt artifact that is installed in | 
|  | 492 | // <partition>/ directory. Can't have any sub directories. | 
|  | 493 | func PrebuiltRootFactory() android.Module { | 
|  | 494 | module := &PrebuiltEtc{} | 
|  | 495 | InitPrebuiltRootModule(module) | 
|  | 496 | // This module is device-only | 
|  | 497 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 498 | android.InitDefaultableModule(module) | 
| Inseob Kim | 27408bf | 2021-04-06 21:00:17 +0900 | [diff] [blame] | 499 | return module | 
|  | 500 | } | 
|  | 501 |  | 
| Liz Kammer | e9ecddc | 2022-01-04 17:27:52 -0500 | [diff] [blame] | 502 | // prebuilt_root_host is for a host prebuilt artifact that is installed in $(HOST_OUT)/<sub_dir> | 
|  | 503 | // directory. | 
|  | 504 | func PrebuiltRootHostFactory() android.Module { | 
|  | 505 | module := &PrebuiltEtc{} | 
|  | 506 | InitPrebuiltEtcModule(module, ".") | 
|  | 507 | // This module is host-only | 
|  | 508 | android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon) | 
|  | 509 | android.InitDefaultableModule(module) | 
|  | 510 | return module | 
|  | 511 | } | 
|  | 512 |  | 
| Patrice Arruda | 9e14b96 | 2019-03-11 15:58:50 -0700 | [diff] [blame] | 513 | // prebuilt_usr_share is for a prebuilt artifact that is installed in | 
|  | 514 | // <partition>/usr/share/<sub_dir> directory. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 515 | func PrebuiltUserShareFactory() android.Module { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 516 | module := &PrebuiltEtc{} | 
|  | 517 | InitPrebuiltEtcModule(module, "usr/share") | 
| Jaewoong Jung | c3fcdb4 | 2019-02-13 05:50:33 -0800 | [diff] [blame] | 518 | // This module is device-only | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 519 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 520 | android.InitDefaultableModule(module) | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 521 | android.InitBazelModule(module) | 
| Jaewoong Jung | c3fcdb4 | 2019-02-13 05:50:33 -0800 | [diff] [blame] | 522 | return module | 
|  | 523 | } | 
|  | 524 |  | 
| Patrice Arruda | 9e14b96 | 2019-03-11 15:58:50 -0700 | [diff] [blame] | 525 | // prebuild_usr_share_host is for a host prebuilt artifact that is installed in | 
|  | 526 | // $(HOST_OUT)/usr/share/<sub_dir> directory. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 527 | func PrebuiltUserShareHostFactory() android.Module { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 528 | module := &PrebuiltEtc{} | 
|  | 529 | InitPrebuiltEtcModule(module, "usr/share") | 
| Patrice Arruda | 300cef9 | 2019-02-22 15:47:57 -0800 | [diff] [blame] | 530 | // This module is host-only | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 531 | android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 532 | android.InitDefaultableModule(module) | 
| Patrice Arruda | 300cef9 | 2019-02-22 15:47:57 -0800 | [diff] [blame] | 533 | return module | 
|  | 534 | } | 
|  | 535 |  | 
| Patrice Arruda | 61583eb | 2019-05-14 08:20:45 -0700 | [diff] [blame] | 536 | // prebuilt_font installs a font in <partition>/fonts directory. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 537 | func PrebuiltFontFactory() android.Module { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 538 | module := &PrebuiltEtc{} | 
|  | 539 | InitPrebuiltEtcModule(module, "fonts") | 
| Patrice Arruda | 61583eb | 2019-05-14 08:20:45 -0700 | [diff] [blame] | 540 | // This module is device-only | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 541 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 542 | android.InitDefaultableModule(module) | 
| Patrice Arruda | 61583eb | 2019-05-14 08:20:45 -0700 | [diff] [blame] | 543 | return module | 
|  | 544 | } | 
| Patrice Arruda | 057a8b1 | 2019-06-03 15:29:27 -0700 | [diff] [blame] | 545 |  | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 546 | // prebuilt_firmware installs a firmware file to <partition>/etc/firmware directory for system | 
|  | 547 | // image. | 
|  | 548 | // If soc_specific property is set to true, the firmware file is installed to the | 
|  | 549 | // vendor <partition>/firmware directory for vendor image. | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 550 | func PrebuiltFirmwareFactory() android.Module { | 
| Jooyung Han | a017182 | 2019-07-22 15:48:36 +0900 | [diff] [blame] | 551 | module := &PrebuiltEtc{} | 
|  | 552 | module.socInstallDirBase = "firmware" | 
|  | 553 | InitPrebuiltEtcModule(module, "etc/firmware") | 
| Patrice Arruda | 057a8b1 | 2019-06-03 15:29:27 -0700 | [diff] [blame] | 554 | // This module is device-only | 
| Jaewoong Jung | 4b79e98 | 2020-06-01 10:45:49 -0700 | [diff] [blame] | 555 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 556 | android.InitDefaultableModule(module) | 
| Patrice Arruda | 057a8b1 | 2019-06-03 15:29:27 -0700 | [diff] [blame] | 557 | return module | 
|  | 558 | } | 
| Patrice Arruda | 0f68800 | 2020-06-08 21:40:25 +0000 | [diff] [blame] | 559 |  | 
|  | 560 | // prebuilt_dsp installs a DSP related file to <partition>/etc/dsp directory for system image. | 
| Yo Chiang | f0e19fe | 2020-11-18 15:28:42 +0800 | [diff] [blame] | 561 | // If soc_specific property is set to true, the DSP related file is installed to the | 
|  | 562 | // vendor <partition>/dsp directory for vendor image. | 
| Patrice Arruda | 0f68800 | 2020-06-08 21:40:25 +0000 | [diff] [blame] | 563 | func PrebuiltDSPFactory() android.Module { | 
|  | 564 | module := &PrebuiltEtc{} | 
|  | 565 | module.socInstallDirBase = "dsp" | 
|  | 566 | InitPrebuiltEtcModule(module, "etc/dsp") | 
|  | 567 | // This module is device-only | 
|  | 568 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 569 | android.InitDefaultableModule(module) | 
| Patrice Arruda | 0f68800 | 2020-06-08 21:40:25 +0000 | [diff] [blame] | 570 | return module | 
|  | 571 | } | 
| Colin Cross | 83ebf23 | 2021-04-09 09:41:23 -0700 | [diff] [blame] | 572 |  | 
|  | 573 | // prebuilt_rfsa installs a firmware file that will be available through Qualcomm's RFSA | 
|  | 574 | // to the <partition>/lib/rfsa directory. | 
|  | 575 | func PrebuiltRFSAFactory() android.Module { | 
|  | 576 | module := &PrebuiltEtc{} | 
|  | 577 | // Ideally these would go in /vendor/dsp, but the /vendor/lib/rfsa paths are hardcoded in too | 
|  | 578 | // many places outside of the application processor.  They could be moved to /vendor/dsp once | 
|  | 579 | // that is cleaned up. | 
|  | 580 | InitPrebuiltEtcModule(module, "lib/rfsa") | 
|  | 581 | // This module is device-only | 
|  | 582 | android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) | 
| Martin Stjernholm | dc6525e | 2021-10-14 00:42:59 +0100 | [diff] [blame] | 583 | android.InitDefaultableModule(module) | 
| Colin Cross | 83ebf23 | 2021-04-09 09:41:23 -0700 | [diff] [blame] | 584 | return module | 
|  | 585 | } | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 586 |  | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 587 | // Copy file into the snapshot | 
|  | 588 | func copyFile(ctx android.SingletonContext, path android.Path, out string, fake bool) android.OutputPath { | 
|  | 589 | if fake { | 
|  | 590 | // Create empty file instead for the fake snapshot | 
|  | 591 | return snapshot.WriteStringToFileRule(ctx, "", out) | 
|  | 592 | } else { | 
|  | 593 | return snapshot.CopyFileRule(pctx, ctx, path, out) | 
|  | 594 | } | 
|  | 595 | } | 
|  | 596 |  | 
|  | 597 | // Check if the module is target of the snapshot | 
|  | 598 | func isSnapshotAware(ctx android.SingletonContext, m *PrebuiltEtc, image snapshot.SnapshotImage) bool { | 
|  | 599 | if !m.Enabled() { | 
|  | 600 | return false | 
|  | 601 | } | 
|  | 602 |  | 
|  | 603 | // Skip if the module is not included in the image | 
|  | 604 | if !image.InImage(m)() { | 
|  | 605 | return false | 
|  | 606 | } | 
|  | 607 |  | 
|  | 608 | // When android/prebuilt.go selects between source and prebuilt, it sets | 
|  | 609 | // HideFromMake on the other one to avoid duplicate install rules in make. | 
|  | 610 | if m.IsHideFromMake() { | 
|  | 611 | return false | 
|  | 612 | } | 
|  | 613 |  | 
|  | 614 | // There are some prebuilt_etc module with multiple definition of same name. | 
|  | 615 | // Check if the target would be included from the build | 
|  | 616 | if !m.ExportedToMake() { | 
|  | 617 | return false | 
|  | 618 | } | 
|  | 619 |  | 
|  | 620 | // Skip if the module is in the predefined path list to skip | 
|  | 621 | if image.IsProprietaryPath(ctx.ModuleDir(m), ctx.DeviceConfig()) { | 
|  | 622 | return false | 
|  | 623 | } | 
|  | 624 |  | 
|  | 625 | // Skip if the module should be excluded | 
|  | 626 | if image.ExcludeFromSnapshot(m) || image.ExcludeFromDirectedSnapshot(ctx.DeviceConfig(), m.BaseModuleName()) { | 
|  | 627 | return false | 
|  | 628 | } | 
|  | 629 |  | 
|  | 630 | // Skip from other exceptional cases | 
|  | 631 | if m.Target().Os.Class != android.Device { | 
|  | 632 | return false | 
|  | 633 | } | 
|  | 634 | if m.Target().NativeBridge == android.NativeBridgeEnabled { | 
|  | 635 | return false | 
|  | 636 | } | 
|  | 637 |  | 
|  | 638 | return true | 
|  | 639 | } | 
|  | 640 |  | 
| Justin Yun | 1db9748 | 2023-04-11 18:20:07 +0900 | [diff] [blame] | 641 | func generatePrebuiltSnapshot(s snapshot.SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) snapshot.SnapshotPaths { | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 642 | /* | 
|  | 643 | Snapshot zipped artifacts directory structure for etc modules: | 
|  | 644 | {SNAPSHOT_ARCH}/ | 
|  | 645 | arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/ | 
|  | 646 | etc/ | 
|  | 647 | (prebuilt etc files) | 
|  | 648 | arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/ | 
|  | 649 | etc/ | 
|  | 650 | (prebuilt etc files) | 
|  | 651 | NOTICE_FILES/ | 
|  | 652 | (notice files) | 
|  | 653 | */ | 
|  | 654 | var snapshotOutputs android.Paths | 
| Justin Yun | 1db9748 | 2023-04-11 18:20:07 +0900 | [diff] [blame] | 655 | var snapshotNotices android.Paths | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 656 | installedNotices := make(map[string]bool) | 
|  | 657 |  | 
|  | 658 | ctx.VisitAllModules(func(module android.Module) { | 
|  | 659 | m, ok := module.(*PrebuiltEtc) | 
|  | 660 | if !ok { | 
|  | 661 | return | 
|  | 662 | } | 
|  | 663 |  | 
|  | 664 | if !isSnapshotAware(ctx, m, s.Image) { | 
|  | 665 | return | 
|  | 666 | } | 
|  | 667 |  | 
|  | 668 | targetArch := "arch-" + m.Target().Arch.ArchType.String() | 
|  | 669 |  | 
|  | 670 | snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "etc", m.BaseModuleName()) | 
|  | 671 | snapshotOutputs = append(snapshotOutputs, copyFile(ctx, m.OutputFile(), snapshotLibOut, s.Fake)) | 
|  | 672 |  | 
| Rob Seymour | 925aa09 | 2021-08-10 20:42:03 +0000 | [diff] [blame] | 673 | prop := snapshot.SnapshotJsonFlags{} | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 674 | propOut := snapshotLibOut + ".json" | 
| Justin Yun | 1db9748 | 2023-04-11 18:20:07 +0900 | [diff] [blame] | 675 | prop.InitBaseSnapshotProps(m) | 
| Justin Yun | 8bd3afe | 2023-05-12 15:53:06 +0900 | [diff] [blame] | 676 | prop.RelativeInstallPath = m.SubDir() | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 677 |  | 
|  | 678 | if m.properties.Filename != nil { | 
|  | 679 | prop.Filename = *m.properties.Filename | 
|  | 680 | } | 
|  | 681 |  | 
|  | 682 | j, err := json.Marshal(prop) | 
|  | 683 | if err != nil { | 
|  | 684 | ctx.Errorf("json marshal to %q failed: %#v", propOut, err) | 
|  | 685 | return | 
|  | 686 | } | 
|  | 687 | snapshotOutputs = append(snapshotOutputs, snapshot.WriteStringToFileRule(ctx, string(j), propOut)) | 
|  | 688 |  | 
| Justin Yun | 1db9748 | 2023-04-11 18:20:07 +0900 | [diff] [blame] | 689 | for _, notice := range m.EffectiveLicenseFiles() { | 
|  | 690 | if _, ok := installedNotices[notice.String()]; !ok { | 
|  | 691 | installedNotices[notice.String()] = true | 
|  | 692 | snapshotNotices = append(snapshotNotices, notice) | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 693 | } | 
|  | 694 | } | 
|  | 695 |  | 
|  | 696 | }) | 
|  | 697 |  | 
| Justin Yun | 1db9748 | 2023-04-11 18:20:07 +0900 | [diff] [blame] | 698 | return snapshot.SnapshotPaths{OutputFiles: snapshotOutputs, NoticeFiles: snapshotNotices} | 
| Kiyoung Kim | ae11c23 | 2021-07-19 11:38:04 +0900 | [diff] [blame] | 699 | } | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 700 |  | 
|  | 701 | // For Bazel / bp2build | 
|  | 702 |  | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 703 | type bazelPrebuiltFileAttributes struct { | 
| Alix | 993872a | 2022-06-15 17:42:14 +0000 | [diff] [blame] | 704 | Src               bazel.LabelAttribute | 
|  | 705 | Filename          bazel.LabelAttribute | 
|  | 706 | Dir               string | 
|  | 707 | Installable       bazel.BoolAttribute | 
|  | 708 | Filename_from_src bazel.BoolAttribute | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 709 | } | 
|  | 710 |  | 
| Alix | 5918d64 | 2022-06-27 20:57:44 +0000 | [diff] [blame] | 711 | // Bp2buildHelper returns a bazelPrebuiltFileAttributes used for the conversion | 
|  | 712 | // of prebuilt_*  modules. bazelPrebuiltFileAttributes has the common attributes | 
|  | 713 | // used by both prebuilt_etc_xml and other prebuilt_* moodules | 
|  | 714 | func (module *PrebuiltEtc) Bp2buildHelper(ctx android.TopDownMutatorContext) *bazelPrebuiltFileAttributes { | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 715 | var src bazel.LabelAttribute | 
| Liz Kammer | dff00ea | 2021-10-04 13:44:34 -0400 | [diff] [blame] | 716 | for axis, configToProps := range module.GetArchVariantProperties(ctx, &prebuiltEtcProperties{}) { | 
|  | 717 | for config, p := range configToProps { | 
|  | 718 | props, ok := p.(*prebuiltEtcProperties) | 
|  | 719 | if !ok { | 
|  | 720 | continue | 
|  | 721 | } | 
|  | 722 | if props.Src != nil { | 
| Chris Parsons | 58852a0 | 2021-12-09 18:10:18 -0500 | [diff] [blame] | 723 | label := android.BazelLabelForModuleSrcSingle(ctx, *props.Src) | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 724 | src.SetSelectValue(axis, config, label) | 
| Liz Kammer | dff00ea | 2021-10-04 13:44:34 -0400 | [diff] [blame] | 725 | } | 
|  | 726 | } | 
| Alix | bbfd538 | 2022-06-09 18:52:05 +0000 | [diff] [blame] | 727 |  | 
| Cole Faust | 912bc88 | 2023-03-08 12:29:50 -0800 | [diff] [blame] | 728 | for propName, productConfigProps := range android.ProductVariableProperties(ctx, ctx.Module()) { | 
| Alix | bbfd538 | 2022-06-09 18:52:05 +0000 | [diff] [blame] | 729 | for configProp, propVal := range productConfigProps { | 
|  | 730 | if propName == "Src" { | 
|  | 731 | props, ok := propVal.(*string) | 
|  | 732 | if !ok { | 
|  | 733 | ctx.PropertyErrorf(" Expected Property to have type string, but was %s\n", reflect.TypeOf(propVal).String()) | 
|  | 734 | continue | 
|  | 735 | } | 
|  | 736 | if props != nil { | 
|  | 737 | label := android.BazelLabelForModuleSrcSingle(ctx, *props) | 
|  | 738 | src.SetSelectValue(configProp.ConfigurationAxis(), configProp.SelectKey(), label) | 
|  | 739 | } | 
|  | 740 | } | 
|  | 741 | } | 
|  | 742 | } | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 743 | } | 
|  | 744 |  | 
|  | 745 | var filename string | 
| Alix | 993872a | 2022-06-15 17:42:14 +0000 | [diff] [blame] | 746 | var filenameFromSrc bool | 
|  | 747 | moduleProps := module.properties | 
|  | 748 |  | 
|  | 749 | if moduleProps.Filename != nil && *moduleProps.Filename != "" { | 
|  | 750 | filename = *moduleProps.Filename | 
|  | 751 | } else if moduleProps.Filename_from_src != nil && *moduleProps.Filename_from_src { | 
|  | 752 | if moduleProps.Src != nil { | 
|  | 753 | filename = *moduleProps.Src | 
|  | 754 | } | 
|  | 755 | filenameFromSrc = true | 
|  | 756 | } else { | 
|  | 757 | filename = ctx.ModuleName() | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 758 | } | 
|  | 759 |  | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 760 | var dir = module.installDirBase | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 761 | if subDir := module.subdirProperties.Sub_dir; subDir != nil { | 
|  | 762 | dir = dir + "/" + *subDir | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 763 | } | 
|  | 764 |  | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 765 | var installable bazel.BoolAttribute | 
|  | 766 | if install := module.properties.Installable; install != nil { | 
|  | 767 | installable.Value = install | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 768 | } | 
|  | 769 |  | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 770 | attrs := &bazelPrebuiltFileAttributes{ | 
|  | 771 | Src:         src, | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | c78604e | 2022-02-28 18:22:59 -0500 | [diff] [blame] | 772 | Dir:         dir, | 
|  | 773 | Installable: installable, | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 774 | } | 
|  | 775 |  | 
| Alix | 993872a | 2022-06-15 17:42:14 +0000 | [diff] [blame] | 776 | if filename != "" { | 
|  | 777 | attrs.Filename = bazel.LabelAttribute{Value: &bazel.Label{Label: filename}} | 
|  | 778 | } else if filenameFromSrc { | 
|  | 779 | attrs.Filename_from_src = bazel.BoolAttribute{Value: moduleProps.Filename_from_src} | 
|  | 780 | } | 
|  | 781 |  | 
| Alix | 5918d64 | 2022-06-27 20:57:44 +0000 | [diff] [blame] | 782 | return attrs | 
|  | 783 |  | 
|  | 784 | } | 
|  | 785 |  | 
|  | 786 | // ConvertWithBp2build performs bp2build conversion of PrebuiltEtc | 
|  | 787 | // prebuilt_* modules (except prebuilt_etc_xml) are PrebuiltEtc, | 
|  | 788 | // which we treat as *PrebuiltFile* | 
|  | 789 | func (module *PrebuiltEtc) ConvertWithBp2build(ctx android.TopDownMutatorContext) { | 
|  | 790 | var dir = module.installDirBase | 
|  | 791 | // prebuilt_file supports only `etc` or `usr/share` | 
|  | 792 | if !(dir == "etc" || dir == "usr/share") { | 
|  | 793 | return | 
|  | 794 | } | 
|  | 795 |  | 
|  | 796 | attrs := module.Bp2buildHelper(ctx) | 
|  | 797 |  | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 798 | props := bazel.BazelTargetModuleProperties{ | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | b81f77e | 2022-02-28 17:38:34 -0500 | [diff] [blame] | 799 | Rule_class:        "prebuilt_file", | 
|  | 800 | Bzl_load_location: "//build/bazel/rules:prebuilt_file.bzl", | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 801 | } | 
|  | 802 |  | 
| Alex Márquez Pérez Muñíz Díaz Púras Thaureaux | 447f6c9 | 2021-08-31 20:30:36 +0000 | [diff] [blame] | 803 | ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name()}, attrs) | 
| Rupert Shuttleworth | 378fc1b | 2021-07-28 08:03:16 -0400 | [diff] [blame] | 804 | } | 
| Spandan Das | 756d340 | 2023-06-05 22:49:50 +0000 | [diff] [blame^] | 805 |  | 
|  | 806 | var _ android.MixedBuildBuildable = (*PrebuiltEtc)(nil) | 
|  | 807 |  | 
|  | 808 | func (pe *PrebuiltEtc) IsMixedBuildSupported(ctx android.BaseModuleContext) bool { | 
|  | 809 | return true | 
|  | 810 | } | 
|  | 811 |  | 
|  | 812 | func (pe *PrebuiltEtc) QueueBazelCall(ctx android.BaseModuleContext) { | 
|  | 813 | ctx.Config().BazelContext.QueueBazelRequest( | 
|  | 814 | pe.GetBazelLabel(ctx, pe), | 
|  | 815 | cquery.GetPrebuiltFileInfo, | 
|  | 816 | android.GetConfigKey(ctx), | 
|  | 817 | ) | 
|  | 818 | } | 
|  | 819 |  | 
|  | 820 | func (pe *PrebuiltEtc) ProcessBazelQueryResponse(ctx android.ModuleContext) { | 
|  | 821 | bazelCtx := ctx.Config().BazelContext | 
|  | 822 | pfi, err := bazelCtx.GetPrebuiltFileInfo(pe.GetBazelLabel(ctx, pe), android.GetConfigKey(ctx)) | 
|  | 823 | if err != nil { | 
|  | 824 | ctx.ModuleErrorf(err.Error()) | 
|  | 825 | return | 
|  | 826 | } | 
|  | 827 |  | 
|  | 828 | // Set properties for androidmk | 
|  | 829 | pe.installDirPath = android.PathForModuleInstall(ctx, pfi.Dir) | 
|  | 830 |  | 
|  | 831 | // Installation rules | 
|  | 832 | ip := installProperties{ | 
|  | 833 | installable:    pfi.Installable, | 
|  | 834 | filename:       pfi.Filename, | 
|  | 835 | sourceFilePath: android.PathForSource(ctx, pfi.Src), | 
|  | 836 | // symlinks: pe.properties.Symlinks, // TODO: b/207489266 - Fully support all properties in prebuilt_file | 
|  | 837 | } | 
|  | 838 | pe.addInstallRules(ctx, ip) | 
|  | 839 | } |