blob: c35b39128b93ebd707a69f7ba9c77a0e47d65774 [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 Yun8effde42017-06-23 19:24:43 +090031)
32
Jooyung Han39edb6c2019-11-06 16:53:07 +090033const (
34 llndkLibrariesTxt = "llndk.libraries.txt"
35 vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
36 vndkSpLibrariesTxt = "vndksp.libraries.txt"
37 vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
Justin Yun8a2600c2020-12-07 12:44:03 +090038 vndkProductLibrariesTxt = "vndkproduct.libraries.txt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090039 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
40)
41
42func VndkLibrariesTxtModules(vndkVersion string) []string {
43 if vndkVersion == "current" {
44 return []string{
45 llndkLibrariesTxt,
46 vndkCoreLibrariesTxt,
47 vndkSpLibrariesTxt,
48 vndkPrivateLibrariesTxt,
Justin Yun8a2600c2020-12-07 12:44:03 +090049 vndkProductLibrariesTxt,
Jooyung Han39edb6c2019-11-06 16:53:07 +090050 }
51 }
52 // Snapshot vndks have their own *.libraries.VER.txt files.
53 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
54 return []string{
55 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
56 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
57 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
58 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
Justin Yun8a2600c2020-12-07 12:44:03 +090059 insertVndkVersion(vndkProductLibrariesTxt, vndkVersion),
Jooyung Han39edb6c2019-11-06 16:53:07 +090060 }
61}
62
Justin Yun8effde42017-06-23 19:24:43 +090063type VndkProperties struct {
64 Vndk struct {
65 // declared as a VNDK or VNDK-SP module. The vendor variant
66 // will be installed in /system instead of /vendor partition.
67 //
Justin Yun63e9ec72020-10-29 16:49:43 +090068 // `vendor_available` and `product_available` must be explicitly
69 // set to either true or false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090070 Enabled *bool
71
72 // declared as a VNDK-SP module, which is a subset of VNDK.
73 //
74 // `vndk: { enabled: true }` must set together.
75 //
76 // All these modules are allowed to link to VNDK-SP or LL-NDK
77 // modules only. Other dependency will cause link-type errors.
78 //
79 // If `support_system_process` is not set or set to false,
80 // the module is VNDK-core and can link to other VNDK-core,
81 // VNDK-SP or LL-NDK modules only.
82 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +080083
Justin Yunfd9e8042020-12-23 18:23:14 +090084 // declared as a VNDK-private module.
85 // This module still creates the vendor and product variants refering
86 // to the `vendor_available: true` and `product_available: true`
87 // properties. However, it is only available to the other VNDK modules
88 // but not to the non-VNDK vendor or product modules.
89 Private *bool
90
Logan Chienf3511742017-10-31 18:04:35 +080091 // Extending another module
92 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +090093 }
94}
95
96type vndkdep struct {
97 Properties VndkProperties
98}
99
100func (vndk *vndkdep) props() []interface{} {
101 return []interface{}{&vndk.Properties}
102}
103
Justin Yun8effde42017-06-23 19:24:43 +0900104func (vndk *vndkdep) isVndk() bool {
105 return Bool(vndk.Properties.Vndk.Enabled)
106}
107
108func (vndk *vndkdep) isVndkSp() bool {
109 return Bool(vndk.Properties.Vndk.Support_system_process)
110}
111
Logan Chienf3511742017-10-31 18:04:35 +0800112func (vndk *vndkdep) isVndkExt() bool {
113 return vndk.Properties.Vndk.Extends != nil
114}
115
116func (vndk *vndkdep) getVndkExtendsModuleName() string {
117 return String(vndk.Properties.Vndk.Extends)
118}
119
Justin Yun8effde42017-06-23 19:24:43 +0900120func (vndk *vndkdep) typeName() string {
121 if !vndk.isVndk() {
122 return "native:vendor"
123 }
Logan Chienf3511742017-10-31 18:04:35 +0800124 if !vndk.isVndkExt() {
125 if !vndk.isVndkSp() {
126 return "native:vendor:vndk"
127 }
128 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900129 }
Logan Chienf3511742017-10-31 18:04:35 +0800130 if !vndk.isVndkSp() {
131 return "native:vendor:vndkext"
132 }
133 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900134}
135
Justin Yun63e9ec72020-10-29 16:49:43 +0900136// VNDK link type check from a module with UseVndk() == true.
Jooyung Han479ca172020-10-19 18:51:07 +0900137func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900138 if to.linker == nil {
139 return
140 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900141 if !vndk.isVndk() {
Justin Yunfd9e8042020-12-23 18:23:14 +0900142 // Non-VNDK modules those installed to /vendor, /system/vendor,
143 // /product or /system/product cannot depend on VNDK-private modules
144 // that include VNDK-core-private, VNDK-SP-private and LLNDK-private.
145 if to.IsVndkPrivate() {
146 ctx.ModuleErrorf("non-VNDK module should not link to %q which has `private: true`", to.Name())
Jiyong Park82e2bf32017-08-16 14:05:54 +0900147 }
148 }
Justin Yun8effde42017-06-23 19:24:43 +0900149 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
150 // Check only shared libraries.
Colin Cross127bb8b2020-12-16 16:46:01 -0800151 // Other (static) libraries are allowed to link.
Justin Yun8effde42017-06-23 19:24:43 +0900152 return
153 }
Colin Cross127bb8b2020-12-16 16:46:01 -0800154
155 if to.IsLlndk() {
156 // LL-NDK libraries are allowed to link
157 return
158 }
159
Ivan Lozano52767be2019-10-18 14:49:46 -0700160 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900161 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
162 vndk.typeName(), to.Name())
163 return
164 }
Logan Chienf3511742017-10-31 18:04:35 +0800165 if tag == vndkExtDepTag {
166 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
167 // and has identical vndk properties.
168 if to.vndkdep == nil || !to.vndkdep.isVndk() {
169 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
170 return
171 }
172 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
173 ctx.ModuleErrorf(
174 "`extends` refers a module %q with mismatched support_system_process",
175 to.Name())
176 return
177 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900178 if to.IsVndkPrivate() {
Logan Chienf3511742017-10-31 18:04:35 +0800179 ctx.ModuleErrorf(
Justin Yunfd9e8042020-12-23 18:23:14 +0900180 "`extends` refers module %q which has `private: true`",
Justin Yun6977e8a2020-10-29 18:24:11 +0900181 to.Name())
182 return
183 }
Logan Chienf3511742017-10-31 18:04:35 +0800184 }
Justin Yun8effde42017-06-23 19:24:43 +0900185 if to.vndkdep == nil {
186 return
187 }
Logan Chienf3511742017-10-31 18:04:35 +0800188
Logan Chiend3c59a22018-03-29 14:08:15 +0800189 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100190 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
191 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
192 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800193 return
194 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800195}
Logan Chienf3511742017-10-31 18:04:35 +0800196
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100197func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800198 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
199 if from.isVndkExt() {
200 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100201 if to.isVndk() && !to.isVndkSp() {
202 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
203 }
204 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800205 }
206 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100207 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900208 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800209 if from.isVndk() {
210 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100211 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800212 }
213 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100214 if !to.isVndkSp() {
215 return errors.New("VNDK-SP must only depend on VNDK-SP")
216 }
217 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800218 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100219 if !to.isVndk() {
220 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
221 }
222 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800223 }
224 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100225 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900226}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900227
Colin Cross78212242021-01-06 14:51:30 -0800228type moduleListerFunc func(ctx android.SingletonContext) (moduleNames, fileNames []string)
229
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900230var (
Colin Cross203b4212021-04-26 17:19:41 -0700231 llndkLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsLLNDK && !m.Header() })
Colin Cross78212242021-01-06 14:51:30 -0800232 vndkSPLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKSP })
233 vndkCoreLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKCore })
Colin Cross203b4212021-04-26 17:19:41 -0700234 vndkPrivateLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKPrivate })
Colin Cross78212242021-01-06 14:51:30 -0800235 vndkProductLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKProduct })
236 vndkUsingCoreVariantLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKUsingCoreVariant })
Inseob Kimae553032019-05-14 18:52:49 +0900237)
Inseob Kim1f086e22019-05-09 13:29:15 +0900238
Colin Cross78212242021-01-06 14:51:30 -0800239// vndkModuleLister takes a predicate that operates on a Module and returns a moduleListerFunc
240// that produces a list of module names and output file names for which the predicate returns true.
241func vndkModuleLister(predicate func(*Module) bool) moduleListerFunc {
242 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
243 ctx.VisitAllModules(func(m android.Module) {
Jooyung Hane3f02812023-05-08 13:54:50 +0900244 if c, ok := m.(*Module); ok && predicate(c) && !c.IsVndkPrebuiltLibrary() {
Colin Cross78212242021-01-06 14:51:30 -0800245 filename, err := getVndkFileName(c)
246 if err != nil {
247 ctx.ModuleErrorf(m, "%s", err)
248 }
249 moduleNames = append(moduleNames, ctx.ModuleName(m))
250 fileNames = append(fileNames, filename)
251 }
252 })
253 moduleNames = android.SortedUniqueStrings(moduleNames)
254 fileNames = android.SortedUniqueStrings(fileNames)
255 return
256 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900257}
258
Colin Cross78212242021-01-06 14:51:30 -0800259// vndkModuleListRemover takes a moduleListerFunc and a prefix and returns a moduleListerFunc
260// that returns the same lists as the input moduleListerFunc, but with modules with the
261// given prefix removed.
262func vndkModuleListRemover(lister moduleListerFunc, prefix string) moduleListerFunc {
263 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
264 moduleNames, fileNames = lister(ctx)
265 filter := func(in []string) []string {
266 out := make([]string, 0, len(in))
267 for _, lib := range in {
268 if strings.HasPrefix(lib, prefix) {
269 continue
270 }
271 out = append(out, lib)
272 }
273 return out
274 }
275 return filter(moduleNames), filter(fileNames)
276 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900277}
278
Colin Cross78212242021-01-06 14:51:30 -0800279var vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
Inseob Kim9516ee92019-05-09 10:56:13 +0900280
Jooyung Han097087b2019-10-22 19:32:18 +0900281func vndkMustUseVendorVariantList(cfg android.Config) []string {
282 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900283 return config.VndkMustUseVendorVariantList
284 }).([]string)
285}
286
287// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
288// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
289func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900290 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900291 return mustUseVendorVariantList
292 })
293}
294
Inseob Kim1f086e22019-05-09 13:29:15 +0900295func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Justin Yun8a2600c2020-12-07 12:44:03 +0900296 if m.InProduct() {
297 // We may skip the steps for the product variants because they
298 // are already covered by the vendor variants.
299 return
300 }
301
Jooyung Han0302a842019-10-30 18:43:49 +0900302 name := m.BaseModuleName()
Inseob Kim1f086e22019-05-09 13:29:15 +0900303
Colin Cross31076b32020-10-23 17:22:06 -0700304 if lib := m.library; lib != nil && lib.hasStubsVariants() && name != "libz" {
Jiyong Park2478e4e2020-05-18 09:30:14 +0000305 // b/155456180 libz is the ONLY exception here. We don't want to make
306 // libz an LLNDK library because we in general can't guarantee that
307 // libz will behave consistently especially about the compression.
308 // i.e. the compressed output might be different across releases.
309 // As the library is an external one, it's risky to keep the compatibility
310 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900311 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
312 }
313
Jooyung Han097087b2019-10-22 19:32:18 +0900314 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
315 m.Properties.MustUseVendorVariant = true
316 }
Jooyung Han0302a842019-10-30 18:43:49 +0900317 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
Colin Cross78212242021-01-06 14:51:30 -0800318 m.VendorProperties.IsVNDKUsingCoreVariant = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900319 }
Jooyung Han0302a842019-10-30 18:43:49 +0900320
Inseob Kim1f086e22019-05-09 13:29:15 +0900321 if m.vndkdep.isVndkSp() {
Colin Cross78212242021-01-06 14:51:30 -0800322 m.VendorProperties.IsVNDKSP = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900323 } else {
Colin Cross78212242021-01-06 14:51:30 -0800324 m.VendorProperties.IsVNDKCore = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900325 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900326 if m.IsVndkPrivate() {
Colin Cross78212242021-01-06 14:51:30 -0800327 m.VendorProperties.IsVNDKPrivate = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900328 }
Justin Yunc0d8c492021-01-07 17:45:31 +0900329 if Bool(m.VendorProperties.Product_available) {
Colin Cross78212242021-01-06 14:51:30 -0800330 m.VendorProperties.IsVNDKProduct = true
Justin Yun8a2600c2020-12-07 12:44:03 +0900331 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900332}
333
Yo Chiang08fac0c2020-07-29 01:08:20 +0800334// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800335func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900336 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800337 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900338 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800339 if !m.Device() {
340 // Skip non-device modules
341 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900342 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900343 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800344 // Skip native_bridge modules
345 return true
346 }
347 return false
348}
349
350func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
351 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900352 return false
353 }
354
Jooyung Han31c470b2019-10-18 16:26:59 +0900355 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
356 // When b/142675459 is landed, remove following check
Justin Yunf14beaf2023-08-18 17:51:14 +0900357 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
358 // prebuilt vndk modules should match with device
359 if !p.MatchesWithDevice(mctx.DeviceConfig()) {
360 return false
361 }
362
363 // ignore prebuilt vndk modules that are newer than or equal to the platform vndk version
364 platformVndkApiLevel := android.ApiLevelOrPanic(mctx, mctx.DeviceConfig().PlatformVndkVersion())
365 if platformVndkApiLevel.LessThanOrEqualTo(android.ApiLevelOrPanic(mctx, p.Version())) {
366 return false
367 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900368 }
369
370 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900371 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
372 if mctx.DeviceConfig().VndkVersion() == "" {
373 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
374 if mctx.ModuleName() == "libz" {
375 return false
376 }
Jooyung Han7d6e79b2021-06-24 01:53:43 +0900377 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.IsVndkSp() && !m.IsVndkExt()
Jooyung Han73d20d02020-03-27 16:06:55 +0900378 }
Jooyung Han1724d582022-12-21 10:17:44 +0900379 // VNDK APEX doesn't need stub variants
380 if lib.buildStubs() {
381 return false
382 }
Justin Yun5f7f7e82019-11-18 19:52:14 +0900383 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900384 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500385 return lib.shared() && m.InVendor() && m.IsVndk() && !m.IsVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900386 }
387 return false
388}
389
Inseob Kim1f086e22019-05-09 13:29:15 +0900390// gather list of vndk-core, vndk-sp, and ll-ndk libs
391func VndkMutator(mctx android.BottomUpMutatorContext) {
392 m, ok := mctx.Module().(*Module)
393 if !ok {
394 return
395 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800396
397 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900398 return
399 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900400
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800401 lib, isLib := m.linker.(*libraryDecorator)
402 prebuiltLib, isPrebuiltLib := m.linker.(*prebuiltLibraryLinker)
Inseob Kim1f086e22019-05-09 13:29:15 +0900403
Colin Cross203b4212021-04-26 17:19:41 -0700404 if m.UseVndk() && isLib && lib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800405 m.VendorProperties.IsLLNDK = true
406 m.VendorProperties.IsVNDKPrivate = Bool(lib.Properties.Llndk.Private)
407 }
Colin Cross203b4212021-04-26 17:19:41 -0700408 if m.UseVndk() && isPrebuiltLib && prebuiltLib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800409 m.VendorProperties.IsLLNDK = true
410 m.VendorProperties.IsVNDKPrivate = Bool(prebuiltLib.Properties.Llndk.Private)
411 }
412
Jooyung Hane3f02812023-05-08 13:54:50 +0900413 if m.IsVndkPrebuiltLibrary() && !m.IsVndk() {
414 m.VendorProperties.IsLLNDK = true
415 // TODO(b/280697209): copy "llndk.private" flag to vndk_prebuilt_shared
416 }
417
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800418 if (isLib && lib.buildShared()) || (isPrebuiltLib && prebuiltLib.buildShared()) {
Inseob Kim64c43952019-08-26 16:52:35 +0900419 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900420 processVndkLibrary(mctx, m)
421 return
422 }
423 }
424}
425
426func init() {
Colin Crosse4e44bc2020-12-28 13:50:21 -0800427 RegisterVndkLibraryTxtTypes(android.InitRegistrationContext)
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000428 android.RegisterParallelSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900429}
430
Colin Crosse4e44bc2020-12-28 13:50:21 -0800431func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) {
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000432 ctx.RegisterParallelSingletonModuleType("llndk_libraries_txt", llndkLibrariesTxtFactory)
433 ctx.RegisterParallelSingletonModuleType("vndksp_libraries_txt", vndkSPLibrariesTxtFactory)
434 ctx.RegisterParallelSingletonModuleType("vndkcore_libraries_txt", vndkCoreLibrariesTxtFactory)
435 ctx.RegisterParallelSingletonModuleType("vndkprivate_libraries_txt", vndkPrivateLibrariesTxtFactory)
436 ctx.RegisterParallelSingletonModuleType("vndkproduct_libraries_txt", vndkProductLibrariesTxtFactory)
437 ctx.RegisterParallelSingletonModuleType("vndkcorevariant_libraries_txt", vndkUsingCoreVariantLibrariesTxtFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800438}
439
Jooyung Han2216fb12019-11-06 16:46:15 +0900440type vndkLibrariesTxt struct {
Colin Cross78212242021-01-06 14:51:30 -0800441 android.SingletonModuleBase
Colin Crosse4e44bc2020-12-28 13:50:21 -0800442
Justin Yun611e8862021-05-24 18:17:33 +0900443 lister moduleListerFunc
444 makeVarName string
445 filterOutFromMakeVar string
Colin Cross78212242021-01-06 14:51:30 -0800446
Colin Crosse4e44bc2020-12-28 13:50:21 -0800447 properties VndkLibrariesTxtProperties
448
Colin Cross78212242021-01-06 14:51:30 -0800449 outputFile android.OutputPath
450 moduleNames []string
451 fileNames []string
Jooyung Han2216fb12019-11-06 16:46:15 +0900452}
453
Colin Crosse4e44bc2020-12-28 13:50:21 -0800454type VndkLibrariesTxtProperties struct {
455 Insert_vndk_version *bool
456}
457
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700458var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900459var _ android.OutputFileProducer = &vndkLibrariesTxt{}
460
Colin Cross78212242021-01-06 14:51:30 -0800461// llndk_libraries_txt is a singleton module whose content is a list of LLNDK libraries
462// generated by Soong but can be referenced by other modules.
Jooyung Han2216fb12019-11-06 16:46:15 +0900463// For example, apex_vndk can depend on these files as prebuilt.
Justin Yun611e8862021-05-24 18:17:33 +0900464// Make uses LLNDK_LIBRARIES to determine which libraries to install.
465// HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
466// Therefore, by removing the library here, we cause it to only be installed if libc
467// depends on it.
Colin Cross78212242021-01-06 14:51:30 -0800468func llndkLibrariesTxtFactory() android.SingletonModule {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800469 return newVndkLibrariesWithMakeVarFilter(llndkLibraries, "LLNDK_LIBRARIES", "libclang_rt.hwasan")
Colin Cross78212242021-01-06 14:51:30 -0800470}
471
472// vndksp_libraries_txt is a singleton module whose content is a list of VNDKSP libraries
473// generated by Soong but can be referenced by other modules.
474// For example, apex_vndk can depend on these files as prebuilt.
475func vndkSPLibrariesTxtFactory() android.SingletonModule {
476 return newVndkLibrariesTxt(vndkSPLibraries, "VNDK_SAMEPROCESS_LIBRARIES")
477}
478
479// vndkcore_libraries_txt is a singleton module whose content is a list of VNDK core libraries
480// generated by Soong but can be referenced by other modules.
481// For example, apex_vndk can depend on these files as prebuilt.
482func vndkCoreLibrariesTxtFactory() android.SingletonModule {
483 return newVndkLibrariesTxt(vndkCoreLibraries, "VNDK_CORE_LIBRARIES")
484}
485
486// vndkprivate_libraries_txt is a singleton module whose content is a list of VNDK private libraries
487// generated by Soong but can be referenced by other modules.
488// For example, apex_vndk can depend on these files as prebuilt.
489func vndkPrivateLibrariesTxtFactory() android.SingletonModule {
490 return newVndkLibrariesTxt(vndkPrivateLibraries, "VNDK_PRIVATE_LIBRARIES")
491}
492
493// vndkproduct_libraries_txt is a singleton module whose content is a list of VNDK product libraries
494// generated by Soong but can be referenced by other modules.
495// For example, apex_vndk can depend on these files as prebuilt.
496func vndkProductLibrariesTxtFactory() android.SingletonModule {
497 return newVndkLibrariesTxt(vndkProductLibraries, "VNDK_PRODUCT_LIBRARIES")
498}
499
500// vndkcorevariant_libraries_txt is a singleton module whose content is a list of VNDK libraries
501// that are using the core variant, generated by Soong but can be referenced by other modules.
502// For example, apex_vndk can depend on these files as prebuilt.
503func vndkUsingCoreVariantLibrariesTxtFactory() android.SingletonModule {
504 return newVndkLibrariesTxt(vndkUsingCoreVariantLibraries, "VNDK_USING_CORE_VARIANT_LIBRARIES")
505}
506
Justin Yun611e8862021-05-24 18:17:33 +0900507func newVndkLibrariesWithMakeVarFilter(lister moduleListerFunc, makeVarName string, filter string) android.SingletonModule {
Colin Cross78212242021-01-06 14:51:30 -0800508 m := &vndkLibrariesTxt{
Justin Yun611e8862021-05-24 18:17:33 +0900509 lister: lister,
510 makeVarName: makeVarName,
511 filterOutFromMakeVar: filter,
Colin Crosse4e44bc2020-12-28 13:50:21 -0800512 }
Colin Cross78212242021-01-06 14:51:30 -0800513 m.AddProperties(&m.properties)
Colin Cross45bce852021-11-11 22:47:54 -0800514 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
Colin Cross78212242021-01-06 14:51:30 -0800515 return m
Jooyung Han2216fb12019-11-06 16:46:15 +0900516}
517
Justin Yun611e8862021-05-24 18:17:33 +0900518func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule {
519 return newVndkLibrariesWithMakeVarFilter(lister, makeVarName, "")
520}
521
Jooyung Han2216fb12019-11-06 16:46:15 +0900522func insertVndkVersion(filename string, vndkVersion string) string {
523 if index := strings.LastIndex(filename, "."); index != -1 {
524 return filename[:index] + "." + vndkVersion + filename[index:]
525 }
526 return filename
527}
528
Colin Crosse4e44bc2020-12-28 13:50:21 -0800529func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900530 var filename string
Colin Crosse4e44bc2020-12-28 13:50:21 -0800531 if BoolDefault(txt.properties.Insert_vndk_version, true) {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900532 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
533 } else {
534 filename = txt.Name()
535 }
536
Jooyung Han2216fb12019-11-06 16:46:15 +0900537 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
Jooyung Han2216fb12019-11-06 16:46:15 +0900538
539 installPath := android.PathForModuleInstall(ctx, "etc")
540 ctx.InstallFile(installPath, filename, txt.outputFile)
541}
542
Colin Cross78212242021-01-06 14:51:30 -0800543func (txt *vndkLibrariesTxt) GenerateSingletonBuildActions(ctx android.SingletonContext) {
544 txt.moduleNames, txt.fileNames = txt.lister(ctx)
545 android.WriteFileRule(ctx, txt.outputFile, strings.Join(txt.fileNames, "\n"))
546}
547
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900548func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
549 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900550 Class: "ETC",
551 OutputFile: android.OptionalPathForPath(txt.outputFile),
552 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
Colin Crossaa255532020-07-03 13:18:24 -0700553 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900554 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
555 },
556 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900557 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900558}
559
Colin Cross78212242021-01-06 14:51:30 -0800560func (txt *vndkLibrariesTxt) MakeVars(ctx android.MakeVarsContext) {
Justin Yun611e8862021-05-24 18:17:33 +0900561 filter := func(modules []string, prefix string) []string {
562 if prefix == "" {
563 return modules
564 }
565 var result []string
566 for _, module := range modules {
567 if strings.HasPrefix(module, prefix) {
568 continue
569 } else {
570 result = append(result, module)
571 }
572 }
573 return result
574 }
575 ctx.Strict(txt.makeVarName, strings.Join(filter(txt.moduleNames, txt.filterOutFromMakeVar), " "))
Colin Cross78212242021-01-06 14:51:30 -0800576}
577
Jooyung Han0703fd82020-08-26 22:11:53 +0900578// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900579func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
580 return txt.outputFile
581}
582
Jooyung Han0703fd82020-08-26 22:11:53 +0900583// PrebuiltEtcModule interface
584func (txt *vndkLibrariesTxt) BaseDir() string {
585 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900586}
587
Jooyung Han0703fd82020-08-26 22:11:53 +0900588// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900589func (txt *vndkLibrariesTxt) SubDir() string {
590 return ""
591}
592
Jooyung Han0703fd82020-08-26 22:11:53 +0900593func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
594 return android.Paths{txt.outputFile}, nil
595}
596
Inseob Kim1f086e22019-05-09 13:29:15 +0900597func VndkSnapshotSingleton() android.Singleton {
598 return &vndkSnapshotSingleton{}
599}
600
Jooyung Han0302a842019-10-30 18:43:49 +0900601type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900602 vndkLibrariesFile android.OutputPath
603 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900604}
Inseob Kim1f086e22019-05-09 13:29:15 +0900605
Ivan Lozanod7586b62021-04-01 09:49:36 -0400606func isVndkSnapshotAware(config android.DeviceConfig, m LinkableInterface,
607 apexInfo android.ApexInfo) (vndkType string, isVndkSnapshotLib bool) {
Colin Cross56a83212020-09-15 18:30:11 -0700608
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900609 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400610 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900611 }
Jooyung Han261e1582020-10-20 18:54:21 +0900612 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
613 // !installable: Snapshot only cares about "installable" modules.
Justin Yun450ae722021-04-16 19:58:18 +0900614 // !m.IsLlndk: llndk stubs are required for building against snapshots.
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400615 // IsSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Justin Yun450ae722021-04-16 19:58:18 +0900616 // !outputFile.Valid: Snapshot requires valid output file.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400617 if !m.InVendor() || (!installable(m, apexInfo) && !m.IsLlndk()) || m.IsSnapshotPrebuilt() || !m.OutputFile().Valid() {
618 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900619 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400620 if !m.IsSnapshotLibrary() || !m.Shared() {
621 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900622 }
Justin Yun450ae722021-04-16 19:58:18 +0900623 if m.VndkVersion() == config.PlatformVndkVersion() {
624 if m.IsVndk() && !m.IsVndkExt() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400625 if m.IsVndkSp() {
626 return "vndk-sp", true
Justin Yun450ae722021-04-16 19:58:18 +0900627 } else {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400628 return "vndk-core", true
Justin Yun450ae722021-04-16 19:58:18 +0900629 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400630 } else if m.HasLlndkStubs() && m.StubsVersion() == "" {
Justin Yun450ae722021-04-16 19:58:18 +0900631 // Use default version for the snapshot.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400632 return "llndk-stub", true
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900633 }
634 }
635
Ivan Lozanod7586b62021-04-01 09:49:36 -0400636 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900637}
638
Inseob Kim1f086e22019-05-09 13:29:15 +0900639func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900640 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
641 c.buildVndkLibrariesTxtFiles(ctx)
642
Inseob Kim1f086e22019-05-09 13:29:15 +0900643 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
644 if ctx.DeviceConfig().VndkVersion() != "current" {
645 return
646 }
647
648 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
649 return
650 }
651
Inseob Kim242ef0c2019-10-22 20:15:20 +0900652 var snapshotOutputs android.Paths
653
654 /*
655 VNDK snapshot zipped artifacts directory structure:
656 {SNAPSHOT_ARCH}/
657 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
658 shared/
659 vndk-core/
660 (VNDK-core libraries, e.g. libbinder.so)
661 vndk-sp/
662 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900663 llndk-stub/
664 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900665 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
666 shared/
667 vndk-core/
668 (VNDK-core libraries, e.g. libbinder.so)
669 vndk-sp/
670 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900671 llndk-stub/
672 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900673 binder32/
674 (This directory is newly introduced in v28 (Android P) to hold
675 prebuilts built for 32-bit binder interface.)
676 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
677 ...
678 configs/
679 (various *.txt configuration files)
680 include/
681 (header files of same directory structure with source tree)
682 NOTICE_FILES/
683 (notice files of libraries, e.g. libcutils.so.txt)
684 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900685
686 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900687 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900688
Inseob Kim242ef0c2019-10-22 20:15:20 +0900689 configsDir := filepath.Join(snapshotArchDir, "configs")
Justin Yun1871f902023-04-07 20:13:19 +0900690 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900691 includeDir := filepath.Join(snapshotArchDir, "include")
692
Justin Yun1871f902023-04-07 20:13:19 +0900693 // set of notice files copied.
694 noticeBuilt := make(map[string]bool)
695
Inseob Kim242ef0c2019-10-22 20:15:20 +0900696 // paths of VNDK modules for GPL license checking
697 modulePaths := make(map[string]string)
698
699 // actual module names of .so files
700 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
701 moduleNames := make(map[string]string)
702
Inseob Kim8471cda2019-11-15 09:59:12 +0900703 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900704
Inseob Kimde5744a2020-12-02 13:14:28 +0900705 // installVndkSnapshotLib copies built .so file from the module.
706 // Also, if the build artifacts is on, write a json file which contains all exported flags
707 // with FlagExporterInfo.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700708 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900709 var ret android.Paths
710
Inseob Kim8471cda2019-11-15 09:59:12 +0900711 targetArch := "arch-" + m.Target().Arch.ArchType.String()
712 if m.Target().Arch.ArchVariant != "" {
713 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900714 }
Inseob Kimae553032019-05-14 18:52:49 +0900715
Inseob Kim8471cda2019-11-15 09:59:12 +0900716 libPath := m.outputFile.Path()
717 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
Kiyoung Kimae11c232021-07-19 11:38:04 +0900718 ret = append(ret, snapshot.CopyFileRule(pctx, ctx, libPath, snapshotLibOut))
Inseob Kim8471cda2019-11-15 09:59:12 +0900719
Justin Yun1871f902023-04-07 20:13:19 +0900720 // json struct to export snapshot information
721 prop := struct {
Inseob Kim5860f822023-04-18 11:30:22 +0900722 MinSdkVersion string `json:",omitempty"`
Justin Yun1871f902023-04-07 20:13:19 +0900723 LicenseKinds []string `json:",omitempty"`
724 LicenseTexts []string `json:",omitempty"`
725 ExportedDirs []string `json:",omitempty"`
726 ExportedSystemDirs []string `json:",omitempty"`
727 ExportedFlags []string `json:",omitempty"`
728 RelativeInstallPath string `json:",omitempty"`
729 }{}
730
731 prop.LicenseKinds = m.EffectiveLicenseKinds()
732 prop.LicenseTexts = m.EffectiveLicenseFiles().Strings()
Inseob Kim5860f822023-04-18 11:30:22 +0900733 prop.MinSdkVersion = m.MinSdkVersion()
Justin Yun1871f902023-04-07 20:13:19 +0900734
Inseob Kimae553032019-05-14 18:52:49 +0900735 if ctx.Config().VndkSnapshotBuildArtifacts() {
Colin Cross0de8a1e2020-09-18 14:15:30 -0700736 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
737 prop.ExportedFlags = exportedInfo.Flags
738 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
739 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900740 prop.RelativeInstallPath = m.RelativeInstallPath()
Inseob Kimae553032019-05-14 18:52:49 +0900741 }
Justin Yun1871f902023-04-07 20:13:19 +0900742
743 propOut := snapshotLibOut + ".json"
744
745 j, err := json.Marshal(prop)
746 if err != nil {
747 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
748 return nil, false
749 }
750 ret = append(ret, snapshot.WriteStringToFileRule(ctx, string(j), propOut))
751
Inseob Kim242ef0c2019-10-22 20:15:20 +0900752 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900753 }
754
Inseob Kim1f086e22019-05-09 13:29:15 +0900755 ctx.VisitAllModules(func(module android.Module) {
756 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900757 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900758 return
759 }
760
Colin Cross56a83212020-09-15 18:30:11 -0700761 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
762
Ivan Lozanod7586b62021-04-01 09:49:36 -0400763 vndkType, ok := isVndkSnapshotAware(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900764 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200765 return
766 }
767
Inseob Kimde5744a2020-12-02 13:14:28 +0900768 // For all snapshot candidates, the followings are captured.
769 // - .so files
770 // - notice files
771 //
772 // The followings are also captured if VNDK_SNAPSHOT_BUILD_ARTIFACTS.
773 // - .json files containing exported flags
774 // - exported headers from collectHeadersForSnapshot()
775 //
776 // Headers are deduplicated after visiting all modules.
777
Inseob Kim8471cda2019-11-15 09:59:12 +0900778 // install .so files for appropriate modules.
779 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700780 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900781 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900782 return
783 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900784 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900785
Inseob Kim8471cda2019-11-15 09:59:12 +0900786 // These are for generating module_names.txt and module_paths.txt
787 stem := m.outputFile.Path().Base()
788 moduleNames[stem] = ctx.ModuleName(m)
789 modulePaths[stem] = ctx.ModuleDir(m)
790
Justin Yun1871f902023-04-07 20:13:19 +0900791 for _, notice := range m.EffectiveLicenseFiles() {
792 if _, ok := noticeBuilt[notice.String()]; !ok {
793 noticeBuilt[notice.String()] = true
794 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
795 pctx, ctx, notice, filepath.Join(noticeDir, notice.String())))
796 }
797 }
798
Inseob Kim8471cda2019-11-15 09:59:12 +0900799 if ctx.Config().VndkSnapshotBuildArtifacts() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400800 headers = append(headers, m.SnapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900801 }
802 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900803
Inseob Kim8471cda2019-11-15 09:59:12 +0900804 // install all headers after removing duplicates
805 for _, header := range android.FirstUniquePaths(headers) {
Kiyoung Kimae11c232021-07-19 11:38:04 +0900806 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
807 pctx, ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900808 }
809
Jooyung Han39edb6c2019-11-06 16:53:07 +0900810 // install *.libraries.txt except vndkcorevariant.libraries.txt
811 ctx.VisitAllModules(func(module android.Module) {
812 m, ok := module.(*vndkLibrariesTxt)
813 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
814 return
815 }
Kiyoung Kimae11c232021-07-19 11:38:04 +0900816 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
817 pctx, ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900818 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900819
Inseob Kim242ef0c2019-10-22 20:15:20 +0900820 /*
Inseob Kim242ef0c2019-10-22 20:15:20 +0900821 module_paths.txt contains paths on which VNDK modules are defined.
822 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000823 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900824 libc.so bionic/libc
825 ...
826 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900827 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, modulePaths, filepath.Join(configsDir, "module_paths.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900828
829 /*
830 module_names.txt contains names as which VNDK modules are defined,
831 because output filename and module name can be different with stem and suffix properties.
832
833 e.g.,
834 libcutils.so libcutils
835 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
836 ...
837 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900838 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, moduleNames, filepath.Join(configsDir, "module_names.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900839
840 // All artifacts are ready. Sort them to normalize ninja and then zip.
841 sort.Slice(snapshotOutputs, func(i, j int) bool {
842 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
843 })
844
845 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
Colin Crossf1a035e2020-11-16 17:32:30 -0800846 zipRule := android.NewRuleBuilder(pctx, ctx)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900847
Inseob Kimde5744a2020-12-02 13:14:28 +0900848 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with tr
Inseob Kim242ef0c2019-10-22 20:15:20 +0900849 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
Colin Cross70c47412021-03-12 17:48:14 -0800850 rspFile := snapshotOutputList.ReplaceExtension(ctx, "rsp")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900851 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900852 Text("tr").
853 FlagWithArg("-d ", "\\'").
Colin Cross70c47412021-03-12 17:48:14 -0800854 FlagWithRspFileInputList("< ", rspFile, snapshotOutputs).
Inseob Kim8471cda2019-11-15 09:59:12 +0900855 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900856
857 zipRule.Temporary(snapshotOutputList)
858
859 zipRule.Command().
Colin Crossf1a035e2020-11-16 17:32:30 -0800860 BuiltTool("soong_zip").
Inseob Kim242ef0c2019-10-22 20:15:20 +0900861 FlagWithOutput("-o ", zipPath).
862 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
863 FlagWithInput("-l ", snapshotOutputList)
864
Colin Crossf1a035e2020-11-16 17:32:30 -0800865 zipRule.Build(zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900866 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900867 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900868}
Jooyung Han097087b2019-10-22 19:32:18 +0900869
Jooyung Han0302a842019-10-30 18:43:49 +0900870func getVndkFileName(m *Module) (string, error) {
871 if library, ok := m.linker.(*libraryDecorator); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900872 return library.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900873 }
874 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900875 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900876 }
877 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900878}
879
880func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900881 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900882 // Since each target have different set of libclang_rt.* files,
883 // keep the common set of files in vndk.libraries.txt
Colin Cross78212242021-01-06 14:51:30 -0800884 _, llndk := vndkModuleListRemover(llndkLibraries, "libclang_rt.")(ctx)
885 _, vndkcore := vndkModuleListRemover(vndkCoreLibraries, "libclang_rt.")(ctx)
886 _, vndksp := vndkSPLibraries(ctx)
887 _, vndkprivate := vndkPrivateLibraries(ctx)
888 _, vndkproduct := vndkModuleListRemover(vndkProductLibraries, "libclang_rt.")(ctx)
Jooyung Han0302a842019-10-30 18:43:49 +0900889 var merged []string
Colin Cross78212242021-01-06 14:51:30 -0800890 merged = append(merged, addPrefix(llndk, "LLNDK: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900891 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800892 merged = append(merged, addPrefix(vndkcore, "VNDK-core: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900893 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800894 merged = append(merged, addPrefix(vndkproduct, "VNDK-product: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900895 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
Colin Crosscf371cc2020-11-13 11:48:42 -0800896 android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n"))
Jooyung Han0302a842019-10-30 18:43:49 +0900897}
Jooyung Han097087b2019-10-22 19:32:18 +0900898
Jooyung Han0302a842019-10-30 18:43:49 +0900899func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
900 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
901 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700902 movedToApexLlndkLibraries := make(map[string]bool)
903 ctx.VisitAllModules(func(module android.Module) {
Colin Cross127bb8b2020-12-16 16:46:01 -0800904 if library := moduleLibraryInterface(module); library != nil && library.hasLLNDKStubs() {
905 // Skip bionic libs, they are handled in different manner
906 name := library.implementationModuleName(module.(*Module).BaseModuleName())
907 if module.(android.ApexModule).DirectlyInAnyApex() && !isBionic(name) {
908 movedToApexLlndkLibraries[name] = true
Colin Cross56a83212020-09-15 18:30:11 -0700909 }
Jooyung Han0302a842019-10-30 18:43:49 +0900910 }
Colin Cross56a83212020-09-15 18:30:11 -0700911 })
912
913 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
Cole Faust18994c72023-02-28 16:02:16 -0800914 strings.Join(android.SortedKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900915
Jooyung Han0302a842019-10-30 18:43:49 +0900916 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900917 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900918}