blob: d57cdf79d1b7e93c234ef8e32daa73509afe53b0 [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 //
Justin Yun63e9ec72020-10-29 16:49:43 +090065 // `vendor_available` and `product_available` must be explicitly
66 // set to either true or 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
Justin Yun63e9ec72020-10-29 16:49:43 +0900132// VNDK link type check from a module with UseVndk() == true.
Jooyung Han479ca172020-10-19 18:51:07 +0900133func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900134 if to.linker == nil {
135 return
136 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900137 if !vndk.isVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +0900138 // Non-VNDK modules those installed to /vendor or /system/vendor
139 // can't depend on modules marked with vendor_available: false;
140 // or those installed to /product or /system/product can't depend
141 // on modules marked with product_available: false.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900142 violation := false
Nan Zhang0007d812017-11-07 10:57:05 -0800143 if lib, ok := to.linker.(*llndkStubDecorator); ok && !Bool(lib.Properties.Vendor_available) {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900144 violation = true
145 } else {
146 if _, ok := to.linker.(libraryInterface); ok && to.VendorProperties.Vendor_available != nil && !Bool(to.VendorProperties.Vendor_available) {
147 // Vendor_available == nil && !Bool(Vendor_available) should be okay since
Justin Yun5f7f7e82019-11-18 19:52:14 +0900148 // it means a vendor-only, or product-only library which is a valid dependency
149 // for non-VNDK modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900150 violation = true
151 }
152 }
153 if violation {
154 ctx.ModuleErrorf("Vendor module that is not VNDK should not link to %q which is marked as `vendor_available: false`", to.Name())
155 }
156 }
Justin Yun8effde42017-06-23 19:24:43 +0900157 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
158 // Check only shared libraries.
159 // Other (static and LL-NDK) libraries are allowed to link.
160 return
161 }
Ivan Lozano52767be2019-10-18 14:49:46 -0700162 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900163 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
164 vndk.typeName(), to.Name())
165 return
166 }
Logan Chienf3511742017-10-31 18:04:35 +0800167 if tag == vndkExtDepTag {
168 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
169 // and has identical vndk properties.
170 if to.vndkdep == nil || !to.vndkdep.isVndk() {
171 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
172 return
173 }
174 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
175 ctx.ModuleErrorf(
176 "`extends` refers a module %q with mismatched support_system_process",
177 to.Name())
178 return
179 }
Justin Yun63e9ec72020-10-29 16:49:43 +0900180 // TODO(b/150902910): vndk-ext for product must check product_available.
Logan Chienf3511742017-10-31 18:04:35 +0800181 if !Bool(to.VendorProperties.Vendor_available) {
182 ctx.ModuleErrorf(
183 "`extends` refers module %q which does not have `vendor_available: true`",
184 to.Name())
185 return
186 }
187 }
Justin Yun8effde42017-06-23 19:24:43 +0900188 if to.vndkdep == nil {
189 return
190 }
Logan Chienf3511742017-10-31 18:04:35 +0800191
Logan Chiend3c59a22018-03-29 14:08:15 +0800192 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100193 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
194 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
195 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800196 return
197 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800198}
Logan Chienf3511742017-10-31 18:04:35 +0800199
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100200func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800201 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
202 if from.isVndkExt() {
203 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100204 if to.isVndk() && !to.isVndkSp() {
205 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
206 }
207 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800208 }
209 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100210 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900211 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800212 if from.isVndk() {
213 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100214 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800215 }
216 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100217 if !to.isVndkSp() {
218 return errors.New("VNDK-SP must only depend on VNDK-SP")
219 }
220 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800221 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100222 if !to.isVndk() {
223 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
224 }
225 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800226 }
227 // Vendor modules 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}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900230
231var (
Jooyung Hana463f722019-11-01 08:45:59 +0900232 vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires")
233 vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires")
234 llndkLibrariesKey = android.NewOnceKey("llndkLibrarires")
235 vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires")
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900236 vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries")
Jooyung Hana463f722019-11-01 08:45:59 +0900237 vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
238 vndkLibrariesLock sync.Mutex
Inseob Kimae553032019-05-14 18:52:49 +0900239)
Inseob Kim1f086e22019-05-09 13:29:15 +0900240
Jooyung Han0302a842019-10-30 18:43:49 +0900241func vndkCoreLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900242 return config.Once(vndkCoreLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900243 return make(map[string]string)
244 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900245}
246
Jooyung Han0302a842019-10-30 18:43:49 +0900247func vndkSpLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900248 return config.Once(vndkSpLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900249 return make(map[string]string)
250 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900251}
252
Jooyung Han0302a842019-10-30 18:43:49 +0900253func isLlndkLibrary(baseModuleName string, config android.Config) bool {
Colin Cross0477b422020-10-13 18:43:54 -0700254 _, ok := llndkLibraries(config)[strings.TrimSuffix(baseModuleName, llndkLibrarySuffix)]
Jooyung Han0302a842019-10-30 18:43:49 +0900255 return ok
256}
257
258func llndkLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900259 return config.Once(llndkLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900260 return make(map[string]string)
261 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900262}
263
Jooyung Han0302a842019-10-30 18:43:49 +0900264func isVndkPrivateLibrary(baseModuleName string, config android.Config) bool {
265 _, ok := vndkPrivateLibraries(config)[baseModuleName]
266 return ok
267}
268
269func vndkPrivateLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900270 return config.Once(vndkPrivateLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900271 return make(map[string]string)
272 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900273}
274
Jooyung Han0302a842019-10-30 18:43:49 +0900275func vndkUsingCoreVariantLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900276 return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900277 return make(map[string]string)
278 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900279}
280
Jooyung Han097087b2019-10-22 19:32:18 +0900281func vndkMustUseVendorVariantList(cfg android.Config) []string {
282 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900283 return config.VndkMustUseVendorVariantList
284 }).([]string)
285}
286
287// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
288// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
289func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900290 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900291 return mustUseVendorVariantList
292 })
293}
294
Inseob Kim1f086e22019-05-09 13:29:15 +0900295func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
296 lib := m.linker.(*llndkStubDecorator)
Colin Cross0477b422020-10-13 18:43:54 -0700297 name := m.ImplementationModuleName(mctx)
298 filename := name + ".so"
Inseob Kim9516ee92019-05-09 10:56:13 +0900299
Inseob Kim1f086e22019-05-09 13:29:15 +0900300 vndkLibrariesLock.Lock()
301 defer vndkLibrariesLock.Unlock()
Inseob Kim9516ee92019-05-09 10:56:13 +0900302
Jooyung Han0302a842019-10-30 18:43:49 +0900303 llndkLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900304 if !Bool(lib.Properties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900305 vndkPrivateLibraries(mctx.Config())[name] = filename
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900306 }
Colin Cross56a83212020-09-15 18:30:11 -0700307
Jooyung Han61b66e92020-03-21 14:21:46 +0000308 if mctx.OtherModuleExists(name) {
309 mctx.AddFarVariationDependencies(m.Target().Variations(), llndkImplDep, name)
310 }
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900311}
Inseob Kim1f086e22019-05-09 13:29:15 +0900312
313func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Jooyung Han0302a842019-10-30 18:43:49 +0900314 name := m.BaseModuleName()
315 filename, err := getVndkFileName(m)
316 if err != nil {
317 panic(err)
318 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900319
Colin Cross31076b32020-10-23 17:22:06 -0700320 if lib := m.library; lib != nil && lib.hasStubsVariants() && name != "libz" {
Jiyong Park2478e4e2020-05-18 09:30:14 +0000321 // b/155456180 libz is the ONLY exception here. We don't want to make
322 // libz an LLNDK library because we in general can't guarantee that
323 // libz will behave consistently especially about the compression.
324 // i.e. the compressed output might be different across releases.
325 // As the library is an external one, it's risky to keep the compatibility
326 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900327 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
328 }
329
Inseob Kim1f086e22019-05-09 13:29:15 +0900330 vndkLibrariesLock.Lock()
331 defer vndkLibrariesLock.Unlock()
332
Jooyung Han097087b2019-10-22 19:32:18 +0900333 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
334 m.Properties.MustUseVendorVariant = true
335 }
Jooyung Han0302a842019-10-30 18:43:49 +0900336 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
337 vndkUsingCoreVariantLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900338 }
Jooyung Han0302a842019-10-30 18:43:49 +0900339
Inseob Kim1f086e22019-05-09 13:29:15 +0900340 if m.vndkdep.isVndkSp() {
Jooyung Han0302a842019-10-30 18:43:49 +0900341 vndkSpLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900342 } else {
Jooyung Han0302a842019-10-30 18:43:49 +0900343 vndkCoreLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900344 }
Justin Yun63e9ec72020-10-29 16:49:43 +0900345 // As `vendor_available` and `product_available` has the same value for VNDK modules,
346 // we don't need to check both values.
Inseob Kim1f086e22019-05-09 13:29:15 +0900347 if !Bool(m.VendorProperties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900348 vndkPrivateLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900349 }
350}
351
Yo Chiang08fac0c2020-07-29 01:08:20 +0800352// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800353func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900354 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800355 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900356 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800357 if !m.Device() {
358 // Skip non-device modules
359 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900360 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900361 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800362 // Skip native_bridge modules
363 return true
364 }
365 return false
366}
367
368func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
369 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900370 return false
371 }
372
373 // prebuilt vndk modules should match with device
374 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
375 // When b/142675459 is landed, remove following check
376 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.matchesWithDevice(mctx.DeviceConfig()) {
377 return false
378 }
379
380 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900381 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
382 if mctx.DeviceConfig().VndkVersion() == "" {
383 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
384 if mctx.ModuleName() == "libz" {
385 return false
386 }
387 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.isVndkSp()
388 }
389
Justin Yun5f7f7e82019-11-18 19:52:14 +0900390 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900391 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000392 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900393 }
394 return false
395}
396
Inseob Kim1f086e22019-05-09 13:29:15 +0900397// gather list of vndk-core, vndk-sp, and ll-ndk libs
398func VndkMutator(mctx android.BottomUpMutatorContext) {
399 m, ok := mctx.Module().(*Module)
400 if !ok {
401 return
402 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800403
404 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900405 return
406 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900407
408 if _, ok := m.linker.(*llndkStubDecorator); ok {
409 processLlndkLibrary(mctx, m)
410 return
411 }
412
413 lib, is_lib := m.linker.(*libraryDecorator)
414 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
415
Inseob Kim64c43952019-08-26 16:52:35 +0900416 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
417 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900418 processVndkLibrary(mctx, m)
419 return
420 }
421 }
422}
423
424func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900425 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900426 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900427}
428
Jooyung Han2216fb12019-11-06 16:46:15 +0900429type vndkLibrariesTxt struct {
430 android.ModuleBase
431 outputFile android.OutputPath
432}
433
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700434var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900435var _ android.OutputFileProducer = &vndkLibrariesTxt{}
436
Jooyung Han2216fb12019-11-06 16:46:15 +0900437// vndk_libraries_txt is a special kind of module type in that it name is one of
438// - llndk.libraries.txt
439// - vndkcore.libraries.txt
440// - vndksp.libraries.txt
441// - vndkprivate.libraries.txt
442// - vndkcorevariant.libraries.txt
443// A module behaves like a prebuilt_etc but its content is generated by soong.
444// By being a soong module, these files can be referenced by other soong modules.
445// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900446func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900447 m := &vndkLibrariesTxt{}
448 android.InitAndroidModule(m)
449 return m
450}
451
452func insertVndkVersion(filename string, vndkVersion string) string {
453 if index := strings.LastIndex(filename, "."); index != -1 {
454 return filename[:index] + "." + vndkVersion + filename[index:]
455 }
456 return filename
457}
458
459func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
460 var list []string
461 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900462 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900463 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
464 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
465 continue
466 }
467 list = append(list, filename)
468 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900469 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900470 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900471 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900472 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900473 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900474 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900475 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900476 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
477 default:
478 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
479 return
480 }
481
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900482 var filename string
483 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
484 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
485 } else {
486 filename = txt.Name()
487 }
488
Jooyung Han2216fb12019-11-06 16:46:15 +0900489 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
Colin Crosscf371cc2020-11-13 11:48:42 -0800490 android.WriteFileRule(ctx, txt.outputFile, strings.Join(list, "\n"))
Jooyung Han2216fb12019-11-06 16:46:15 +0900491
492 installPath := android.PathForModuleInstall(ctx, "etc")
493 ctx.InstallFile(installPath, filename, txt.outputFile)
494}
495
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900496func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
497 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900498 Class: "ETC",
499 OutputFile: android.OptionalPathForPath(txt.outputFile),
500 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
501 func(entries *android.AndroidMkEntries) {
502 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
503 },
504 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900505 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900506}
507
Jooyung Han0703fd82020-08-26 22:11:53 +0900508// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900509func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
510 return txt.outputFile
511}
512
Jooyung Han0703fd82020-08-26 22:11:53 +0900513// PrebuiltEtcModule interface
514func (txt *vndkLibrariesTxt) BaseDir() string {
515 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900516}
517
Jooyung Han0703fd82020-08-26 22:11:53 +0900518// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900519func (txt *vndkLibrariesTxt) SubDir() string {
520 return ""
521}
522
Jooyung Han0703fd82020-08-26 22:11:53 +0900523func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
524 return android.Paths{txt.outputFile}, nil
525}
526
Inseob Kim1f086e22019-05-09 13:29:15 +0900527func VndkSnapshotSingleton() android.Singleton {
528 return &vndkSnapshotSingleton{}
529}
530
Jooyung Han0302a842019-10-30 18:43:49 +0900531type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900532 vndkLibrariesFile android.OutputPath
533 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900534}
Inseob Kim1f086e22019-05-09 13:29:15 +0900535
Colin Cross56a83212020-09-15 18:30:11 -0700536func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module,
537 apexInfo android.ApexInfo) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
538
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900539 if m.Target().NativeBridge == android.NativeBridgeEnabled {
540 return nil, "", false
541 }
Jooyung Han261e1582020-10-20 18:54:21 +0900542 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
543 // !installable: Snapshot only cares about "installable" modules.
544 // isSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Colin Cross56a83212020-09-15 18:30:11 -0700545 if !m.inVendor() || !m.installable(apexInfo) || m.isSnapshotPrebuilt() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900546 return nil, "", false
547 }
548 l, ok := m.linker.(snapshotLibraryInterface)
549 if !ok || !l.shared() {
550 return nil, "", false
551 }
552 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
553 if m.isVndkSp() {
554 return l, "vndk-sp", true
555 } else {
556 return l, "vndk-core", true
557 }
558 }
559
560 return nil, "", false
561}
562
Inseob Kim1f086e22019-05-09 13:29:15 +0900563func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900564 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
565 c.buildVndkLibrariesTxtFiles(ctx)
566
Inseob Kim1f086e22019-05-09 13:29:15 +0900567 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
568 if ctx.DeviceConfig().VndkVersion() != "current" {
569 return
570 }
571
572 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
573 return
574 }
575
Inseob Kim242ef0c2019-10-22 20:15:20 +0900576 var snapshotOutputs android.Paths
577
578 /*
579 VNDK snapshot zipped artifacts directory structure:
580 {SNAPSHOT_ARCH}/
581 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
582 shared/
583 vndk-core/
584 (VNDK-core libraries, e.g. libbinder.so)
585 vndk-sp/
586 (VNDK-SP libraries, e.g. libc++.so)
587 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
588 shared/
589 vndk-core/
590 (VNDK-core libraries, e.g. libbinder.so)
591 vndk-sp/
592 (VNDK-SP libraries, e.g. libc++.so)
593 binder32/
594 (This directory is newly introduced in v28 (Android P) to hold
595 prebuilts built for 32-bit binder interface.)
596 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
597 ...
598 configs/
599 (various *.txt configuration files)
600 include/
601 (header files of same directory structure with source tree)
602 NOTICE_FILES/
603 (notice files of libraries, e.g. libcutils.so.txt)
604 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900605
606 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900607 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900608
Inseob Kim242ef0c2019-10-22 20:15:20 +0900609 configsDir := filepath.Join(snapshotArchDir, "configs")
610 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
611 includeDir := filepath.Join(snapshotArchDir, "include")
612
Inseob Kim242ef0c2019-10-22 20:15:20 +0900613 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900614 noticeBuilt := make(map[string]bool)
615
Inseob Kim242ef0c2019-10-22 20:15:20 +0900616 // paths of VNDK modules for GPL license checking
617 modulePaths := make(map[string]string)
618
619 // actual module names of .so files
620 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
621 moduleNames := make(map[string]string)
622
Inseob Kim8471cda2019-11-15 09:59:12 +0900623 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900624
Colin Cross0de8a1e2020-09-18 14:15:30 -0700625 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900626 var ret android.Paths
627
Inseob Kim8471cda2019-11-15 09:59:12 +0900628 targetArch := "arch-" + m.Target().Arch.ArchType.String()
629 if m.Target().Arch.ArchVariant != "" {
630 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900631 }
Inseob Kimae553032019-05-14 18:52:49 +0900632
Inseob Kim8471cda2019-11-15 09:59:12 +0900633 libPath := m.outputFile.Path()
634 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
635 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
636
Inseob Kimae553032019-05-14 18:52:49 +0900637 if ctx.Config().VndkSnapshotBuildArtifacts() {
638 prop := struct {
639 ExportedDirs []string `json:",omitempty"`
640 ExportedSystemDirs []string `json:",omitempty"`
641 ExportedFlags []string `json:",omitempty"`
642 RelativeInstallPath string `json:",omitempty"`
643 }{}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700644 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
645 prop.ExportedFlags = exportedInfo.Flags
646 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
647 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900648 prop.RelativeInstallPath = m.RelativeInstallPath()
649
Inseob Kim242ef0c2019-10-22 20:15:20 +0900650 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900651
652 j, err := json.Marshal(prop)
653 if err != nil {
654 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900655 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900656 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900657 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900658 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900659 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900660 }
661
Inseob Kim1f086e22019-05-09 13:29:15 +0900662 ctx.VisitAllModules(func(module android.Module) {
663 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900664 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900665 return
666 }
667
Colin Cross56a83212020-09-15 18:30:11 -0700668 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
669
670 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900671 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200672 return
673 }
674
Inseob Kim8471cda2019-11-15 09:59:12 +0900675 // install .so files for appropriate modules.
676 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700677 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900678 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900679 return
680 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900681 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900682
Inseob Kim8471cda2019-11-15 09:59:12 +0900683 // These are for generating module_names.txt and module_paths.txt
684 stem := m.outputFile.Path().Base()
685 moduleNames[stem] = ctx.ModuleName(m)
686 modulePaths[stem] = ctx.ModuleDir(m)
687
Bob Badoura75b0572020-02-18 20:21:55 -0800688 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900689 noticeName := stem + ".txt"
690 // skip already copied notice file
691 if _, ok := noticeBuilt[noticeName]; !ok {
692 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800693 snapshotOutputs = append(snapshotOutputs, combineNotices(
694 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900695 }
696 }
697
698 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900699 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900700 }
701 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900702
Inseob Kim8471cda2019-11-15 09:59:12 +0900703 // install all headers after removing duplicates
704 for _, header := range android.FirstUniquePaths(headers) {
705 snapshotOutputs = append(snapshotOutputs, copyFile(
706 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900707 }
708
Jooyung Han39edb6c2019-11-06 16:53:07 +0900709 // install *.libraries.txt except vndkcorevariant.libraries.txt
710 ctx.VisitAllModules(func(module android.Module) {
711 m, ok := module.(*vndkLibrariesTxt)
712 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
713 return
714 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900715 snapshotOutputs = append(snapshotOutputs, copyFile(
716 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900717 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900718
Inseob Kim242ef0c2019-10-22 20:15:20 +0900719 /*
720 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900721
Inseob Kim242ef0c2019-10-22 20:15:20 +0900722 {key1} {value1}
723 {key2} {value2}
724 ...
725 */
726 installMapListFile := func(m map[string]string, path string) android.OutputPath {
727 var txtBuilder strings.Builder
728 for idx, k := range android.SortedStringKeys(m) {
729 if idx > 0 {
Justin Yun7a444792020-11-27 20:30:44 +0900730 txtBuilder.WriteString("\n")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900731 }
732 txtBuilder.WriteString(k)
733 txtBuilder.WriteString(" ")
734 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900735 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900736 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900737 }
738
Inseob Kim242ef0c2019-10-22 20:15:20 +0900739 /*
740 module_paths.txt contains paths on which VNDK modules are defined.
741 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000742 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900743 libc.so bionic/libc
744 ...
745 */
746 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
747
748 /*
749 module_names.txt contains names as which VNDK modules are defined,
750 because output filename and module name can be different with stem and suffix properties.
751
752 e.g.,
753 libcutils.so libcutils
754 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
755 ...
756 */
757 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
758
759 // All artifacts are ready. Sort them to normalize ninja and then zip.
760 sort.Slice(snapshotOutputs, func(i, j int) bool {
761 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
762 })
763
764 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
Colin Crossf1a035e2020-11-16 17:32:30 -0800765 zipRule := android.NewRuleBuilder(pctx, ctx)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900766
Inseob Kim8471cda2019-11-15 09:59:12 +0900767 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900768 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
769 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900770 Text("tr").
771 FlagWithArg("-d ", "\\'").
772 FlagWithRspFileInputList("< ", snapshotOutputs).
773 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900774
775 zipRule.Temporary(snapshotOutputList)
776
777 zipRule.Command().
Colin Crossf1a035e2020-11-16 17:32:30 -0800778 BuiltTool("soong_zip").
Inseob Kim242ef0c2019-10-22 20:15:20 +0900779 FlagWithOutput("-o ", zipPath).
780 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
781 FlagWithInput("-l ", snapshotOutputList)
782
Colin Crossf1a035e2020-11-16 17:32:30 -0800783 zipRule.Build(zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900784 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900785 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900786}
Jooyung Han097087b2019-10-22 19:32:18 +0900787
Jooyung Han0302a842019-10-30 18:43:49 +0900788func getVndkFileName(m *Module) (string, error) {
789 if library, ok := m.linker.(*libraryDecorator); ok {
790 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
791 }
792 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
793 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
794 }
795 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900796}
797
798func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900799 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900800 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
801 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
802 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900803
Jooyung Han2216fb12019-11-06 16:46:15 +0900804 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900805 // Since each target have different set of libclang_rt.* files,
806 // keep the common set of files in vndk.libraries.txt
807 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900808 filterOutLibClangRt := func(libList []string) (filtered []string) {
809 for _, lib := range libList {
810 if !strings.HasPrefix(lib, "libclang_rt.") {
811 filtered = append(filtered, lib)
812 }
813 }
814 return
815 }
816 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
817 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
818 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
819 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900820 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
Colin Crosscf371cc2020-11-13 11:48:42 -0800821 android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n"))
Jooyung Han0302a842019-10-30 18:43:49 +0900822}
Jooyung Han097087b2019-10-22 19:32:18 +0900823
Jooyung Han0302a842019-10-30 18:43:49 +0900824func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
825 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
826 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700827 movedToApexLlndkLibraries := make(map[string]bool)
828 ctx.VisitAllModules(func(module android.Module) {
829 if m, ok := module.(*Module); ok {
830 if llndk, ok := m.linker.(*llndkStubDecorator); ok {
831 // Skip bionic libs, they are handled in different manner
Colin Cross0477b422020-10-13 18:43:54 -0700832 name := llndk.implementationModuleName(m.BaseModuleName())
833 if llndk.movedToApex && !isBionic(name) {
Colin Cross56a83212020-09-15 18:30:11 -0700834 movedToApexLlndkLibraries[name] = true
835 }
836 }
Jooyung Han0302a842019-10-30 18:43:49 +0900837 }
Colin Cross56a83212020-09-15 18:30:11 -0700838 })
839
840 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
841 strings.Join(android.SortedStringKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900842
843 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
844 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
845 // Therefore, by removing the library here, we cause it to only be installed if libc
846 // depends on it.
847 installedLlndkLibraries := []string{}
848 for lib := range llndkLibraries(ctx.Config()) {
849 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
850 continue
851 }
852 installedLlndkLibraries = append(installedLlndkLibraries, lib)
853 }
854 sort.Strings(installedLlndkLibraries)
855 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
856
Jooyung Han0302a842019-10-30 18:43:49 +0900857 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
858 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
859 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
860 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
861
Jooyung Han0302a842019-10-30 18:43:49 +0900862 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900863 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900864}