blob: 0e0dba93418c8fca19a084afedd3415ed7e690f2 [file] [log] [blame]
Justin Yun8effde42017-06-23 19:24:43 +09001// Copyright 2017 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 cc
16
17import (
Inseob Kimae553032019-05-14 18:52:49 +090018 "encoding/json"
Martin Stjernholm257eb0c2018-10-15 13:05:27 +010019 "errors"
Jooyung Han0302a842019-10-30 18:43:49 +090020 "fmt"
Inseob Kim1f086e22019-05-09 13:29:15 +090021 "path/filepath"
Inseob Kim242ef0c2019-10-22 20:15:20 +090022 "sort"
Jiyong Parkd5b18a52017-08-03 21:22:50 +090023 "strings"
Jiyong Parkd5b18a52017-08-03 21:22:50 +090024
Justin Yun8effde42017-06-23 19:24:43 +090025 "android/soong/android"
Vic Yangefd249e2018-11-12 20:19:56 -080026 "android/soong/cc/config"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070027 "android/soong/etc"
Kiyoung Kimae11c232021-07-19 11:38:04 +090028 "android/soong/snapshot"
Colin Cross6e511a92020-07-27 21:26:48 -070029
30 "github.com/google/blueprint"
Justin Yund5784122023-10-25 13:25:32 +090031 "github.com/google/blueprint/proptools"
Justin Yun8effde42017-06-23 19:24:43 +090032)
33
Jooyung Han39edb6c2019-11-06 16:53:07 +090034const (
35 llndkLibrariesTxt = "llndk.libraries.txt"
Justin Yund5784122023-10-25 13:25:32 +090036 llndkLibrariesTxtForApex = "llndk.libraries.txt.apex"
Jooyung Han39edb6c2019-11-06 16:53:07 +090037 vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
38 vndkSpLibrariesTxt = "vndksp.libraries.txt"
39 vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
Justin Yun8a2600c2020-12-07 12:44:03 +090040 vndkProductLibrariesTxt = "vndkproduct.libraries.txt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090041 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
42)
43
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090044func VndkLibrariesTxtModules(vndkVersion string, ctx android.BaseModuleContext) []string {
Justin Yund5784122023-10-25 13:25:32 +090045 // Return the list of vndk txt files for the vndk apex of the vndkVersion.
Jooyung Han39edb6c2019-11-06 16:53:07 +090046 if vndkVersion == "current" {
Justin Yun74217d92023-08-21 20:51:45 +090047 // We can assume all txt files are snapshotted if we find one of them.
48 currentVndkSnapshotted := ctx.OtherModuleExists(insertVndkVersion(llndkLibrariesTxt, ctx.DeviceConfig().PlatformVndkVersion()))
49 if currentVndkSnapshotted {
50 // If the current VNDK is already snapshotted (which can happen with
51 // the `next` config), use the prebuilt txt files in the snapshot.
52 // This is because the txt files built from source are probably be
53 // for the in-development version.
54 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
55 } else {
56 // Use the txt files generated from the source
Justin Yund5784122023-10-25 13:25:32 +090057 return []string{
58 llndkLibrariesTxtForApex,
Justin Yun74217d92023-08-21 20:51:45 +090059 vndkCoreLibrariesTxt,
60 vndkSpLibrariesTxt,
61 vndkPrivateLibrariesTxt,
62 vndkProductLibrariesTxt,
63 }
Justin Yun74217d92023-08-21 20:51:45 +090064 }
Jooyung Han39edb6c2019-11-06 16:53:07 +090065 }
Justin Yun74217d92023-08-21 20:51:45 +090066
Jooyung Han39edb6c2019-11-06 16:53:07 +090067 // Snapshot vndks have their own *.libraries.VER.txt files.
68 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090069 result := []string{
Jooyung Han39edb6c2019-11-06 16:53:07 +090070 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
71 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
72 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
Justin Yun8a2600c2020-12-07 12:44:03 +090073 insertVndkVersion(vndkProductLibrariesTxt, vndkVersion),
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090074 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
Jooyung Han39edb6c2019-11-06 16:53:07 +090075 }
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090076
77 return result
Jooyung Han39edb6c2019-11-06 16:53:07 +090078}
79
Justin Yun8effde42017-06-23 19:24:43 +090080type VndkProperties struct {
81 Vndk struct {
82 // declared as a VNDK or VNDK-SP module. The vendor variant
83 // will be installed in /system instead of /vendor partition.
84 //
Justin Yun63e9ec72020-10-29 16:49:43 +090085 // `vendor_available` and `product_available` must be explicitly
86 // set to either true or false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090087 Enabled *bool
88
89 // declared as a VNDK-SP module, which is a subset of VNDK.
90 //
91 // `vndk: { enabled: true }` must set together.
92 //
93 // All these modules are allowed to link to VNDK-SP or LL-NDK
94 // modules only. Other dependency will cause link-type errors.
95 //
96 // If `support_system_process` is not set or set to false,
97 // the module is VNDK-core and can link to other VNDK-core,
98 // VNDK-SP or LL-NDK modules only.
99 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +0800100
Justin Yunfd9e8042020-12-23 18:23:14 +0900101 // declared as a VNDK-private module.
102 // This module still creates the vendor and product variants refering
103 // to the `vendor_available: true` and `product_available: true`
104 // properties. However, it is only available to the other VNDK modules
105 // but not to the non-VNDK vendor or product modules.
106 Private *bool
107
Logan Chienf3511742017-10-31 18:04:35 +0800108 // Extending another module
109 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +0900110 }
111}
112
113type vndkdep struct {
114 Properties VndkProperties
115}
116
117func (vndk *vndkdep) props() []interface{} {
118 return []interface{}{&vndk.Properties}
119}
120
Justin Yun8effde42017-06-23 19:24:43 +0900121func (vndk *vndkdep) isVndk() bool {
122 return Bool(vndk.Properties.Vndk.Enabled)
123}
124
125func (vndk *vndkdep) isVndkSp() bool {
126 return Bool(vndk.Properties.Vndk.Support_system_process)
127}
128
Logan Chienf3511742017-10-31 18:04:35 +0800129func (vndk *vndkdep) isVndkExt() bool {
130 return vndk.Properties.Vndk.Extends != nil
131}
132
133func (vndk *vndkdep) getVndkExtendsModuleName() string {
134 return String(vndk.Properties.Vndk.Extends)
135}
136
Justin Yun8effde42017-06-23 19:24:43 +0900137func (vndk *vndkdep) typeName() string {
138 if !vndk.isVndk() {
139 return "native:vendor"
140 }
Logan Chienf3511742017-10-31 18:04:35 +0800141 if !vndk.isVndkExt() {
142 if !vndk.isVndkSp() {
143 return "native:vendor:vndk"
144 }
145 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900146 }
Logan Chienf3511742017-10-31 18:04:35 +0800147 if !vndk.isVndkSp() {
148 return "native:vendor:vndkext"
149 }
150 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900151}
152
Justin Yun63e9ec72020-10-29 16:49:43 +0900153// VNDK link type check from a module with UseVndk() == true.
Jooyung Han479ca172020-10-19 18:51:07 +0900154func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900155 if to.linker == nil {
156 return
157 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900158 if !vndk.isVndk() {
Justin Yunfd9e8042020-12-23 18:23:14 +0900159 // Non-VNDK modules those installed to /vendor, /system/vendor,
160 // /product or /system/product cannot depend on VNDK-private modules
161 // that include VNDK-core-private, VNDK-SP-private and LLNDK-private.
162 if to.IsVndkPrivate() {
163 ctx.ModuleErrorf("non-VNDK module should not link to %q which has `private: true`", to.Name())
Jiyong Park82e2bf32017-08-16 14:05:54 +0900164 }
165 }
Justin Yun8effde42017-06-23 19:24:43 +0900166 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
167 // Check only shared libraries.
Colin Cross127bb8b2020-12-16 16:46:01 -0800168 // Other (static) libraries are allowed to link.
Justin Yun8effde42017-06-23 19:24:43 +0900169 return
170 }
Colin Cross127bb8b2020-12-16 16:46:01 -0800171
172 if to.IsLlndk() {
173 // LL-NDK libraries are allowed to link
174 return
175 }
176
Ivan Lozano52767be2019-10-18 14:49:46 -0700177 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900178 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
179 vndk.typeName(), to.Name())
180 return
181 }
Logan Chienf3511742017-10-31 18:04:35 +0800182 if tag == vndkExtDepTag {
183 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
184 // and has identical vndk properties.
185 if to.vndkdep == nil || !to.vndkdep.isVndk() {
186 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
187 return
188 }
189 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
190 ctx.ModuleErrorf(
191 "`extends` refers a module %q with mismatched support_system_process",
192 to.Name())
193 return
194 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900195 if to.IsVndkPrivate() {
Logan Chienf3511742017-10-31 18:04:35 +0800196 ctx.ModuleErrorf(
Justin Yunfd9e8042020-12-23 18:23:14 +0900197 "`extends` refers module %q which has `private: true`",
Justin Yun6977e8a2020-10-29 18:24:11 +0900198 to.Name())
199 return
200 }
Logan Chienf3511742017-10-31 18:04:35 +0800201 }
Justin Yun8effde42017-06-23 19:24:43 +0900202 if to.vndkdep == nil {
203 return
204 }
Logan Chienf3511742017-10-31 18:04:35 +0800205
Logan Chiend3c59a22018-03-29 14:08:15 +0800206 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100207 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
208 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
209 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800210 return
211 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800212}
Logan Chienf3511742017-10-31 18:04:35 +0800213
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100214func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800215 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
216 if from.isVndkExt() {
217 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100218 if to.isVndk() && !to.isVndkSp() {
219 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
220 }
221 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800222 }
223 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100224 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900225 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800226 if from.isVndk() {
227 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100228 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800229 }
230 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100231 if !to.isVndkSp() {
232 return errors.New("VNDK-SP must only depend on VNDK-SP")
233 }
234 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800235 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100236 if !to.isVndk() {
237 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
238 }
239 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800240 }
241 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100242 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900243}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900244
Colin Cross78212242021-01-06 14:51:30 -0800245type moduleListerFunc func(ctx android.SingletonContext) (moduleNames, fileNames []string)
246
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900247var (
Colin Cross203b4212021-04-26 17:19:41 -0700248 llndkLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsLLNDK && !m.Header() })
Colin Cross78212242021-01-06 14:51:30 -0800249 vndkSPLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKSP })
250 vndkCoreLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKCore })
Colin Cross203b4212021-04-26 17:19:41 -0700251 vndkPrivateLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKPrivate })
Colin Cross78212242021-01-06 14:51:30 -0800252 vndkProductLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKProduct })
253 vndkUsingCoreVariantLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKUsingCoreVariant })
Inseob Kimae553032019-05-14 18:52:49 +0900254)
Inseob Kim1f086e22019-05-09 13:29:15 +0900255
Colin Cross78212242021-01-06 14:51:30 -0800256// vndkModuleLister takes a predicate that operates on a Module and returns a moduleListerFunc
257// that produces a list of module names and output file names for which the predicate returns true.
258func vndkModuleLister(predicate func(*Module) bool) moduleListerFunc {
259 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
260 ctx.VisitAllModules(func(m android.Module) {
Jooyung Hane3f02812023-05-08 13:54:50 +0900261 if c, ok := m.(*Module); ok && predicate(c) && !c.IsVndkPrebuiltLibrary() {
Colin Cross78212242021-01-06 14:51:30 -0800262 filename, err := getVndkFileName(c)
263 if err != nil {
264 ctx.ModuleErrorf(m, "%s", err)
265 }
266 moduleNames = append(moduleNames, ctx.ModuleName(m))
267 fileNames = append(fileNames, filename)
268 }
269 })
270 moduleNames = android.SortedUniqueStrings(moduleNames)
271 fileNames = android.SortedUniqueStrings(fileNames)
272 return
273 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900274}
275
Colin Cross78212242021-01-06 14:51:30 -0800276// vndkModuleListRemover takes a moduleListerFunc and a prefix and returns a moduleListerFunc
277// that returns the same lists as the input moduleListerFunc, but with modules with the
278// given prefix removed.
279func vndkModuleListRemover(lister moduleListerFunc, prefix string) moduleListerFunc {
280 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
281 moduleNames, fileNames = lister(ctx)
282 filter := func(in []string) []string {
283 out := make([]string, 0, len(in))
284 for _, lib := range in {
285 if strings.HasPrefix(lib, prefix) {
286 continue
287 }
288 out = append(out, lib)
289 }
290 return out
291 }
292 return filter(moduleNames), filter(fileNames)
293 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900294}
295
Colin Cross78212242021-01-06 14:51:30 -0800296var vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
Inseob Kim9516ee92019-05-09 10:56:13 +0900297
Jooyung Han097087b2019-10-22 19:32:18 +0900298func vndkMustUseVendorVariantList(cfg android.Config) []string {
299 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900300 return config.VndkMustUseVendorVariantList
301 }).([]string)
302}
303
304// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
305// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
306func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900307 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900308 return mustUseVendorVariantList
309 })
310}
311
Inseob Kim1f086e22019-05-09 13:29:15 +0900312func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Justin Yun8a2600c2020-12-07 12:44:03 +0900313 if m.InProduct() {
314 // We may skip the steps for the product variants because they
315 // are already covered by the vendor variants.
316 return
317 }
318
Jooyung Han0302a842019-10-30 18:43:49 +0900319 name := m.BaseModuleName()
Inseob Kim1f086e22019-05-09 13:29:15 +0900320
Colin Cross31076b32020-10-23 17:22:06 -0700321 if lib := m.library; lib != nil && lib.hasStubsVariants() && name != "libz" {
Jiyong Park2478e4e2020-05-18 09:30:14 +0000322 // b/155456180 libz is the ONLY exception here. We don't want to make
323 // libz an LLNDK library because we in general can't guarantee that
324 // libz will behave consistently especially about the compression.
325 // i.e. the compressed output might be different across releases.
326 // As the library is an external one, it's risky to keep the compatibility
327 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900328 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
329 }
330
Jooyung Han097087b2019-10-22 19:32:18 +0900331 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
332 m.Properties.MustUseVendorVariant = true
333 }
Jooyung Han0302a842019-10-30 18:43:49 +0900334 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
Colin Cross78212242021-01-06 14:51:30 -0800335 m.VendorProperties.IsVNDKUsingCoreVariant = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900336 }
Jooyung Han0302a842019-10-30 18:43:49 +0900337
Inseob Kim1f086e22019-05-09 13:29:15 +0900338 if m.vndkdep.isVndkSp() {
Colin Cross78212242021-01-06 14:51:30 -0800339 m.VendorProperties.IsVNDKSP = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900340 } else {
Colin Cross78212242021-01-06 14:51:30 -0800341 m.VendorProperties.IsVNDKCore = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900342 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900343 if m.IsVndkPrivate() {
Colin Cross78212242021-01-06 14:51:30 -0800344 m.VendorProperties.IsVNDKPrivate = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900345 }
Justin Yunc0d8c492021-01-07 17:45:31 +0900346 if Bool(m.VendorProperties.Product_available) {
Colin Cross78212242021-01-06 14:51:30 -0800347 m.VendorProperties.IsVNDKProduct = true
Justin Yun8a2600c2020-12-07 12:44:03 +0900348 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900349}
350
Yo Chiang08fac0c2020-07-29 01:08:20 +0800351// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800352func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900353 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800354 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900355 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800356 if !m.Device() {
357 // Skip non-device modules
358 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900359 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900360 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800361 // Skip native_bridge modules
362 return true
363 }
364 return false
365}
366
367func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
368 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900369 return false
370 }
371
Jooyung Han31c470b2019-10-18 16:26:59 +0900372 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
373 // When b/142675459 is landed, remove following check
Justin Yunf14beaf2023-08-18 17:51:14 +0900374 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
375 // prebuilt vndk modules should match with device
376 if !p.MatchesWithDevice(mctx.DeviceConfig()) {
377 return false
378 }
379
380 // ignore prebuilt vndk modules that are newer than or equal to the platform vndk version
381 platformVndkApiLevel := android.ApiLevelOrPanic(mctx, mctx.DeviceConfig().PlatformVndkVersion())
382 if platformVndkApiLevel.LessThanOrEqualTo(android.ApiLevelOrPanic(mctx, p.Version())) {
383 return false
384 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900385 }
386
387 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900388 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
389 if mctx.DeviceConfig().VndkVersion() == "" {
390 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
391 if mctx.ModuleName() == "libz" {
392 return false
393 }
Jooyung Han7d6e79b2021-06-24 01:53:43 +0900394 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.IsVndkSp() && !m.IsVndkExt()
Jooyung Han73d20d02020-03-27 16:06:55 +0900395 }
Jooyung Han1724d582022-12-21 10:17:44 +0900396 // VNDK APEX doesn't need stub variants
397 if lib.buildStubs() {
398 return false
399 }
Justin Yun5f7f7e82019-11-18 19:52:14 +0900400 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900401 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500402 return lib.shared() && m.InVendor() && m.IsVndk() && !m.IsVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900403 }
404 return false
405}
406
Inseob Kim1f086e22019-05-09 13:29:15 +0900407// gather list of vndk-core, vndk-sp, and ll-ndk libs
408func VndkMutator(mctx android.BottomUpMutatorContext) {
409 m, ok := mctx.Module().(*Module)
410 if !ok {
411 return
412 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800413
414 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900415 return
416 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900417
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800418 lib, isLib := m.linker.(*libraryDecorator)
419 prebuiltLib, isPrebuiltLib := m.linker.(*prebuiltLibraryLinker)
Inseob Kim1f086e22019-05-09 13:29:15 +0900420
Kiyoung Kimaa394802024-01-08 12:55:45 +0900421 if m.InVendorOrProduct() && isLib && lib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800422 m.VendorProperties.IsLLNDK = true
423 m.VendorProperties.IsVNDKPrivate = Bool(lib.Properties.Llndk.Private)
424 }
Kiyoung Kimaa394802024-01-08 12:55:45 +0900425 if m.InVendorOrProduct() && isPrebuiltLib && prebuiltLib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800426 m.VendorProperties.IsLLNDK = true
427 m.VendorProperties.IsVNDKPrivate = Bool(prebuiltLib.Properties.Llndk.Private)
428 }
429
Jooyung Hane3f02812023-05-08 13:54:50 +0900430 if m.IsVndkPrebuiltLibrary() && !m.IsVndk() {
431 m.VendorProperties.IsLLNDK = true
432 // TODO(b/280697209): copy "llndk.private" flag to vndk_prebuilt_shared
433 }
434
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800435 if (isLib && lib.buildShared()) || (isPrebuiltLib && prebuiltLib.buildShared()) {
Inseob Kim64c43952019-08-26 16:52:35 +0900436 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900437 processVndkLibrary(mctx, m)
438 return
439 }
440 }
441}
442
443func init() {
Colin Crosse4e44bc2020-12-28 13:50:21 -0800444 RegisterVndkLibraryTxtTypes(android.InitRegistrationContext)
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000445 android.RegisterParallelSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900446}
447
Colin Crosse4e44bc2020-12-28 13:50:21 -0800448func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) {
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000449 ctx.RegisterParallelSingletonModuleType("llndk_libraries_txt", llndkLibrariesTxtFactory)
Justin Yund5784122023-10-25 13:25:32 +0900450 ctx.RegisterParallelSingletonModuleType("llndk_libraries_txt_for_apex", llndkLibrariesTxtApexOnlyFactory)
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000451 ctx.RegisterParallelSingletonModuleType("vndksp_libraries_txt", vndkSPLibrariesTxtFactory)
452 ctx.RegisterParallelSingletonModuleType("vndkcore_libraries_txt", vndkCoreLibrariesTxtFactory)
453 ctx.RegisterParallelSingletonModuleType("vndkprivate_libraries_txt", vndkPrivateLibrariesTxtFactory)
454 ctx.RegisterParallelSingletonModuleType("vndkproduct_libraries_txt", vndkProductLibrariesTxtFactory)
455 ctx.RegisterParallelSingletonModuleType("vndkcorevariant_libraries_txt", vndkUsingCoreVariantLibrariesTxtFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800456}
457
Jooyung Han2216fb12019-11-06 16:46:15 +0900458type vndkLibrariesTxt struct {
Colin Cross78212242021-01-06 14:51:30 -0800459 android.SingletonModuleBase
Colin Crosse4e44bc2020-12-28 13:50:21 -0800460
Justin Yun611e8862021-05-24 18:17:33 +0900461 lister moduleListerFunc
462 makeVarName string
463 filterOutFromMakeVar string
Colin Cross78212242021-01-06 14:51:30 -0800464
Colin Crosse4e44bc2020-12-28 13:50:21 -0800465 properties VndkLibrariesTxtProperties
466
Colin Cross78212242021-01-06 14:51:30 -0800467 outputFile android.OutputPath
468 moduleNames []string
469 fileNames []string
Jooyung Han2216fb12019-11-06 16:46:15 +0900470}
471
Colin Crosse4e44bc2020-12-28 13:50:21 -0800472type VndkLibrariesTxtProperties struct {
473 Insert_vndk_version *bool
Justin Yund5784122023-10-25 13:25:32 +0900474 Stem *string
Colin Crosse4e44bc2020-12-28 13:50:21 -0800475}
476
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700477var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900478var _ android.OutputFileProducer = &vndkLibrariesTxt{}
479
Colin Cross78212242021-01-06 14:51:30 -0800480// llndk_libraries_txt is a singleton module whose content is a list of LLNDK libraries
Justin Yund5784122023-10-25 13:25:32 +0900481// generated by Soong.
Justin Yun611e8862021-05-24 18:17:33 +0900482// Make uses LLNDK_LIBRARIES to determine which libraries to install.
Justin Yund5784122023-10-25 13:25:32 +0900483// HWASAN is only part of the LLNDK in builds in which libc depends on HWASAN.
Justin Yun611e8862021-05-24 18:17:33 +0900484// Therefore, by removing the library here, we cause it to only be installed if libc
485// depends on it.
Colin Cross78212242021-01-06 14:51:30 -0800486func llndkLibrariesTxtFactory() android.SingletonModule {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800487 return newVndkLibrariesWithMakeVarFilter(llndkLibraries, "LLNDK_LIBRARIES", "libclang_rt.hwasan")
Colin Cross78212242021-01-06 14:51:30 -0800488}
489
Justin Yund5784122023-10-25 13:25:32 +0900490// llndk_libraries_txt_for_apex is a singleton module that provide the same LLNDK libraries list
491// with the llndk_libraries_txt, but skips setting make variable LLNDK_LIBRARIES. So, it must not
492// be used without installing llndk_libraries_txt singleton.
493// We include llndk_libraries_txt by default to install the llndk.libraries.txt file to system/etc.
494// This singleton module is to install the llndk.libraries.<ver>.txt file to vndk apex.
495func llndkLibrariesTxtApexOnlyFactory() android.SingletonModule {
496 return newVndkLibrariesWithMakeVarFilter(llndkLibraries, "", "libclang_rt.hwasan")
497}
498
Colin Cross78212242021-01-06 14:51:30 -0800499// vndksp_libraries_txt is a singleton module whose content is a list of VNDKSP libraries
500// generated by Soong but can be referenced by other modules.
501// For example, apex_vndk can depend on these files as prebuilt.
502func vndkSPLibrariesTxtFactory() android.SingletonModule {
503 return newVndkLibrariesTxt(vndkSPLibraries, "VNDK_SAMEPROCESS_LIBRARIES")
504}
505
506// vndkcore_libraries_txt is a singleton module whose content is a list of VNDK core libraries
507// generated by Soong but can be referenced by other modules.
508// For example, apex_vndk can depend on these files as prebuilt.
509func vndkCoreLibrariesTxtFactory() android.SingletonModule {
510 return newVndkLibrariesTxt(vndkCoreLibraries, "VNDK_CORE_LIBRARIES")
511}
512
513// vndkprivate_libraries_txt is a singleton module whose content is a list of VNDK private libraries
514// generated by Soong but can be referenced by other modules.
515// For example, apex_vndk can depend on these files as prebuilt.
516func vndkPrivateLibrariesTxtFactory() android.SingletonModule {
517 return newVndkLibrariesTxt(vndkPrivateLibraries, "VNDK_PRIVATE_LIBRARIES")
518}
519
520// vndkproduct_libraries_txt is a singleton module whose content is a list of VNDK product libraries
521// generated by Soong but can be referenced by other modules.
522// For example, apex_vndk can depend on these files as prebuilt.
523func vndkProductLibrariesTxtFactory() android.SingletonModule {
524 return newVndkLibrariesTxt(vndkProductLibraries, "VNDK_PRODUCT_LIBRARIES")
525}
526
527// vndkcorevariant_libraries_txt is a singleton module whose content is a list of VNDK libraries
528// that are using the core variant, generated by Soong but can be referenced by other modules.
529// For example, apex_vndk can depend on these files as prebuilt.
530func vndkUsingCoreVariantLibrariesTxtFactory() android.SingletonModule {
531 return newVndkLibrariesTxt(vndkUsingCoreVariantLibraries, "VNDK_USING_CORE_VARIANT_LIBRARIES")
532}
533
Justin Yun611e8862021-05-24 18:17:33 +0900534func newVndkLibrariesWithMakeVarFilter(lister moduleListerFunc, makeVarName string, filter string) android.SingletonModule {
Colin Cross78212242021-01-06 14:51:30 -0800535 m := &vndkLibrariesTxt{
Justin Yun611e8862021-05-24 18:17:33 +0900536 lister: lister,
537 makeVarName: makeVarName,
538 filterOutFromMakeVar: filter,
Colin Crosse4e44bc2020-12-28 13:50:21 -0800539 }
Colin Cross78212242021-01-06 14:51:30 -0800540 m.AddProperties(&m.properties)
Colin Cross45bce852021-11-11 22:47:54 -0800541 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
Colin Cross78212242021-01-06 14:51:30 -0800542 return m
Jooyung Han2216fb12019-11-06 16:46:15 +0900543}
544
Justin Yun611e8862021-05-24 18:17:33 +0900545func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule {
546 return newVndkLibrariesWithMakeVarFilter(lister, makeVarName, "")
547}
548
Jooyung Han2216fb12019-11-06 16:46:15 +0900549func insertVndkVersion(filename string, vndkVersion string) string {
550 if index := strings.LastIndex(filename, "."); index != -1 {
551 return filename[:index] + "." + vndkVersion + filename[index:]
552 }
553 return filename
554}
555
Justin Yun74217d92023-08-21 20:51:45 +0900556func (txt *vndkLibrariesTxt) DepsMutator(mctx android.BottomUpMutatorContext) {
557 versionedName := insertVndkVersion(txt.Name(), mctx.DeviceConfig().PlatformVndkVersion())
558 if mctx.OtherModuleExists(versionedName) {
559 // If the prebuilt vndk libraries txt files exist, install them instead.
560 txt.HideFromMake()
561 mctx.AddDependency(txt, nil, versionedName)
562 }
563}
564
Colin Crosse4e44bc2020-12-28 13:50:21 -0800565func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Justin Yund5784122023-10-25 13:25:32 +0900566 filename := proptools.StringDefault(txt.properties.Stem, txt.Name())
Kiyoung Kima2d6dee2023-08-11 10:14:43 +0900567
Justin Yund5784122023-10-25 13:25:32 +0900568 if Bool(txt.properties.Insert_vndk_version) {
569 filename = insertVndkVersion(filename, ctx.DeviceConfig().PlatformVndkVersion())
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900570 }
571
Jooyung Han2216fb12019-11-06 16:46:15 +0900572 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
Jooyung Han2216fb12019-11-06 16:46:15 +0900573
574 installPath := android.PathForModuleInstall(ctx, "etc")
575 ctx.InstallFile(installPath, filename, txt.outputFile)
576}
577
Colin Cross78212242021-01-06 14:51:30 -0800578func (txt *vndkLibrariesTxt) GenerateSingletonBuildActions(ctx android.SingletonContext) {
579 txt.moduleNames, txt.fileNames = txt.lister(ctx)
580 android.WriteFileRule(ctx, txt.outputFile, strings.Join(txt.fileNames, "\n"))
581}
582
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900583func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
584 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900585 Class: "ETC",
586 OutputFile: android.OptionalPathForPath(txt.outputFile),
587 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
Colin Crossaa255532020-07-03 13:18:24 -0700588 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900589 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
590 },
591 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900592 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900593}
594
Colin Cross78212242021-01-06 14:51:30 -0800595func (txt *vndkLibrariesTxt) MakeVars(ctx android.MakeVarsContext) {
Justin Yund5784122023-10-25 13:25:32 +0900596 if txt.makeVarName == "" {
597 return
598 }
599
Justin Yun611e8862021-05-24 18:17:33 +0900600 filter := func(modules []string, prefix string) []string {
601 if prefix == "" {
602 return modules
603 }
604 var result []string
605 for _, module := range modules {
606 if strings.HasPrefix(module, prefix) {
607 continue
608 } else {
609 result = append(result, module)
610 }
611 }
612 return result
613 }
614 ctx.Strict(txt.makeVarName, strings.Join(filter(txt.moduleNames, txt.filterOutFromMakeVar), " "))
Colin Cross78212242021-01-06 14:51:30 -0800615}
616
Jooyung Han0703fd82020-08-26 22:11:53 +0900617// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900618func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
619 return txt.outputFile
620}
621
Jooyung Han0703fd82020-08-26 22:11:53 +0900622// PrebuiltEtcModule interface
623func (txt *vndkLibrariesTxt) BaseDir() string {
624 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900625}
626
Jooyung Han0703fd82020-08-26 22:11:53 +0900627// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900628func (txt *vndkLibrariesTxt) SubDir() string {
629 return ""
630}
631
Jooyung Han0703fd82020-08-26 22:11:53 +0900632func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
633 return android.Paths{txt.outputFile}, nil
634}
635
Inseob Kim1f086e22019-05-09 13:29:15 +0900636func VndkSnapshotSingleton() android.Singleton {
637 return &vndkSnapshotSingleton{}
638}
639
Jooyung Han0302a842019-10-30 18:43:49 +0900640type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900641 vndkLibrariesFile android.OutputPath
642 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900643}
Inseob Kim1f086e22019-05-09 13:29:15 +0900644
Ivan Lozanod7586b62021-04-01 09:49:36 -0400645func isVndkSnapshotAware(config android.DeviceConfig, m LinkableInterface,
646 apexInfo android.ApexInfo) (vndkType string, isVndkSnapshotLib bool) {
Colin Cross56a83212020-09-15 18:30:11 -0700647
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900648 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400649 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900650 }
Jooyung Han261e1582020-10-20 18:54:21 +0900651 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
652 // !installable: Snapshot only cares about "installable" modules.
Justin Yun450ae722021-04-16 19:58:18 +0900653 // !m.IsLlndk: llndk stubs are required for building against snapshots.
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400654 // IsSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Justin Yun450ae722021-04-16 19:58:18 +0900655 // !outputFile.Valid: Snapshot requires valid output file.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400656 if !m.InVendor() || (!installable(m, apexInfo) && !m.IsLlndk()) || m.IsSnapshotPrebuilt() || !m.OutputFile().Valid() {
657 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900658 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400659 if !m.IsSnapshotLibrary() || !m.Shared() {
660 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900661 }
Justin Yun450ae722021-04-16 19:58:18 +0900662 if m.VndkVersion() == config.PlatformVndkVersion() {
663 if m.IsVndk() && !m.IsVndkExt() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400664 if m.IsVndkSp() {
665 return "vndk-sp", true
Justin Yun450ae722021-04-16 19:58:18 +0900666 } else {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400667 return "vndk-core", true
Justin Yun450ae722021-04-16 19:58:18 +0900668 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400669 } else if m.HasLlndkStubs() && m.StubsVersion() == "" {
Justin Yun450ae722021-04-16 19:58:18 +0900670 // Use default version for the snapshot.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400671 return "llndk-stub", true
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900672 }
673 }
674
Ivan Lozanod7586b62021-04-01 09:49:36 -0400675 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900676}
677
Inseob Kim1f086e22019-05-09 13:29:15 +0900678func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900679 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
680 c.buildVndkLibrariesTxtFiles(ctx)
681
Inseob Kim1f086e22019-05-09 13:29:15 +0900682 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
683 if ctx.DeviceConfig().VndkVersion() != "current" {
684 return
685 }
686
687 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
688 return
689 }
690
Inseob Kim242ef0c2019-10-22 20:15:20 +0900691 var snapshotOutputs android.Paths
692
693 /*
694 VNDK snapshot zipped artifacts directory structure:
695 {SNAPSHOT_ARCH}/
696 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
697 shared/
698 vndk-core/
699 (VNDK-core libraries, e.g. libbinder.so)
700 vndk-sp/
701 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900702 llndk-stub/
703 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900704 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
705 shared/
706 vndk-core/
707 (VNDK-core libraries, e.g. libbinder.so)
708 vndk-sp/
709 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900710 llndk-stub/
711 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900712 binder32/
713 (This directory is newly introduced in v28 (Android P) to hold
714 prebuilts built for 32-bit binder interface.)
715 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
716 ...
717 configs/
718 (various *.txt configuration files)
719 include/
720 (header files of same directory structure with source tree)
721 NOTICE_FILES/
722 (notice files of libraries, e.g. libcutils.so.txt)
723 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900724
725 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900726 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900727
Inseob Kim242ef0c2019-10-22 20:15:20 +0900728 configsDir := filepath.Join(snapshotArchDir, "configs")
Justin Yun1871f902023-04-07 20:13:19 +0900729 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900730 includeDir := filepath.Join(snapshotArchDir, "include")
731
Justin Yun1871f902023-04-07 20:13:19 +0900732 // set of notice files copied.
733 noticeBuilt := make(map[string]bool)
734
Inseob Kim242ef0c2019-10-22 20:15:20 +0900735 // paths of VNDK modules for GPL license checking
736 modulePaths := make(map[string]string)
737
738 // actual module names of .so files
739 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
740 moduleNames := make(map[string]string)
741
Inseob Kim8471cda2019-11-15 09:59:12 +0900742 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900743
Inseob Kimde5744a2020-12-02 13:14:28 +0900744 // installVndkSnapshotLib copies built .so file from the module.
745 // Also, if the build artifacts is on, write a json file which contains all exported flags
746 // with FlagExporterInfo.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700747 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900748 var ret android.Paths
749
Inseob Kim8471cda2019-11-15 09:59:12 +0900750 targetArch := "arch-" + m.Target().Arch.ArchType.String()
751 if m.Target().Arch.ArchVariant != "" {
752 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900753 }
Inseob Kimae553032019-05-14 18:52:49 +0900754
Inseob Kim8471cda2019-11-15 09:59:12 +0900755 libPath := m.outputFile.Path()
756 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
Kiyoung Kimae11c232021-07-19 11:38:04 +0900757 ret = append(ret, snapshot.CopyFileRule(pctx, ctx, libPath, snapshotLibOut))
Inseob Kim8471cda2019-11-15 09:59:12 +0900758
Justin Yun1871f902023-04-07 20:13:19 +0900759 // json struct to export snapshot information
760 prop := struct {
Inseob Kim5860f822023-04-18 11:30:22 +0900761 MinSdkVersion string `json:",omitempty"`
Justin Yun1871f902023-04-07 20:13:19 +0900762 LicenseKinds []string `json:",omitempty"`
763 LicenseTexts []string `json:",omitempty"`
764 ExportedDirs []string `json:",omitempty"`
765 ExportedSystemDirs []string `json:",omitempty"`
766 ExportedFlags []string `json:",omitempty"`
767 RelativeInstallPath string `json:",omitempty"`
768 }{}
769
770 prop.LicenseKinds = m.EffectiveLicenseKinds()
771 prop.LicenseTexts = m.EffectiveLicenseFiles().Strings()
Inseob Kim5860f822023-04-18 11:30:22 +0900772 prop.MinSdkVersion = m.MinSdkVersion()
Justin Yun1871f902023-04-07 20:13:19 +0900773
Inseob Kimae553032019-05-14 18:52:49 +0900774 if ctx.Config().VndkSnapshotBuildArtifacts() {
Colin Cross5a377182023-12-14 14:46:23 -0800775 exportedInfo, _ := android.SingletonModuleProvider(ctx, m, FlagExporterInfoProvider)
Colin Cross0de8a1e2020-09-18 14:15:30 -0700776 prop.ExportedFlags = exportedInfo.Flags
777 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
778 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900779 prop.RelativeInstallPath = m.RelativeInstallPath()
Inseob Kimae553032019-05-14 18:52:49 +0900780 }
Justin Yun1871f902023-04-07 20:13:19 +0900781
782 propOut := snapshotLibOut + ".json"
783
784 j, err := json.Marshal(prop)
785 if err != nil {
786 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
787 return nil, false
788 }
789 ret = append(ret, snapshot.WriteStringToFileRule(ctx, string(j), propOut))
790
Inseob Kim242ef0c2019-10-22 20:15:20 +0900791 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900792 }
793
Inseob Kim1f086e22019-05-09 13:29:15 +0900794 ctx.VisitAllModules(func(module android.Module) {
795 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900796 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900797 return
798 }
799
Colin Cross5a377182023-12-14 14:46:23 -0800800 apexInfo, _ := android.SingletonModuleProvider(ctx, module, android.ApexInfoProvider)
Colin Cross56a83212020-09-15 18:30:11 -0700801
Ivan Lozanod7586b62021-04-01 09:49:36 -0400802 vndkType, ok := isVndkSnapshotAware(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900803 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200804 return
805 }
806
Inseob Kimde5744a2020-12-02 13:14:28 +0900807 // For all snapshot candidates, the followings are captured.
808 // - .so files
809 // - notice files
810 //
811 // The followings are also captured if VNDK_SNAPSHOT_BUILD_ARTIFACTS.
812 // - .json files containing exported flags
813 // - exported headers from collectHeadersForSnapshot()
814 //
815 // Headers are deduplicated after visiting all modules.
816
Inseob Kim8471cda2019-11-15 09:59:12 +0900817 // install .so files for appropriate modules.
818 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700819 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900820 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900821 return
822 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900823 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900824
Inseob Kim8471cda2019-11-15 09:59:12 +0900825 // These are for generating module_names.txt and module_paths.txt
826 stem := m.outputFile.Path().Base()
827 moduleNames[stem] = ctx.ModuleName(m)
828 modulePaths[stem] = ctx.ModuleDir(m)
829
Justin Yun1871f902023-04-07 20:13:19 +0900830 for _, notice := range m.EffectiveLicenseFiles() {
831 if _, ok := noticeBuilt[notice.String()]; !ok {
832 noticeBuilt[notice.String()] = true
833 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
834 pctx, ctx, notice, filepath.Join(noticeDir, notice.String())))
835 }
836 }
837
Inseob Kim8471cda2019-11-15 09:59:12 +0900838 if ctx.Config().VndkSnapshotBuildArtifacts() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400839 headers = append(headers, m.SnapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900840 }
841 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900842
Inseob Kim8471cda2019-11-15 09:59:12 +0900843 // install all headers after removing duplicates
844 for _, header := range android.FirstUniquePaths(headers) {
Kiyoung Kimae11c232021-07-19 11:38:04 +0900845 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
846 pctx, ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900847 }
848
Jooyung Han39edb6c2019-11-06 16:53:07 +0900849 // install *.libraries.txt except vndkcorevariant.libraries.txt
850 ctx.VisitAllModules(func(module android.Module) {
851 m, ok := module.(*vndkLibrariesTxt)
852 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
853 return
854 }
Kiyoung Kimae11c232021-07-19 11:38:04 +0900855 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
856 pctx, ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900857 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900858
Inseob Kim242ef0c2019-10-22 20:15:20 +0900859 /*
Inseob Kim242ef0c2019-10-22 20:15:20 +0900860 module_paths.txt contains paths on which VNDK modules are defined.
861 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000862 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900863 libc.so bionic/libc
864 ...
865 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900866 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, modulePaths, filepath.Join(configsDir, "module_paths.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900867
868 /*
869 module_names.txt contains names as which VNDK modules are defined,
870 because output filename and module name can be different with stem and suffix properties.
871
872 e.g.,
873 libcutils.so libcutils
874 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
875 ...
876 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900877 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, moduleNames, filepath.Join(configsDir, "module_names.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900878
879 // All artifacts are ready. Sort them to normalize ninja and then zip.
880 sort.Slice(snapshotOutputs, func(i, j int) bool {
881 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
882 })
883
884 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
Colin Crossf1a035e2020-11-16 17:32:30 -0800885 zipRule := android.NewRuleBuilder(pctx, ctx)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900886
Inseob Kimde5744a2020-12-02 13:14:28 +0900887 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with tr
Inseob Kim242ef0c2019-10-22 20:15:20 +0900888 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
Colin Cross70c47412021-03-12 17:48:14 -0800889 rspFile := snapshotOutputList.ReplaceExtension(ctx, "rsp")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900890 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900891 Text("tr").
892 FlagWithArg("-d ", "\\'").
Colin Cross70c47412021-03-12 17:48:14 -0800893 FlagWithRspFileInputList("< ", rspFile, snapshotOutputs).
Inseob Kim8471cda2019-11-15 09:59:12 +0900894 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900895
896 zipRule.Temporary(snapshotOutputList)
897
898 zipRule.Command().
Colin Crossf1a035e2020-11-16 17:32:30 -0800899 BuiltTool("soong_zip").
Inseob Kim242ef0c2019-10-22 20:15:20 +0900900 FlagWithOutput("-o ", zipPath).
901 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
902 FlagWithInput("-l ", snapshotOutputList)
903
Colin Crossf1a035e2020-11-16 17:32:30 -0800904 zipRule.Build(zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900905 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900906 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900907}
Jooyung Han097087b2019-10-22 19:32:18 +0900908
Jooyung Han0302a842019-10-30 18:43:49 +0900909func getVndkFileName(m *Module) (string, error) {
910 if library, ok := m.linker.(*libraryDecorator); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900911 return library.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900912 }
913 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900914 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900915 }
916 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900917}
918
919func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900920 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900921 // Since each target have different set of libclang_rt.* files,
922 // keep the common set of files in vndk.libraries.txt
Colin Cross78212242021-01-06 14:51:30 -0800923 _, llndk := vndkModuleListRemover(llndkLibraries, "libclang_rt.")(ctx)
924 _, vndkcore := vndkModuleListRemover(vndkCoreLibraries, "libclang_rt.")(ctx)
925 _, vndksp := vndkSPLibraries(ctx)
926 _, vndkprivate := vndkPrivateLibraries(ctx)
927 _, vndkproduct := vndkModuleListRemover(vndkProductLibraries, "libclang_rt.")(ctx)
Jooyung Han0302a842019-10-30 18:43:49 +0900928 var merged []string
Colin Cross78212242021-01-06 14:51:30 -0800929 merged = append(merged, addPrefix(llndk, "LLNDK: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900930 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800931 merged = append(merged, addPrefix(vndkcore, "VNDK-core: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900932 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800933 merged = append(merged, addPrefix(vndkproduct, "VNDK-product: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900934 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
Colin Crosscf371cc2020-11-13 11:48:42 -0800935 android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n"))
Jooyung Han0302a842019-10-30 18:43:49 +0900936}
Jooyung Han097087b2019-10-22 19:32:18 +0900937
Jooyung Han0302a842019-10-30 18:43:49 +0900938func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
939 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
940 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700941 movedToApexLlndkLibraries := make(map[string]bool)
942 ctx.VisitAllModules(func(module android.Module) {
Colin Cross127bb8b2020-12-16 16:46:01 -0800943 if library := moduleLibraryInterface(module); library != nil && library.hasLLNDKStubs() {
944 // Skip bionic libs, they are handled in different manner
945 name := library.implementationModuleName(module.(*Module).BaseModuleName())
946 if module.(android.ApexModule).DirectlyInAnyApex() && !isBionic(name) {
947 movedToApexLlndkLibraries[name] = true
Colin Cross56a83212020-09-15 18:30:11 -0700948 }
Jooyung Han0302a842019-10-30 18:43:49 +0900949 }
Colin Cross56a83212020-09-15 18:30:11 -0700950 })
951
952 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
Cole Faust18994c72023-02-28 16:02:16 -0800953 strings.Join(android.SortedKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900954
Jooyung Han0302a842019-10-30 18:43:49 +0900955 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900956 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900957}