blob: 2cac03c82be5d2ce872896eb2bd4dcfd03a97a0d [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
490 ctx.Build(pctx, android.BuildParams{
491 Rule: android.WriteFile,
492 Output: txt.outputFile,
493 Description: "Writing " + txt.outputFile.String(),
494 Args: map[string]string{
495 "content": strings.Join(list, "\\n"),
496 },
497 })
498
499 installPath := android.PathForModuleInstall(ctx, "etc")
500 ctx.InstallFile(installPath, filename, txt.outputFile)
501}
502
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900503func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
504 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900505 Class: "ETC",
506 OutputFile: android.OptionalPathForPath(txt.outputFile),
507 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
508 func(entries *android.AndroidMkEntries) {
509 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
510 },
511 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900512 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900513}
514
Jooyung Han0703fd82020-08-26 22:11:53 +0900515// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900516func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
517 return txt.outputFile
518}
519
Jooyung Han0703fd82020-08-26 22:11:53 +0900520// PrebuiltEtcModule interface
521func (txt *vndkLibrariesTxt) BaseDir() string {
522 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900523}
524
Jooyung Han0703fd82020-08-26 22:11:53 +0900525// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900526func (txt *vndkLibrariesTxt) SubDir() string {
527 return ""
528}
529
Jooyung Han0703fd82020-08-26 22:11:53 +0900530func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
531 return android.Paths{txt.outputFile}, nil
532}
533
Inseob Kim1f086e22019-05-09 13:29:15 +0900534func VndkSnapshotSingleton() android.Singleton {
535 return &vndkSnapshotSingleton{}
536}
537
Jooyung Han0302a842019-10-30 18:43:49 +0900538type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900539 vndkLibrariesFile android.OutputPath
540 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900541}
Inseob Kim1f086e22019-05-09 13:29:15 +0900542
Colin Cross56a83212020-09-15 18:30:11 -0700543func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module,
544 apexInfo android.ApexInfo) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
545
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900546 if m.Target().NativeBridge == android.NativeBridgeEnabled {
547 return nil, "", false
548 }
Jooyung Han261e1582020-10-20 18:54:21 +0900549 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
550 // !installable: Snapshot only cares about "installable" modules.
551 // isSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Colin Cross56a83212020-09-15 18:30:11 -0700552 if !m.inVendor() || !m.installable(apexInfo) || m.isSnapshotPrebuilt() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900553 return nil, "", false
554 }
555 l, ok := m.linker.(snapshotLibraryInterface)
556 if !ok || !l.shared() {
557 return nil, "", false
558 }
559 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
560 if m.isVndkSp() {
561 return l, "vndk-sp", true
562 } else {
563 return l, "vndk-core", true
564 }
565 }
566
567 return nil, "", false
568}
569
Inseob Kim1f086e22019-05-09 13:29:15 +0900570func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900571 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
572 c.buildVndkLibrariesTxtFiles(ctx)
573
Inseob Kim1f086e22019-05-09 13:29:15 +0900574 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
575 if ctx.DeviceConfig().VndkVersion() != "current" {
576 return
577 }
578
579 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
580 return
581 }
582
Inseob Kim242ef0c2019-10-22 20:15:20 +0900583 var snapshotOutputs android.Paths
584
585 /*
586 VNDK snapshot zipped artifacts directory structure:
587 {SNAPSHOT_ARCH}/
588 arch-{TARGET_ARCH}-{TARGET_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 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
595 shared/
596 vndk-core/
597 (VNDK-core libraries, e.g. libbinder.so)
598 vndk-sp/
599 (VNDK-SP libraries, e.g. libc++.so)
600 binder32/
601 (This directory is newly introduced in v28 (Android P) to hold
602 prebuilts built for 32-bit binder interface.)
603 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
604 ...
605 configs/
606 (various *.txt configuration files)
607 include/
608 (header files of same directory structure with source tree)
609 NOTICE_FILES/
610 (notice files of libraries, e.g. libcutils.so.txt)
611 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900612
613 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900614 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900615
Inseob Kim242ef0c2019-10-22 20:15:20 +0900616 configsDir := filepath.Join(snapshotArchDir, "configs")
617 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
618 includeDir := filepath.Join(snapshotArchDir, "include")
619
Inseob Kim242ef0c2019-10-22 20:15:20 +0900620 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900621 noticeBuilt := make(map[string]bool)
622
Inseob Kim242ef0c2019-10-22 20:15:20 +0900623 // paths of VNDK modules for GPL license checking
624 modulePaths := make(map[string]string)
625
626 // actual module names of .so files
627 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
628 moduleNames := make(map[string]string)
629
Inseob Kim8471cda2019-11-15 09:59:12 +0900630 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900631
Colin Cross0de8a1e2020-09-18 14:15:30 -0700632 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900633 var ret android.Paths
634
Inseob Kim8471cda2019-11-15 09:59:12 +0900635 targetArch := "arch-" + m.Target().Arch.ArchType.String()
636 if m.Target().Arch.ArchVariant != "" {
637 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900638 }
Inseob Kimae553032019-05-14 18:52:49 +0900639
Inseob Kim8471cda2019-11-15 09:59:12 +0900640 libPath := m.outputFile.Path()
641 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
642 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
643
Inseob Kimae553032019-05-14 18:52:49 +0900644 if ctx.Config().VndkSnapshotBuildArtifacts() {
645 prop := struct {
646 ExportedDirs []string `json:",omitempty"`
647 ExportedSystemDirs []string `json:",omitempty"`
648 ExportedFlags []string `json:",omitempty"`
649 RelativeInstallPath string `json:",omitempty"`
650 }{}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700651 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
652 prop.ExportedFlags = exportedInfo.Flags
653 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
654 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900655 prop.RelativeInstallPath = m.RelativeInstallPath()
656
Inseob Kim242ef0c2019-10-22 20:15:20 +0900657 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900658
659 j, err := json.Marshal(prop)
660 if err != nil {
661 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900662 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900663 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900664 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900665 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900666 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900667 }
668
Inseob Kim1f086e22019-05-09 13:29:15 +0900669 ctx.VisitAllModules(func(module android.Module) {
670 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900671 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900672 return
673 }
674
Colin Cross56a83212020-09-15 18:30:11 -0700675 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
676
677 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900678 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200679 return
680 }
681
Inseob Kim8471cda2019-11-15 09:59:12 +0900682 // install .so files for appropriate modules.
683 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700684 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900685 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900686 return
687 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900688 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900689
Inseob Kim8471cda2019-11-15 09:59:12 +0900690 // These are for generating module_names.txt and module_paths.txt
691 stem := m.outputFile.Path().Base()
692 moduleNames[stem] = ctx.ModuleName(m)
693 modulePaths[stem] = ctx.ModuleDir(m)
694
Bob Badoura75b0572020-02-18 20:21:55 -0800695 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900696 noticeName := stem + ".txt"
697 // skip already copied notice file
698 if _, ok := noticeBuilt[noticeName]; !ok {
699 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800700 snapshotOutputs = append(snapshotOutputs, combineNotices(
701 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900702 }
703 }
704
705 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900706 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900707 }
708 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900709
Inseob Kim8471cda2019-11-15 09:59:12 +0900710 // install all headers after removing duplicates
711 for _, header := range android.FirstUniquePaths(headers) {
712 snapshotOutputs = append(snapshotOutputs, copyFile(
713 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900714 }
715
Jooyung Han39edb6c2019-11-06 16:53:07 +0900716 // install *.libraries.txt except vndkcorevariant.libraries.txt
717 ctx.VisitAllModules(func(module android.Module) {
718 m, ok := module.(*vndkLibrariesTxt)
719 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
720 return
721 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900722 snapshotOutputs = append(snapshotOutputs, copyFile(
723 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900724 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900725
Inseob Kim242ef0c2019-10-22 20:15:20 +0900726 /*
727 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900728
Inseob Kim242ef0c2019-10-22 20:15:20 +0900729 {key1} {value1}
730 {key2} {value2}
731 ...
732 */
733 installMapListFile := func(m map[string]string, path string) android.OutputPath {
734 var txtBuilder strings.Builder
735 for idx, k := range android.SortedStringKeys(m) {
736 if idx > 0 {
737 txtBuilder.WriteString("\\n")
738 }
739 txtBuilder.WriteString(k)
740 txtBuilder.WriteString(" ")
741 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900742 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900743 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900744 }
745
Inseob Kim242ef0c2019-10-22 20:15:20 +0900746 /*
747 module_paths.txt contains paths on which VNDK modules are defined.
748 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000749 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900750 libc.so bionic/libc
751 ...
752 */
753 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
754
755 /*
756 module_names.txt contains names as which VNDK modules are defined,
757 because output filename and module name can be different with stem and suffix properties.
758
759 e.g.,
760 libcutils.so libcutils
761 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
762 ...
763 */
764 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
765
766 // All artifacts are ready. Sort them to normalize ninja and then zip.
767 sort.Slice(snapshotOutputs, func(i, j int) bool {
768 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
769 })
770
771 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
772 zipRule := android.NewRuleBuilder()
773
Inseob Kim8471cda2019-11-15 09:59:12 +0900774 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900775 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
776 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900777 Text("tr").
778 FlagWithArg("-d ", "\\'").
779 FlagWithRspFileInputList("< ", snapshotOutputs).
780 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900781
782 zipRule.Temporary(snapshotOutputList)
783
784 zipRule.Command().
785 BuiltTool(ctx, "soong_zip").
786 FlagWithOutput("-o ", zipPath).
787 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
788 FlagWithInput("-l ", snapshotOutputList)
789
790 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900791 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900792 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900793}
Jooyung Han097087b2019-10-22 19:32:18 +0900794
Jooyung Han0302a842019-10-30 18:43:49 +0900795func getVndkFileName(m *Module) (string, error) {
796 if library, ok := m.linker.(*libraryDecorator); ok {
797 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
798 }
799 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
800 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
801 }
802 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900803}
804
805func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900806 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900807 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
808 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
809 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900810
Jooyung Han2216fb12019-11-06 16:46:15 +0900811 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900812 // Since each target have different set of libclang_rt.* files,
813 // keep the common set of files in vndk.libraries.txt
814 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900815 filterOutLibClangRt := func(libList []string) (filtered []string) {
816 for _, lib := range libList {
817 if !strings.HasPrefix(lib, "libclang_rt.") {
818 filtered = append(filtered, lib)
819 }
820 }
821 return
822 }
823 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
824 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
825 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
826 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900827 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
828 ctx.Build(pctx, android.BuildParams{
829 Rule: android.WriteFile,
830 Output: c.vndkLibrariesFile,
831 Description: "Writing " + c.vndkLibrariesFile.String(),
832 Args: map[string]string{
833 "content": strings.Join(merged, "\\n"),
834 },
835 })
Jooyung Han0302a842019-10-30 18:43:49 +0900836}
Jooyung Han097087b2019-10-22 19:32:18 +0900837
Jooyung Han0302a842019-10-30 18:43:49 +0900838func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
839 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
840 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700841 movedToApexLlndkLibraries := make(map[string]bool)
842 ctx.VisitAllModules(func(module android.Module) {
843 if m, ok := module.(*Module); ok {
844 if llndk, ok := m.linker.(*llndkStubDecorator); ok {
845 // Skip bionic libs, they are handled in different manner
Colin Cross0477b422020-10-13 18:43:54 -0700846 name := llndk.implementationModuleName(m.BaseModuleName())
847 if llndk.movedToApex && !isBionic(name) {
Colin Cross56a83212020-09-15 18:30:11 -0700848 movedToApexLlndkLibraries[name] = true
849 }
850 }
Jooyung Han0302a842019-10-30 18:43:49 +0900851 }
Colin Cross56a83212020-09-15 18:30:11 -0700852 })
853
854 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
855 strings.Join(android.SortedStringKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900856
857 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
858 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
859 // Therefore, by removing the library here, we cause it to only be installed if libc
860 // depends on it.
861 installedLlndkLibraries := []string{}
862 for lib := range llndkLibraries(ctx.Config()) {
863 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
864 continue
865 }
866 installedLlndkLibraries = append(installedLlndkLibraries, lib)
867 }
868 sort.Strings(installedLlndkLibraries)
869 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
870
Jooyung Han0302a842019-10-30 18:43:49 +0900871 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
872 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
873 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
874 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
875
Jooyung Han0302a842019-10-30 18:43:49 +0900876 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900877 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900878}