blob: 6342f0578b699362e66b74ba93838f6adcb6f85e [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 {
250 _, ok := llndkLibraries(config)[baseModuleName]
251 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)
Jooyung Han0302a842019-10-30 18:43:49 +0900293 name := m.BaseModuleName()
294 filename := m.BaseModuleName() + ".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 }
Colin Cross56a83212020-09-15 18:30:11 -0700543 if !m.inVendor() || !m.installable(apexInfo) || m.isSnapshotPrebuilt() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900544 return nil, "", false
545 }
546 l, ok := m.linker.(snapshotLibraryInterface)
547 if !ok || !l.shared() {
548 return nil, "", false
549 }
550 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
551 if m.isVndkSp() {
552 return l, "vndk-sp", true
553 } else {
554 return l, "vndk-core", true
555 }
556 }
557
558 return nil, "", false
559}
560
Inseob Kim1f086e22019-05-09 13:29:15 +0900561func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900562 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
563 c.buildVndkLibrariesTxtFiles(ctx)
564
Inseob Kim1f086e22019-05-09 13:29:15 +0900565 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
566 if ctx.DeviceConfig().VndkVersion() != "current" {
567 return
568 }
569
570 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
571 return
572 }
573
Inseob Kim242ef0c2019-10-22 20:15:20 +0900574 var snapshotOutputs android.Paths
575
576 /*
577 VNDK snapshot zipped artifacts directory structure:
578 {SNAPSHOT_ARCH}/
579 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
580 shared/
581 vndk-core/
582 (VNDK-core libraries, e.g. libbinder.so)
583 vndk-sp/
584 (VNDK-SP libraries, e.g. libc++.so)
585 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
586 shared/
587 vndk-core/
588 (VNDK-core libraries, e.g. libbinder.so)
589 vndk-sp/
590 (VNDK-SP libraries, e.g. libc++.so)
591 binder32/
592 (This directory is newly introduced in v28 (Android P) to hold
593 prebuilts built for 32-bit binder interface.)
594 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
595 ...
596 configs/
597 (various *.txt configuration files)
598 include/
599 (header files of same directory structure with source tree)
600 NOTICE_FILES/
601 (notice files of libraries, e.g. libcutils.so.txt)
602 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900603
604 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900605 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900606
Inseob Kim242ef0c2019-10-22 20:15:20 +0900607 configsDir := filepath.Join(snapshotArchDir, "configs")
608 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
609 includeDir := filepath.Join(snapshotArchDir, "include")
610
Inseob Kim242ef0c2019-10-22 20:15:20 +0900611 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900612 noticeBuilt := make(map[string]bool)
613
Inseob Kim242ef0c2019-10-22 20:15:20 +0900614 // paths of VNDK modules for GPL license checking
615 modulePaths := make(map[string]string)
616
617 // actual module names of .so files
618 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
619 moduleNames := make(map[string]string)
620
Inseob Kim8471cda2019-11-15 09:59:12 +0900621 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900622
Colin Cross0de8a1e2020-09-18 14:15:30 -0700623 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900624 var ret android.Paths
625
Inseob Kim8471cda2019-11-15 09:59:12 +0900626 targetArch := "arch-" + m.Target().Arch.ArchType.String()
627 if m.Target().Arch.ArchVariant != "" {
628 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900629 }
Inseob Kimae553032019-05-14 18:52:49 +0900630
Inseob Kim8471cda2019-11-15 09:59:12 +0900631 libPath := m.outputFile.Path()
632 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
633 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
634
Inseob Kimae553032019-05-14 18:52:49 +0900635 if ctx.Config().VndkSnapshotBuildArtifacts() {
636 prop := struct {
637 ExportedDirs []string `json:",omitempty"`
638 ExportedSystemDirs []string `json:",omitempty"`
639 ExportedFlags []string `json:",omitempty"`
640 RelativeInstallPath string `json:",omitempty"`
641 }{}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700642 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
643 prop.ExportedFlags = exportedInfo.Flags
644 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
645 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900646 prop.RelativeInstallPath = m.RelativeInstallPath()
647
Inseob Kim242ef0c2019-10-22 20:15:20 +0900648 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900649
650 j, err := json.Marshal(prop)
651 if err != nil {
652 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900653 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900654 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900655 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900656 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900657 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900658 }
659
Inseob Kim1f086e22019-05-09 13:29:15 +0900660 ctx.VisitAllModules(func(module android.Module) {
661 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900662 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900663 return
664 }
665
Colin Cross56a83212020-09-15 18:30:11 -0700666 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
667
668 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900669 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200670 return
671 }
672
Inseob Kim8471cda2019-11-15 09:59:12 +0900673 // install .so files for appropriate modules.
674 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700675 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900676 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900677 return
678 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900679 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900680
Inseob Kim8471cda2019-11-15 09:59:12 +0900681 // These are for generating module_names.txt and module_paths.txt
682 stem := m.outputFile.Path().Base()
683 moduleNames[stem] = ctx.ModuleName(m)
684 modulePaths[stem] = ctx.ModuleDir(m)
685
Bob Badoura75b0572020-02-18 20:21:55 -0800686 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900687 noticeName := stem + ".txt"
688 // skip already copied notice file
689 if _, ok := noticeBuilt[noticeName]; !ok {
690 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800691 snapshotOutputs = append(snapshotOutputs, combineNotices(
692 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900693 }
694 }
695
696 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900697 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900698 }
699 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900700
Inseob Kim8471cda2019-11-15 09:59:12 +0900701 // install all headers after removing duplicates
702 for _, header := range android.FirstUniquePaths(headers) {
703 snapshotOutputs = append(snapshotOutputs, copyFile(
704 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900705 }
706
Jooyung Han39edb6c2019-11-06 16:53:07 +0900707 // install *.libraries.txt except vndkcorevariant.libraries.txt
708 ctx.VisitAllModules(func(module android.Module) {
709 m, ok := module.(*vndkLibrariesTxt)
710 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
711 return
712 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900713 snapshotOutputs = append(snapshotOutputs, copyFile(
714 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900715 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900716
Inseob Kim242ef0c2019-10-22 20:15:20 +0900717 /*
718 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900719
Inseob Kim242ef0c2019-10-22 20:15:20 +0900720 {key1} {value1}
721 {key2} {value2}
722 ...
723 */
724 installMapListFile := func(m map[string]string, path string) android.OutputPath {
725 var txtBuilder strings.Builder
726 for idx, k := range android.SortedStringKeys(m) {
727 if idx > 0 {
728 txtBuilder.WriteString("\\n")
729 }
730 txtBuilder.WriteString(k)
731 txtBuilder.WriteString(" ")
732 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900733 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900734 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900735 }
736
Inseob Kim242ef0c2019-10-22 20:15:20 +0900737 /*
738 module_paths.txt contains paths on which VNDK modules are defined.
739 e.g.,
740 libbase.so system/core/base
741 libc.so bionic/libc
742 ...
743 */
744 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
745
746 /*
747 module_names.txt contains names as which VNDK modules are defined,
748 because output filename and module name can be different with stem and suffix properties.
749
750 e.g.,
751 libcutils.so libcutils
752 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
753 ...
754 */
755 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
756
757 // All artifacts are ready. Sort them to normalize ninja and then zip.
758 sort.Slice(snapshotOutputs, func(i, j int) bool {
759 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
760 })
761
762 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
763 zipRule := android.NewRuleBuilder()
764
Inseob Kim8471cda2019-11-15 09:59:12 +0900765 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900766 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
767 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900768 Text("tr").
769 FlagWithArg("-d ", "\\'").
770 FlagWithRspFileInputList("< ", snapshotOutputs).
771 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900772
773 zipRule.Temporary(snapshotOutputList)
774
775 zipRule.Command().
776 BuiltTool(ctx, "soong_zip").
777 FlagWithOutput("-o ", zipPath).
778 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
779 FlagWithInput("-l ", snapshotOutputList)
780
781 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900782 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900783 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900784}
Jooyung Han097087b2019-10-22 19:32:18 +0900785
Jooyung Han0302a842019-10-30 18:43:49 +0900786func getVndkFileName(m *Module) (string, error) {
787 if library, ok := m.linker.(*libraryDecorator); ok {
788 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
789 }
790 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
791 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
792 }
793 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900794}
795
796func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900797 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900798 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
799 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
800 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900801
Jooyung Han2216fb12019-11-06 16:46:15 +0900802 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900803 // Since each target have different set of libclang_rt.* files,
804 // keep the common set of files in vndk.libraries.txt
805 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900806 filterOutLibClangRt := func(libList []string) (filtered []string) {
807 for _, lib := range libList {
808 if !strings.HasPrefix(lib, "libclang_rt.") {
809 filtered = append(filtered, lib)
810 }
811 }
812 return
813 }
814 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
815 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
816 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
817 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900818 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
819 ctx.Build(pctx, android.BuildParams{
820 Rule: android.WriteFile,
821 Output: c.vndkLibrariesFile,
822 Description: "Writing " + c.vndkLibrariesFile.String(),
823 Args: map[string]string{
824 "content": strings.Join(merged, "\\n"),
825 },
826 })
Jooyung Han0302a842019-10-30 18:43:49 +0900827}
Jooyung Han097087b2019-10-22 19:32:18 +0900828
Jooyung Han0302a842019-10-30 18:43:49 +0900829func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
830 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
831 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700832 movedToApexLlndkLibraries := make(map[string]bool)
833 ctx.VisitAllModules(func(module android.Module) {
834 if m, ok := module.(*Module); ok {
835 if llndk, ok := m.linker.(*llndkStubDecorator); ok {
836 // Skip bionic libs, they are handled in different manner
837 name := m.BaseModuleName()
838 if llndk.movedToApex && !isBionic(m.BaseModuleName()) {
839 movedToApexLlndkLibraries[name] = true
840 }
841 }
Jooyung Han0302a842019-10-30 18:43:49 +0900842 }
Colin Cross56a83212020-09-15 18:30:11 -0700843 })
844
845 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
846 strings.Join(android.SortedStringKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900847
848 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
849 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
850 // Therefore, by removing the library here, we cause it to only be installed if libc
851 // depends on it.
852 installedLlndkLibraries := []string{}
853 for lib := range llndkLibraries(ctx.Config()) {
854 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
855 continue
856 }
857 installedLlndkLibraries = append(installedLlndkLibraries, lib)
858 }
859 sort.Strings(installedLlndkLibraries)
860 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
861
Jooyung Han0302a842019-10-30 18:43:49 +0900862 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
863 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
864 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
865 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
866
Jooyung Han0302a842019-10-30 18:43:49 +0900867 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900868 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900869}