blob: 7d8777c1d4c63ae2ce968a104e072286afdf4d72 [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"
24 "sync"
25
Justin Yun8effde42017-06-23 19:24:43 +090026 "android/soong/android"
Vic Yangefd249e2018-11-12 20:19:56 -080027 "android/soong/cc/config"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070028 "android/soong/etc"
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"
38 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
39)
40
41func VndkLibrariesTxtModules(vndkVersion string) []string {
42 if vndkVersion == "current" {
43 return []string{
44 llndkLibrariesTxt,
45 vndkCoreLibrariesTxt,
46 vndkSpLibrariesTxt,
47 vndkPrivateLibrariesTxt,
Jooyung Han39edb6c2019-11-06 16:53:07 +090048 }
49 }
50 // Snapshot vndks have their own *.libraries.VER.txt files.
51 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
52 return []string{
53 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
54 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
55 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
56 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
57 }
58}
59
Justin Yun8effde42017-06-23 19:24:43 +090060type VndkProperties struct {
61 Vndk struct {
62 // declared as a VNDK or VNDK-SP module. The vendor variant
63 // will be installed in /system instead of /vendor partition.
64 //
Roland Levillaindfe75b32019-07-23 16:53:32 +010065 // `vendor_available` must be explicitly set to either true or
Jiyong Park82e2bf32017-08-16 14:05:54 +090066 // false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090067 Enabled *bool
68
69 // declared as a VNDK-SP module, which is a subset of VNDK.
70 //
71 // `vndk: { enabled: true }` must set together.
72 //
73 // All these modules are allowed to link to VNDK-SP or LL-NDK
74 // modules only. Other dependency will cause link-type errors.
75 //
76 // If `support_system_process` is not set or set to false,
77 // the module is VNDK-core and can link to other VNDK-core,
78 // VNDK-SP or LL-NDK modules only.
79 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +080080
81 // Extending another module
82 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +090083 }
84}
85
86type vndkdep struct {
87 Properties VndkProperties
88}
89
90func (vndk *vndkdep) props() []interface{} {
91 return []interface{}{&vndk.Properties}
92}
93
94func (vndk *vndkdep) begin(ctx BaseModuleContext) {}
95
96func (vndk *vndkdep) deps(ctx BaseModuleContext, deps Deps) Deps {
97 return deps
98}
99
100func (vndk *vndkdep) isVndk() bool {
101 return Bool(vndk.Properties.Vndk.Enabled)
102}
103
104func (vndk *vndkdep) isVndkSp() bool {
105 return Bool(vndk.Properties.Vndk.Support_system_process)
106}
107
Logan Chienf3511742017-10-31 18:04:35 +0800108func (vndk *vndkdep) isVndkExt() bool {
109 return vndk.Properties.Vndk.Extends != nil
110}
111
112func (vndk *vndkdep) getVndkExtendsModuleName() string {
113 return String(vndk.Properties.Vndk.Extends)
114}
115
Justin Yun8effde42017-06-23 19:24:43 +0900116func (vndk *vndkdep) typeName() string {
117 if !vndk.isVndk() {
118 return "native:vendor"
119 }
Logan Chienf3511742017-10-31 18:04:35 +0800120 if !vndk.isVndkExt() {
121 if !vndk.isVndkSp() {
122 return "native:vendor:vndk"
123 }
124 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900125 }
Logan Chienf3511742017-10-31 18:04:35 +0800126 if !vndk.isVndkSp() {
127 return "native:vendor:vndkext"
128 }
129 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900130}
131
Jooyung Han479ca172020-10-19 18:51:07 +0900132func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900133 if to.linker == nil {
134 return
135 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900136 if !vndk.isVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900137 // Non-VNDK modules (those installed to /vendor, /product, or /system/product) can't depend
138 // on modules marked with vendor_available: false.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900139 violation := false
Nan Zhang0007d812017-11-07 10:57:05 -0800140 if lib, ok := to.linker.(*llndkStubDecorator); ok && !Bool(lib.Properties.Vendor_available) {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900141 violation = true
142 } else {
143 if _, ok := to.linker.(libraryInterface); ok && to.VendorProperties.Vendor_available != nil && !Bool(to.VendorProperties.Vendor_available) {
144 // Vendor_available == nil && !Bool(Vendor_available) should be okay since
Justin Yun5f7f7e82019-11-18 19:52:14 +0900145 // it means a vendor-only, or product-only library which is a valid dependency
146 // for non-VNDK modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900147 violation = true
148 }
149 }
150 if violation {
151 ctx.ModuleErrorf("Vendor module that is not VNDK should not link to %q which is marked as `vendor_available: false`", to.Name())
152 }
153 }
Justin Yun8effde42017-06-23 19:24:43 +0900154 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
155 // Check only shared libraries.
156 // Other (static and LL-NDK) libraries are allowed to link.
157 return
158 }
Ivan Lozano52767be2019-10-18 14:49:46 -0700159 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900160 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
161 vndk.typeName(), to.Name())
162 return
163 }
Logan Chienf3511742017-10-31 18:04:35 +0800164 if tag == vndkExtDepTag {
165 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
166 // and has identical vndk properties.
167 if to.vndkdep == nil || !to.vndkdep.isVndk() {
168 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
169 return
170 }
171 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
172 ctx.ModuleErrorf(
173 "`extends` refers a module %q with mismatched support_system_process",
174 to.Name())
175 return
176 }
177 if !Bool(to.VendorProperties.Vendor_available) {
178 ctx.ModuleErrorf(
179 "`extends` refers module %q which does not have `vendor_available: true`",
180 to.Name())
181 return
182 }
183 }
Justin Yun8effde42017-06-23 19:24:43 +0900184 if to.vndkdep == nil {
185 return
186 }
Logan Chienf3511742017-10-31 18:04:35 +0800187
Logan Chiend3c59a22018-03-29 14:08:15 +0800188 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100189 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
190 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
191 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800192 return
193 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800194}
Logan Chienf3511742017-10-31 18:04:35 +0800195
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100196func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800197 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
198 if from.isVndkExt() {
199 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100200 if to.isVndk() && !to.isVndkSp() {
201 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
202 }
203 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800204 }
205 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100206 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900207 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800208 if from.isVndk() {
209 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100210 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800211 }
212 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100213 if !to.isVndkSp() {
214 return errors.New("VNDK-SP must only depend on VNDK-SP")
215 }
216 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800217 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100218 if !to.isVndk() {
219 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
220 }
221 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800222 }
223 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100224 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900225}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900226
227var (
Jooyung Hana463f722019-11-01 08:45:59 +0900228 vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires")
229 vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires")
230 llndkLibrariesKey = android.NewOnceKey("llndkLibrarires")
231 vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires")
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900232 vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries")
Jooyung Hana463f722019-11-01 08:45:59 +0900233 vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
234 vndkLibrariesLock sync.Mutex
Inseob Kimae553032019-05-14 18:52:49 +0900235)
Inseob Kim1f086e22019-05-09 13:29:15 +0900236
Jooyung Han0302a842019-10-30 18:43:49 +0900237func vndkCoreLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900238 return config.Once(vndkCoreLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900239 return make(map[string]string)
240 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900241}
242
Jooyung Han0302a842019-10-30 18:43:49 +0900243func vndkSpLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900244 return config.Once(vndkSpLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900245 return make(map[string]string)
246 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900247}
248
Jooyung Han0302a842019-10-30 18:43:49 +0900249func isLlndkLibrary(baseModuleName string, config android.Config) bool {
Colin Cross0477b422020-10-13 18:43:54 -0700250 _, ok := llndkLibraries(config)[strings.TrimSuffix(baseModuleName, llndkLibrarySuffix)]
Jooyung Han0302a842019-10-30 18:43:49 +0900251 return ok
252}
253
254func llndkLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900255 return config.Once(llndkLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900256 return make(map[string]string)
257 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900258}
259
Jooyung Han0302a842019-10-30 18:43:49 +0900260func isVndkPrivateLibrary(baseModuleName string, config android.Config) bool {
261 _, ok := vndkPrivateLibraries(config)[baseModuleName]
262 return ok
263}
264
265func vndkPrivateLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900266 return config.Once(vndkPrivateLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900267 return make(map[string]string)
268 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900269}
270
Jooyung Han0302a842019-10-30 18:43:49 +0900271func vndkUsingCoreVariantLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900272 return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900273 return make(map[string]string)
274 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900275}
276
Jooyung Han097087b2019-10-22 19:32:18 +0900277func vndkMustUseVendorVariantList(cfg android.Config) []string {
278 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900279 return config.VndkMustUseVendorVariantList
280 }).([]string)
281}
282
283// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
284// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
285func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900286 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900287 return mustUseVendorVariantList
288 })
289}
290
Inseob Kim1f086e22019-05-09 13:29:15 +0900291func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
292 lib := m.linker.(*llndkStubDecorator)
Colin Cross0477b422020-10-13 18:43:54 -0700293 name := m.ImplementationModuleName(mctx)
294 filename := name + ".so"
Inseob Kim9516ee92019-05-09 10:56:13 +0900295
Inseob Kim1f086e22019-05-09 13:29:15 +0900296 vndkLibrariesLock.Lock()
297 defer vndkLibrariesLock.Unlock()
Inseob Kim9516ee92019-05-09 10:56:13 +0900298
Jooyung Han0302a842019-10-30 18:43:49 +0900299 llndkLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900300 if !Bool(lib.Properties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900301 vndkPrivateLibraries(mctx.Config())[name] = filename
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900302 }
Colin Cross56a83212020-09-15 18:30:11 -0700303
Jooyung Han61b66e92020-03-21 14:21:46 +0000304 if mctx.OtherModuleExists(name) {
305 mctx.AddFarVariationDependencies(m.Target().Variations(), llndkImplDep, name)
306 }
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900307}
Inseob Kim1f086e22019-05-09 13:29:15 +0900308
309func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Jooyung Han0302a842019-10-30 18:43:49 +0900310 name := m.BaseModuleName()
311 filename, err := getVndkFileName(m)
312 if err != nil {
313 panic(err)
314 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900315
Jiyong Park2478e4e2020-05-18 09:30:14 +0000316 if m.HasStubsVariants() && name != "libz" {
317 // b/155456180 libz is the ONLY exception here. We don't want to make
318 // libz an LLNDK library because we in general can't guarantee that
319 // libz will behave consistently especially about the compression.
320 // i.e. the compressed output might be different across releases.
321 // As the library is an external one, it's risky to keep the compatibility
322 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900323 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
324 }
325
Inseob Kim1f086e22019-05-09 13:29:15 +0900326 vndkLibrariesLock.Lock()
327 defer vndkLibrariesLock.Unlock()
328
Jooyung Han097087b2019-10-22 19:32:18 +0900329 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
330 m.Properties.MustUseVendorVariant = true
331 }
Jooyung Han0302a842019-10-30 18:43:49 +0900332 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
333 vndkUsingCoreVariantLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900334 }
Jooyung Han0302a842019-10-30 18:43:49 +0900335
Inseob Kim1f086e22019-05-09 13:29:15 +0900336 if m.vndkdep.isVndkSp() {
Jooyung Han0302a842019-10-30 18:43:49 +0900337 vndkSpLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900338 } else {
Jooyung Han0302a842019-10-30 18:43:49 +0900339 vndkCoreLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900340 }
341 if !Bool(m.VendorProperties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900342 vndkPrivateLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900343 }
344}
345
Yo Chiang08fac0c2020-07-29 01:08:20 +0800346// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800347func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900348 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800349 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900350 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800351 if !m.Device() {
352 // Skip non-device modules
353 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900354 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900355 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800356 // Skip native_bridge modules
357 return true
358 }
359 return false
360}
361
362func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
363 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900364 return false
365 }
366
367 // prebuilt vndk modules should match with device
368 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
369 // When b/142675459 is landed, remove following check
370 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.matchesWithDevice(mctx.DeviceConfig()) {
371 return false
372 }
373
374 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900375 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
376 if mctx.DeviceConfig().VndkVersion() == "" {
377 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
378 if mctx.ModuleName() == "libz" {
379 return false
380 }
381 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.isVndkSp()
382 }
383
Justin Yun5f7f7e82019-11-18 19:52:14 +0900384 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900385 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000386 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900387 }
388 return false
389}
390
Inseob Kim1f086e22019-05-09 13:29:15 +0900391// gather list of vndk-core, vndk-sp, and ll-ndk libs
392func VndkMutator(mctx android.BottomUpMutatorContext) {
393 m, ok := mctx.Module().(*Module)
394 if !ok {
395 return
396 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800397
398 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900399 return
400 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900401
402 if _, ok := m.linker.(*llndkStubDecorator); ok {
403 processLlndkLibrary(mctx, m)
404 return
405 }
406
407 lib, is_lib := m.linker.(*libraryDecorator)
408 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
409
Inseob Kim64c43952019-08-26 16:52:35 +0900410 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
411 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900412 processVndkLibrary(mctx, m)
413 return
414 }
415 }
416}
417
418func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900419 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900420 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900421}
422
Jooyung Han2216fb12019-11-06 16:46:15 +0900423type vndkLibrariesTxt struct {
424 android.ModuleBase
425 outputFile android.OutputPath
426}
427
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700428var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900429var _ android.OutputFileProducer = &vndkLibrariesTxt{}
430
Jooyung Han2216fb12019-11-06 16:46:15 +0900431// vndk_libraries_txt is a special kind of module type in that it name is one of
432// - llndk.libraries.txt
433// - vndkcore.libraries.txt
434// - vndksp.libraries.txt
435// - vndkprivate.libraries.txt
436// - vndkcorevariant.libraries.txt
437// A module behaves like a prebuilt_etc but its content is generated by soong.
438// By being a soong module, these files can be referenced by other soong modules.
439// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900440func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900441 m := &vndkLibrariesTxt{}
442 android.InitAndroidModule(m)
443 return m
444}
445
446func insertVndkVersion(filename string, vndkVersion string) string {
447 if index := strings.LastIndex(filename, "."); index != -1 {
448 return filename[:index] + "." + vndkVersion + filename[index:]
449 }
450 return filename
451}
452
453func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
454 var list []string
455 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900456 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900457 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
458 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
459 continue
460 }
461 list = append(list, filename)
462 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900463 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900464 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900465 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900466 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900467 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900468 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900469 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900470 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
471 default:
472 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
473 return
474 }
475
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900476 var filename string
477 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
478 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
479 } else {
480 filename = txt.Name()
481 }
482
Jooyung Han2216fb12019-11-06 16:46:15 +0900483 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
484 ctx.Build(pctx, android.BuildParams{
485 Rule: android.WriteFile,
486 Output: txt.outputFile,
487 Description: "Writing " + txt.outputFile.String(),
488 Args: map[string]string{
489 "content": strings.Join(list, "\\n"),
490 },
491 })
492
493 installPath := android.PathForModuleInstall(ctx, "etc")
494 ctx.InstallFile(installPath, filename, txt.outputFile)
495}
496
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900497func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
498 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900499 Class: "ETC",
500 OutputFile: android.OptionalPathForPath(txt.outputFile),
501 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
502 func(entries *android.AndroidMkEntries) {
503 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
504 },
505 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900506 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900507}
508
Jooyung Han0703fd82020-08-26 22:11:53 +0900509// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900510func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
511 return txt.outputFile
512}
513
Jooyung Han0703fd82020-08-26 22:11:53 +0900514// PrebuiltEtcModule interface
515func (txt *vndkLibrariesTxt) BaseDir() string {
516 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900517}
518
Jooyung Han0703fd82020-08-26 22:11:53 +0900519// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900520func (txt *vndkLibrariesTxt) SubDir() string {
521 return ""
522}
523
Jooyung Han0703fd82020-08-26 22:11:53 +0900524func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
525 return android.Paths{txt.outputFile}, nil
526}
527
Inseob Kim1f086e22019-05-09 13:29:15 +0900528func VndkSnapshotSingleton() android.Singleton {
529 return &vndkSnapshotSingleton{}
530}
531
Jooyung Han0302a842019-10-30 18:43:49 +0900532type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900533 vndkLibrariesFile android.OutputPath
534 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900535}
Inseob Kim1f086e22019-05-09 13:29:15 +0900536
Colin Cross56a83212020-09-15 18:30:11 -0700537func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module,
538 apexInfo android.ApexInfo) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
539
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900540 if m.Target().NativeBridge == android.NativeBridgeEnabled {
541 return nil, "", false
542 }
Jooyung Han261e1582020-10-20 18:54:21 +0900543 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
544 // !installable: Snapshot only cares about "installable" modules.
545 // isSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Colin Cross56a83212020-09-15 18:30:11 -0700546 if !m.inVendor() || !m.installable(apexInfo) || m.isSnapshotPrebuilt() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900547 return nil, "", false
548 }
549 l, ok := m.linker.(snapshotLibraryInterface)
550 if !ok || !l.shared() {
551 return nil, "", false
552 }
553 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
554 if m.isVndkSp() {
555 return l, "vndk-sp", true
556 } else {
557 return l, "vndk-core", true
558 }
559 }
560
561 return nil, "", false
562}
563
Inseob Kim1f086e22019-05-09 13:29:15 +0900564func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900565 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
566 c.buildVndkLibrariesTxtFiles(ctx)
567
Inseob Kim1f086e22019-05-09 13:29:15 +0900568 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
569 if ctx.DeviceConfig().VndkVersion() != "current" {
570 return
571 }
572
573 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
574 return
575 }
576
Inseob Kim242ef0c2019-10-22 20:15:20 +0900577 var snapshotOutputs android.Paths
578
579 /*
580 VNDK snapshot zipped artifacts directory structure:
581 {SNAPSHOT_ARCH}/
582 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
583 shared/
584 vndk-core/
585 (VNDK-core libraries, e.g. libbinder.so)
586 vndk-sp/
587 (VNDK-SP libraries, e.g. libc++.so)
588 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
589 shared/
590 vndk-core/
591 (VNDK-core libraries, e.g. libbinder.so)
592 vndk-sp/
593 (VNDK-SP libraries, e.g. libc++.so)
594 binder32/
595 (This directory is newly introduced in v28 (Android P) to hold
596 prebuilts built for 32-bit binder interface.)
597 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
598 ...
599 configs/
600 (various *.txt configuration files)
601 include/
602 (header files of same directory structure with source tree)
603 NOTICE_FILES/
604 (notice files of libraries, e.g. libcutils.so.txt)
605 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900606
607 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900608 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900609
Inseob Kim242ef0c2019-10-22 20:15:20 +0900610 configsDir := filepath.Join(snapshotArchDir, "configs")
611 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
612 includeDir := filepath.Join(snapshotArchDir, "include")
613
Inseob Kim242ef0c2019-10-22 20:15:20 +0900614 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900615 noticeBuilt := make(map[string]bool)
616
Inseob Kim242ef0c2019-10-22 20:15:20 +0900617 // paths of VNDK modules for GPL license checking
618 modulePaths := make(map[string]string)
619
620 // actual module names of .so files
621 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
622 moduleNames := make(map[string]string)
623
Inseob Kim8471cda2019-11-15 09:59:12 +0900624 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900625
Colin Cross0de8a1e2020-09-18 14:15:30 -0700626 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900627 var ret android.Paths
628
Inseob Kim8471cda2019-11-15 09:59:12 +0900629 targetArch := "arch-" + m.Target().Arch.ArchType.String()
630 if m.Target().Arch.ArchVariant != "" {
631 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900632 }
Inseob Kimae553032019-05-14 18:52:49 +0900633
Inseob Kim8471cda2019-11-15 09:59:12 +0900634 libPath := m.outputFile.Path()
635 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
636 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
637
Inseob Kimae553032019-05-14 18:52:49 +0900638 if ctx.Config().VndkSnapshotBuildArtifacts() {
639 prop := struct {
640 ExportedDirs []string `json:",omitempty"`
641 ExportedSystemDirs []string `json:",omitempty"`
642 ExportedFlags []string `json:",omitempty"`
643 RelativeInstallPath string `json:",omitempty"`
644 }{}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700645 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
646 prop.ExportedFlags = exportedInfo.Flags
647 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
648 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900649 prop.RelativeInstallPath = m.RelativeInstallPath()
650
Inseob Kim242ef0c2019-10-22 20:15:20 +0900651 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900652
653 j, err := json.Marshal(prop)
654 if err != nil {
655 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900656 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900657 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900658 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900659 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900660 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900661 }
662
Inseob Kim1f086e22019-05-09 13:29:15 +0900663 ctx.VisitAllModules(func(module android.Module) {
664 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900665 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900666 return
667 }
668
Colin Cross56a83212020-09-15 18:30:11 -0700669 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
670
671 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900672 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200673 return
674 }
675
Inseob Kim8471cda2019-11-15 09:59:12 +0900676 // install .so files for appropriate modules.
677 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700678 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900679 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900680 return
681 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900682 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900683
Inseob Kim8471cda2019-11-15 09:59:12 +0900684 // These are for generating module_names.txt and module_paths.txt
685 stem := m.outputFile.Path().Base()
686 moduleNames[stem] = ctx.ModuleName(m)
687 modulePaths[stem] = ctx.ModuleDir(m)
688
Bob Badoura75b0572020-02-18 20:21:55 -0800689 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900690 noticeName := stem + ".txt"
691 // skip already copied notice file
692 if _, ok := noticeBuilt[noticeName]; !ok {
693 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800694 snapshotOutputs = append(snapshotOutputs, combineNotices(
695 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900696 }
697 }
698
699 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900700 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900701 }
702 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900703
Inseob Kim8471cda2019-11-15 09:59:12 +0900704 // install all headers after removing duplicates
705 for _, header := range android.FirstUniquePaths(headers) {
706 snapshotOutputs = append(snapshotOutputs, copyFile(
707 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900708 }
709
Jooyung Han39edb6c2019-11-06 16:53:07 +0900710 // install *.libraries.txt except vndkcorevariant.libraries.txt
711 ctx.VisitAllModules(func(module android.Module) {
712 m, ok := module.(*vndkLibrariesTxt)
713 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
714 return
715 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900716 snapshotOutputs = append(snapshotOutputs, copyFile(
717 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900718 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900719
Inseob Kim242ef0c2019-10-22 20:15:20 +0900720 /*
721 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900722
Inseob Kim242ef0c2019-10-22 20:15:20 +0900723 {key1} {value1}
724 {key2} {value2}
725 ...
726 */
727 installMapListFile := func(m map[string]string, path string) android.OutputPath {
728 var txtBuilder strings.Builder
729 for idx, k := range android.SortedStringKeys(m) {
730 if idx > 0 {
731 txtBuilder.WriteString("\\n")
732 }
733 txtBuilder.WriteString(k)
734 txtBuilder.WriteString(" ")
735 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900736 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900737 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900738 }
739
Inseob Kim242ef0c2019-10-22 20:15:20 +0900740 /*
741 module_paths.txt contains paths on which VNDK modules are defined.
742 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000743 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900744 libc.so bionic/libc
745 ...
746 */
747 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
748
749 /*
750 module_names.txt contains names as which VNDK modules are defined,
751 because output filename and module name can be different with stem and suffix properties.
752
753 e.g.,
754 libcutils.so libcutils
755 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
756 ...
757 */
758 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
759
760 // All artifacts are ready. Sort them to normalize ninja and then zip.
761 sort.Slice(snapshotOutputs, func(i, j int) bool {
762 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
763 })
764
765 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
766 zipRule := android.NewRuleBuilder()
767
Inseob Kim8471cda2019-11-15 09:59:12 +0900768 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900769 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
770 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900771 Text("tr").
772 FlagWithArg("-d ", "\\'").
773 FlagWithRspFileInputList("< ", snapshotOutputs).
774 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900775
776 zipRule.Temporary(snapshotOutputList)
777
778 zipRule.Command().
779 BuiltTool(ctx, "soong_zip").
780 FlagWithOutput("-o ", zipPath).
781 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
782 FlagWithInput("-l ", snapshotOutputList)
783
784 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900785 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900786 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900787}
Jooyung Han097087b2019-10-22 19:32:18 +0900788
Jooyung Han0302a842019-10-30 18:43:49 +0900789func getVndkFileName(m *Module) (string, error) {
790 if library, ok := m.linker.(*libraryDecorator); ok {
791 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
792 }
793 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
794 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
795 }
796 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900797}
798
799func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900800 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900801 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
802 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
803 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900804
Jooyung Han2216fb12019-11-06 16:46:15 +0900805 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900806 // Since each target have different set of libclang_rt.* files,
807 // keep the common set of files in vndk.libraries.txt
808 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900809 filterOutLibClangRt := func(libList []string) (filtered []string) {
810 for _, lib := range libList {
811 if !strings.HasPrefix(lib, "libclang_rt.") {
812 filtered = append(filtered, lib)
813 }
814 }
815 return
816 }
817 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
818 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
819 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
820 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900821 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
822 ctx.Build(pctx, android.BuildParams{
823 Rule: android.WriteFile,
824 Output: c.vndkLibrariesFile,
825 Description: "Writing " + c.vndkLibrariesFile.String(),
826 Args: map[string]string{
827 "content": strings.Join(merged, "\\n"),
828 },
829 })
Jooyung Han0302a842019-10-30 18:43:49 +0900830}
Jooyung Han097087b2019-10-22 19:32:18 +0900831
Jooyung Han0302a842019-10-30 18:43:49 +0900832func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
833 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
834 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700835 movedToApexLlndkLibraries := make(map[string]bool)
836 ctx.VisitAllModules(func(module android.Module) {
837 if m, ok := module.(*Module); ok {
838 if llndk, ok := m.linker.(*llndkStubDecorator); ok {
839 // Skip bionic libs, they are handled in different manner
Colin Cross0477b422020-10-13 18:43:54 -0700840 name := llndk.implementationModuleName(m.BaseModuleName())
841 if llndk.movedToApex && !isBionic(name) {
Colin Cross56a83212020-09-15 18:30:11 -0700842 movedToApexLlndkLibraries[name] = true
843 }
844 }
Jooyung Han0302a842019-10-30 18:43:49 +0900845 }
Colin Cross56a83212020-09-15 18:30:11 -0700846 })
847
848 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
849 strings.Join(android.SortedStringKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900850
851 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
852 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
853 // Therefore, by removing the library here, we cause it to only be installed if libc
854 // depends on it.
855 installedLlndkLibraries := []string{}
856 for lib := range llndkLibraries(ctx.Config()) {
857 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
858 continue
859 }
860 installedLlndkLibraries = append(installedLlndkLibraries, lib)
861 }
862 sort.Strings(installedLlndkLibraries)
863 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
864
Jooyung Han0302a842019-10-30 18:43:49 +0900865 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
866 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
867 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
868 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
869
Jooyung Han0302a842019-10-30 18:43:49 +0900870 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900871 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900872}