blob: 5ac5032c54635b4abfb49c0d89573d4365436eee [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
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090042func VndkLibrariesTxtModules(vndkVersion string, ctx android.BaseModuleContext) []string {
Jooyung Han39edb6c2019-11-06 16:53:07 +090043 if vndkVersion == "current" {
Justin Yun74217d92023-08-21 20:51:45 +090044 // We can assume all txt files are snapshotted if we find one of them.
45 currentVndkSnapshotted := ctx.OtherModuleExists(insertVndkVersion(llndkLibrariesTxt, ctx.DeviceConfig().PlatformVndkVersion()))
46 if currentVndkSnapshotted {
47 // If the current VNDK is already snapshotted (which can happen with
48 // the `next` config), use the prebuilt txt files in the snapshot.
49 // This is because the txt files built from source are probably be
50 // for the in-development version.
51 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
52 } else {
53 // Use the txt files generated from the source
54 result := []string{
55 vndkCoreLibrariesTxt,
56 vndkSpLibrariesTxt,
57 vndkPrivateLibrariesTxt,
58 vndkProductLibrariesTxt,
59 }
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090060
Justin Yun74217d92023-08-21 20:51:45 +090061 // TODO(b/290159430) This part will not be required once deprecation
62 // of VNDK is handled with 'ro.vndk.version' property
63 if !ctx.Config().IsVndkDeprecated() {
64 result = append(result, llndkLibrariesTxt)
65 }
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090066
Justin Yun74217d92023-08-21 20:51:45 +090067 return result
68 }
Jooyung Han39edb6c2019-11-06 16:53:07 +090069 }
Justin Yun74217d92023-08-21 20:51:45 +090070
Jooyung Han39edb6c2019-11-06 16:53:07 +090071 // Snapshot vndks have their own *.libraries.VER.txt files.
72 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090073 result := []string{
Jooyung Han39edb6c2019-11-06 16:53:07 +090074 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
75 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
76 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
Justin Yun8a2600c2020-12-07 12:44:03 +090077 insertVndkVersion(vndkProductLibrariesTxt, vndkVersion),
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090078 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
Jooyung Han39edb6c2019-11-06 16:53:07 +090079 }
Kiyoung Kima2d6dee2023-08-11 10:14:43 +090080
81 return result
Jooyung Han39edb6c2019-11-06 16:53:07 +090082}
83
Justin Yun8effde42017-06-23 19:24:43 +090084type VndkProperties struct {
85 Vndk struct {
86 // declared as a VNDK or VNDK-SP module. The vendor variant
87 // will be installed in /system instead of /vendor partition.
88 //
Justin Yun63e9ec72020-10-29 16:49:43 +090089 // `vendor_available` and `product_available` must be explicitly
90 // set to either true or false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090091 Enabled *bool
92
93 // declared as a VNDK-SP module, which is a subset of VNDK.
94 //
95 // `vndk: { enabled: true }` must set together.
96 //
97 // All these modules are allowed to link to VNDK-SP or LL-NDK
98 // modules only. Other dependency will cause link-type errors.
99 //
100 // If `support_system_process` is not set or set to false,
101 // the module is VNDK-core and can link to other VNDK-core,
102 // VNDK-SP or LL-NDK modules only.
103 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +0800104
Justin Yunfd9e8042020-12-23 18:23:14 +0900105 // declared as a VNDK-private module.
106 // This module still creates the vendor and product variants refering
107 // to the `vendor_available: true` and `product_available: true`
108 // properties. However, it is only available to the other VNDK modules
109 // but not to the non-VNDK vendor or product modules.
110 Private *bool
111
Logan Chienf3511742017-10-31 18:04:35 +0800112 // Extending another module
113 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +0900114 }
115}
116
117type vndkdep struct {
118 Properties VndkProperties
119}
120
121func (vndk *vndkdep) props() []interface{} {
122 return []interface{}{&vndk.Properties}
123}
124
Justin Yun8effde42017-06-23 19:24:43 +0900125func (vndk *vndkdep) isVndk() bool {
126 return Bool(vndk.Properties.Vndk.Enabled)
127}
128
129func (vndk *vndkdep) isVndkSp() bool {
130 return Bool(vndk.Properties.Vndk.Support_system_process)
131}
132
Logan Chienf3511742017-10-31 18:04:35 +0800133func (vndk *vndkdep) isVndkExt() bool {
134 return vndk.Properties.Vndk.Extends != nil
135}
136
137func (vndk *vndkdep) getVndkExtendsModuleName() string {
138 return String(vndk.Properties.Vndk.Extends)
139}
140
Justin Yun8effde42017-06-23 19:24:43 +0900141func (vndk *vndkdep) typeName() string {
142 if !vndk.isVndk() {
143 return "native:vendor"
144 }
Logan Chienf3511742017-10-31 18:04:35 +0800145 if !vndk.isVndkExt() {
146 if !vndk.isVndkSp() {
147 return "native:vendor:vndk"
148 }
149 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900150 }
Logan Chienf3511742017-10-31 18:04:35 +0800151 if !vndk.isVndkSp() {
152 return "native:vendor:vndkext"
153 }
154 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900155}
156
Justin Yun63e9ec72020-10-29 16:49:43 +0900157// VNDK link type check from a module with UseVndk() == true.
Jooyung Han479ca172020-10-19 18:51:07 +0900158func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900159 if to.linker == nil {
160 return
161 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900162 if !vndk.isVndk() {
Justin Yunfd9e8042020-12-23 18:23:14 +0900163 // Non-VNDK modules those installed to /vendor, /system/vendor,
164 // /product or /system/product cannot depend on VNDK-private modules
165 // that include VNDK-core-private, VNDK-SP-private and LLNDK-private.
166 if to.IsVndkPrivate() {
167 ctx.ModuleErrorf("non-VNDK module should not link to %q which has `private: true`", to.Name())
Jiyong Park82e2bf32017-08-16 14:05:54 +0900168 }
169 }
Justin Yun8effde42017-06-23 19:24:43 +0900170 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
171 // Check only shared libraries.
Colin Cross127bb8b2020-12-16 16:46:01 -0800172 // Other (static) libraries are allowed to link.
Justin Yun8effde42017-06-23 19:24:43 +0900173 return
174 }
Colin Cross127bb8b2020-12-16 16:46:01 -0800175
176 if to.IsLlndk() {
177 // LL-NDK libraries are allowed to link
178 return
179 }
180
Ivan Lozano52767be2019-10-18 14:49:46 -0700181 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900182 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
183 vndk.typeName(), to.Name())
184 return
185 }
Logan Chienf3511742017-10-31 18:04:35 +0800186 if tag == vndkExtDepTag {
187 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
188 // and has identical vndk properties.
189 if to.vndkdep == nil || !to.vndkdep.isVndk() {
190 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
191 return
192 }
193 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
194 ctx.ModuleErrorf(
195 "`extends` refers a module %q with mismatched support_system_process",
196 to.Name())
197 return
198 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900199 if to.IsVndkPrivate() {
Logan Chienf3511742017-10-31 18:04:35 +0800200 ctx.ModuleErrorf(
Justin Yunfd9e8042020-12-23 18:23:14 +0900201 "`extends` refers module %q which has `private: true`",
Justin Yun6977e8a2020-10-29 18:24:11 +0900202 to.Name())
203 return
204 }
Logan Chienf3511742017-10-31 18:04:35 +0800205 }
Justin Yun8effde42017-06-23 19:24:43 +0900206 if to.vndkdep == nil {
207 return
208 }
Logan Chienf3511742017-10-31 18:04:35 +0800209
Logan Chiend3c59a22018-03-29 14:08:15 +0800210 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100211 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
212 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
213 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800214 return
215 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800216}
Logan Chienf3511742017-10-31 18:04:35 +0800217
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100218func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800219 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
220 if from.isVndkExt() {
221 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100222 if to.isVndk() && !to.isVndkSp() {
223 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
224 }
225 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800226 }
227 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100228 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900229 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800230 if from.isVndk() {
231 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100232 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800233 }
234 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100235 if !to.isVndkSp() {
236 return errors.New("VNDK-SP must only depend on VNDK-SP")
237 }
238 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800239 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100240 if !to.isVndk() {
241 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
242 }
243 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800244 }
245 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100246 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900247}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900248
Colin Cross78212242021-01-06 14:51:30 -0800249type moduleListerFunc func(ctx android.SingletonContext) (moduleNames, fileNames []string)
250
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900251var (
Colin Cross203b4212021-04-26 17:19:41 -0700252 llndkLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsLLNDK && !m.Header() })
Colin Cross78212242021-01-06 14:51:30 -0800253 vndkSPLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKSP })
254 vndkCoreLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKCore })
Colin Cross203b4212021-04-26 17:19:41 -0700255 vndkPrivateLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKPrivate })
Colin Cross78212242021-01-06 14:51:30 -0800256 vndkProductLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKProduct })
257 vndkUsingCoreVariantLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKUsingCoreVariant })
Inseob Kimae553032019-05-14 18:52:49 +0900258)
Inseob Kim1f086e22019-05-09 13:29:15 +0900259
Colin Cross78212242021-01-06 14:51:30 -0800260// vndkModuleLister takes a predicate that operates on a Module and returns a moduleListerFunc
261// that produces a list of module names and output file names for which the predicate returns true.
262func vndkModuleLister(predicate func(*Module) bool) moduleListerFunc {
263 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
264 ctx.VisitAllModules(func(m android.Module) {
Jooyung Hane3f02812023-05-08 13:54:50 +0900265 if c, ok := m.(*Module); ok && predicate(c) && !c.IsVndkPrebuiltLibrary() {
Colin Cross78212242021-01-06 14:51:30 -0800266 filename, err := getVndkFileName(c)
267 if err != nil {
268 ctx.ModuleErrorf(m, "%s", err)
269 }
270 moduleNames = append(moduleNames, ctx.ModuleName(m))
271 fileNames = append(fileNames, filename)
272 }
273 })
274 moduleNames = android.SortedUniqueStrings(moduleNames)
275 fileNames = android.SortedUniqueStrings(fileNames)
276 return
277 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900278}
279
Colin Cross78212242021-01-06 14:51:30 -0800280// vndkModuleListRemover takes a moduleListerFunc and a prefix and returns a moduleListerFunc
281// that returns the same lists as the input moduleListerFunc, but with modules with the
282// given prefix removed.
283func vndkModuleListRemover(lister moduleListerFunc, prefix string) moduleListerFunc {
284 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
285 moduleNames, fileNames = lister(ctx)
286 filter := func(in []string) []string {
287 out := make([]string, 0, len(in))
288 for _, lib := range in {
289 if strings.HasPrefix(lib, prefix) {
290 continue
291 }
292 out = append(out, lib)
293 }
294 return out
295 }
296 return filter(moduleNames), filter(fileNames)
297 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900298}
299
Colin Cross78212242021-01-06 14:51:30 -0800300var vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
Inseob Kim9516ee92019-05-09 10:56:13 +0900301
Jooyung Han097087b2019-10-22 19:32:18 +0900302func vndkMustUseVendorVariantList(cfg android.Config) []string {
303 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900304 return config.VndkMustUseVendorVariantList
305 }).([]string)
306}
307
308// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
309// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
310func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900311 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900312 return mustUseVendorVariantList
313 })
314}
315
Inseob Kim1f086e22019-05-09 13:29:15 +0900316func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Justin Yun8a2600c2020-12-07 12:44:03 +0900317 if m.InProduct() {
318 // We may skip the steps for the product variants because they
319 // are already covered by the vendor variants.
320 return
321 }
322
Jooyung Han0302a842019-10-30 18:43:49 +0900323 name := m.BaseModuleName()
Inseob Kim1f086e22019-05-09 13:29:15 +0900324
Colin Cross31076b32020-10-23 17:22:06 -0700325 if lib := m.library; lib != nil && lib.hasStubsVariants() && name != "libz" {
Jiyong Park2478e4e2020-05-18 09:30:14 +0000326 // b/155456180 libz is the ONLY exception here. We don't want to make
327 // libz an LLNDK library because we in general can't guarantee that
328 // libz will behave consistently especially about the compression.
329 // i.e. the compressed output might be different across releases.
330 // As the library is an external one, it's risky to keep the compatibility
331 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900332 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
333 }
334
Jooyung Han097087b2019-10-22 19:32:18 +0900335 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
336 m.Properties.MustUseVendorVariant = true
337 }
Jooyung Han0302a842019-10-30 18:43:49 +0900338 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
Colin Cross78212242021-01-06 14:51:30 -0800339 m.VendorProperties.IsVNDKUsingCoreVariant = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900340 }
Jooyung Han0302a842019-10-30 18:43:49 +0900341
Inseob Kim1f086e22019-05-09 13:29:15 +0900342 if m.vndkdep.isVndkSp() {
Colin Cross78212242021-01-06 14:51:30 -0800343 m.VendorProperties.IsVNDKSP = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900344 } else {
Colin Cross78212242021-01-06 14:51:30 -0800345 m.VendorProperties.IsVNDKCore = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900346 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900347 if m.IsVndkPrivate() {
Colin Cross78212242021-01-06 14:51:30 -0800348 m.VendorProperties.IsVNDKPrivate = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900349 }
Justin Yunc0d8c492021-01-07 17:45:31 +0900350 if Bool(m.VendorProperties.Product_available) {
Colin Cross78212242021-01-06 14:51:30 -0800351 m.VendorProperties.IsVNDKProduct = true
Justin Yun8a2600c2020-12-07 12:44:03 +0900352 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900353}
354
Yo Chiang08fac0c2020-07-29 01:08:20 +0800355// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800356func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900357 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800358 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900359 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800360 if !m.Device() {
361 // Skip non-device modules
362 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900363 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900364 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800365 // Skip native_bridge modules
366 return true
367 }
368 return false
369}
370
371func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
372 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900373 return false
374 }
375
Jooyung Han31c470b2019-10-18 16:26:59 +0900376 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
377 // When b/142675459 is landed, remove following check
Justin Yunf14beaf2023-08-18 17:51:14 +0900378 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
379 // prebuilt vndk modules should match with device
380 if !p.MatchesWithDevice(mctx.DeviceConfig()) {
381 return false
382 }
383
384 // ignore prebuilt vndk modules that are newer than or equal to the platform vndk version
385 platformVndkApiLevel := android.ApiLevelOrPanic(mctx, mctx.DeviceConfig().PlatformVndkVersion())
386 if platformVndkApiLevel.LessThanOrEqualTo(android.ApiLevelOrPanic(mctx, p.Version())) {
387 return false
388 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900389 }
390
391 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900392 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
393 if mctx.DeviceConfig().VndkVersion() == "" {
394 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
395 if mctx.ModuleName() == "libz" {
396 return false
397 }
Jooyung Han7d6e79b2021-06-24 01:53:43 +0900398 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.IsVndkSp() && !m.IsVndkExt()
Jooyung Han73d20d02020-03-27 16:06:55 +0900399 }
Jooyung Han1724d582022-12-21 10:17:44 +0900400 // VNDK APEX doesn't need stub variants
401 if lib.buildStubs() {
402 return false
403 }
Justin Yun5f7f7e82019-11-18 19:52:14 +0900404 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900405 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500406 return lib.shared() && m.InVendor() && m.IsVndk() && !m.IsVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900407 }
408 return false
409}
410
Inseob Kim1f086e22019-05-09 13:29:15 +0900411// gather list of vndk-core, vndk-sp, and ll-ndk libs
412func VndkMutator(mctx android.BottomUpMutatorContext) {
413 m, ok := mctx.Module().(*Module)
414 if !ok {
415 return
416 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800417
418 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900419 return
420 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900421
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800422 lib, isLib := m.linker.(*libraryDecorator)
423 prebuiltLib, isPrebuiltLib := m.linker.(*prebuiltLibraryLinker)
Inseob Kim1f086e22019-05-09 13:29:15 +0900424
Colin Cross203b4212021-04-26 17:19:41 -0700425 if m.UseVndk() && isLib && lib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800426 m.VendorProperties.IsLLNDK = true
427 m.VendorProperties.IsVNDKPrivate = Bool(lib.Properties.Llndk.Private)
428 }
Colin Cross203b4212021-04-26 17:19:41 -0700429 if m.UseVndk() && isPrebuiltLib && prebuiltLib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800430 m.VendorProperties.IsLLNDK = true
431 m.VendorProperties.IsVNDKPrivate = Bool(prebuiltLib.Properties.Llndk.Private)
432 }
433
Jooyung Hane3f02812023-05-08 13:54:50 +0900434 if m.IsVndkPrebuiltLibrary() && !m.IsVndk() {
435 m.VendorProperties.IsLLNDK = true
436 // TODO(b/280697209): copy "llndk.private" flag to vndk_prebuilt_shared
437 }
438
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800439 if (isLib && lib.buildShared()) || (isPrebuiltLib && prebuiltLib.buildShared()) {
Inseob Kim64c43952019-08-26 16:52:35 +0900440 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900441 processVndkLibrary(mctx, m)
442 return
443 }
444 }
445}
446
447func init() {
Colin Crosse4e44bc2020-12-28 13:50:21 -0800448 RegisterVndkLibraryTxtTypes(android.InitRegistrationContext)
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000449 android.RegisterParallelSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900450}
451
Colin Crosse4e44bc2020-12-28 13:50:21 -0800452func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) {
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000453 ctx.RegisterParallelSingletonModuleType("llndk_libraries_txt", llndkLibrariesTxtFactory)
454 ctx.RegisterParallelSingletonModuleType("vndksp_libraries_txt", vndkSPLibrariesTxtFactory)
455 ctx.RegisterParallelSingletonModuleType("vndkcore_libraries_txt", vndkCoreLibrariesTxtFactory)
456 ctx.RegisterParallelSingletonModuleType("vndkprivate_libraries_txt", vndkPrivateLibrariesTxtFactory)
457 ctx.RegisterParallelSingletonModuleType("vndkproduct_libraries_txt", vndkProductLibrariesTxtFactory)
458 ctx.RegisterParallelSingletonModuleType("vndkcorevariant_libraries_txt", vndkUsingCoreVariantLibrariesTxtFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800459}
460
Jooyung Han2216fb12019-11-06 16:46:15 +0900461type vndkLibrariesTxt struct {
Colin Cross78212242021-01-06 14:51:30 -0800462 android.SingletonModuleBase
Colin Crosse4e44bc2020-12-28 13:50:21 -0800463
Justin Yun611e8862021-05-24 18:17:33 +0900464 lister moduleListerFunc
465 makeVarName string
466 filterOutFromMakeVar string
Colin Cross78212242021-01-06 14:51:30 -0800467
Colin Crosse4e44bc2020-12-28 13:50:21 -0800468 properties VndkLibrariesTxtProperties
469
Colin Cross78212242021-01-06 14:51:30 -0800470 outputFile android.OutputPath
471 moduleNames []string
472 fileNames []string
Jooyung Han2216fb12019-11-06 16:46:15 +0900473}
474
Colin Crosse4e44bc2020-12-28 13:50:21 -0800475type VndkLibrariesTxtProperties struct {
476 Insert_vndk_version *bool
477}
478
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700479var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900480var _ android.OutputFileProducer = &vndkLibrariesTxt{}
481
Colin Cross78212242021-01-06 14:51:30 -0800482// llndk_libraries_txt is a singleton module whose content is a list of LLNDK libraries
483// generated by Soong but can be referenced by other modules.
Jooyung Han2216fb12019-11-06 16:46:15 +0900484// For example, apex_vndk can depend on these files as prebuilt.
Justin Yun611e8862021-05-24 18:17:33 +0900485// Make uses LLNDK_LIBRARIES to determine which libraries to install.
486// HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
487// Therefore, by removing the library here, we cause it to only be installed if libc
488// depends on it.
Colin Cross78212242021-01-06 14:51:30 -0800489func llndkLibrariesTxtFactory() android.SingletonModule {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800490 return newVndkLibrariesWithMakeVarFilter(llndkLibraries, "LLNDK_LIBRARIES", "libclang_rt.hwasan")
Colin Cross78212242021-01-06 14:51:30 -0800491}
492
493// vndksp_libraries_txt is a singleton module whose content is a list of VNDKSP 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 vndkSPLibrariesTxtFactory() android.SingletonModule {
497 return newVndkLibrariesTxt(vndkSPLibraries, "VNDK_SAMEPROCESS_LIBRARIES")
498}
499
500// vndkcore_libraries_txt is a singleton module whose content is a list of VNDK core libraries
501// generated by Soong but can be referenced by other modules.
502// For example, apex_vndk can depend on these files as prebuilt.
503func vndkCoreLibrariesTxtFactory() android.SingletonModule {
504 return newVndkLibrariesTxt(vndkCoreLibraries, "VNDK_CORE_LIBRARIES")
505}
506
507// vndkprivate_libraries_txt is a singleton module whose content is a list of VNDK private libraries
508// generated by Soong but can be referenced by other modules.
509// For example, apex_vndk can depend on these files as prebuilt.
510func vndkPrivateLibrariesTxtFactory() android.SingletonModule {
511 return newVndkLibrariesTxt(vndkPrivateLibraries, "VNDK_PRIVATE_LIBRARIES")
512}
513
514// vndkproduct_libraries_txt is a singleton module whose content is a list of VNDK product libraries
515// generated by Soong but can be referenced by other modules.
516// For example, apex_vndk can depend on these files as prebuilt.
517func vndkProductLibrariesTxtFactory() android.SingletonModule {
518 return newVndkLibrariesTxt(vndkProductLibraries, "VNDK_PRODUCT_LIBRARIES")
519}
520
521// vndkcorevariant_libraries_txt is a singleton module whose content is a list of VNDK libraries
522// that are using the core variant, generated by Soong but can be referenced by other modules.
523// For example, apex_vndk can depend on these files as prebuilt.
524func vndkUsingCoreVariantLibrariesTxtFactory() android.SingletonModule {
525 return newVndkLibrariesTxt(vndkUsingCoreVariantLibraries, "VNDK_USING_CORE_VARIANT_LIBRARIES")
526}
527
Justin Yun611e8862021-05-24 18:17:33 +0900528func newVndkLibrariesWithMakeVarFilter(lister moduleListerFunc, makeVarName string, filter string) android.SingletonModule {
Colin Cross78212242021-01-06 14:51:30 -0800529 m := &vndkLibrariesTxt{
Justin Yun611e8862021-05-24 18:17:33 +0900530 lister: lister,
531 makeVarName: makeVarName,
532 filterOutFromMakeVar: filter,
Colin Crosse4e44bc2020-12-28 13:50:21 -0800533 }
Colin Cross78212242021-01-06 14:51:30 -0800534 m.AddProperties(&m.properties)
Colin Cross45bce852021-11-11 22:47:54 -0800535 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
Colin Cross78212242021-01-06 14:51:30 -0800536 return m
Jooyung Han2216fb12019-11-06 16:46:15 +0900537}
538
Justin Yun611e8862021-05-24 18:17:33 +0900539func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule {
540 return newVndkLibrariesWithMakeVarFilter(lister, makeVarName, "")
541}
542
Jooyung Han2216fb12019-11-06 16:46:15 +0900543func insertVndkVersion(filename string, vndkVersion string) string {
544 if index := strings.LastIndex(filename, "."); index != -1 {
545 return filename[:index] + "." + vndkVersion + filename[index:]
546 }
547 return filename
548}
549
Justin Yun74217d92023-08-21 20:51:45 +0900550func (txt *vndkLibrariesTxt) DepsMutator(mctx android.BottomUpMutatorContext) {
551 versionedName := insertVndkVersion(txt.Name(), mctx.DeviceConfig().PlatformVndkVersion())
552 if mctx.OtherModuleExists(versionedName) {
553 // If the prebuilt vndk libraries txt files exist, install them instead.
554 txt.HideFromMake()
555 mctx.AddDependency(txt, nil, versionedName)
556 }
557}
558
Colin Crosse4e44bc2020-12-28 13:50:21 -0800559func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Kiyoung Kima2d6dee2023-08-11 10:14:43 +0900560 filename := txt.Name()
561
562 shouldInsertVndkVersion := BoolDefault(txt.properties.Insert_vndk_version, true)
563 // llndk.libraries.txt file installed in the system image should not contain version info.
564 if ctx.Config().IsVndkDeprecated() && txt.Name() == llndkLibrariesTxt {
565 shouldInsertVndkVersion = false
566 }
567 if shouldInsertVndkVersion {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900568 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900569 }
570
Jooyung Han2216fb12019-11-06 16:46:15 +0900571 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
Jooyung Han2216fb12019-11-06 16:46:15 +0900572
573 installPath := android.PathForModuleInstall(ctx, "etc")
574 ctx.InstallFile(installPath, filename, txt.outputFile)
575}
576
Colin Cross78212242021-01-06 14:51:30 -0800577func (txt *vndkLibrariesTxt) GenerateSingletonBuildActions(ctx android.SingletonContext) {
578 txt.moduleNames, txt.fileNames = txt.lister(ctx)
579 android.WriteFileRule(ctx, txt.outputFile, strings.Join(txt.fileNames, "\n"))
580}
581
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900582func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
583 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900584 Class: "ETC",
585 OutputFile: android.OptionalPathForPath(txt.outputFile),
586 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
Colin Crossaa255532020-07-03 13:18:24 -0700587 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900588 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
589 },
590 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900591 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900592}
593
Colin Cross78212242021-01-06 14:51:30 -0800594func (txt *vndkLibrariesTxt) MakeVars(ctx android.MakeVarsContext) {
Justin Yun611e8862021-05-24 18:17:33 +0900595 filter := func(modules []string, prefix string) []string {
596 if prefix == "" {
597 return modules
598 }
599 var result []string
600 for _, module := range modules {
601 if strings.HasPrefix(module, prefix) {
602 continue
603 } else {
604 result = append(result, module)
605 }
606 }
607 return result
608 }
609 ctx.Strict(txt.makeVarName, strings.Join(filter(txt.moduleNames, txt.filterOutFromMakeVar), " "))
Colin Cross78212242021-01-06 14:51:30 -0800610}
611
Jooyung Han0703fd82020-08-26 22:11:53 +0900612// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900613func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
614 return txt.outputFile
615}
616
Jooyung Han0703fd82020-08-26 22:11:53 +0900617// PrebuiltEtcModule interface
618func (txt *vndkLibrariesTxt) BaseDir() string {
619 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900620}
621
Jooyung Han0703fd82020-08-26 22:11:53 +0900622// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900623func (txt *vndkLibrariesTxt) SubDir() string {
624 return ""
625}
626
Jooyung Han0703fd82020-08-26 22:11:53 +0900627func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
628 return android.Paths{txt.outputFile}, nil
629}
630
Inseob Kim1f086e22019-05-09 13:29:15 +0900631func VndkSnapshotSingleton() android.Singleton {
632 return &vndkSnapshotSingleton{}
633}
634
Jooyung Han0302a842019-10-30 18:43:49 +0900635type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900636 vndkLibrariesFile android.OutputPath
637 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900638}
Inseob Kim1f086e22019-05-09 13:29:15 +0900639
Ivan Lozanod7586b62021-04-01 09:49:36 -0400640func isVndkSnapshotAware(config android.DeviceConfig, m LinkableInterface,
641 apexInfo android.ApexInfo) (vndkType string, isVndkSnapshotLib bool) {
Colin Cross56a83212020-09-15 18:30:11 -0700642
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900643 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400644 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900645 }
Jooyung Han261e1582020-10-20 18:54:21 +0900646 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
647 // !installable: Snapshot only cares about "installable" modules.
Justin Yun450ae722021-04-16 19:58:18 +0900648 // !m.IsLlndk: llndk stubs are required for building against snapshots.
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400649 // IsSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Justin Yun450ae722021-04-16 19:58:18 +0900650 // !outputFile.Valid: Snapshot requires valid output file.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400651 if !m.InVendor() || (!installable(m, apexInfo) && !m.IsLlndk()) || m.IsSnapshotPrebuilt() || !m.OutputFile().Valid() {
652 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900653 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400654 if !m.IsSnapshotLibrary() || !m.Shared() {
655 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900656 }
Justin Yun450ae722021-04-16 19:58:18 +0900657 if m.VndkVersion() == config.PlatformVndkVersion() {
658 if m.IsVndk() && !m.IsVndkExt() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400659 if m.IsVndkSp() {
660 return "vndk-sp", true
Justin Yun450ae722021-04-16 19:58:18 +0900661 } else {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400662 return "vndk-core", true
Justin Yun450ae722021-04-16 19:58:18 +0900663 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400664 } else if m.HasLlndkStubs() && m.StubsVersion() == "" {
Justin Yun450ae722021-04-16 19:58:18 +0900665 // Use default version for the snapshot.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400666 return "llndk-stub", true
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900667 }
668 }
669
Ivan Lozanod7586b62021-04-01 09:49:36 -0400670 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900671}
672
Inseob Kim1f086e22019-05-09 13:29:15 +0900673func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900674 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
675 c.buildVndkLibrariesTxtFiles(ctx)
676
Inseob Kim1f086e22019-05-09 13:29:15 +0900677 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
678 if ctx.DeviceConfig().VndkVersion() != "current" {
679 return
680 }
681
682 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
683 return
684 }
685
Inseob Kim242ef0c2019-10-22 20:15:20 +0900686 var snapshotOutputs android.Paths
687
688 /*
689 VNDK snapshot zipped artifacts directory structure:
690 {SNAPSHOT_ARCH}/
691 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
692 shared/
693 vndk-core/
694 (VNDK-core libraries, e.g. libbinder.so)
695 vndk-sp/
696 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900697 llndk-stub/
698 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900699 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
700 shared/
701 vndk-core/
702 (VNDK-core libraries, e.g. libbinder.so)
703 vndk-sp/
704 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900705 llndk-stub/
706 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900707 binder32/
708 (This directory is newly introduced in v28 (Android P) to hold
709 prebuilts built for 32-bit binder interface.)
710 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
711 ...
712 configs/
713 (various *.txt configuration files)
714 include/
715 (header files of same directory structure with source tree)
716 NOTICE_FILES/
717 (notice files of libraries, e.g. libcutils.so.txt)
718 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900719
720 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900721 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900722
Inseob Kim242ef0c2019-10-22 20:15:20 +0900723 configsDir := filepath.Join(snapshotArchDir, "configs")
Justin Yun1871f902023-04-07 20:13:19 +0900724 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900725 includeDir := filepath.Join(snapshotArchDir, "include")
726
Justin Yun1871f902023-04-07 20:13:19 +0900727 // set of notice files copied.
728 noticeBuilt := make(map[string]bool)
729
Inseob Kim242ef0c2019-10-22 20:15:20 +0900730 // paths of VNDK modules for GPL license checking
731 modulePaths := make(map[string]string)
732
733 // actual module names of .so files
734 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
735 moduleNames := make(map[string]string)
736
Inseob Kim8471cda2019-11-15 09:59:12 +0900737 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900738
Inseob Kimde5744a2020-12-02 13:14:28 +0900739 // installVndkSnapshotLib copies built .so file from the module.
740 // Also, if the build artifacts is on, write a json file which contains all exported flags
741 // with FlagExporterInfo.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700742 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900743 var ret android.Paths
744
Inseob Kim8471cda2019-11-15 09:59:12 +0900745 targetArch := "arch-" + m.Target().Arch.ArchType.String()
746 if m.Target().Arch.ArchVariant != "" {
747 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900748 }
Inseob Kimae553032019-05-14 18:52:49 +0900749
Inseob Kim8471cda2019-11-15 09:59:12 +0900750 libPath := m.outputFile.Path()
751 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
Kiyoung Kimae11c232021-07-19 11:38:04 +0900752 ret = append(ret, snapshot.CopyFileRule(pctx, ctx, libPath, snapshotLibOut))
Inseob Kim8471cda2019-11-15 09:59:12 +0900753
Justin Yun1871f902023-04-07 20:13:19 +0900754 // json struct to export snapshot information
755 prop := struct {
Inseob Kim5860f822023-04-18 11:30:22 +0900756 MinSdkVersion string `json:",omitempty"`
Justin Yun1871f902023-04-07 20:13:19 +0900757 LicenseKinds []string `json:",omitempty"`
758 LicenseTexts []string `json:",omitempty"`
759 ExportedDirs []string `json:",omitempty"`
760 ExportedSystemDirs []string `json:",omitempty"`
761 ExportedFlags []string `json:",omitempty"`
762 RelativeInstallPath string `json:",omitempty"`
763 }{}
764
765 prop.LicenseKinds = m.EffectiveLicenseKinds()
766 prop.LicenseTexts = m.EffectiveLicenseFiles().Strings()
Inseob Kim5860f822023-04-18 11:30:22 +0900767 prop.MinSdkVersion = m.MinSdkVersion()
Justin Yun1871f902023-04-07 20:13:19 +0900768
Inseob Kimae553032019-05-14 18:52:49 +0900769 if ctx.Config().VndkSnapshotBuildArtifacts() {
Colin Cross0de8a1e2020-09-18 14:15:30 -0700770 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
771 prop.ExportedFlags = exportedInfo.Flags
772 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
773 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900774 prop.RelativeInstallPath = m.RelativeInstallPath()
Inseob Kimae553032019-05-14 18:52:49 +0900775 }
Justin Yun1871f902023-04-07 20:13:19 +0900776
777 propOut := snapshotLibOut + ".json"
778
779 j, err := json.Marshal(prop)
780 if err != nil {
781 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
782 return nil, false
783 }
784 ret = append(ret, snapshot.WriteStringToFileRule(ctx, string(j), propOut))
785
Inseob Kim242ef0c2019-10-22 20:15:20 +0900786 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900787 }
788
Inseob Kim1f086e22019-05-09 13:29:15 +0900789 ctx.VisitAllModules(func(module android.Module) {
790 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900791 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900792 return
793 }
794
Colin Cross56a83212020-09-15 18:30:11 -0700795 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
796
Ivan Lozanod7586b62021-04-01 09:49:36 -0400797 vndkType, ok := isVndkSnapshotAware(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900798 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200799 return
800 }
801
Inseob Kimde5744a2020-12-02 13:14:28 +0900802 // For all snapshot candidates, the followings are captured.
803 // - .so files
804 // - notice files
805 //
806 // The followings are also captured if VNDK_SNAPSHOT_BUILD_ARTIFACTS.
807 // - .json files containing exported flags
808 // - exported headers from collectHeadersForSnapshot()
809 //
810 // Headers are deduplicated after visiting all modules.
811
Inseob Kim8471cda2019-11-15 09:59:12 +0900812 // install .so files for appropriate modules.
813 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700814 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900815 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900816 return
817 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900818 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900819
Inseob Kim8471cda2019-11-15 09:59:12 +0900820 // These are for generating module_names.txt and module_paths.txt
821 stem := m.outputFile.Path().Base()
822 moduleNames[stem] = ctx.ModuleName(m)
823 modulePaths[stem] = ctx.ModuleDir(m)
824
Justin Yun1871f902023-04-07 20:13:19 +0900825 for _, notice := range m.EffectiveLicenseFiles() {
826 if _, ok := noticeBuilt[notice.String()]; !ok {
827 noticeBuilt[notice.String()] = true
828 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
829 pctx, ctx, notice, filepath.Join(noticeDir, notice.String())))
830 }
831 }
832
Inseob Kim8471cda2019-11-15 09:59:12 +0900833 if ctx.Config().VndkSnapshotBuildArtifacts() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400834 headers = append(headers, m.SnapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900835 }
836 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900837
Inseob Kim8471cda2019-11-15 09:59:12 +0900838 // install all headers after removing duplicates
839 for _, header := range android.FirstUniquePaths(headers) {
Kiyoung Kimae11c232021-07-19 11:38:04 +0900840 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
841 pctx, ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900842 }
843
Jooyung Han39edb6c2019-11-06 16:53:07 +0900844 // install *.libraries.txt except vndkcorevariant.libraries.txt
845 ctx.VisitAllModules(func(module android.Module) {
846 m, ok := module.(*vndkLibrariesTxt)
847 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
848 return
849 }
Kiyoung Kimae11c232021-07-19 11:38:04 +0900850 snapshotOutputs = append(snapshotOutputs, snapshot.CopyFileRule(
851 pctx, ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900852 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900853
Inseob Kim242ef0c2019-10-22 20:15:20 +0900854 /*
Inseob Kim242ef0c2019-10-22 20:15:20 +0900855 module_paths.txt contains paths on which VNDK modules are defined.
856 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000857 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900858 libc.so bionic/libc
859 ...
860 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900861 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, modulePaths, filepath.Join(configsDir, "module_paths.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900862
863 /*
864 module_names.txt contains names as which VNDK modules are defined,
865 because output filename and module name can be different with stem and suffix properties.
866
867 e.g.,
868 libcutils.so libcutils
869 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
870 ...
871 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900872 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, moduleNames, filepath.Join(configsDir, "module_names.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900873
874 // All artifacts are ready. Sort them to normalize ninja and then zip.
875 sort.Slice(snapshotOutputs, func(i, j int) bool {
876 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
877 })
878
879 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
Colin Crossf1a035e2020-11-16 17:32:30 -0800880 zipRule := android.NewRuleBuilder(pctx, ctx)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900881
Inseob Kimde5744a2020-12-02 13:14:28 +0900882 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with tr
Inseob Kim242ef0c2019-10-22 20:15:20 +0900883 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
Colin Cross70c47412021-03-12 17:48:14 -0800884 rspFile := snapshotOutputList.ReplaceExtension(ctx, "rsp")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900885 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900886 Text("tr").
887 FlagWithArg("-d ", "\\'").
Colin Cross70c47412021-03-12 17:48:14 -0800888 FlagWithRspFileInputList("< ", rspFile, snapshotOutputs).
Inseob Kim8471cda2019-11-15 09:59:12 +0900889 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900890
891 zipRule.Temporary(snapshotOutputList)
892
893 zipRule.Command().
Colin Crossf1a035e2020-11-16 17:32:30 -0800894 BuiltTool("soong_zip").
Inseob Kim242ef0c2019-10-22 20:15:20 +0900895 FlagWithOutput("-o ", zipPath).
896 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
897 FlagWithInput("-l ", snapshotOutputList)
898
Colin Crossf1a035e2020-11-16 17:32:30 -0800899 zipRule.Build(zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900900 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900901 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900902}
Jooyung Han097087b2019-10-22 19:32:18 +0900903
Jooyung Han0302a842019-10-30 18:43:49 +0900904func getVndkFileName(m *Module) (string, error) {
905 if library, ok := m.linker.(*libraryDecorator); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900906 return library.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900907 }
908 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900909 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900910 }
911 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900912}
913
914func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900915 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900916 // Since each target have different set of libclang_rt.* files,
917 // keep the common set of files in vndk.libraries.txt
Colin Cross78212242021-01-06 14:51:30 -0800918 _, llndk := vndkModuleListRemover(llndkLibraries, "libclang_rt.")(ctx)
919 _, vndkcore := vndkModuleListRemover(vndkCoreLibraries, "libclang_rt.")(ctx)
920 _, vndksp := vndkSPLibraries(ctx)
921 _, vndkprivate := vndkPrivateLibraries(ctx)
922 _, vndkproduct := vndkModuleListRemover(vndkProductLibraries, "libclang_rt.")(ctx)
Jooyung Han0302a842019-10-30 18:43:49 +0900923 var merged []string
Colin Cross78212242021-01-06 14:51:30 -0800924 merged = append(merged, addPrefix(llndk, "LLNDK: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900925 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800926 merged = append(merged, addPrefix(vndkcore, "VNDK-core: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900927 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800928 merged = append(merged, addPrefix(vndkproduct, "VNDK-product: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900929 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
Colin Crosscf371cc2020-11-13 11:48:42 -0800930 android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n"))
Jooyung Han0302a842019-10-30 18:43:49 +0900931}
Jooyung Han097087b2019-10-22 19:32:18 +0900932
Jooyung Han0302a842019-10-30 18:43:49 +0900933func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
934 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
935 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700936 movedToApexLlndkLibraries := make(map[string]bool)
937 ctx.VisitAllModules(func(module android.Module) {
Colin Cross127bb8b2020-12-16 16:46:01 -0800938 if library := moduleLibraryInterface(module); library != nil && library.hasLLNDKStubs() {
939 // Skip bionic libs, they are handled in different manner
940 name := library.implementationModuleName(module.(*Module).BaseModuleName())
941 if module.(android.ApexModule).DirectlyInAnyApex() && !isBionic(name) {
942 movedToApexLlndkLibraries[name] = true
Colin Cross56a83212020-09-15 18:30:11 -0700943 }
Jooyung Han0302a842019-10-30 18:43:49 +0900944 }
Colin Cross56a83212020-09-15 18:30:11 -0700945 })
946
947 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
Cole Faust18994c72023-02-28 16:02:16 -0800948 strings.Join(android.SortedKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900949
Jooyung Han0302a842019-10-30 18:43:49 +0900950 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900951 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900952}